build-strap 3.0.0-dev.42 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -34
  3. package/dist/src/ant.d.ts +19 -0
  4. package/dist/src/ant.js +18 -0
  5. package/dist/src/cert.d.ts +12 -0
  6. package/dist/src/cert.js +91 -0
  7. package/dist/src/clean.d.ts +4 -0
  8. package/dist/src/clean.js +11 -0
  9. package/dist/src/copy.d.ts +7 -0
  10. package/dist/src/copy.js +53 -0
  11. package/dist/src/cp.d.ts +17 -0
  12. package/dist/src/cp.js +88 -0
  13. package/dist/src/docker.container.d.ts +73 -0
  14. package/dist/src/docker.container.js +247 -0
  15. package/dist/src/docker.d.ts +68 -0
  16. package/dist/src/docker.js +188 -0
  17. package/dist/src/docker.network.d.ts +42 -0
  18. package/dist/src/docker.network.js +85 -0
  19. package/dist/src/docker.volume.d.ts +26 -0
  20. package/dist/src/docker.volume.js +62 -0
  21. package/dist/src/dockerCleanup.d.ts +38 -0
  22. package/dist/src/dockerCleanup.js +77 -0
  23. package/dist/src/dockerCompose.d.ts +154 -0
  24. package/dist/src/dockerCompose.js +439 -0
  25. package/dist/src/fs.d.ts +5 -0
  26. package/dist/src/fs.js +38 -0
  27. package/dist/src/git.d.ts +9 -0
  28. package/dist/src/git.js +24 -0
  29. package/dist/src/index.d.ts +20 -0
  30. package/dist/src/index.js +20 -0
  31. package/dist/src/maps.d.ts +33 -0
  32. package/dist/src/maps.js +41 -0
  33. package/dist/src/npm.d.ts +35 -0
  34. package/dist/src/npm.js +104 -0
  35. package/dist/src/pkg.d.ts +33 -0
  36. package/dist/src/pkg.js +33 -0
  37. package/dist/src/publish.d.ts +27 -0
  38. package/dist/src/publish.js +57 -0
  39. package/dist/src/run.d.ts +13 -0
  40. package/dist/src/run.js +44 -0
  41. package/dist/src/tgz.d.ts +13 -0
  42. package/dist/src/tgz.js +67 -0
  43. package/dist/src/version.d.ts +34 -0
  44. package/dist/src/version.js +101 -0
  45. package/dist/src/yarn.d.ts +26 -0
  46. package/dist/src/yarn.js +75 -0
  47. package/package.json +74 -20
  48. package/ant.js +0 -43
  49. package/ant.js.flow +0 -42
  50. package/artifactory.js +0 -617
  51. package/artifactory.js.flow +0 -616
  52. package/cert.conf +0 -20
  53. package/cert.js +0 -153
  54. package/cert.js.flow +0 -152
  55. package/clean.js +0 -20
  56. package/clean.js.flow +0 -19
  57. package/copy.js +0 -80
  58. package/copy.js.flow +0 -79
  59. package/cp.js +0 -173
  60. package/cp.js.flow +0 -172
  61. package/docker.container.js +0 -390
  62. package/docker.container.js.flow +0 -389
  63. package/docker.js +0 -368
  64. package/docker.js.flow +0 -367
  65. package/docker.network.js +0 -160
  66. package/docker.network.js.flow +0 -159
  67. package/docker.volume.js +0 -136
  68. package/docker.volume.js.flow +0 -136
  69. package/dockerCleanup.js +0 -152
  70. package/dockerCleanup.js.flow +0 -151
  71. package/dockerCompose.js +0 -766
  72. package/dockerCompose.js.flow +0 -765
  73. package/flow.js +0 -21
  74. package/flow.js.flow +0 -20
  75. package/fs.js +0 -95
  76. package/fs.js.flow +0 -96
  77. package/git.js +0 -35
  78. package/git.js.flow +0 -34
  79. package/hg.js +0 -35
  80. package/hg.js.flow +0 -34
  81. package/index.js +0 -27
  82. package/index.js.flow +0 -26
  83. package/inline-resources.js +0 -158
  84. package/inline-resources.js.flow +0 -157
  85. package/maps.js +0 -112
  86. package/maps.js.flow +0 -111
  87. package/npm.js +0 -145
  88. package/npm.js.flow +0 -144
  89. package/pkg.js +0 -81
  90. package/pkg.js.flow +0 -80
  91. package/publish.js +0 -145
  92. package/publish.js.flow +0 -144
  93. package/run.js +0 -90
  94. package/run.js.flow +0 -89
  95. package/src/ant.js +0 -42
  96. package/src/artifactory.js +0 -616
  97. package/src/cert.conf +0 -20
  98. package/src/cert.js +0 -152
  99. package/src/clean.js +0 -19
  100. package/src/copy.js +0 -79
  101. package/src/cp.js +0 -172
  102. package/src/docker.container.js +0 -389
  103. package/src/docker.js +0 -367
  104. package/src/docker.network.js +0 -159
  105. package/src/docker.volume.js +0 -136
  106. package/src/dockerCleanup.js +0 -151
  107. package/src/dockerCompose.js +0 -765
  108. package/src/flow.js +0 -20
  109. package/src/fs.js +0 -96
  110. package/src/git.js +0 -34
  111. package/src/hg.js +0 -34
  112. package/src/index.js +0 -26
  113. package/src/inline-resources.js +0 -157
  114. package/src/maps.js +0 -111
  115. package/src/npm.js +0 -144
  116. package/src/pkg.js +0 -80
  117. package/src/publish.js +0 -144
  118. package/src/run.js +0 -89
  119. package/src/test.js +0 -55
  120. package/src/tgz.js +0 -101
  121. package/src/version.js +0 -141
  122. package/src/yarn.js +0 -123
  123. package/test.js +0 -56
  124. package/test.js.flow +0 -55
  125. package/tgz.js +0 -102
  126. package/tgz.js.flow +0 -101
  127. package/version.js +0 -142
  128. package/version.js.flow +0 -141
  129. package/yarn.js +0 -124
  130. package/yarn.js.flow +0 -123
package/docker.js.flow DELETED
@@ -1,367 +0,0 @@
1
- // @flow
2
- import path from 'path';
3
- import bytes from 'bytes';
4
- import isReachable from 'is-reachable';
5
- import moment from 'moment';
6
- import { buildLog } from './run';
7
- import { getCfg, getPkgName, getPkgScope } from './pkg';
8
- import { spawn } from './cp';
9
- import { getVersion, getDevBranch } from './version';
10
- import {
11
- dockerContainerRunDaemon,
12
- dockerContainerKill,
13
- } from './docker.container';
14
- import { dockerNetworkConnect } from './docker.network';
15
-
16
- export type DockerConfig = {
17
- registry?: string,
18
- repository?: string,
19
- name?: string,
20
- };
21
-
22
- export function getDockerConfig(): DockerConfig {
23
- return getCfg().docker || {};
24
- }
25
-
26
- export const parseDockerDate = (date: string): Date =>
27
- moment(date, 'YYYY-MM-DD HH:mm:ss ZZ').toDate();
28
-
29
- export async function dockerBuild(
30
- tags: string[] = ['latest'],
31
- buildArgs: string[] = [],
32
- target: ?string = null,
33
- extraArgs?: ?(string[]) = [],
34
- repo: string = getDockerRepo(),
35
- dockerFile: string = './Dockerfile',
36
- workDir: string = '.',
37
- ): Promise<string> {
38
- const args = [
39
- 'build',
40
- ...['-f', path.resolve(dockerFile)],
41
- ...(target ? ['--target', target] : []),
42
- ...tags.reduce((ar, t) => [...ar, '-t', `${repo}:${t}`], []),
43
- ...buildArgs.reduce((ar, a) => [...ar, '--build-arg', a], []),
44
- ...(extraArgs || []),
45
- path.resolve(workDir),
46
- ];
47
-
48
- return spawn('docker', args, { stdio: 'inherit' });
49
- }
50
-
51
- export async function dockerTag(
52
- imageId: string,
53
- tags: string[] = ['latest'],
54
- repo?: string = getDockerRepo(),
55
- ): Promise<void> {
56
- await Promise.all(
57
- tags.map(async (t) => {
58
- await spawn('docker', ['tag', imageId, `${repo}:${t}`]);
59
- buildLog(`Tagged image ${imageId} as ${repo}:${t}`);
60
- }),
61
- );
62
- }
63
-
64
- /**
65
- * Apply the standard convention for tagging the docker image for the project,
66
- * based on the source control branch being built.
67
- * For releases, applies `latest`, `M.m.p`, `M.m`, `M`
68
- * For release candidates, applies `latest-rc`
69
- * For feature branches, applies `latest-feature`
70
- * For development branch, applies `latest-dev`
71
- * All other branches, no tag is applies
72
- * @param {string} imageId id of the docker image to which to apply the tags
73
- * @param {string} repo optional override of the docker repo url to use (derived from package.json by default)
74
- */
75
- export async function dockerTagVersion(
76
- imageId: string,
77
- repo?: string = getDockerRepo(),
78
- ) {
79
- const { isRelease, major, minor, patch, branch } = await getVersion();
80
- // determine what tags to apply
81
- if (isRelease) {
82
- await dockerTag(
83
- imageId,
84
- ['latest', `${major}`, `${major}.${minor}`, `${major}.${minor}.${patch}`],
85
- repo,
86
- );
87
- } else if (branch === getDevBranch()) {
88
- await dockerTag(imageId, ['latest-dev'], repo);
89
- } else if (branch.match(/^(release|patch)-/)) {
90
- await dockerTag(imageId, ['latest-rc'], repo);
91
- } else if (branch.match(/^feature-/)) {
92
- await dockerTag(imageId, ['latest-feature'], repo);
93
- }
94
- }
95
-
96
- export type DockerImage = {
97
- repository: string,
98
- tag: string,
99
- id: string,
100
- digest: string,
101
- created: Date,
102
- size: number,
103
- };
104
-
105
- export type DockerImageFilter = (i: DockerImage) => boolean;
106
-
107
- export async function dockerImages(
108
- repo?: ?string = getDockerRepo(),
109
- filter?: ?DockerImageFilter = null,
110
- ): Promise<DockerImage[]> {
111
- return (
112
- await spawn(
113
- 'docker',
114
- ['images', '--format', `{{json .}}`, ...(repo ? [repo] : [])],
115
- { captureOutput: true },
116
- )
117
- )
118
- .split('\n')
119
- .filter((line) => !!line.trim())
120
- .map((l) => {
121
- const {
122
- Repository: repository,
123
- Tag: tag,
124
- ID: id,
125
- Digest: digest,
126
- CreatedAt,
127
- Size,
128
- } = JSON.parse(l.trim());
129
- return {
130
- repository,
131
- tag,
132
- id,
133
- digest,
134
- created: parseDockerDate(CreatedAt),
135
- size: bytes.parse(Size),
136
- };
137
- })
138
- .filter(
139
- (m) =>
140
- (m && m.id) != null &&
141
- (typeof filter === 'function' ? filter(m) : true),
142
- );
143
- }
144
-
145
- export async function getDockerId(
146
- tag: string = 'latest',
147
- repo?: ?string,
148
- ): Promise<string> {
149
- return (await dockerImages(repo, (m) => m.tag === tag)).map((m) => m.id)[0];
150
- }
151
-
152
- export async function getUntaggedDockerIds(
153
- repo?: ?string,
154
- filter?: ?DockerImageFilter = null,
155
- ): Promise<string[]> {
156
- return (
157
- await dockerImages(
158
- repo,
159
- (m) =>
160
- m.tag === '<none>' && (typeof filter === 'function' ? filter(m) : true),
161
- )
162
- ).map((m) => m.id);
163
- }
164
-
165
- export async function getDockerTags(
166
- id?: ?string,
167
- repo?: ?string,
168
- fullName: boolean = false,
169
- filter?: ?DockerImageFilter = null,
170
- ): Promise<string[]> {
171
- return (
172
- await dockerImages(
173
- repo,
174
- (m) =>
175
- (!id || m.id === id) &&
176
- (typeof filter === 'function' ? filter(m) : true),
177
- )
178
- ).map((m) => (fullName ? `${m.repository}:${m.tag}` : m.tag));
179
- }
180
-
181
- export async function getDockerDigest(
182
- imageId: string,
183
- repo?: string,
184
- ): Promise<string> {
185
- return (await dockerImages(repo, (m) => m.id === imageId)).map(
186
- (m) => m.digest,
187
- )[0];
188
- }
189
-
190
- export async function dockerLogin(
191
- user: string,
192
- password: string,
193
- registry: string,
194
- ): Promise<void> {
195
- const reg = registry || getDockerConfig().registry;
196
- await spawn(
197
- 'docker',
198
- [
199
- 'login',
200
- '-u',
201
- user || process.env.ARTIFACTORY_USER || '',
202
- '-p',
203
- password || process.env.ARTIFACTORY_PASSWORD || '',
204
- ...(reg ? [reg] : []),
205
- ],
206
- { stdio: 'inherit' },
207
- );
208
- }
209
-
210
- export async function dockerPush(
211
- tags?: string[] = ['latest'],
212
- repo?: string = getDockerRepo(),
213
- ) {
214
- // do this sequentially, so you don't push the same image simultaneously
215
- await tags.reduce(async (prev, tag) => {
216
- await prev;
217
- await spawn('docker', ['push', `${repo}:${tag}`], { stdio: 'inherit' });
218
- }, Promise.resolve());
219
- }
220
-
221
- export type DockerPullOptions = {
222
- image: string,
223
- offline?: boolean,
224
- testUrl?: ?string,
225
- };
226
-
227
- export async function dockerPull({
228
- image,
229
- offline = process.argv.includes('--offline'),
230
- testUrl,
231
- }: DockerPullOptions) {
232
- if (
233
- offline ||
234
- !(await isReachable(testUrl || 'https://hub.docker.com'))
235
- ) {
236
- if (offline === false) {
237
- throw new Error('Offline, cannot docker pull');
238
- }
239
- buildLog('It looks like you are offline, skipping docker pull');
240
- } else {
241
- // throws on failure
242
- await spawn('docker', ['pull', image], { stdio: 'inherit' });
243
- }
244
- }
245
-
246
- export async function dockerRmi(
247
- images: string[] = [],
248
- ignoreErrors: boolean = true,
249
- ): Promise<void> {
250
- // must do these sequentially, or they will interfere with each other
251
- await images.reduce(async (prev, image) => {
252
- await prev;
253
- await spawn('docker', ['rmi', image], { stdio: 'inherit' }).catch((err) => {
254
- if (ignoreErrors) {
255
- buildLog(
256
- `Warning (ignored Error): Failed to rm image(s): ${err.message}`,
257
- );
258
- } else {
259
- throw err;
260
- }
261
- });
262
- }, Promise.resolve());
263
- }
264
-
265
- export function getDockerRepo(): string {
266
- const { registry, repository: dkrRepo, name: dkrName } = getDockerConfig();
267
- const repository = dkrRepo || getPkgScope();
268
- const name = dkrName || getPkgName(false);
269
- if (!repository || !name) {
270
- throw new Error(
271
- 'Docker configuration is missing or incomplete in package.json',
272
- );
273
- }
274
- return `${registry ? `${registry}/` : ''}${repository}/${name}`;
275
- }
276
-
277
- export type PullAndRunContainerOptions = {
278
- ...DockerPullOptions,
279
- runArgs?: string[],
280
- cmd?: string[],
281
- network?: ?string,
282
- alias?: ?string,
283
- };
284
-
285
- export async function dockerPullAndRunContainer(
286
- image: string,
287
- options: PullAndRunContainerOptions = {},
288
- ): Promise<string> {
289
- const {
290
- runArgs = [],
291
- cmd = [],
292
- network,
293
- alias,
294
- offline = process.argv.includes('--offline'),
295
- testUrl,
296
- } = options;
297
-
298
- try {
299
- await dockerPull({ image, offline, testUrl });
300
- } catch (err) {
301
- buildLog(`docker pull failed (${err.message}), attempting to continue...`);
302
- }
303
- const { id } = await dockerContainerRunDaemon({ image, runArgs, cmd });
304
- if (network) {
305
- await dockerNetworkConnect(network, id, alias);
306
- }
307
- return id;
308
- }
309
-
310
- export type CopyFilePathConfig = {
311
- from: string,
312
- to: string,
313
- };
314
-
315
- export type CopyFilesFromDockerImageConfig = {
316
- imageId: string,
317
- filePaths: CopyFilePathConfig[],
318
- ignoreErrors?: ?boolean,
319
- };
320
-
321
- export async function copyFilesFromDockerImage({
322
- imageId,
323
- filePaths,
324
- ignoreErrors,
325
- }: CopyFilesFromDockerImageConfig): Promise<any> {
326
- const container = await dockerContainerRunDaemon({
327
- image: imageId,
328
- runArgs: ['-it', '--rm', '--entrypoint=/bin/bash'],
329
- cmd: ['read', '-p', 'pause'],
330
- });
331
-
332
- buildLog(`Copying Files from Docker Image - imageId (${imageId})`);
333
-
334
- const spawnOptions = {
335
- stdio: 'inherit',
336
- pipeOutput: true,
337
- captureOutput: false,
338
- };
339
- const copyErrors = [];
340
-
341
- try {
342
- filePaths.forEach(async (fp) => {
343
- // Try to copy from the Debug Folder
344
- try {
345
- await spawn(
346
- 'docker',
347
- ['cp', `${container.id}:${fp.from}`, fp.to],
348
- spawnOptions,
349
- );
350
- buildLog(`Copied ${fp.from} => ${fp.to}`);
351
- } catch (error) {
352
- copyErrors.push(error);
353
- buildLog(`Error copying file ${fp.from}`);
354
- }
355
- });
356
- } finally {
357
- try {
358
- await dockerContainerKill(container.id);
359
- } catch (error) {
360
- copyErrors.push(error);
361
- }
362
- }
363
-
364
- if (copyErrors.length > 0 && ignoreErrors !== true) {
365
- throw new Error('Some files failed to copy');
366
- }
367
- }
package/docker.network.js DELETED
@@ -1,160 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports._dockerNetworkLs = _dockerNetworkLs;exports.dockerNetworkConnect = dockerNetworkConnect;exports.dockerNetworkCreate = dockerNetworkCreate;exports.dockerNetworkDelete = dockerNetworkDelete;exports.dockerNetworkFind = dockerNetworkFind;exports.dockerNetworkLs = void 0;exports.dockerNetworkRm = dockerNetworkRm;
2
- var _throttle = _interopRequireDefault(require("lodash/throttle"));
3
- var _cp = require("./cp");
4
- var _docker = require("./docker");function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
- // calling this function in rapid succession can lead to errors.
23
- // prefer throttled version
24
- async function _dockerNetworkLs({
25
- filter } =
26
- {}) {
27
- return (
28
- await (0, _cp.spawn)('docker', ['network', 'ls', '--format', '{{json .}}'], {
29
- captureOutput: true })).
30
-
31
-
32
- split('\n').
33
- filter((line) => !!line.trim()).
34
- map((line) => {
35
- const {
36
- ID: id,
37
- Name: name,
38
- Driver: driver,
39
- Scope: scope,
40
- CreatedAt,
41
- IPv6,
42
- Labels } =
43
- JSON.parse(line.trim());
44
- return {
45
- id,
46
- name,
47
- driver,
48
- scope,
49
- created: (0, _docker.parseDockerDate)(CreatedAt),
50
- IPv6: IPv6 === 'true',
51
- labels: Labels.split(',').map((l) => l.trim()),
52
- exists: async () => !!(await dockerNetworkFind(id)),
53
- rm: async () => dockerNetworkRm(id) };
54
-
55
- }).
56
- filter((n) => n.id && (typeof filter === 'function' ? filter(n) : true));
57
- }
58
- const dockerNetworkLs =
59
-
60
- (0, _throttle.default)(_dockerNetworkLs, 500, {
61
- trailing: false });exports.dockerNetworkLs = dockerNetworkLs;
62
-
63
-
64
- async function dockerNetworkFind(
65
- networkName,
66
- options)
67
- {
68
- return (await dockerNetworkLs(options)).find(
69
- (n) => n.name === networkName || n.id === networkName);
70
-
71
- }
72
-
73
-
74
-
75
-
76
-
77
-
78
-
79
-
80
-
81
-
82
-
83
-
84
-
85
-
86
- async function dockerNetworkCreate(
87
- networkName,
88
- {
89
- driver,
90
- driverOpts = {},
91
- ipRange,
92
- gateways = [],
93
- subnets = [],
94
- auxAddresses = [],
95
- ingress,
96
- internal,
97
- ipv6,
98
- labels = [] } =
99
- {})
100
- {
101
- const existing = await dockerNetworkFind(networkName);
102
- if (existing) return existing;
103
- await (0, _cp.spawn)('docker', [
104
- 'network',
105
- 'create',
106
- ...labels.flatMap((l) => ['--label', l]),
107
- ...gateways.flatMap((g) => ['--gateway', g]),
108
- ...subnets.flatMap((s) => ['--subnet', s]),
109
- ...auxAddresses.flatMap((a) => ['--aux-address', a]),
110
- ...(ipRange ? ['--ip-range', ipRange] : []),
111
- ...(ingress ? ['--ingress'] : []),
112
- ...(internal ? ['--internal'] : []),
113
- ...(ipv6 ? ['--ipv6'] : []),
114
- ...(driver ? ['-d', driver] : []),
115
- ...Object.entries(driverOpts).flatMap(([k, v]) => [
116
- '-o',
117
- `${k}=${v}`]),
118
-
119
- networkName]);
120
-
121
- return dockerNetworkFind(networkName);
122
- }
123
-
124
- /**
125
- * Removes a network by id
126
- * @param {string} id The id of the network
127
- */
128
- async function dockerNetworkRm(id) {
129
- await (0, _cp.spawn)('docker', ['network', 'rm', id]);
130
- }
131
-
132
- /**
133
- * Removes all networks with the given name
134
- * @param {string} networkName The name of the network
135
- */
136
- async function dockerNetworkDelete(networkName) {
137
- let existing;
138
- // eslint-disable-next-line no-cond-assign, no-await-in-loop
139
- while (existing = await dockerNetworkFind(networkName)) {
140
- // eslint-disable-next-line no-await-in-loop
141
- await existing.rm();
142
- }
143
- }
144
-
145
- async function dockerNetworkConnect(
146
- networkName,
147
- containerId,
148
- alias)
149
- {
150
- const net = await dockerNetworkCreate(networkName);
151
- if (!net) throw new Error('Failed to create docker network');
152
- await (0, _cp.spawn)('docker', [
153
- 'network',
154
- 'connect',
155
- ...(alias ? ['--alias', alias] : []),
156
- net.id,
157
- containerId]);
158
-
159
- }
160
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kb2NrZXIubmV0d29yay5qcyJdLCJuYW1lcyI6WyJfZG9ja2VyTmV0d29ya0xzIiwiZmlsdGVyIiwiY2FwdHVyZU91dHB1dCIsInNwbGl0IiwibGluZSIsInRyaW0iLCJtYXAiLCJJRCIsImlkIiwiTmFtZSIsIm5hbWUiLCJEcml2ZXIiLCJkcml2ZXIiLCJTY29wZSIsInNjb3BlIiwiQ3JlYXRlZEF0IiwiSVB2NiIsIkxhYmVscyIsIkpTT04iLCJwYXJzZSIsImNyZWF0ZWQiLCJsYWJlbHMiLCJsIiwiZXhpc3RzIiwiZG9ja2VyTmV0d29ya0ZpbmQiLCJybSIsImRvY2tlck5ldHdvcmtSbSIsIm4iLCJkb2NrZXJOZXR3b3JrTHMiLCJ0cmFpbGluZyIsIm5ldHdvcmtOYW1lIiwib3B0aW9ucyIsImZpbmQiLCJkb2NrZXJOZXR3b3JrQ3JlYXRlIiwiZHJpdmVyT3B0cyIsImlwUmFuZ2UiLCJnYXRld2F5cyIsInN1Ym5ldHMiLCJhdXhBZGRyZXNzZXMiLCJpbmdyZXNzIiwiaW50ZXJuYWwiLCJpcHY2IiwiZXhpc3RpbmciLCJmbGF0TWFwIiwiZyIsInMiLCJhIiwiT2JqZWN0IiwiZW50cmllcyIsImsiLCJ2IiwiZG9ja2VyTmV0d29ya0RlbGV0ZSIsImRvY2tlck5ldHdvcmtDb25uZWN0IiwiY29udGFpbmVySWQiLCJhbGlhcyIsIm5ldCIsIkVycm9yIl0sIm1hcHBpbmdzIjoiO0FBQ0E7QUFDQTtBQUNBLGtDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkE7QUFDQTtBQUNPLGVBQWVBLGdCQUFmLENBQWdDO0FBQ3JDQyxFQUFBQSxNQURxQztBQUVYLEVBRnJCLEVBRW1EO0FBQ3hELFNBQU87QUFDTCxRQUFNLGVBQU0sUUFBTixFQUFnQixDQUFDLFNBQUQsRUFBWSxJQUFaLEVBQWtCLFVBQWxCLEVBQThCLFlBQTlCLENBQWhCLEVBQTZEO0FBQ2pFQyxJQUFBQSxhQUFhLEVBQUUsSUFEa0QsRUFBN0QsQ0FERDs7O0FBS0pDLEVBQUFBLEtBTEksQ0FLRSxJ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WSxRQUFKO0FBQ0E7QUFDQSxTQUFRQSxRQUFRLEdBQUcsTUFBTWxCLGlCQUFpQixDQUFDTSxXQUFELENBQTFDLEVBQTBEO0FBQ3hEO0FBQ0EsVUFBTVksUUFBUSxDQUFDakIsRUFBVCxFQUFOO0FBQ0Q7QUFDRjs7QUFFTSxlQUFlMkIsb0JBQWY7QUFDTHRCLFdBREs7QUFFTHVCLFdBRks7QUFHTEMsS0FISztBQUlMO0FBQ0EsUUFBTUMsR0FBRyxHQUFHLE1BQU10QixtQkFBbUIsQ0FBQ0gsV0FBRCxDQUFyQztBQUNBLE1BQUksQ0FBQ3lCLEdBQUwsRUFBVSxNQUFNLElBQUlDLEtBQUosQ0FBVSxpQ0FBVixDQUFOO0FBQ1YsUUFBTSxlQUFNLFFBQU4sRUFBZ0I7QUFDcEIsV0FEb0I7QUFFcEIsV0FGb0I7QUFHcEIsTUFBSUYsS0FBSyxHQUFHLENBQUMsU0FBRCxFQUFZQSxLQUFaLENBQUgsR0FBd0IsRUFBakMsQ0FIb0I7QUFJcEJDLEVBQUFBLEdBQUcsQ0FBQy9DLEVBSmdCO0FBS3BCNkMsRUFBQUEsV0FMb0IsQ0FBaEIsQ0FBTjs7QUFPRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIEBmbG93XG5pbXBvcnQgdGhyb3R0bGUgZnJvbSAnbG9kYXNoL3Rocm90dGxlJztcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnLi9jcCc7XG5pbXBvcnQgeyBwYXJzZURvY2tlckRhdGUgfSBmcm9tICcuL2RvY2tlcic7XG5cbmV4cG9ydCB0eXBlIERvY2tlck5ldHdvcmsgPSB7fFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGRyaXZlcjogc3RyaW5nLFxuICBzY29wZTogc3RyaW5nLFxuICBjcmVhdGVkOiBEYXRlLFxuICBJUHY2OiBib29sZWFuLFxuICBsYWJlbHM6IHN0cmluZ1tdLFxuICBleGlzdHM6ICgpID0+IFByb21pc2U8Ym9vbGVhbj4sXG4gIHJtOiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxufH07XG5cbnR5cGUgRG9ja2VyTmV0d29ya0xzT3B0aW9ucyA9IHtcbiAgZmlsdGVyPzogKG5ldHdvcms6IERvY2tlck5ldHdvcmspID0+IGJvb2xlYW4sXG59O1xuXG4vLyBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gaW4gcmFwaWQgc3VjY2Vzc2lvbiBjYW4gbGVhZCB0byBlcnJvcnMuXG4vLyBwcmVmZXIgdGhyb3R0bGVkIHZlcnNpb25cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfZG9ja2VyTmV0d29ya0xzKHtcbiAgZmlsdGVyLFxufTogRG9ja2VyTmV0d29ya0xzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxEb2NrZXJOZXR3b3JrW10+IHtcbiAgcmV0dXJuIChcbiAgICBhd2FpdCBzcGF3bignZG9ja2VyJywgWyduZXR3b3JrJywgJ2xzJywgJy0tZm9ybWF0JywgJ3t7anNvbiAufX0nXSwge1xuICAgICAgY2FwdHVyZU91dHB1dDogdHJ1ZSxcbiAgICB9KVxuICApXG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5maWx0ZXIoKGxpbmUpID0+ICEhbGluZS50cmltKCkpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBJRDogaWQsXG4gICAgICAgIE5hbWU6IG5hbWUsXG4gICAgICAgIERyaXZlcjogZHJpdmVyLFxuICAgICAgICBTY29wZTogc2NvcGUsXG4gICAgICAgIENyZWF0ZWRBdCxcbiAgICAgICAgSVB2NixcbiAgICAgICAgTGFiZWxzLFxuICAgICAgfSA9IEpTT04ucGFyc2UobGluZS50cmltKCkpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRyaXZlcixcbiAgICAgICAgc2NvcGUsXG4gICAgICAgIGNyZWF0ZWQ6IHBhcnNlRG9ja2VyRGF0ZShDcmVhdGVkQXQpLFxuICAgICAgICBJUHY2OiBJUHY2ID09PSAndHJ1ZScsXG4gICAgICAgIGxhYmVsczogTGFiZWxzLnNwbGl0KCcsJykubWFwKChsKSA9PiBsLnRyaW0oKSksXG4gICAgICAgIGV4aXN0czogYXN5bmMgKCkgPT4gISEoYXdhaXQgZG9ja2VyTmV0d29ya0ZpbmQoaWQpKSxcbiAgICAgICAgcm06IGFzeW5jICgpID0+IGRvY2tlck5ldHdvcmtSbShpZCksXG4gICAgICB9O1xuICAgIH0pXG4gICAgLmZpbHRlcigobikgPT4gbi5pZCAmJiAodHlwZW9mIGZpbHRlciA9PT0gJ2Z1bmN0aW9uJyA/IGZpbHRlcihuKSA6IHRydWUpKTtcbn1cbmV4cG9ydCBjb25zdCBkb2NrZXJOZXR3b3JrTHM6IChcbiAgRG9ja2VyTmV0d29ya0xzT3B0aW9ucyB8IHZvaWQsXG4pID0+IFByb21pc2U8RG9ja2VyTmV0d29ya1tdPiA9IHRocm90dGxlKF9kb2NrZXJOZXR3b3JrTHMsIDUwMCwge1xuICB0cmFpbGluZzogZmFsc2UsXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvY2tlck5ldHdvcmtGaW5kKFxuICBuZXR3b3JrTmFtZTogc3RyaW5nLFxuICBvcHRpb25zPzogRG9ja2VyTmV0d29ya0xzT3B0aW9ucyxcbik6IFByb21pc2U8P0RvY2tlck5ldHdvcms+IHtcbiAgcmV0dXJuIChhd2FpdCBkb2NrZXJOZXR3b3JrTHMob3B0aW9ucykpLmZpbmQoXG4gICAgKG4pID0+IG4ubmFtZSA9PT0gbmV0d29ya05hbWUgfHwgbi5pZCA9PT0gbmV0d29ya05hbWUsXG4gICk7XG59XG5cbmV4cG9ydCB0eXBlIERvY2tlck5ldHdvcmtDcmVhdGVPcHRpb25zID0ge3xcbiAgZHJpdmVyPzogc3RyaW5nLFxuICBkcml2ZXJPcHRzPzogeyBbc3RyaW5nXTogc3RyaW5nIH0sXG4gIGlwUmFuZ2U/OiBzdHJpbmcsXG4gIGdhdGV3YXlzPzogc3RyaW5nW10sXG4gIHN1Ym5ldHM/OiBzdHJpbmdbXSxcbiAgYXV4QWRkcmVzc2VzPzogc3RyaW5nW10sXG4gIGluZ3Jlc3M/OiBib29sZWFuLFxuICBpbnRlcm5hbD86IGJvb2xlYW4sXG4gIGlwdjY/OiBib29sZWFuLFxuICBsYWJlbHM/OiBzdHJpbmdbXSxcbnx9O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZG9ja2VyTmV0d29ya0NyZWF0ZShcbiAgbmV0d29ya05hbWU6IHN0cmluZyxcbiAge1xuICAgIGRyaXZlcixcbiAgICBkcml2ZXJPcHRzID0ge30sXG4gICAgaXBSYW5nZSxcbiAgICBnYXRld2F5cyA9IFtdLFxuICAgIHN1Ym5ldHMgPSBbXSxcbiAgICBhdXhBZGRyZXNzZXMgPSBbXSxcbiAgICBpbmdyZXNzLFxuICAgIGludGVybmFsLFxuICAgIGlwdjYsXG4gICAgbGFiZWxzID0gW10sXG4gIH06IERvY2tlck5ldHdvcmtDcmVhdGVPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPD9Eb2NrZXJOZXR3b3JrPiB7XG4gIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgZG9ja2VyTmV0d29ya0ZpbmQobmV0d29ya05hbWUpO1xuICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcbiAgYXdhaXQgc3Bhd24oJ2RvY2tlcicsIFtcbiAgICAnbmV0d29yaycsXG4gICAgJ2NyZWF0ZScsXG4gICAgLi4ubGFiZWxzLmZsYXRNYXAoKGwpID0+IFsnLS1sYWJlbCcsIGxdKSxcbiAgICAuLi5nYXRld2F5cy5mbGF0TWFwKChnKSA9PiBbJy0tZ2F0ZXdheScsIGddKSxcbiAgICAuLi5zdWJuZXRzLmZsYXRNYXAoKHMpID0+IFsnLS1zdWJuZXQnLCBzXSksXG4gICAgLi4uYXV4QWRkcmVzc2VzLmZsYXRNYXAoKGEpID0+IFsnLS1hdXgtYWRkcmVzcycsIGFdKSxcbiAgICAuLi4oaXBSYW5nZSA/IFsnLS1pcC1yYW5nZScsIGlwUmFuZ2VdIDogW10pLFxuICAgIC4uLihpbmdyZXNzID8gWyctLWluZ3Jlc3MnXSA6IFtdKSxcbiAgICAuLi4oaW50ZXJuYWwgPyBbJy0taW50ZXJuYWwnXSA6IFtdKSxcbiAgICAuLi4oaXB2NiA/IFsnLS1pcHY2J10gOiBbXSksXG4gICAgLi4uKGRyaXZlciA/IFsnLWQnLCBkcml2ZXJdIDogW10pLFxuICAgIC4uLk9iamVjdC5lbnRyaWVzKGRyaXZlck9wdHMpLmZsYXRNYXAoKFtrLCB2XSkgPT4gW1xuICAgICAgJy1vJyxcbiAgICAgIGAke2t9PSR7KHY6IGFueSl9YCxcbiAgICBdKSxcbiAgICBuZXR3b3JrTmFtZSxcbiAgXSk7XG4gIHJldHVybiBkb2NrZXJOZXR3b3JrRmluZChuZXR3b3JrTmFtZSk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhIG5ldHdvcmsgYnkgaWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCBUaGUgaWQgb2YgdGhlIG5ldHdvcmtcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvY2tlck5ldHdvcmtSbShpZDogc3RyaW5nKSB7XG4gIGF3YWl0IHNwYXduKCdkb2NrZXInLCBbJ25ldHdvcmsnLCAncm0nLCBpZF0pO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgYWxsIG5ldHdvcmtzIHdpdGggdGhlIGdpdmVuIG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuZXR3b3JrTmFtZSBUaGUgbmFtZSBvZiB0aGUgbmV0d29ya1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZG9ja2VyTmV0d29ya0RlbGV0ZShuZXR3b3JrTmFtZTogc3RyaW5nKSB7XG4gIGxldCBleGlzdGluZztcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbmQtYXNzaWduLCBuby1hd2FpdC1pbi1sb29wXG4gIHdoaWxlICgoZXhpc3RpbmcgPSBhd2FpdCBkb2NrZXJOZXR3b3JrRmluZChuZXR3b3JrTmFtZSkpKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICBhd2FpdCBleGlzdGluZy5ybSgpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb2NrZXJOZXR3b3JrQ29ubmVjdChcbiAgbmV0d29ya05hbWU6IHN0cmluZyxcbiAgY29udGFpbmVySWQ6IHN0cmluZyxcbiAgYWxpYXM/OiA/c3RyaW5nLFxuKSB7XG4gIGNvbnN0IG5ldCA9IGF3YWl0IGRvY2tlck5ldHdvcmtDcmVhdGUobmV0d29ya05hbWUpO1xuICBpZiAoIW5ldCkgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGRvY2tlciBuZXR3b3JrJyk7XG4gIGF3YWl0IHNwYXduKCdkb2NrZXInLCBbXG4gICAgJ25ldHdvcmsnLFxuICAgICdjb25uZWN0JyxcbiAgICAuLi4oYWxpYXMgPyBbJy0tYWxpYXMnLCBhbGlhc10gOiBbXSksXG4gICAgbmV0LmlkLFxuICAgIGNvbnRhaW5lcklkLFxuICBdKTtcbn1cbiJdfQ==
@@ -1,159 +0,0 @@
1
- // @flow
2
- import throttle from 'lodash/throttle';
3
- import { spawn } from './cp';
4
- import { parseDockerDate } from './docker';
5
-
6
- export type DockerNetwork = {|
7
- id: string,
8
- name: string,
9
- driver: string,
10
- scope: string,
11
- created: Date,
12
- IPv6: boolean,
13
- labels: string[],
14
- exists: () => Promise<boolean>,
15
- rm: () => Promise<void>,
16
- |};
17
-
18
- type DockerNetworkLsOptions = {
19
- filter?: (network: DockerNetwork) => boolean,
20
- };
21
-
22
- // calling this function in rapid succession can lead to errors.
23
- // prefer throttled version
24
- export async function _dockerNetworkLs({
25
- filter,
26
- }: DockerNetworkLsOptions = {}): Promise<DockerNetwork[]> {
27
- return (
28
- await spawn('docker', ['network', 'ls', '--format', '{{json .}}'], {
29
- captureOutput: true,
30
- })
31
- )
32
- .split('\n')
33
- .filter((line) => !!line.trim())
34
- .map((line) => {
35
- const {
36
- ID: id,
37
- Name: name,
38
- Driver: driver,
39
- Scope: scope,
40
- CreatedAt,
41
- IPv6,
42
- Labels,
43
- } = JSON.parse(line.trim());
44
- return {
45
- id,
46
- name,
47
- driver,
48
- scope,
49
- created: parseDockerDate(CreatedAt),
50
- IPv6: IPv6 === 'true',
51
- labels: Labels.split(',').map((l) => l.trim()),
52
- exists: async () => !!(await dockerNetworkFind(id)),
53
- rm: async () => dockerNetworkRm(id),
54
- };
55
- })
56
- .filter((n) => n.id && (typeof filter === 'function' ? filter(n) : true));
57
- }
58
- export const dockerNetworkLs: (
59
- DockerNetworkLsOptions | void,
60
- ) => Promise<DockerNetwork[]> = throttle(_dockerNetworkLs, 500, {
61
- trailing: false,
62
- });
63
-
64
- export async function dockerNetworkFind(
65
- networkName: string,
66
- options?: DockerNetworkLsOptions,
67
- ): Promise<?DockerNetwork> {
68
- return (await dockerNetworkLs(options)).find(
69
- (n) => n.name === networkName || n.id === networkName,
70
- );
71
- }
72
-
73
- export type DockerNetworkCreateOptions = {|
74
- driver?: string,
75
- driverOpts?: { [string]: string },
76
- ipRange?: string,
77
- gateways?: string[],
78
- subnets?: string[],
79
- auxAddresses?: string[],
80
- ingress?: boolean,
81
- internal?: boolean,
82
- ipv6?: boolean,
83
- labels?: string[],
84
- |};
85
-
86
- export async function dockerNetworkCreate(
87
- networkName: string,
88
- {
89
- driver,
90
- driverOpts = {},
91
- ipRange,
92
- gateways = [],
93
- subnets = [],
94
- auxAddresses = [],
95
- ingress,
96
- internal,
97
- ipv6,
98
- labels = [],
99
- }: DockerNetworkCreateOptions = {},
100
- ): Promise<?DockerNetwork> {
101
- const existing = await dockerNetworkFind(networkName);
102
- if (existing) return existing;
103
- await spawn('docker', [
104
- 'network',
105
- 'create',
106
- ...labels.flatMap((l) => ['--label', l]),
107
- ...gateways.flatMap((g) => ['--gateway', g]),
108
- ...subnets.flatMap((s) => ['--subnet', s]),
109
- ...auxAddresses.flatMap((a) => ['--aux-address', a]),
110
- ...(ipRange ? ['--ip-range', ipRange] : []),
111
- ...(ingress ? ['--ingress'] : []),
112
- ...(internal ? ['--internal'] : []),
113
- ...(ipv6 ? ['--ipv6'] : []),
114
- ...(driver ? ['-d', driver] : []),
115
- ...Object.entries(driverOpts).flatMap(([k, v]) => [
116
- '-o',
117
- `${k}=${(v: any)}`,
118
- ]),
119
- networkName,
120
- ]);
121
- return dockerNetworkFind(networkName);
122
- }
123
-
124
- /**
125
- * Removes a network by id
126
- * @param {string} id The id of the network
127
- */
128
- export async function dockerNetworkRm(id: string) {
129
- await spawn('docker', ['network', 'rm', id]);
130
- }
131
-
132
- /**
133
- * Removes all networks with the given name
134
- * @param {string} networkName The name of the network
135
- */
136
- export async function dockerNetworkDelete(networkName: string) {
137
- let existing;
138
- // eslint-disable-next-line no-cond-assign, no-await-in-loop
139
- while ((existing = await dockerNetworkFind(networkName))) {
140
- // eslint-disable-next-line no-await-in-loop
141
- await existing.rm();
142
- }
143
- }
144
-
145
- export async function dockerNetworkConnect(
146
- networkName: string,
147
- containerId: string,
148
- alias?: ?string,
149
- ) {
150
- const net = await dockerNetworkCreate(networkName);
151
- if (!net) throw new Error('Failed to create docker network');
152
- await spawn('docker', [
153
- 'network',
154
- 'connect',
155
- ...(alias ? ['--alias', alias] : []),
156
- net.id,
157
- containerId,
158
- ]);
159
- }