@kapeta/local-cluster-service 0.16.8 → 0.18.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 +6 -2
- package/dist/cjs/src/assetManager.d.ts +2 -2
- package/dist/cjs/src/assetManager.js +16 -16
- package/dist/cjs/src/assets/routes.js +2 -2
- package/dist/cjs/src/authManager.d.ts +12 -0
- package/dist/cjs/src/authManager.js +60 -0
- package/dist/cjs/src/codeGeneratorManager.d.ts +1 -1
- package/dist/cjs/src/codeGeneratorManager.js +3 -3
- package/dist/cjs/src/configManager.js +2 -2
- package/dist/cjs/src/definitionsManager.d.ts +7 -6
- package/dist/cjs/src/definitionsManager.js +102 -18
- package/dist/cjs/src/instanceManager.d.ts +1 -1
- package/dist/cjs/src/instanceManager.js +4 -4
- package/dist/cjs/src/instances/routes.js +2 -2
- package/dist/cjs/src/operatorManager.d.ts +1 -1
- package/dist/cjs/src/operatorManager.js +7 -9
- package/dist/cjs/src/providerManager.d.ts +2 -1
- package/dist/cjs/src/providerManager.js +23 -15
- package/dist/cjs/src/repositoryManager.d.ts +2 -2
- package/dist/cjs/src/repositoryManager.js +8 -9
- package/dist/cjs/src/socketManager.js +6 -0
- package/dist/cjs/src/utils/BlockInstanceRunner.js +6 -8
- package/dist/cjs/src/utils/DefaultProviderInstaller.d.ts +11 -0
- package/dist/cjs/src/utils/DefaultProviderInstaller.js +129 -0
- package/dist/esm/index.js +67 -58
- package/dist/esm/src/RepositoryWatcher.js +40 -33
- package/dist/esm/src/api.js +14 -9
- package/dist/esm/src/assetManager.d.ts +2 -2
- package/dist/esm/src/assetManager.js +73 -67
- package/dist/esm/src/assets/routes.js +23 -18
- package/dist/esm/src/attachments/routes.js +14 -9
- package/dist/esm/src/authManager.d.ts +12 -0
- package/dist/esm/src/authManager.js +60 -0
- package/dist/esm/src/cacheManager.js +13 -5
- package/dist/esm/src/clusterService.js +6 -3
- package/dist/esm/src/codeGeneratorManager.d.ts +1 -1
- package/dist/esm/src/codeGeneratorManager.js +20 -14
- 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.d.ts +7 -6
- package/dist/esm/src/definitionsManager.js +114 -24
- 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.d.ts +1 -1
- package/dist/esm/src/instanceManager.js +165 -158
- package/dist/esm/src/instances/routes.js +39 -34
- 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.d.ts +1 -1
- package/dist/esm/src/operatorManager.js +48 -44
- package/dist/esm/src/progressListener.js +16 -12
- package/dist/esm/src/providerManager.d.ts +2 -1
- package/dist/esm/src/providerManager.js +43 -29
- 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.d.ts +2 -2
- package/dist/esm/src/repositoryManager.js +33 -28
- 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 +60 -55
- 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 +7 -2
- package/package.json +10 -4
- package/src/assetManager.ts +18 -16
- package/src/assets/routes.ts +2 -2
- package/src/authManager.ts +62 -0
- package/src/codeGeneratorManager.ts +3 -3
- package/src/configManager.ts +2 -2
- package/src/definitionsManager.ts +132 -17
- package/src/instanceManager.ts +5 -5
- package/src/instances/routes.ts +2 -2
- package/src/operatorManager.ts +7 -12
- package/src/providerManager.ts +27 -19
- package/src/repositoryManager.ts +8 -11
- package/src/socketManager.ts +6 -0
- package/src/utils/BlockInstanceRunner.ts +6 -8
- 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
|
-
router.get('/:systemId/instances', (req, res) => {
|
22
|
-
res.send(instanceManager.getInstancesForPlan(req.params.systemId));
|
26
|
+
router.get('/:systemId/instances', async (req, res) => {
|
27
|
+
res.send(await 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();
|
@@ -21,7 +21,7 @@ declare class OperatorManager {
|
|
21
21
|
* @param {string} version
|
22
22
|
* @return {Operator}
|
23
23
|
*/
|
24
|
-
getOperator(resourceType: string, version: string): Operator
|
24
|
+
getOperator(resourceType: string, version: string): Promise<Operator>;
|
25
25
|
/**
|
26
26
|
* Get information about a specific consumed resource
|
27
27
|
*/
|
@@ -1,16 +1,23 @@
|
|
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';
|
20
|
+
const KIND_PLAN = 'core/plan';
|
14
21
|
class Operator {
|
15
22
|
_data;
|
16
23
|
constructor(data) {
|
@@ -28,13 +35,13 @@ class Operator {
|
|
28
35
|
}
|
29
36
|
class OperatorManager {
|
30
37
|
_mountDir;
|
31
|
-
operatorLock = new
|
38
|
+
operatorLock = new async_lock_1.default();
|
32
39
|
constructor() {
|
33
|
-
this._mountDir =
|
34
|
-
|
40
|
+
this._mountDir = path_1.default.join(storageService_1.storageService.getKapetaBasedir(), 'mounts');
|
41
|
+
fs_extra_1.default.mkdirpSync(this._mountDir);
|
35
42
|
}
|
36
43
|
_getMountPoint(operatorType, mountName) {
|
37
|
-
return
|
44
|
+
return path_1.default.join(this._mountDir, operatorType, mountName);
|
38
45
|
}
|
39
46
|
/**
|
40
47
|
* Get operator definition for resource type
|
@@ -43,8 +50,8 @@ class OperatorManager {
|
|
43
50
|
* @param {string} version
|
44
51
|
* @return {Operator}
|
45
52
|
*/
|
46
|
-
getOperator(resourceType, version) {
|
47
|
-
const operators = definitionsManager.getDefinitions(KIND_OPERATOR);
|
53
|
+
async getOperator(resourceType, version) {
|
54
|
+
const operators = await definitionsManager_1.definitionsManager.getDefinitions(exports.KIND_OPERATOR);
|
48
55
|
const operator = operators.find((operator) => operator.definition &&
|
49
56
|
operator.definition.metadata &&
|
50
57
|
operator.definition.metadata.name &&
|
@@ -62,9 +69,9 @@ class OperatorManager {
|
|
62
69
|
* Get information about a specific consumed resource
|
63
70
|
*/
|
64
71
|
async getConsumerResourceInfo(systemId, fromServiceId, resourceType, portType, name, environment) {
|
65
|
-
systemId = normalizeKapetaUri(systemId);
|
66
|
-
const plans = definitionsManager.getDefinitions(
|
67
|
-
const planUri = parseKapetaUri(systemId);
|
72
|
+
systemId = (0, utils_1.normalizeKapetaUri)(systemId);
|
73
|
+
const plans = await definitionsManager_1.definitionsManager.getDefinitions(KIND_PLAN);
|
74
|
+
const planUri = (0, nodejs_utils_1.parseKapetaUri)(systemId);
|
68
75
|
const currentPlan = plans.find((plan) => plan.definition.metadata.name === planUri.fullName && plan.version === planUri.version);
|
69
76
|
if (!currentPlan) {
|
70
77
|
throw new Error(`Unknown plan: ${systemId}`);
|
@@ -73,10 +80,7 @@ class OperatorManager {
|
|
73
80
|
if (!currentInstance) {
|
74
81
|
throw new Error(`Unknown instance: ${fromServiceId} in plan ${systemId}`);
|
75
82
|
}
|
76
|
-
const
|
77
|
-
const blockDefinition = definitionsManager
|
78
|
-
.getDefinitions()
|
79
|
-
.find((definition) => definition.version === blockUri.version && definition.definition.metadata.name === blockUri.fullName);
|
83
|
+
const blockDefinition = await definitionsManager_1.definitionsManager.getDefinition(currentInstance.block.ref);
|
80
84
|
if (!blockDefinition) {
|
81
85
|
throw new Error(`Unknown block: ${currentInstance.block.ref} in plan ${systemId}`);
|
82
86
|
}
|
@@ -84,8 +88,8 @@ class OperatorManager {
|
|
84
88
|
if (!blockResource) {
|
85
89
|
throw new Error(`Unknown resource: ${name} in block ${currentInstance.block.ref} in plan ${systemId}`);
|
86
90
|
}
|
87
|
-
const kindUri = parseKapetaUri(blockResource.kind);
|
88
|
-
const operator = this.getOperator(resourceType, kindUri.version);
|
91
|
+
const kindUri = (0, nodejs_utils_1.parseKapetaUri)(blockResource.kind);
|
92
|
+
const operator = await this.getOperator(resourceType, kindUri.version);
|
89
93
|
const credentials = operator.getCredentials();
|
90
94
|
const container = await this.ensureResource(systemId, resourceType, kindUri.version);
|
91
95
|
const portInfo = await container.getPort(portType);
|
@@ -113,10 +117,10 @@ class OperatorManager {
|
|
113
117
|
* @return {Promise<ContainerInfo>}
|
114
118
|
*/
|
115
119
|
async ensureResource(systemId, resourceType, version) {
|
116
|
-
systemId = normalizeKapetaUri(systemId);
|
120
|
+
systemId = (0, utils_1.normalizeKapetaUri)(systemId);
|
117
121
|
const key = `${systemId}#${resourceType}:${version}`;
|
118
122
|
return await this.operatorLock.acquire(key, async () => {
|
119
|
-
const operator = this.getOperator(resourceType, version);
|
123
|
+
const operator = await this.getOperator(resourceType, version);
|
120
124
|
const operatorData = operator.getLocalData();
|
121
125
|
const portTypes = Object.keys(operatorData.ports);
|
122
126
|
portTypes.sort();
|
@@ -124,7 +128,7 @@ class OperatorManager {
|
|
124
128
|
for (let i = 0; i < portTypes.length; i++) {
|
125
129
|
const portType = portTypes[i];
|
126
130
|
let containerPortInfo = operatorData.ports[portType];
|
127
|
-
const hostPort = await serviceManager.ensureServicePort(systemId, resourceType, portType);
|
131
|
+
const hostPort = await serviceManager_1.serviceManager.ensureServicePort(systemId, resourceType, portType);
|
128
132
|
if (typeof containerPortInfo === 'number' || typeof containerPortInfo === 'string') {
|
129
133
|
containerPortInfo = { port: containerPortInfo, type: 'tcp' };
|
130
134
|
}
|
@@ -137,18 +141,18 @@ class OperatorManager {
|
|
137
141
|
hostPort,
|
138
142
|
};
|
139
143
|
}
|
140
|
-
const mounts = await containerManager.createMounts(systemId, resourceType, operatorData.mounts);
|
144
|
+
const mounts = await containerManager_1.containerManager.createMounts(systemId, resourceType, operatorData.mounts);
|
141
145
|
const nameParts = [systemId, resourceType.toLowerCase(), version];
|
142
|
-
const containerName = `kapeta-resource-${
|
146
|
+
const containerName = `kapeta-resource-${(0, md5_1.default)(nameParts.join('_'))}`;
|
143
147
|
const PortBindings = {};
|
144
148
|
const Env = [];
|
145
149
|
const Labels = {
|
146
150
|
kapeta: 'true',
|
147
151
|
};
|
148
152
|
const operatorMetadata = operator.getDefinitionInfo().definition.metadata;
|
149
|
-
const bindHost = getBindHost();
|
153
|
+
const bindHost = (0, utils_1.getBindHost)();
|
150
154
|
const ExposedPorts = {};
|
151
|
-
|
155
|
+
lodash_1.default.forEach(ports, (portInfo, containerPort) => {
|
152
156
|
ExposedPorts['' + containerPort] = {};
|
153
157
|
PortBindings['' + containerPort] = [
|
154
158
|
{
|
@@ -156,18 +160,18 @@ class OperatorManager {
|
|
156
160
|
HostIp: bindHost,
|
157
161
|
},
|
158
162
|
];
|
159
|
-
Labels[CONTAINER_LABEL_PORT_PREFIX + portInfo.hostPort] = portInfo.type;
|
163
|
+
Labels[containerManager_1.CONTAINER_LABEL_PORT_PREFIX + portInfo.hostPort] = portInfo.type;
|
160
164
|
});
|
161
|
-
const Mounts = containerManager.toDockerMounts(mounts);
|
162
|
-
|
165
|
+
const Mounts = containerManager_1.containerManager.toDockerMounts(mounts);
|
166
|
+
lodash_1.default.forEach(operatorData.env, (value, name) => {
|
163
167
|
Env.push(name + '=' + value);
|
164
168
|
});
|
165
|
-
const task = taskManager.add(`operator:ensure:${key}`, async () => {
|
169
|
+
const task = taskManager_1.taskManager.add(`operator:ensure:${key}`, async () => {
|
166
170
|
let HealthCheck = undefined;
|
167
171
|
if (operatorData.health) {
|
168
|
-
HealthCheck = containerManager.toDockerHealth(operatorData.health);
|
172
|
+
HealthCheck = containerManager_1.containerManager.toDockerHealth(operatorData.health);
|
169
173
|
}
|
170
|
-
const container = await containerManager.ensureContainer({
|
174
|
+
const container = await containerManager_1.containerManager.ensureContainer({
|
171
175
|
name: containerName,
|
172
176
|
Image: operatorData.image,
|
173
177
|
Hostname: containerName + '.kapeta',
|
@@ -181,8 +185,8 @@ class OperatorManager {
|
|
181
185
|
Mounts,
|
182
186
|
},
|
183
187
|
});
|
184
|
-
await containerManager.waitForReady(container);
|
185
|
-
return new ContainerInfo(container);
|
188
|
+
await containerManager_1.containerManager.waitForReady(container);
|
189
|
+
return new containerManager_1.ContainerInfo(container);
|
186
190
|
}, {
|
187
191
|
name: `Ensuring ${operatorMetadata.title ?? operatorMetadata.name}`,
|
188
192
|
systemId,
|
@@ -191,4 +195,4 @@ class OperatorManager {
|
|
191
195
|
});
|
192
196
|
}
|
193
197
|
}
|
194
|
-
|
198
|
+
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,5 +1,6 @@
|
|
1
|
+
import { DefinitionInfo } from '@kapeta/local-cluster-config';
|
1
2
|
declare class ProviderManager {
|
2
|
-
getWebProviders():
|
3
|
+
getWebProviders(): Promise<DefinitionInfo[]>;
|
3
4
|
getProviderWebJS(handle: string, name: string, version: string, sourceMap?: boolean): Promise<unknown>;
|
4
5
|
}
|
5
6
|
export declare const providerManager: ProviderManager;
|