-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathrunner.utils.ts
More file actions
124 lines (106 loc) · 3.07 KB
/
runner.utils.ts
File metadata and controls
124 lines (106 loc) · 3.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import {notEmptyString} from '@dfinity/utils';
import {spawn} from '@junobuild/cli-tools';
import {green, red, yellow} from 'kleur';
import {lt} from 'semver';
import {DOCKER_MIN_VERSION} from '../constants/dev.constants';
import type {CliEmulatorDerivedConfig} from '../types/emulator';
export const checkDockerVersion = async (): Promise<{valid: boolean | 'error'}> => {
try {
let output = '';
await spawn({
command: 'docker',
args: ['--version'],
stdout: (o) => (output += o)
});
const version = output.replaceAll(',', '').trim().split(' ')[2];
if (lt(version, DOCKER_MIN_VERSION)) {
console.log(
`Your version of Docker is ${yellow(version.trim())}. Juno CLI requires ${green(
DOCKER_MIN_VERSION
)} or a more recent version.`
);
return {valid: false};
}
} catch (_e: unknown) {
console.log(`${red('Cannot detect Docker version.')} Is Docker installed on your machine?`);
return {valid: 'error'};
}
return {valid: true};
};
export const assertContainerRunnerRunning = async ({
runner
}: Pick<CliEmulatorDerivedConfig, 'runner'>) => {
try {
// container does not support ps
// Reference: https://github.com/apple/container/pull/299
const args = runner === 'container' ? ['ls', '--quiet'] : ['ps', '--quiet'];
await spawn({
command: runner,
args,
silentOut: true
});
} catch (_e: unknown) {
console.log(red(`It looks like ${runner} does not appear to be running.`));
process.exit(1);
}
};
export const hasExistingContainer = async ({
containerName,
runner
}: Pick<CliEmulatorDerivedConfig, 'runner' | 'containerName'>): Promise<
{exist: boolean} | {err: unknown}
> => {
try {
let output = '';
const args =
runner === 'container' ? ['ls', '-aq'] : ['ps', '-aq', '-f', `name=^/${containerName}$`];
await spawn({
command: runner,
args,
stdout: (o) => (output += o),
silentOut: true
});
if (runner === 'container') {
const exist = output
.split(/\r?\n/)
.map((line) => line.trim())
.filter(notEmptyString)
.some((name) => name === containerName);
return {exist};
}
return {exist: output.trim().length > 0};
} catch (err: unknown) {
return {err};
}
};
export const isContainerRunning = async ({
containerName,
runner
}: Pick<CliEmulatorDerivedConfig, 'runner' | 'containerName'>): Promise<
{running: boolean} | {err: unknown}
> => {
try {
let output = '';
const args =
runner === 'container'
? ['ls', '--quiet']
: ['ps', '--quiet', '-f', `name=^/${containerName}$`];
await spawn({
command: runner,
args,
stdout: (o) => (output += o),
silentOut: true
});
if (runner === 'container') {
const running = output
.split(/\r?\n/)
.map((line) => line.trim())
.filter(notEmptyString)
.some((name) => name === containerName);
return {running};
}
return {running: output.trim().length > 0};
} catch (err: unknown) {
return {err};
}
};