@kapeta/local-cluster-service 0.16.7 → 0.17.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.
- package/CHANGELOG.md +20 -0
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/src/instanceManager.js +30 -0
- package/dist/cjs/src/socketManager.js +6 -0
- package/dist/cjs/src/utils/DefaultProviderInstaller.d.ts +11 -0
- package/dist/cjs/src/utils/DefaultProviderInstaller.js +129 -0
- package/dist/esm/index.js +64 -57
- package/dist/esm/src/RepositoryWatcher.js +40 -33
- package/dist/esm/src/api.js +14 -9
- package/dist/esm/src/assetManager.js +62 -56
- package/dist/esm/src/assets/routes.js +22 -17
- package/dist/esm/src/attachments/routes.js +14 -9
- package/dist/esm/src/cacheManager.js +13 -5
- package/dist/esm/src/clusterService.js +6 -3
- package/dist/esm/src/codeGeneratorManager.js +19 -13
- package/dist/esm/src/config/routes.js +30 -25
- package/dist/esm/src/configManager.js +29 -26
- package/dist/esm/src/containerManager.js +48 -39
- package/dist/esm/src/definitionsManager.js +15 -9
- package/dist/esm/src/filesystem/routes.js +21 -16
- package/dist/esm/src/filesystemManager.js +23 -17
- package/dist/esm/src/identities/routes.js +13 -8
- package/dist/esm/src/instanceManager.js +186 -149
- package/dist/esm/src/instances/routes.js +38 -33
- package/dist/esm/src/middleware/cors.js +5 -1
- package/dist/esm/src/middleware/kapeta.js +8 -4
- package/dist/esm/src/middleware/stringBody.js +5 -1
- package/dist/esm/src/networkManager.js +15 -9
- package/dist/esm/src/operatorManager.js +45 -39
- package/dist/esm/src/progressListener.js +16 -12
- package/dist/esm/src/providerManager.js +22 -16
- package/dist/esm/src/providers/routes.js +14 -9
- package/dist/esm/src/proxy/routes.js +26 -21
- package/dist/esm/src/proxy/types/rest.js +29 -22
- package/dist/esm/src/proxy/types/web.js +18 -11
- package/dist/esm/src/repositoryManager.js +28 -22
- package/dist/esm/src/serviceManager.js +25 -19
- package/dist/esm/src/socketManager.js +31 -18
- package/dist/esm/src/storageService.js +18 -12
- package/dist/esm/src/taskManager.js +12 -8
- package/dist/esm/src/tasks/routes.js +14 -9
- package/dist/esm/src/traffic/routes.js +12 -7
- package/dist/esm/src/types.js +11 -8
- package/dist/esm/src/utils/BlockInstanceRunner.js +57 -50
- package/dist/esm/src/utils/DefaultProviderInstaller.d.ts +11 -0
- package/dist/esm/src/utils/DefaultProviderInstaller.js +129 -0
- package/dist/esm/src/utils/LogData.js +5 -1
- package/dist/esm/src/utils/commandLineUtils.js +12 -7
- package/dist/esm/src/utils/pathTemplateParser.js +7 -2
- package/dist/esm/src/utils/utils.js +30 -17
- package/dist/esm/start.js +7 -2
- package/index.ts +3 -0
- package/package.json +10 -4
- package/src/instanceManager.ts +34 -8
- package/src/socketManager.ts +6 -0
- package/src/utils/DefaultProviderInstaller.ts +141 -0
- package/tsconfig.json +3 -2
@@ -1,37 +1,42 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
const
|
10
|
-
|
11
|
-
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
const express_promise_router_1 = __importDefault(require("express-promise-router"));
|
7
|
+
const instanceManager_1 = require("../instanceManager");
|
8
|
+
const serviceManager_1 = require("../serviceManager");
|
9
|
+
const cors_1 = require("../middleware/cors");
|
10
|
+
const kapeta_1 = require("../middleware/kapeta");
|
11
|
+
const stringBody_1 = require("../middleware/stringBody");
|
12
|
+
const types_1 = require("../types");
|
13
|
+
const taskManager_1 = require("../taskManager");
|
14
|
+
const router = (0, express_promise_router_1.default)();
|
15
|
+
router.use('/', cors_1.corsHandler);
|
16
|
+
router.use('/', kapeta_1.kapetaHeaders);
|
12
17
|
/**
|
13
18
|
* Get all instances
|
14
19
|
*/
|
15
20
|
router.get('/', (req, res) => {
|
16
|
-
res.send(instanceManager.getInstances());
|
21
|
+
res.send(instanceManager_1.instanceManager.getInstances());
|
17
22
|
});
|
18
23
|
/**
|
19
24
|
* Get all instances
|
20
25
|
*/
|
21
26
|
router.get('/:systemId/instances', (req, res) => {
|
22
|
-
res.send(instanceManager.getInstancesForPlan(req.params.systemId));
|
27
|
+
res.send(instanceManager_1.instanceManager.getInstancesForPlan(req.params.systemId));
|
23
28
|
});
|
24
29
|
/**
|
25
30
|
* Get single instance in a plan
|
26
31
|
*/
|
27
32
|
router.get('/:systemId/instances/:instanceId', (req, res) => {
|
28
|
-
res.send(instanceManager.getInstance(req.params.systemId, req.params.instanceId));
|
33
|
+
res.send(instanceManager_1.instanceManager.getInstance(req.params.systemId, req.params.instanceId));
|
29
34
|
});
|
30
35
|
/**
|
31
36
|
* Start all instances in a plan
|
32
37
|
*/
|
33
38
|
router.post('/:systemId/start', async (req, res) => {
|
34
|
-
const task = await instanceManager.startAllForPlan(req.params.systemId);
|
39
|
+
const task = await instanceManager_1.instanceManager.startAllForPlan(req.params.systemId);
|
35
40
|
res.status(202).send({
|
36
41
|
ok: true,
|
37
42
|
taskId: task.id,
|
@@ -41,7 +46,7 @@ router.post('/:systemId/start', async (req, res) => {
|
|
41
46
|
* Stop all instances in plan
|
42
47
|
*/
|
43
48
|
router.post('/:systemId/stop', async (req, res) => {
|
44
|
-
const task = instanceManager.stopAllForPlan(req.params.systemId);
|
49
|
+
const task = instanceManager_1.instanceManager.stopAllForPlan(req.params.systemId);
|
45
50
|
res.status(202).send({
|
46
51
|
ok: true,
|
47
52
|
taskId: task.id,
|
@@ -51,8 +56,8 @@ router.post('/:systemId/stop', async (req, res) => {
|
|
51
56
|
* Start single instance in a plan
|
52
57
|
*/
|
53
58
|
router.post('/:systemId/:instanceId/start', async (req, res) => {
|
54
|
-
const result = await instanceManager.start(req.params.systemId, req.params.instanceId);
|
55
|
-
if (result instanceof Task) {
|
59
|
+
const result = await instanceManager_1.instanceManager.start(req.params.systemId, req.params.instanceId);
|
60
|
+
if (result instanceof taskManager_1.Task) {
|
56
61
|
res.status(202).send({
|
57
62
|
ok: true,
|
58
63
|
taskId: result.id,
|
@@ -70,20 +75,20 @@ router.post('/:systemId/:instanceId/start', async (req, res) => {
|
|
70
75
|
* Stop single instance in a plan
|
71
76
|
*/
|
72
77
|
router.post('/:systemId/:instanceId/stop', async (req, res) => {
|
73
|
-
await instanceManager.stop(req.params.systemId, req.params.instanceId);
|
78
|
+
await instanceManager_1.instanceManager.stop(req.params.systemId, req.params.instanceId);
|
74
79
|
res.status(202).send({ ok: true });
|
75
80
|
});
|
76
81
|
/**
|
77
82
|
* Get logs for instance in a plan
|
78
83
|
*/
|
79
84
|
router.get('/:systemId/:instanceId/logs', async (req, res) => {
|
80
|
-
const instanceInfo = instanceManager.getInstance(req.params.systemId, req.params.instanceId);
|
85
|
+
const instanceInfo = instanceManager_1.instanceManager.getInstance(req.params.systemId, req.params.instanceId);
|
81
86
|
if (!instanceInfo) {
|
82
87
|
res.status(404).send({ ok: false });
|
83
88
|
return;
|
84
89
|
}
|
85
90
|
try {
|
86
|
-
const logs = await instanceManager.getLogs(req.params.systemId, req.params.instanceId);
|
91
|
+
const logs = await instanceManager_1.instanceManager.getLogs(req.params.systemId, req.params.instanceId);
|
87
92
|
res.status(200).send({
|
88
93
|
logs,
|
89
94
|
});
|
@@ -96,7 +101,7 @@ router.get('/:systemId/:instanceId/logs', async (req, res) => {
|
|
96
101
|
* Get public address for instance in a plan if available
|
97
102
|
*/
|
98
103
|
router.get('/:systemId/:instanceId/address/public', (req, res) => {
|
99
|
-
const instance = instanceManager.getInstance(req.params.systemId, req.params.instanceId);
|
104
|
+
const instance = instanceManager_1.instanceManager.getInstance(req.params.systemId, req.params.instanceId);
|
100
105
|
if (!instance) {
|
101
106
|
res.status(404).send({ ok: false });
|
102
107
|
return;
|
@@ -111,9 +116,9 @@ router.get('/:systemId/:instanceId/address/public', (req, res) => {
|
|
111
116
|
* Get public address for particular resource on instance in a plan if available
|
112
117
|
*/
|
113
118
|
router.get('/:systemId/:instanceId/provider/:portType/:resourceName/address/public', (req, res) => {
|
114
|
-
res.send(serviceManager.getConsumerAddress(req.params.systemId, req.params.instanceId, req.params.resourceName, req.params.portType, req.kapeta?.environment));
|
119
|
+
res.send(serviceManager_1.serviceManager.getConsumerAddress(req.params.systemId, req.params.instanceId, req.params.resourceName, req.params.portType, req.kapeta?.environment));
|
115
120
|
});
|
116
|
-
router.use('/', stringBody);
|
121
|
+
router.use('/', stringBody_1.stringBody);
|
117
122
|
router.use('/', (req, res, next) => {
|
118
123
|
if (!req.kapeta.blockRef) {
|
119
124
|
res.status(400).send({ error: 'Missing X-Kapeta-Block header.' });
|
@@ -128,22 +133,22 @@ router.put('/', async (req, res) => {
|
|
128
133
|
let instance = req.stringBody ? JSON.parse(req.stringBody) : null;
|
129
134
|
if (req.kapeta.environment === 'docker') {
|
130
135
|
//A bit hacky but we want to avoid overwriting the docker PID with a process PID
|
131
|
-
const oldInstance = instanceManager.getInstance(req.kapeta.systemId, req.kapeta.instanceId);
|
136
|
+
const oldInstance = instanceManager_1.instanceManager.getInstance(req.kapeta.systemId, req.kapeta.instanceId);
|
132
137
|
if (oldInstance) {
|
133
138
|
instance.pid = oldInstance.pid;
|
134
139
|
instance.desiredStatus = oldInstance.desiredStatus;
|
135
140
|
}
|
136
|
-
instance.type = InstanceType.DOCKER;
|
137
|
-
instance.owner = InstanceOwner.INTERNAL;
|
141
|
+
instance.type = types_1.InstanceType.DOCKER;
|
142
|
+
instance.owner = types_1.InstanceOwner.INTERNAL;
|
138
143
|
}
|
139
144
|
else {
|
140
145
|
// Coming from user starting the instance outside of kapeta
|
141
|
-
instance.type = InstanceType.LOCAL;
|
142
|
-
instance.owner = InstanceOwner.EXTERNAL;
|
143
|
-
instance.desiredStatus = DesiredInstanceStatus.EXTERNAL;
|
146
|
+
instance.type = types_1.InstanceType.LOCAL;
|
147
|
+
instance.owner = types_1.InstanceOwner.EXTERNAL;
|
148
|
+
instance.desiredStatus = types_1.DesiredInstanceStatus.EXTERNAL;
|
144
149
|
}
|
145
150
|
try {
|
146
|
-
await instanceManager.registerInstanceFromSDK(req.kapeta.systemId, req.kapeta.instanceId, instance);
|
151
|
+
await instanceManager_1.instanceManager.registerInstanceFromSDK(req.kapeta.systemId, req.kapeta.instanceId, instance);
|
147
152
|
res.status(202).send({ ok: true });
|
148
153
|
}
|
149
154
|
catch (e) {
|
@@ -154,7 +159,7 @@ router.put('/', async (req, res) => {
|
|
154
159
|
* Delete instance
|
155
160
|
*/
|
156
161
|
router.delete('/', async (req, res) => {
|
157
|
-
await instanceManager.markAsStopped(req.kapeta.systemId, req.kapeta.instanceId);
|
162
|
+
await instanceManager_1.instanceManager.markAsStopped(req.kapeta.systemId, req.kapeta.instanceId);
|
158
163
|
res.status(202).send({ ok: true });
|
159
164
|
});
|
160
|
-
|
165
|
+
exports.default = router;
|
@@ -1,6 +1,10 @@
|
|
1
|
-
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.corsHandler = void 0;
|
4
|
+
function corsHandler(req, res, next) {
|
2
5
|
res.set('Access-Control-Allow-Origin', req.headers.origin);
|
3
6
|
res.set('Access-Control-Allow-Methods', 'GET, PUT, POST, DELETE, HEAD, PATCH');
|
4
7
|
res.set('Access-Control-Allow-Headers', '*');
|
5
8
|
next();
|
6
9
|
}
|
10
|
+
exports.corsHandler = corsHandler;
|
@@ -1,14 +1,17 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.kapetaHeaders = void 0;
|
4
|
+
const utils_1 = require("../utils/utils");
|
5
|
+
function kapetaHeaders(req, res, next) {
|
3
6
|
let blockRef = req.headers['x-kapeta-block'];
|
4
7
|
let systemId = req.headers['x-kapeta-system'];
|
5
8
|
let instanceId = req.headers['x-kapeta-instance'];
|
6
9
|
let environment = req.headers['x-kapeta-environment'];
|
7
10
|
if (blockRef) {
|
8
|
-
blockRef = normalizeKapetaUri(blockRef);
|
11
|
+
blockRef = (0, utils_1.normalizeKapetaUri)(blockRef);
|
9
12
|
}
|
10
13
|
if (systemId) {
|
11
|
-
systemId = normalizeKapetaUri(systemId);
|
14
|
+
systemId = (0, utils_1.normalizeKapetaUri)(systemId);
|
12
15
|
}
|
13
16
|
req.kapeta = {
|
14
17
|
blockRef,
|
@@ -18,3 +21,4 @@ export function kapetaHeaders(req, res, next) {
|
|
18
21
|
};
|
19
22
|
next();
|
20
23
|
}
|
24
|
+
exports.kapetaHeaders = kapetaHeaders;
|
@@ -1,4 +1,7 @@
|
|
1
|
-
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.stringBody = void 0;
|
4
|
+
function stringBody(req, res, next) {
|
2
5
|
// push the data to body
|
3
6
|
const body = [];
|
4
7
|
req.on('data', (chunk) => {
|
@@ -8,3 +11,4 @@ export function stringBody(req, res, next) {
|
|
8
11
|
next();
|
9
12
|
});
|
10
13
|
}
|
14
|
+
exports.stringBody = stringBody;
|
@@ -1,5 +1,11 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.networkManager = void 0;
|
7
|
+
const node_uuid_1 = __importDefault(require("node-uuid"));
|
8
|
+
const utils_1 = require("./utils/utils");
|
3
9
|
class NetworkManager {
|
4
10
|
_connections;
|
5
11
|
_sources;
|
@@ -18,7 +24,7 @@ class NetworkManager {
|
|
18
24
|
this._targets = {};
|
19
25
|
}
|
20
26
|
_ensureSystem(systemId) {
|
21
|
-
systemId = normalizeKapetaUri(systemId);
|
27
|
+
systemId = (0, utils_1.normalizeKapetaUri)(systemId);
|
22
28
|
if (!this._connections[systemId]) {
|
23
29
|
this._connections[systemId] = {};
|
24
30
|
}
|
@@ -30,7 +36,7 @@ class NetworkManager {
|
|
30
36
|
}
|
31
37
|
}
|
32
38
|
_ensureConnection(systemId, connectionId) {
|
33
|
-
systemId = normalizeKapetaUri(systemId);
|
39
|
+
systemId = (0, utils_1.normalizeKapetaUri)(systemId);
|
34
40
|
this._ensureSystem(systemId);
|
35
41
|
if (!this._connections[systemId][connectionId]) {
|
36
42
|
this._connections[systemId][connectionId] = [];
|
@@ -38,7 +44,7 @@ class NetworkManager {
|
|
38
44
|
return this._connections[systemId][connectionId];
|
39
45
|
}
|
40
46
|
_ensureSource(systemId, sourceBlockInstanceId) {
|
41
|
-
systemId = normalizeKapetaUri(systemId);
|
47
|
+
systemId = (0, utils_1.normalizeKapetaUri)(systemId);
|
42
48
|
this._ensureSystem(systemId);
|
43
49
|
if (!this._sources[systemId][sourceBlockInstanceId]) {
|
44
50
|
this._sources[systemId][sourceBlockInstanceId] = [];
|
@@ -46,7 +52,7 @@ class NetworkManager {
|
|
46
52
|
return this._sources[systemId][sourceBlockInstanceId];
|
47
53
|
}
|
48
54
|
_ensureTarget(systemId, targetBlockInstanceId) {
|
49
|
-
systemId = normalizeKapetaUri(systemId);
|
55
|
+
systemId = (0, utils_1.normalizeKapetaUri)(systemId);
|
50
56
|
this._ensureSystem(systemId);
|
51
57
|
if (!this._targets[systemId][targetBlockInstanceId]) {
|
52
58
|
this._targets[systemId][targetBlockInstanceId] = [];
|
@@ -54,7 +60,7 @@ class NetworkManager {
|
|
54
60
|
return this._targets[systemId][targetBlockInstanceId];
|
55
61
|
}
|
56
62
|
addRequest(systemId, connection, request, consumerMethodId, providerMethodId) {
|
57
|
-
systemId = normalizeKapetaUri(systemId);
|
63
|
+
systemId = (0, utils_1.normalizeKapetaUri)(systemId);
|
58
64
|
const traffic = new Traffic(connection, request, consumerMethodId, providerMethodId);
|
59
65
|
this._ensureConnection(systemId, traffic.connectionId).push(traffic);
|
60
66
|
this._ensureSource(systemId, connection.provider.blockId).push(traffic);
|
@@ -82,7 +88,7 @@ class Traffic {
|
|
82
88
|
error;
|
83
89
|
response;
|
84
90
|
constructor(connection, request, consumerMethodId, providerMethodId) {
|
85
|
-
this.id =
|
91
|
+
this.id = node_uuid_1.default.v4();
|
86
92
|
this.connectionId = NetworkManager.toConnectionId(connection);
|
87
93
|
this.consumerMethodId = consumerMethodId;
|
88
94
|
this.providerMethodId = providerMethodId;
|
@@ -106,4 +112,4 @@ class Traffic {
|
|
106
112
|
this.response = response;
|
107
113
|
}
|
108
114
|
}
|
109
|
-
|
115
|
+
exports.networkManager = new NetworkManager();
|
@@ -1,16 +1,22 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.operatorManager = exports.KIND_OPERATOR = void 0;
|
7
|
+
const path_1 = __importDefault(require("path"));
|
8
|
+
const md5_1 = __importDefault(require("md5"));
|
9
|
+
const nodejs_utils_1 = require("@kapeta/nodejs-utils");
|
10
|
+
const serviceManager_1 = require("./serviceManager");
|
11
|
+
const storageService_1 = require("./storageService");
|
12
|
+
const containerManager_1 = require("./containerManager");
|
13
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
14
|
+
const definitionsManager_1 = require("./definitionsManager");
|
15
|
+
const utils_1 = require("./utils/utils");
|
16
|
+
const lodash_1 = __importDefault(require("lodash"));
|
17
|
+
const async_lock_1 = __importDefault(require("async-lock"));
|
18
|
+
const taskManager_1 = require("./taskManager");
|
19
|
+
exports.KIND_OPERATOR = 'core/resource-type-operator';
|
14
20
|
class Operator {
|
15
21
|
_data;
|
16
22
|
constructor(data) {
|
@@ -28,13 +34,13 @@ class Operator {
|
|
28
34
|
}
|
29
35
|
class OperatorManager {
|
30
36
|
_mountDir;
|
31
|
-
operatorLock = new
|
37
|
+
operatorLock = new async_lock_1.default();
|
32
38
|
constructor() {
|
33
|
-
this._mountDir =
|
34
|
-
|
39
|
+
this._mountDir = path_1.default.join(storageService_1.storageService.getKapetaBasedir(), 'mounts');
|
40
|
+
fs_extra_1.default.mkdirpSync(this._mountDir);
|
35
41
|
}
|
36
42
|
_getMountPoint(operatorType, mountName) {
|
37
|
-
return
|
43
|
+
return path_1.default.join(this._mountDir, operatorType, mountName);
|
38
44
|
}
|
39
45
|
/**
|
40
46
|
* Get operator definition for resource type
|
@@ -44,7 +50,7 @@ class OperatorManager {
|
|
44
50
|
* @return {Operator}
|
45
51
|
*/
|
46
52
|
getOperator(resourceType, version) {
|
47
|
-
const operators = definitionsManager.getDefinitions(KIND_OPERATOR);
|
53
|
+
const operators = definitionsManager_1.definitionsManager.getDefinitions(exports.KIND_OPERATOR);
|
48
54
|
const operator = operators.find((operator) => operator.definition &&
|
49
55
|
operator.definition.metadata &&
|
50
56
|
operator.definition.metadata.name &&
|
@@ -62,9 +68,9 @@ class OperatorManager {
|
|
62
68
|
* Get information about a specific consumed resource
|
63
69
|
*/
|
64
70
|
async getConsumerResourceInfo(systemId, fromServiceId, resourceType, portType, name, environment) {
|
65
|
-
systemId = normalizeKapetaUri(systemId);
|
66
|
-
const plans = definitionsManager.getDefinitions('core/plan');
|
67
|
-
const planUri = parseKapetaUri(systemId);
|
71
|
+
systemId = (0, utils_1.normalizeKapetaUri)(systemId);
|
72
|
+
const plans = definitionsManager_1.definitionsManager.getDefinitions('core/plan');
|
73
|
+
const planUri = (0, nodejs_utils_1.parseKapetaUri)(systemId);
|
68
74
|
const currentPlan = plans.find((plan) => plan.definition.metadata.name === planUri.fullName && plan.version === planUri.version);
|
69
75
|
if (!currentPlan) {
|
70
76
|
throw new Error(`Unknown plan: ${systemId}`);
|
@@ -73,8 +79,8 @@ class OperatorManager {
|
|
73
79
|
if (!currentInstance) {
|
74
80
|
throw new Error(`Unknown instance: ${fromServiceId} in plan ${systemId}`);
|
75
81
|
}
|
76
|
-
const blockUri = parseKapetaUri(currentInstance.block.ref);
|
77
|
-
const blockDefinition = definitionsManager
|
82
|
+
const blockUri = (0, nodejs_utils_1.parseKapetaUri)(currentInstance.block.ref);
|
83
|
+
const blockDefinition = definitionsManager_1.definitionsManager
|
78
84
|
.getDefinitions()
|
79
85
|
.find((definition) => definition.version === blockUri.version && definition.definition.metadata.name === blockUri.fullName);
|
80
86
|
if (!blockDefinition) {
|
@@ -84,7 +90,7 @@ class OperatorManager {
|
|
84
90
|
if (!blockResource) {
|
85
91
|
throw new Error(`Unknown resource: ${name} in block ${currentInstance.block.ref} in plan ${systemId}`);
|
86
92
|
}
|
87
|
-
const kindUri = parseKapetaUri(blockResource.kind);
|
93
|
+
const kindUri = (0, nodejs_utils_1.parseKapetaUri)(blockResource.kind);
|
88
94
|
const operator = this.getOperator(resourceType, kindUri.version);
|
89
95
|
const credentials = operator.getCredentials();
|
90
96
|
const container = await this.ensureResource(systemId, resourceType, kindUri.version);
|
@@ -113,7 +119,7 @@ class OperatorManager {
|
|
113
119
|
* @return {Promise<ContainerInfo>}
|
114
120
|
*/
|
115
121
|
async ensureResource(systemId, resourceType, version) {
|
116
|
-
systemId = normalizeKapetaUri(systemId);
|
122
|
+
systemId = (0, utils_1.normalizeKapetaUri)(systemId);
|
117
123
|
const key = `${systemId}#${resourceType}:${version}`;
|
118
124
|
return await this.operatorLock.acquire(key, async () => {
|
119
125
|
const operator = this.getOperator(resourceType, version);
|
@@ -124,7 +130,7 @@ class OperatorManager {
|
|
124
130
|
for (let i = 0; i < portTypes.length; i++) {
|
125
131
|
const portType = portTypes[i];
|
126
132
|
let containerPortInfo = operatorData.ports[portType];
|
127
|
-
const hostPort = await serviceManager.ensureServicePort(systemId, resourceType, portType);
|
133
|
+
const hostPort = await serviceManager_1.serviceManager.ensureServicePort(systemId, resourceType, portType);
|
128
134
|
if (typeof containerPortInfo === 'number' || typeof containerPortInfo === 'string') {
|
129
135
|
containerPortInfo = { port: containerPortInfo, type: 'tcp' };
|
130
136
|
}
|
@@ -137,18 +143,18 @@ class OperatorManager {
|
|
137
143
|
hostPort,
|
138
144
|
};
|
139
145
|
}
|
140
|
-
const mounts = await containerManager.createMounts(systemId, resourceType, operatorData.mounts);
|
146
|
+
const mounts = await containerManager_1.containerManager.createMounts(systemId, resourceType, operatorData.mounts);
|
141
147
|
const nameParts = [systemId, resourceType.toLowerCase(), version];
|
142
|
-
const containerName = `kapeta-resource-${
|
148
|
+
const containerName = `kapeta-resource-${(0, md5_1.default)(nameParts.join('_'))}`;
|
143
149
|
const PortBindings = {};
|
144
150
|
const Env = [];
|
145
151
|
const Labels = {
|
146
152
|
kapeta: 'true',
|
147
153
|
};
|
148
154
|
const operatorMetadata = operator.getDefinitionInfo().definition.metadata;
|
149
|
-
const bindHost = getBindHost();
|
155
|
+
const bindHost = (0, utils_1.getBindHost)();
|
150
156
|
const ExposedPorts = {};
|
151
|
-
|
157
|
+
lodash_1.default.forEach(ports, (portInfo, containerPort) => {
|
152
158
|
ExposedPorts['' + containerPort] = {};
|
153
159
|
PortBindings['' + containerPort] = [
|
154
160
|
{
|
@@ -156,18 +162,18 @@ class OperatorManager {
|
|
156
162
|
HostIp: bindHost,
|
157
163
|
},
|
158
164
|
];
|
159
|
-
Labels[CONTAINER_LABEL_PORT_PREFIX + portInfo.hostPort] = portInfo.type;
|
165
|
+
Labels[containerManager_1.CONTAINER_LABEL_PORT_PREFIX + portInfo.hostPort] = portInfo.type;
|
160
166
|
});
|
161
|
-
const Mounts = containerManager.toDockerMounts(mounts);
|
162
|
-
|
167
|
+
const Mounts = containerManager_1.containerManager.toDockerMounts(mounts);
|
168
|
+
lodash_1.default.forEach(operatorData.env, (value, name) => {
|
163
169
|
Env.push(name + '=' + value);
|
164
170
|
});
|
165
|
-
const task = taskManager.add(`operator:ensure:${key}`, async () => {
|
171
|
+
const task = taskManager_1.taskManager.add(`operator:ensure:${key}`, async () => {
|
166
172
|
let HealthCheck = undefined;
|
167
173
|
if (operatorData.health) {
|
168
|
-
HealthCheck = containerManager.toDockerHealth(operatorData.health);
|
174
|
+
HealthCheck = containerManager_1.containerManager.toDockerHealth(operatorData.health);
|
169
175
|
}
|
170
|
-
const container = await containerManager.ensureContainer({
|
176
|
+
const container = await containerManager_1.containerManager.ensureContainer({
|
171
177
|
name: containerName,
|
172
178
|
Image: operatorData.image,
|
173
179
|
Hostname: containerName + '.kapeta',
|
@@ -181,8 +187,8 @@ class OperatorManager {
|
|
181
187
|
Mounts,
|
182
188
|
},
|
183
189
|
});
|
184
|
-
await containerManager.waitForReady(container);
|
185
|
-
return new ContainerInfo(container);
|
190
|
+
await containerManager_1.containerManager.waitForReady(container);
|
191
|
+
return new containerManager_1.ContainerInfo(container);
|
186
192
|
}, {
|
187
193
|
name: `Ensuring ${operatorMetadata.title ?? operatorMetadata.name}`,
|
188
194
|
systemId,
|
@@ -191,4 +197,4 @@ class OperatorManager {
|
|
191
197
|
});
|
192
198
|
}
|
193
199
|
}
|
194
|
-
|
200
|
+
exports.operatorManager = new OperatorManager();
|
@@ -1,7 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.ProgressListener = void 0;
|
4
|
+
const nodejs_process_1 = require("@kapeta/nodejs-process");
|
5
|
+
const socketManager_1 = require("./socketManager");
|
6
|
+
const node_util_1 = require("node:util");
|
7
|
+
class ProgressListener {
|
5
8
|
systemId;
|
6
9
|
instanceId;
|
7
10
|
constructor(systemId, instanceId) {
|
@@ -15,21 +18,21 @@ export class ProgressListener {
|
|
15
18
|
time: Date.now(),
|
16
19
|
};
|
17
20
|
if (this.systemId && this.instanceId) {
|
18
|
-
socketManager.emitInstanceLog(this.systemId, this.instanceId, logEntry);
|
21
|
+
socketManager_1.socketManager.emitInstanceLog(this.systemId, this.instanceId, logEntry);
|
19
22
|
return;
|
20
23
|
}
|
21
24
|
if (this.systemId) {
|
22
|
-
socketManager.emitSystemLog(this.systemId, logEntry);
|
25
|
+
socketManager_1.socketManager.emitSystemLog(this.systemId, logEntry);
|
23
26
|
return;
|
24
27
|
}
|
25
|
-
socketManager.emitGlobalLog(logEntry);
|
28
|
+
socketManager_1.socketManager.emitGlobalLog(logEntry);
|
26
29
|
}
|
27
30
|
run(command, directory) {
|
28
31
|
this.info(`Running command "${command}"`);
|
29
32
|
return new Promise(async (resolve, reject) => {
|
30
33
|
try {
|
31
34
|
const chunks = [];
|
32
|
-
const child = spawn(command, [], {
|
35
|
+
const child = (0, nodejs_process_1.spawn)(command, [], {
|
33
36
|
cwd: directory ? directory : process.cwd(),
|
34
37
|
shell: true,
|
35
38
|
});
|
@@ -89,26 +92,27 @@ export class ProgressListener {
|
|
89
92
|
}
|
90
93
|
error(msg, ...args) {
|
91
94
|
this.emitLog({
|
92
|
-
message: format(msg, args),
|
95
|
+
message: (0, node_util_1.format)(msg, args),
|
93
96
|
level: 'ERROR',
|
94
97
|
});
|
95
98
|
}
|
96
99
|
warn(msg, ...args) {
|
97
100
|
this.emitLog({
|
98
|
-
message: format(msg, args),
|
101
|
+
message: (0, node_util_1.format)(msg, args),
|
99
102
|
level: 'WARN',
|
100
103
|
});
|
101
104
|
}
|
102
105
|
info(msg, ...args) {
|
103
106
|
this.emitLog({
|
104
|
-
message: format(msg, args),
|
107
|
+
message: (0, node_util_1.format)(msg, args),
|
105
108
|
level: 'INFO',
|
106
109
|
});
|
107
110
|
}
|
108
111
|
debug(msg, ...args) {
|
109
112
|
this.emitLog({
|
110
|
-
message: format(msg, args),
|
113
|
+
message: (0, node_util_1.format)(msg, args),
|
111
114
|
level: 'DEBUG',
|
112
115
|
});
|
113
116
|
}
|
114
117
|
}
|
118
|
+
exports.ProgressListener = ProgressListener;
|
@@ -1,30 +1,36 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.providerManager = void 0;
|
7
|
+
const path_1 = __importDefault(require("path"));
|
8
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
9
|
+
const definitionsManager_1 = require("./definitionsManager");
|
10
|
+
const cacheManager_1 = require("./cacheManager");
|
11
|
+
const request_1 = __importDefault(require("request"));
|
6
12
|
const PROVIDER_FILE_BASE = 'https://providers.kapeta.com/files';
|
7
13
|
class ProviderManager {
|
8
14
|
getWebProviders() {
|
9
|
-
return definitionsManager.getProviderDefinitions().filter((providerDefinition) => providerDefinition.hasWeb);
|
15
|
+
return definitionsManager_1.definitionsManager.getProviderDefinitions().filter((providerDefinition) => providerDefinition.hasWeb);
|
10
16
|
}
|
11
17
|
async getProviderWebJS(handle, name, version, sourceMap = false) {
|
12
18
|
const fullName = `${handle}/${name}`;
|
13
19
|
const id = `${handle}/${name}/${version}/web.js${sourceMap ? '.map' : ''}`;
|
14
20
|
const cacheKey = `provider:web:${id}`;
|
15
|
-
const file = cacheManager.get(cacheKey);
|
16
|
-
if (file && (await
|
17
|
-
return
|
21
|
+
const file = cacheManager_1.cacheManager.get(cacheKey);
|
22
|
+
if (file && (await fs_extra_1.default.pathExists(file))) {
|
23
|
+
return fs_extra_1.default.readFile(file, 'utf8');
|
18
24
|
}
|
19
25
|
const installedProvider = this.getWebProviders().find((providerDefinition) => {
|
20
26
|
return providerDefinition.definition.metadata.name === fullName && providerDefinition.version === version;
|
21
27
|
});
|
22
28
|
if (installedProvider) {
|
23
29
|
//Check locally installed providers
|
24
|
-
const path =
|
25
|
-
if (await
|
26
|
-
cacheManager.set(cacheKey, path, 24 * 60 * 60 * 1000);
|
27
|
-
return
|
30
|
+
const path = path_1.default.join(installedProvider.path, 'web', handle, `${name}.js${sourceMap ? '.map' : ''}`);
|
31
|
+
if (await fs_extra_1.default.pathExists(path)) {
|
32
|
+
cacheManager_1.cacheManager.set(cacheKey, path, 24 * 60 * 60 * 1000);
|
33
|
+
return fs_extra_1.default.readFile(path);
|
28
34
|
}
|
29
35
|
}
|
30
36
|
if (version === 'local') {
|
@@ -33,7 +39,7 @@ class ProviderManager {
|
|
33
39
|
const url = `${PROVIDER_FILE_BASE}/${id}`;
|
34
40
|
return new Promise((resolve, reject) => {
|
35
41
|
console.log('Loading provider from %s', url);
|
36
|
-
|
42
|
+
request_1.default.get(url, (error, response, body) => {
|
37
43
|
if (error) {
|
38
44
|
reject(error);
|
39
45
|
return;
|
@@ -51,7 +57,7 @@ class ProviderManager {
|
|
51
57
|
});
|
52
58
|
}
|
53
59
|
}
|
54
|
-
const providerDefinitions = definitionsManager.getProviderDefinitions();
|
60
|
+
const providerDefinitions = definitionsManager_1.definitionsManager.getProviderDefinitions();
|
55
61
|
if (providerDefinitions.length > 0) {
|
56
62
|
console.log('## Loaded the following providers ##');
|
57
63
|
providerDefinitions.forEach((providerDefinition) => {
|
@@ -63,4 +69,4 @@ if (providerDefinitions.length > 0) {
|
|
63
69
|
else {
|
64
70
|
console.log('## No providers found ##');
|
65
71
|
}
|
66
|
-
|
72
|
+
exports.providerManager = new ProviderManager();
|