navy 6.0.0 → 7.0.0-alpha.2
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.
- package/lib/__tests__/config-provider.js +75 -0
- package/lib/__tests__/config.js +130 -0
- package/lib/__tests__/driver-logging.js +148 -0
- package/lib/__tests__/driver.js +19 -0
- package/lib/__tests__/errors.js +49 -0
- package/lib/__tests__/http-proxy.js +214 -0
- package/lib/__tests__/index.js +25 -0
- package/lib/__tests__/service.js +16 -0
- package/lib/cli/__tests__/develop.js +239 -0
- package/lib/cli/__tests__/external-ip.js +68 -0
- package/lib/cli/__tests__/health.js +257 -0
- package/lib/cli/__tests__/https.js +210 -0
- package/lib/cli/__tests__/import.js +110 -0
- package/lib/cli/__tests__/index.js +118 -0
- package/lib/cli/__tests__/lan-ip.js +90 -0
- package/lib/cli/__tests__/launch.js +179 -0
- package/lib/cli/__tests__/live.js +155 -0
- package/lib/cli/__tests__/local-ip.js +72 -0
- package/lib/cli/__tests__/logs.js +52 -0
- package/lib/cli/__tests__/open.js +65 -0
- package/lib/cli/__tests__/program.js +472 -0
- package/lib/cli/__tests__/ps.js +345 -0
- package/lib/cli/__tests__/refresh-config.js +95 -0
- package/lib/cli/__tests__/run.js +54 -0
- package/lib/cli/__tests__/status.js +204 -0
- package/lib/cli/__tests__/updates.js +243 -0
- package/lib/cli/__tests__/wait-for-healthy.js +134 -0
- package/lib/cli/config/__tests__/index.js +275 -0
- package/lib/cli/config/__tests__/wrapper.js +53 -0
- package/lib/cli/config/index.js +19 -37
- package/lib/cli/config/wrapper.js +0 -6
- package/lib/cli/develop.js +7 -21
- package/lib/cli/doctor/__tests__/clean-compose-files.js +78 -0
- package/lib/cli/doctor/__tests__/index.js +67 -0
- package/lib/cli/doctor/__tests__/invalid-compose-config.js +103 -0
- package/lib/cli/doctor/__tests__/invalid-state.js +83 -0
- package/lib/cli/doctor/__tests__/util.js +91 -0
- package/lib/cli/doctor/clean-compose-files.js +5 -13
- package/lib/cli/doctor/index.js +0 -12
- package/lib/cli/doctor/invalid-compose-config.js +0 -4
- package/lib/cli/doctor/invalid-state.js +0 -6
- package/lib/cli/doctor/util.js +0 -10
- package/lib/cli/external-ip.js +0 -4
- package/lib/cli/health.js +0 -12
- package/lib/cli/https.js +9 -25
- package/lib/cli/import.js +0 -12
- package/lib/cli/index.js +0 -9
- package/lib/cli/lan-ip.js +2 -8
- package/lib/cli/launch.js +0 -9
- package/lib/cli/live.js +6 -16
- package/lib/cli/local-ip.js +2 -7
- package/lib/cli/logs.js +0 -3
- package/lib/cli/open.js +2 -7
- package/lib/cli/program.js +73 -101
- package/lib/cli/ps.js +1 -21
- package/lib/cli/refresh-config.js +0 -7
- package/lib/cli/run.js +0 -3
- package/lib/cli/status.js +0 -11
- package/lib/cli/updates.js +0 -22
- package/lib/cli/util/__tests__/get-or-initialise-navy.js +66 -0
- package/lib/cli/util/__tests__/import.js +123 -0
- package/lib/cli/util/__tests__/index.js +17 -0
- package/lib/cli/util/__tests__/merge-action-options.js +47 -0
- package/lib/cli/util/__tests__/reconfigure.js +78 -0
- package/lib/cli/util/get-or-initialise-navy.js +0 -7
- package/lib/cli/util/import.js +0 -9
- package/lib/cli/util/index.js +0 -2
- package/lib/cli/util/merge-action-options.js +20 -0
- package/lib/cli/util/reconfigure.js +0 -4
- package/lib/cli/wait-for-healthy.js +0 -21
- package/lib/client/registry/__tests__/get-credentials.js +62 -0
- package/lib/client/registry/__tests__/get-endpoint.js +124 -0
- package/lib/client/registry/__tests__/get-fat-manifest.js +67 -0
- package/lib/client/registry/__tests__/get-token.js +66 -0
- package/lib/client/registry/__tests__/helpers.js +26 -0
- package/lib/client/registry/get-credentials.js +3 -9
- package/lib/client/registry/get-endpoint.js +29 -63
- package/lib/client/registry/get-fat-manifest.js +2 -9
- package/lib/client/registry/get-token.js +2 -13
- package/lib/client/registry/helpers.js +0 -4
- package/lib/config-provider.js +0 -12
- package/lib/config-providers/filesystem/__tests__/index.js +176 -0
- package/lib/config-providers/filesystem/index.js +5 -23
- package/lib/config-providers/npm/__tests__/index.js +226 -0
- package/lib/config-providers/npm/__tests__/util.js +1 -2
- package/lib/config-providers/npm/index.js +12 -35
- package/lib/config-providers/npm/util.js +0 -3
- package/lib/config.js +4 -19
- package/lib/domain/__tests__/container-image.js +81 -0
- package/lib/domain/__tests__/oci-api-specification.js +23 -0
- package/lib/domain/container-image.js +8 -21
- package/lib/domain/oci-api-specification.js +3 -5
- package/lib/driver-logging.js +0 -19
- package/lib/driver.js +0 -4
- package/lib/drivers/docker-compose/__tests__/client.js +249 -0
- package/lib/drivers/docker-compose/__tests__/index.js +430 -0
- package/lib/drivers/docker-compose/client.js +0 -16
- package/lib/drivers/docker-compose/index.js +7 -49
- package/lib/errors.js +0 -10
- package/lib/http-proxy.js +28 -23
- package/lib/index.js +1 -9
- package/lib/middleware/__tests__/add-service-proxy-config.js +258 -0
- package/lib/middleware/__tests__/develop.js +120 -0
- package/lib/middleware/__tests__/helpers.js +154 -0
- package/lib/middleware/__tests__/port-override.js +125 -0
- package/lib/middleware/__tests__/set-env-vars.js +94 -0
- package/lib/middleware/__tests__/set-image.js +76 -0
- package/lib/middleware/__tests__/set-logging-driver.js +94 -0
- package/lib/middleware/__tests__/tag-override.js +92 -0
- package/lib/middleware/add-service-proxy-config.js +8 -16
- package/lib/middleware/develop.js +2 -5
- package/lib/middleware/helpers.js +6 -12
- package/lib/middleware/port-override.js +5 -8
- package/lib/middleware/set-env-vars.js +6 -6
- package/lib/middleware/set-image.js +4 -5
- package/lib/middleware/set-logging-driver.js +6 -6
- package/lib/middleware/tag-override.js +4 -6
- package/lib/navy/__tests__/default-middleware.js +40 -0
- package/lib/navy/__tests__/index.js +1612 -0
- package/lib/navy/__tests__/middleware.js +71 -0
- package/lib/navy/__tests__/plugin-interface.js +121 -0
- package/lib/navy/__tests__/state.js +103 -0
- package/lib/navy/__tests__/util.js +24 -0
- package/lib/navy/default-middleware.js +0 -10
- package/lib/navy/index.js +83 -138
- package/lib/navy/middleware.js +0 -6
- package/lib/navy/plugin-interface.js +2 -10
- package/lib/navy/state.js +12 -24
- package/lib/navy/util.js +0 -1
- package/lib/service.js +2 -3
- package/lib/util/__tests__/exec-async.js +83 -0
- package/lib/util/__tests__/external-ip.js +97 -2
- package/lib/util/__tests__/get-lan-ip.js +46 -0
- package/lib/util/__tests__/has-update.js +136 -0
- package/lib/util/__tests__/https.js +301 -0
- package/lib/util/__tests__/navyrc.js +45 -0
- package/lib/util/__tests__/service-host.js +63 -5
- package/lib/util/__tests__/table.js +44 -0
- package/lib/util/docker-client.js +2 -10
- package/lib/util/exec-async.js +0 -4
- package/lib/util/external-ip.js +8 -12
- package/lib/util/fs.js +1 -6
- package/lib/util/get-lan-ip.js +0 -5
- package/lib/util/has-update.js +2 -14
- package/lib/util/https.js +11 -55
- package/lib/util/navyrc.js +0 -5
- package/lib/util/service-host.js +0 -17
- package/lib/util/table.js +0 -6
- package/package.json +14 -13
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _chai = require("chai");
|
|
4
|
+
var _helpers = require("../helpers");
|
|
5
|
+
/* eslint-env mocha */
|
|
6
|
+
|
|
7
|
+
describe('middlewareHelpers', function () {
|
|
8
|
+
describe('rewriteServices', function () {
|
|
9
|
+
it('should map every service in config.services through the mapper, preserving config', function () {
|
|
10
|
+
const config = {
|
|
11
|
+
version: '3',
|
|
12
|
+
services: {
|
|
13
|
+
api: {
|
|
14
|
+
image: 'api:1',
|
|
15
|
+
ports: ['80']
|
|
16
|
+
},
|
|
17
|
+
web: {
|
|
18
|
+
image: 'web:1'
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
networks: {
|
|
22
|
+
default: {}
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
const result = _helpers.middlewareHelpers.rewriteServices(config, (service, name) => ({
|
|
26
|
+
...service,
|
|
27
|
+
image: name + '-rewritten'
|
|
28
|
+
}));
|
|
29
|
+
(0, _chai.expect)(result).to.have.property('version', '3');
|
|
30
|
+
(0, _chai.expect)(result).to.have.property('networks').that.eql({
|
|
31
|
+
default: {}
|
|
32
|
+
});
|
|
33
|
+
(0, _chai.expect)(result.services.api).to.eql({
|
|
34
|
+
image: 'api-rewritten',
|
|
35
|
+
ports: ['80']
|
|
36
|
+
});
|
|
37
|
+
(0, _chai.expect)(result.services.web).to.eql({
|
|
38
|
+
image: 'web-rewritten'
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
it('should treat a missing services property as an empty object', function () {
|
|
42
|
+
const result = _helpers.middlewareHelpers.rewriteServices({}, () => ({}));
|
|
43
|
+
(0, _chai.expect)(result).to.have.property('services').that.eql({});
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe('rewriteServicesWithState', function () {
|
|
47
|
+
it('should pass per-service state into the mapper', function () {
|
|
48
|
+
const config = {
|
|
49
|
+
services: {
|
|
50
|
+
api: {
|
|
51
|
+
image: 'api'
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
const state = {
|
|
56
|
+
services: {
|
|
57
|
+
api: {
|
|
58
|
+
_ports: {
|
|
59
|
+
80: 8080
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
const result = _helpers.middlewareHelpers.rewriteServicesWithState(config, state, (service, name, serviceState) => ({
|
|
65
|
+
...service,
|
|
66
|
+
meta: {
|
|
67
|
+
name,
|
|
68
|
+
hasState: !!serviceState,
|
|
69
|
+
ports: serviceState && serviceState._ports
|
|
70
|
+
}
|
|
71
|
+
}));
|
|
72
|
+
(0, _chai.expect)(result.services.api.meta).to.eql({
|
|
73
|
+
name: 'api',
|
|
74
|
+
hasState: true,
|
|
75
|
+
ports: {
|
|
76
|
+
80: 8080
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
it('should pass undefined service state when the service is not in state', function () {
|
|
81
|
+
const config = {
|
|
82
|
+
services: {
|
|
83
|
+
web: {
|
|
84
|
+
image: 'web'
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
const state = {
|
|
89
|
+
services: {}
|
|
90
|
+
};
|
|
91
|
+
const result = _helpers.middlewareHelpers.rewriteServicesWithState(config, state, (service, name, serviceState) => ({
|
|
92
|
+
...service,
|
|
93
|
+
seenState: serviceState
|
|
94
|
+
}));
|
|
95
|
+
(0, _chai.expect)(result.services.web.seenState).to.equal(undefined);
|
|
96
|
+
});
|
|
97
|
+
it('should normalise a null state to an empty services map', function () {
|
|
98
|
+
const config = {
|
|
99
|
+
services: {
|
|
100
|
+
api: {
|
|
101
|
+
image: 'api'
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
const result = _helpers.middlewareHelpers.rewriteServicesWithState(config, null, (service, name, serviceState) => ({
|
|
106
|
+
...service,
|
|
107
|
+
seenState: serviceState
|
|
108
|
+
}));
|
|
109
|
+
(0, _chai.expect)(result.services.api.seenState).to.equal(undefined);
|
|
110
|
+
});
|
|
111
|
+
it('should preserve other keys on the config object', function () {
|
|
112
|
+
const config = {
|
|
113
|
+
version: '3',
|
|
114
|
+
services: {},
|
|
115
|
+
volumes: {
|
|
116
|
+
v1: {}
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
const result = _helpers.middlewareHelpers.rewriteServicesWithState(config, {
|
|
120
|
+
services: {}
|
|
121
|
+
}, s => s);
|
|
122
|
+
(0, _chai.expect)(result.version).to.equal('3');
|
|
123
|
+
(0, _chai.expect)(result.volumes).to.eql({
|
|
124
|
+
v1: {}
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
it('should treat a missing services property on config as an empty object', function () {
|
|
128
|
+
const result = _helpers.middlewareHelpers.rewriteServicesWithState({}, {
|
|
129
|
+
services: {}
|
|
130
|
+
}, () => ({}));
|
|
131
|
+
(0, _chai.expect)(result).to.have.property('services').that.eql({});
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
describe('addVolumes', function () {
|
|
135
|
+
it('should append the new volumes to existing service volumes', function () {
|
|
136
|
+
const result = _helpers.middlewareHelpers.addVolumes({
|
|
137
|
+
volumes: ['./local:/app']
|
|
138
|
+
}, ['./extra:/extra']);
|
|
139
|
+
(0, _chai.expect)(result).to.eql(['./local:/app', './extra:/extra']);
|
|
140
|
+
});
|
|
141
|
+
it('should treat a missing volumes property as an empty array', function () {
|
|
142
|
+
const result = _helpers.middlewareHelpers.addVolumes({}, ['./extra:/extra']);
|
|
143
|
+
(0, _chai.expect)(result).to.eql(['./extra:/extra']);
|
|
144
|
+
});
|
|
145
|
+
it('should not mutate the existing volumes array on the service', function () {
|
|
146
|
+
const original = ['./local:/app'];
|
|
147
|
+
const service = {
|
|
148
|
+
volumes: original
|
|
149
|
+
};
|
|
150
|
+
_helpers.middlewareHelpers.addVolumes(service, ['./extra:/extra']);
|
|
151
|
+
(0, _chai.expect)(original).to.eql(['./local:/app']);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
});
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _chai = require("chai");
|
|
5
|
+
var _portOverride = _interopRequireDefault(require("../port-override"));
|
|
6
|
+
/* eslint-env mocha */
|
|
7
|
+
|
|
8
|
+
describe('port-override middleware', function () {
|
|
9
|
+
it('should leave service.ports untouched when no port state exists', function () {
|
|
10
|
+
const config = {
|
|
11
|
+
services: {
|
|
12
|
+
api: {
|
|
13
|
+
ports: ['80:80']
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
const state = {
|
|
18
|
+
services: {}
|
|
19
|
+
};
|
|
20
|
+
const result = (0, _portOverride.default)(config, state);
|
|
21
|
+
(0, _chai.expect)(result.services.api.ports).to.eql(['80:80']);
|
|
22
|
+
});
|
|
23
|
+
it('should leave ports untouched when state has the service but no _ports', function () {
|
|
24
|
+
const config = {
|
|
25
|
+
services: {
|
|
26
|
+
api: {
|
|
27
|
+
ports: ['80:80']
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
const state = {
|
|
32
|
+
services: {
|
|
33
|
+
api: {}
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const result = (0, _portOverride.default)(config, state);
|
|
37
|
+
(0, _chai.expect)(result.services.api.ports).to.eql(['80:80']);
|
|
38
|
+
});
|
|
39
|
+
it('should override an internal port mapping with the configured external port', function () {
|
|
40
|
+
const config = {
|
|
41
|
+
services: {
|
|
42
|
+
api: {
|
|
43
|
+
ports: ['80', '443']
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const state = {
|
|
48
|
+
services: {
|
|
49
|
+
api: {
|
|
50
|
+
_ports: {
|
|
51
|
+
80: 8080
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
const result = (0, _portOverride.default)(config, state);
|
|
57
|
+
(0, _chai.expect)(result.services.api.ports).to.include('443');
|
|
58
|
+
(0, _chai.expect)(result.services.api.ports).to.include('8080:80');
|
|
59
|
+
(0, _chai.expect)(result.services.api.ports).to.not.include('80');
|
|
60
|
+
});
|
|
61
|
+
it('should drop entries whose external port is falsy when port state exists', function () {
|
|
62
|
+
const config = {
|
|
63
|
+
services: {
|
|
64
|
+
api: {
|
|
65
|
+
ports: ['80', '443']
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
const state = {
|
|
70
|
+
services: {
|
|
71
|
+
api: {
|
|
72
|
+
_ports: {
|
|
73
|
+
80: undefined,
|
|
74
|
+
443: 4433
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
const result = (0, _portOverride.default)(config, state);
|
|
80
|
+
(0, _chai.expect)(result.services.api.ports).to.eql(['80', '4433:443']);
|
|
81
|
+
});
|
|
82
|
+
it('should produce an empty ports list when service.ports is missing and there are no internal overrides', function () {
|
|
83
|
+
const config = {
|
|
84
|
+
services: {
|
|
85
|
+
api: {}
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
const state = {
|
|
89
|
+
services: {
|
|
90
|
+
api: {
|
|
91
|
+
_ports: {
|
|
92
|
+
80: undefined
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const result = (0, _portOverride.default)(config, state);
|
|
98
|
+
(0, _chai.expect)(result.services.api.ports).to.eql([]);
|
|
99
|
+
});
|
|
100
|
+
it('should set ports to an empty array when neither the service nor state declare any ports', function () {
|
|
101
|
+
const config = {
|
|
102
|
+
services: {
|
|
103
|
+
api: {}
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
const state = {
|
|
107
|
+
services: {}
|
|
108
|
+
};
|
|
109
|
+
const result = (0, _portOverride.default)(config, state);
|
|
110
|
+
(0, _chai.expect)(result.services.api.ports).to.eql([]);
|
|
111
|
+
});
|
|
112
|
+
it('should preserve top-level config keys', function () {
|
|
113
|
+
const config = {
|
|
114
|
+
version: '3',
|
|
115
|
+
services: {
|
|
116
|
+
api: {}
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
const state = {
|
|
120
|
+
services: {}
|
|
121
|
+
};
|
|
122
|
+
const result = (0, _portOverride.default)(config, state);
|
|
123
|
+
(0, _chai.expect)(result).to.have.property('version', '3');
|
|
124
|
+
});
|
|
125
|
+
});
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _chai = require("chai");
|
|
5
|
+
var _setEnvVars = _interopRequireDefault(require("../set-env-vars"));
|
|
6
|
+
/* eslint-env mocha */
|
|
7
|
+
|
|
8
|
+
describe('set-env-vars middleware', function () {
|
|
9
|
+
it('should leave the service environment unchanged when no state exists for it', function () {
|
|
10
|
+
const config = {
|
|
11
|
+
services: {
|
|
12
|
+
api: {
|
|
13
|
+
environment: {
|
|
14
|
+
FOO: 'bar'
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const state = {
|
|
20
|
+
services: {}
|
|
21
|
+
};
|
|
22
|
+
const result = (0, _setEnvVars.default)(config, state);
|
|
23
|
+
(0, _chai.expect)(result.services.api.environment).to.eql({
|
|
24
|
+
FOO: 'bar'
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
it('should merge state.services[name].environment over the config environment', function () {
|
|
28
|
+
const config = {
|
|
29
|
+
services: {
|
|
30
|
+
api: {
|
|
31
|
+
environment: {
|
|
32
|
+
FOO: 'bar',
|
|
33
|
+
BAZ: 'qux'
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
const state = {
|
|
39
|
+
services: {
|
|
40
|
+
api: {
|
|
41
|
+
environment: {
|
|
42
|
+
FOO: 'overridden',
|
|
43
|
+
NEW: 'value'
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const result = (0, _setEnvVars.default)(config, state);
|
|
49
|
+
(0, _chai.expect)(result.services.api.environment).to.eql({
|
|
50
|
+
FOO: 'overridden',
|
|
51
|
+
BAZ: 'qux',
|
|
52
|
+
NEW: 'value'
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
it('should produce an empty environment when neither config nor state defines one', function () {
|
|
56
|
+
const config = {
|
|
57
|
+
services: {
|
|
58
|
+
api: {}
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
const state = {
|
|
62
|
+
services: {}
|
|
63
|
+
};
|
|
64
|
+
const result = (0, _setEnvVars.default)(config, state);
|
|
65
|
+
(0, _chai.expect)(result.services.api.environment).to.eql({});
|
|
66
|
+
});
|
|
67
|
+
it('should preserve service config keys other than environment', function () {
|
|
68
|
+
const config = {
|
|
69
|
+
services: {
|
|
70
|
+
api: {
|
|
71
|
+
image: 'api:1',
|
|
72
|
+
environment: {
|
|
73
|
+
A: '1'
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
const state = {
|
|
79
|
+
services: {
|
|
80
|
+
api: {
|
|
81
|
+
environment: {
|
|
82
|
+
B: '2'
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
const result = (0, _setEnvVars.default)(config, state);
|
|
88
|
+
(0, _chai.expect)(result.services.api.image).to.equal('api:1');
|
|
89
|
+
(0, _chai.expect)(result.services.api.environment).to.eql({
|
|
90
|
+
A: '1',
|
|
91
|
+
B: '2'
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
});
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _chai = require("chai");
|
|
5
|
+
var _setImage = _interopRequireDefault(require("../set-image"));
|
|
6
|
+
/* eslint-env mocha */
|
|
7
|
+
|
|
8
|
+
describe('set-image middleware', function () {
|
|
9
|
+
it('should leave the image unchanged when no state image is set', function () {
|
|
10
|
+
const config = {
|
|
11
|
+
services: {
|
|
12
|
+
api: {
|
|
13
|
+
image: 'api:1'
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
const state = {
|
|
18
|
+
services: {
|
|
19
|
+
api: {}
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const result = (0, _setImage.default)(config, state);
|
|
23
|
+
(0, _chai.expect)(result.services.api.image).to.equal('api:1');
|
|
24
|
+
});
|
|
25
|
+
it('should leave the image unchanged when there is no service state at all', function () {
|
|
26
|
+
const config = {
|
|
27
|
+
services: {
|
|
28
|
+
api: {
|
|
29
|
+
image: 'api:1'
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const state = {
|
|
34
|
+
services: {}
|
|
35
|
+
};
|
|
36
|
+
const result = (0, _setImage.default)(config, state);
|
|
37
|
+
(0, _chai.expect)(result.services.api.image).to.equal('api:1');
|
|
38
|
+
});
|
|
39
|
+
it('should override the image when state has one', function () {
|
|
40
|
+
const config = {
|
|
41
|
+
services: {
|
|
42
|
+
api: {
|
|
43
|
+
image: 'api:1'
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const state = {
|
|
48
|
+
services: {
|
|
49
|
+
api: {
|
|
50
|
+
image: 'api:override'
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const result = (0, _setImage.default)(config, state);
|
|
55
|
+
(0, _chai.expect)(result.services.api.image).to.equal('api:override');
|
|
56
|
+
});
|
|
57
|
+
it('should preserve other service config keys', function () {
|
|
58
|
+
const config = {
|
|
59
|
+
services: {
|
|
60
|
+
api: {
|
|
61
|
+
image: 'api:1',
|
|
62
|
+
ports: ['80:80']
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
const state = {
|
|
67
|
+
services: {
|
|
68
|
+
api: {
|
|
69
|
+
image: 'api:override'
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
const result = (0, _setImage.default)(config, state);
|
|
74
|
+
(0, _chai.expect)(result.services.api.ports).to.eql(['80:80']);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _chai = require("chai");
|
|
5
|
+
var _setLoggingDriver = _interopRequireDefault(require("../set-logging-driver"));
|
|
6
|
+
/* eslint-env mocha */
|
|
7
|
+
|
|
8
|
+
describe('set-logging-driver middleware', function () {
|
|
9
|
+
it('should produce an empty logging object when neither config nor state set one', function () {
|
|
10
|
+
const config = {
|
|
11
|
+
services: {
|
|
12
|
+
api: {}
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
const state = {
|
|
16
|
+
services: {}
|
|
17
|
+
};
|
|
18
|
+
const result = (0, _setLoggingDriver.default)(config, state);
|
|
19
|
+
(0, _chai.expect)(result.services.api.logging).to.eql({});
|
|
20
|
+
});
|
|
21
|
+
it('should pass the config logging through when state has no logging entry', function () {
|
|
22
|
+
const config = {
|
|
23
|
+
services: {
|
|
24
|
+
api: {
|
|
25
|
+
logging: {
|
|
26
|
+
driver: 'json-file'
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
const state = {
|
|
32
|
+
services: {
|
|
33
|
+
api: {}
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const result = (0, _setLoggingDriver.default)(config, state);
|
|
37
|
+
(0, _chai.expect)(result.services.api.logging).to.eql({
|
|
38
|
+
driver: 'json-file'
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
it('should merge state logging over config logging', function () {
|
|
42
|
+
const config = {
|
|
43
|
+
services: {
|
|
44
|
+
api: {
|
|
45
|
+
logging: {
|
|
46
|
+
driver: 'json-file',
|
|
47
|
+
options: {
|
|
48
|
+
'max-size': '10m'
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const state = {
|
|
55
|
+
services: {
|
|
56
|
+
api: {
|
|
57
|
+
logging: {
|
|
58
|
+
driver: 'syslog'
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
const result = (0, _setLoggingDriver.default)(config, state);
|
|
64
|
+
(0, _chai.expect)(result.services.api.logging).to.eql({
|
|
65
|
+
driver: 'syslog',
|
|
66
|
+
options: {
|
|
67
|
+
'max-size': '10m'
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
it('should preserve other service config keys', function () {
|
|
72
|
+
const config = {
|
|
73
|
+
services: {
|
|
74
|
+
api: {
|
|
75
|
+
image: 'api:1'
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
const state = {
|
|
80
|
+
services: {
|
|
81
|
+
api: {
|
|
82
|
+
logging: {
|
|
83
|
+
driver: 'syslog'
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
const result = (0, _setLoggingDriver.default)(config, state);
|
|
89
|
+
(0, _chai.expect)(result.services.api.image).to.equal('api:1');
|
|
90
|
+
(0, _chai.expect)(result.services.api.logging).to.eql({
|
|
91
|
+
driver: 'syslog'
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
});
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _chai = require("chai");
|
|
5
|
+
var _tagOverride = _interopRequireDefault(require("../tag-override"));
|
|
6
|
+
/* eslint-env mocha */
|
|
7
|
+
|
|
8
|
+
describe('tag-override middleware', function () {
|
|
9
|
+
it('should add the tag when service image has no tag', function () {
|
|
10
|
+
const config = {
|
|
11
|
+
services: {
|
|
12
|
+
api: {
|
|
13
|
+
image: 'navy/api'
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
const state = {
|
|
18
|
+
services: {
|
|
19
|
+
api: {
|
|
20
|
+
_tag: 'v1.2.3'
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
const result = (0, _tagOverride.default)(config, state);
|
|
25
|
+
(0, _chai.expect)(result.services.api.image).to.equal('navy/api:v1.2.3');
|
|
26
|
+
});
|
|
27
|
+
it('should replace an existing tag with the override', function () {
|
|
28
|
+
const config = {
|
|
29
|
+
services: {
|
|
30
|
+
api: {
|
|
31
|
+
image: 'navy/api:old'
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
const state = {
|
|
36
|
+
services: {
|
|
37
|
+
api: {
|
|
38
|
+
_tag: 'new'
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
const result = (0, _tagOverride.default)(config, state);
|
|
43
|
+
(0, _chai.expect)(result.services.api.image).to.equal('navy/api:new');
|
|
44
|
+
});
|
|
45
|
+
it('should leave the image untouched when state has no _tag for the service', function () {
|
|
46
|
+
const config = {
|
|
47
|
+
services: {
|
|
48
|
+
api: {
|
|
49
|
+
image: 'navy/api:old'
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const state = {
|
|
54
|
+
services: {
|
|
55
|
+
api: {}
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
const result = (0, _tagOverride.default)(config, state);
|
|
59
|
+
(0, _chai.expect)(result.services.api.image).to.equal('navy/api:old');
|
|
60
|
+
});
|
|
61
|
+
it('should ignore state services that have no matching service in config', function () {
|
|
62
|
+
const config = {
|
|
63
|
+
services: {
|
|
64
|
+
api: {
|
|
65
|
+
image: 'api:1'
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
const state = {
|
|
70
|
+
services: {
|
|
71
|
+
web: {
|
|
72
|
+
_tag: 'lts'
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
const result = (0, _tagOverride.default)(config, state);
|
|
77
|
+
(0, _chai.expect)(result.services.api.image).to.equal('api:1');
|
|
78
|
+
(0, _chai.expect)(result.services).to.not.have.property('web');
|
|
79
|
+
});
|
|
80
|
+
it('should treat a missing state.services as an empty object', function () {
|
|
81
|
+
const config = {
|
|
82
|
+
services: {
|
|
83
|
+
api: {
|
|
84
|
+
image: 'api:1'
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
const state = {};
|
|
89
|
+
const result = (0, _tagOverride.default)(config, state);
|
|
90
|
+
(0, _chai.expect)(result.services.api.image).to.equal('api:1');
|
|
91
|
+
});
|
|
92
|
+
});
|
|
@@ -4,21 +4,15 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _lodash = require("lodash");
|
|
9
|
-
|
|
10
8
|
var _serviceHost = require("../util/service-host");
|
|
11
|
-
|
|
12
9
|
var _https = require("../util/https");
|
|
13
|
-
|
|
14
10
|
const getServiceHTTPProxyConfig = (serviceName, navyFile) => {
|
|
15
11
|
if (navyFile && navyFile.httpProxy && navyFile.httpProxy[serviceName]) {
|
|
16
12
|
return navyFile.httpProxy[serviceName];
|
|
17
13
|
}
|
|
18
|
-
|
|
19
14
|
return null;
|
|
20
15
|
};
|
|
21
|
-
|
|
22
16
|
const serviceGetAutoProxyPortOr80 = (service, navyFile) => {
|
|
23
17
|
const autoPorts = navyFile && Array.isArray(navyFile.httpProxyAutoPorts) && navyFile.httpProxyAutoPorts || ['80'];
|
|
24
18
|
return service.ports && (0, _lodash.find)(autoPorts, autoPort => {
|
|
@@ -32,45 +26,43 @@ const serviceGetAutoProxyPortOr80 = (service, navyFile) => {
|
|
|
32
26
|
});
|
|
33
27
|
});
|
|
34
28
|
};
|
|
35
|
-
|
|
36
29
|
var _default = navy => async (config, state) => {
|
|
37
30
|
const navyFile = await navy.getNavyFile();
|
|
38
31
|
const services = {};
|
|
39
32
|
const externalIP = await navy.externalIP();
|
|
40
33
|
await Promise.all(Object.keys(config.services).map(async serviceName => {
|
|
41
34
|
const service = config.services[serviceName];
|
|
42
|
-
let proxyConfig = getServiceHTTPProxyConfig(serviceName, navyFile);
|
|
35
|
+
let proxyConfig = getServiceHTTPProxyConfig(serviceName, navyFile);
|
|
43
36
|
|
|
37
|
+
// proxy port 80 even without service config, or a different port with config httpProxyAutoPorts
|
|
44
38
|
if (!proxyConfig) {
|
|
45
39
|
const autoPort = serviceGetAutoProxyPortOr80(service, navyFile);
|
|
46
|
-
|
|
47
40
|
if (autoPort) {
|
|
48
41
|
proxyConfig = {
|
|
49
42
|
port: parseInt(autoPort)
|
|
50
43
|
};
|
|
51
44
|
}
|
|
52
45
|
}
|
|
53
|
-
|
|
54
46
|
if (proxyConfig) {
|
|
55
47
|
const hostName = await (0, _serviceHost.createHostForService)(serviceName, navy.normalisedName, externalIP);
|
|
56
48
|
if (proxyConfig.enableHttps) await (0, _https.createCert)({
|
|
57
49
|
hostName
|
|
58
50
|
});
|
|
59
|
-
return services[serviceName] = {
|
|
51
|
+
return services[serviceName] = {
|
|
52
|
+
...service,
|
|
60
53
|
environment: {
|
|
61
|
-
|
|
62
|
-
|
|
54
|
+
VIRTUAL_HOST: hostName,
|
|
55
|
+
VIRTUAL_PORT: proxyConfig.port,
|
|
63
56
|
...service.environment
|
|
64
57
|
}
|
|
65
58
|
};
|
|
66
59
|
}
|
|
67
|
-
|
|
68
60
|
return services[serviceName] = service;
|
|
69
61
|
}));
|
|
70
|
-
return {
|
|
62
|
+
return {
|
|
63
|
+
...config,
|
|
71
64
|
services
|
|
72
65
|
};
|
|
73
66
|
};
|
|
74
|
-
|
|
75
67
|
exports.default = _default;
|
|
76
68
|
module.exports = exports.default;
|