@kapeta/local-cluster-service 0.35.0 → 0.36.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 +7 -0
- package/dist/cjs/src/containerManager.js +3 -3
- package/dist/cjs/src/instanceManager.d.ts +7 -3
- package/dist/cjs/src/instanceManager.js +143 -63
- package/dist/cjs/src/operatorManager.d.ts +7 -7
- package/dist/cjs/src/operatorManager.js +19 -19
- package/dist/cjs/src/types.d.ts +1 -0
- package/dist/cjs/src/utils/BlockInstanceRunner.d.ts +2 -13
- package/dist/cjs/src/utils/BlockInstanceRunner.js +89 -81
- package/dist/cjs/src/utils/utils.d.ts +1 -1
- package/dist/cjs/src/utils/utils.js +24 -1
- package/dist/esm/src/containerManager.js +3 -3
- package/dist/esm/src/instanceManager.d.ts +7 -3
- package/dist/esm/src/instanceManager.js +143 -63
- package/dist/esm/src/operatorManager.d.ts +7 -7
- package/dist/esm/src/operatorManager.js +19 -19
- package/dist/esm/src/types.d.ts +1 -0
- package/dist/esm/src/utils/BlockInstanceRunner.d.ts +2 -13
- package/dist/esm/src/utils/BlockInstanceRunner.js +89 -81
- package/dist/esm/src/utils/utils.d.ts +1 -1
- package/dist/esm/src/utils/utils.js +24 -1
- package/package.json +1 -1
- package/src/containerManager.ts +3 -3
- package/src/instanceManager.ts +193 -77
- package/src/operatorManager.ts +21 -18
- package/src/types.ts +1 -0
- package/src/utils/BlockInstanceRunner.ts +114 -94
- package/src/utils/utils.ts +27 -1
@@ -7,7 +7,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
7
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
8
8
|
};
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
10
|
-
exports.operatorManager = exports.
|
10
|
+
exports.operatorManager = exports.KIND_BLOCK_OPERATOR = exports.KIND_RESOURCE_OPERATOR = void 0;
|
11
11
|
const path_1 = __importDefault(require("path"));
|
12
12
|
const md5_1 = __importDefault(require("md5"));
|
13
13
|
const serviceManager_1 = require("./serviceManager");
|
@@ -20,7 +20,8 @@ const nodejs_utils_1 = require("@kapeta/nodejs-utils");
|
|
20
20
|
const lodash_1 = __importDefault(require("lodash"));
|
21
21
|
const async_lock_1 = __importDefault(require("async-lock"));
|
22
22
|
const taskManager_1 = require("./taskManager");
|
23
|
-
exports.
|
23
|
+
exports.KIND_RESOURCE_OPERATOR = 'core/resource-type-operator';
|
24
|
+
exports.KIND_BLOCK_OPERATOR = 'core/block-type-operator';
|
24
25
|
const KIND_PLAN = 'core/plan';
|
25
26
|
class Operator {
|
26
27
|
_data;
|
@@ -50,18 +51,18 @@ class OperatorManager {
|
|
50
51
|
/**
|
51
52
|
* Get operator definition for resource type
|
52
53
|
*/
|
53
|
-
async getOperator(
|
54
|
-
const operators = await definitionsManager_1.definitionsManager.getDefinitions(exports.
|
54
|
+
async getOperator(fullName, version) {
|
55
|
+
const operators = await definitionsManager_1.definitionsManager.getDefinitions([exports.KIND_RESOURCE_OPERATOR, exports.KIND_BLOCK_OPERATOR]);
|
55
56
|
const operator = operators.find((operator) => operator.definition &&
|
56
57
|
operator.definition.metadata &&
|
57
58
|
operator.definition.metadata.name &&
|
58
|
-
operator.definition.metadata.name.toLowerCase() ===
|
59
|
+
operator.definition.metadata.name.toLowerCase() === fullName.toLowerCase() &&
|
59
60
|
operator.version === version);
|
60
61
|
if (!operator) {
|
61
|
-
throw new Error(`Unknown
|
62
|
+
throw new Error(`Unknown operator type: ${fullName}:${version}`);
|
62
63
|
}
|
63
64
|
if (!operator.definition.spec || !operator.definition.spec.local) {
|
64
|
-
throw new Error(`Operator missing local definition: ${
|
65
|
+
throw new Error(`Operator missing local definition: ${fullName}:${version}`);
|
65
66
|
}
|
66
67
|
return new Operator(operator);
|
67
68
|
}
|
@@ -96,7 +97,7 @@ class OperatorManager {
|
|
96
97
|
const kindUri = (0, nodejs_utils_1.parseKapetaUri)(blockResource.kind);
|
97
98
|
const operator = await this.getOperator(resourceType, kindUri.version);
|
98
99
|
const credentials = operator.getCredentials();
|
99
|
-
const container = await this.
|
100
|
+
const container = await this.ensureOperator(systemId, resourceType, kindUri.version);
|
100
101
|
const portInfo = await container.getPort(portType);
|
101
102
|
if (!portInfo) {
|
102
103
|
throw new Error('Unknown resource port type : ' + resourceType + '#' + portType);
|
@@ -119,16 +120,15 @@ class OperatorManager {
|
|
119
120
|
/**
|
120
121
|
* Ensure we have a running operator of given type
|
121
122
|
*
|
122
|
-
* @param
|
123
|
-
* @param
|
124
|
-
* @param
|
125
|
-
* @return {Promise<ContainerInfo>}
|
123
|
+
* @param systemId the plan ref
|
124
|
+
* @param kind the full name - e.g. myhandle/rabbitmq
|
125
|
+
* @param version the version of the operator
|
126
126
|
*/
|
127
|
-
async
|
127
|
+
async ensureOperator(systemId, kind, version) {
|
128
128
|
systemId = (0, nodejs_utils_1.normalizeKapetaUri)(systemId);
|
129
|
-
const key = `${systemId}#${
|
129
|
+
const key = `${systemId}#${kind}:${version}`;
|
130
130
|
return await this.operatorLock.acquire(key, async () => {
|
131
|
-
const operator = await this.getOperator(
|
131
|
+
const operator = await this.getOperator(kind, version);
|
132
132
|
const operatorData = operator.getLocalData();
|
133
133
|
const portTypes = Object.keys(operatorData.ports);
|
134
134
|
portTypes.sort();
|
@@ -136,7 +136,7 @@ class OperatorManager {
|
|
136
136
|
for (let i = 0; i < portTypes.length; i++) {
|
137
137
|
const portType = portTypes[i];
|
138
138
|
let containerPortInfo = operatorData.ports[portType];
|
139
|
-
const hostPort = await serviceManager_1.serviceManager.ensureServicePort(systemId,
|
139
|
+
const hostPort = await serviceManager_1.serviceManager.ensureServicePort(systemId, kind, portType);
|
140
140
|
const portInfo = (0, utils_1.toPortInfo)(containerPortInfo);
|
141
141
|
const portId = portInfo.port + '/' + portInfo.type;
|
142
142
|
ports[portId] = {
|
@@ -144,7 +144,7 @@ class OperatorManager {
|
|
144
144
|
hostPort,
|
145
145
|
};
|
146
146
|
}
|
147
|
-
const nameParts = [systemId,
|
147
|
+
const nameParts = [systemId, kind.toLowerCase(), version];
|
148
148
|
const containerName = `kapeta-resource-${(0, md5_1.default)(nameParts.join('_'))}`;
|
149
149
|
const PortBindings = {};
|
150
150
|
const Env = [];
|
@@ -152,7 +152,7 @@ class OperatorManager {
|
|
152
152
|
const Labels = {
|
153
153
|
kapeta: 'true',
|
154
154
|
[containerManager_1.COMPOSE_LABEL_PROJECT]: systemUri.id.replace(/[^a-z0-9]/gi, '_'),
|
155
|
-
[containerManager_1.COMPOSE_LABEL_SERVICE]: [
|
155
|
+
[containerManager_1.COMPOSE_LABEL_SERVICE]: [kind, version].join('_').replace(/[^a-z0-9]/gi, '_'),
|
156
156
|
};
|
157
157
|
const operatorMetadata = operator.getDefinitionInfo().definition.metadata;
|
158
158
|
const bindHost = (0, utils_1.getBindHost)();
|
@@ -167,7 +167,7 @@ class OperatorManager {
|
|
167
167
|
];
|
168
168
|
Labels[containerManager_1.CONTAINER_LABEL_PORT_PREFIX + portInfo.hostPort] = portInfo.type;
|
169
169
|
});
|
170
|
-
const Mounts = await containerManager_1.containerManager.createVolumes(systemId,
|
170
|
+
const Mounts = await containerManager_1.containerManager.createVolumes(systemId, kind, operatorData.mounts);
|
171
171
|
lodash_1.default.forEach(operatorData.env, (value, name) => {
|
172
172
|
Env.push(name + '=' + value);
|
173
173
|
});
|
package/dist/esm/src/types.d.ts
CHANGED
@@ -2,9 +2,7 @@
|
|
2
2
|
* Copyright 2023 Kapeta Inc.
|
3
3
|
* SPDX-License-Identifier: BUSL-1.1
|
4
4
|
*/
|
5
|
-
import {
|
6
|
-
import { KapetaURI } from '@kapeta/nodejs-utils';
|
7
|
-
import { AnyMap, BlockProcessParams, ProcessInfo, StringMap } from '../types';
|
5
|
+
import { AnyMap, ProcessInfo } from '../types';
|
8
6
|
export declare function resolvePortType(portType: string): string;
|
9
7
|
export declare class BlockInstanceRunner {
|
10
8
|
private readonly _systemId;
|
@@ -20,16 +18,7 @@ export declare class BlockInstanceRunner {
|
|
20
18
|
*/
|
21
19
|
private _startLocalProcess;
|
22
20
|
private _startDockerProcess;
|
23
|
-
|
24
|
-
*
|
25
|
-
* @param blockInstance
|
26
|
-
* @param blockUri
|
27
|
-
* @param providerDefinition
|
28
|
-
* @param {{[key:string]:string}} env
|
29
|
-
* @return {Promise<ProcessDetails>}
|
30
|
-
* @private
|
31
|
-
*/
|
32
|
-
_startOperatorProcess(blockInstance: BlockProcessParams, blockUri: KapetaURI, providerDefinition: DefinitionInfo, env: StringMap): Promise<ProcessInfo>;
|
21
|
+
private _startOperatorProcess;
|
33
22
|
private getDockerPortBindings;
|
34
23
|
private ensureContainer;
|
35
24
|
private _handleContainer;
|
@@ -19,6 +19,7 @@ const clusterService_1 = require("../clusterService");
|
|
19
19
|
const types_1 = require("../types");
|
20
20
|
const definitionsManager_1 = require("../definitionsManager");
|
21
21
|
const node_os_1 = __importDefault(require("node:os"));
|
22
|
+
const taskManager_1 = require("../taskManager");
|
22
23
|
const KIND_BLOCK_TYPE_OPERATOR = 'core/block-type-operator';
|
23
24
|
const KAPETA_SYSTEM_ID = 'KAPETA_SYSTEM_ID';
|
24
25
|
const KAPETA_BLOCK_REF = 'KAPETA_BLOCK_REF';
|
@@ -155,7 +156,7 @@ class BlockInstanceRunner {
|
|
155
156
|
if (!dockerImage) {
|
156
157
|
throw new Error(`Missing docker image information: ${JSON.stringify(localContainer)}`);
|
157
158
|
}
|
158
|
-
const containerName = (0, utils_1.getBlockInstanceContainerName)(this._systemId, blockInstance.id);
|
159
|
+
const containerName = await (0, utils_1.getBlockInstanceContainerName)(this._systemId, blockInstance.id, targetKindUri.id);
|
159
160
|
const startCmd = localContainer.handlers?.onCreate ? localContainer.handlers.onCreate : '';
|
160
161
|
const dockerOpts = localContainer.options ?? {};
|
161
162
|
const homeDir = localContainer.userHome ? localContainer.userHome : '/root';
|
@@ -241,7 +242,7 @@ class BlockInstanceRunner {
|
|
241
242
|
throw new Error(`Block type not found: ${kindUri.id}`);
|
242
243
|
}
|
243
244
|
const { PortBindings, ExposedPorts, addonEnv } = await this.getDockerPortBindings(blockInstance, assetVersion, providerVersion);
|
244
|
-
const containerName = (0, utils_1.getBlockInstanceContainerName)(this._systemId, blockInstance.id);
|
245
|
+
const containerName = await (0, utils_1.getBlockInstanceContainerName)(this._systemId, blockInstance.id, kindUri.id);
|
245
246
|
// For windows we need to default to root
|
246
247
|
const innerHome = process.platform === 'win32' ? '/root/.kapeta' : local_cluster_config_1.default.getKapetaBasedir();
|
247
248
|
const systemUri = (0, nodejs_utils_1.parseKapetaUri)(this._systemId);
|
@@ -268,15 +269,6 @@ class BlockInstanceRunner {
|
|
268
269
|
},
|
269
270
|
});
|
270
271
|
}
|
271
|
-
/**
|
272
|
-
*
|
273
|
-
* @param blockInstance
|
274
|
-
* @param blockUri
|
275
|
-
* @param providerDefinition
|
276
|
-
* @param {{[key:string]:string}} env
|
277
|
-
* @return {Promise<ProcessDetails>}
|
278
|
-
* @private
|
279
|
-
*/
|
280
272
|
async _startOperatorProcess(blockInstance, blockUri, providerDefinition, env) {
|
281
273
|
const { assetFile } = local_cluster_config_1.default.getRepositoryAssetInfoPath(blockUri.handle, blockUri.name, blockUri.version);
|
282
274
|
const kapetaYmlPath = assetFile;
|
@@ -290,81 +282,97 @@ class BlockInstanceRunner {
|
|
290
282
|
}
|
291
283
|
const local = spec.local;
|
292
284
|
const dockerImage = local.image;
|
293
|
-
|
294
|
-
const
|
295
|
-
const
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
const PortBindings = {};
|
300
|
-
let HealthCheck = undefined;
|
301
|
-
let Mounts = [];
|
302
|
-
const localPorts = local.ports ?? {};
|
303
|
-
const labels = {};
|
304
|
-
const promises = Object.entries(localPorts).map(async ([portType, value]) => {
|
305
|
-
const portInfo = (0, utils_1.toPortInfo)(value);
|
306
|
-
const dockerPort = `${portInfo.port}/${portInfo.type}`;
|
307
|
-
ExposedPorts[dockerPort] = {};
|
308
|
-
addonEnv[`KAPETA_LOCAL_SERVER_PORT_${portType.toUpperCase()}`] = `${portInfo.port}`;
|
309
|
-
const publicPort = await serviceManager_1.serviceManager.ensureServicePort(this._systemId, blockInstance.id, portType);
|
310
|
-
PortBindings[dockerPort] = [
|
311
|
-
{
|
312
|
-
HostIp: bindHost,
|
313
|
-
HostPort: `${publicPort}`,
|
314
|
-
},
|
315
|
-
];
|
316
|
-
labels[containerManager_1.CONTAINER_LABEL_PORT_PREFIX + publicPort] = portType;
|
317
|
-
});
|
318
|
-
await Promise.all(promises);
|
319
|
-
if (local.env) {
|
320
|
-
Object.entries(local.env).forEach(([key, value]) => {
|
321
|
-
addonEnv[key] = value;
|
322
|
-
});
|
323
|
-
}
|
324
|
-
if (local.mounts) {
|
325
|
-
Mounts = await containerManager_1.containerManager.createVolumes(this._systemId, blockUri.id, local.mounts);
|
326
|
-
}
|
327
|
-
if (local.health) {
|
328
|
-
HealthCheck = containerManager_1.containerManager.toDockerHealth(local.health);
|
285
|
+
const operatorUri = local.singleton ? (0, nodejs_utils_1.parseKapetaUri)(providerRef) : blockUri;
|
286
|
+
const operatorId = local.singleton ? providerRef : blockInstance.id;
|
287
|
+
const operatorRef = local.singleton ? providerRef : blockInstance.ref;
|
288
|
+
if (local.singleton && env) {
|
289
|
+
env[KAPETA_BLOCK_REF] = operatorRef;
|
290
|
+
env[KAPETA_INSTANCE_ID] = operatorId;
|
329
291
|
}
|
330
|
-
|
331
|
-
const
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
292
|
+
const containerName = await (0, utils_1.getBlockInstanceContainerName)(this._systemId, blockInstance.id, providerRef);
|
293
|
+
const task = taskManager_1.taskManager.add(`container:start:${containerName}`, async () => {
|
294
|
+
const logs = new LogData_1.LogData();
|
295
|
+
const bindHost = (0, utils_1.getBindHost)();
|
296
|
+
const ExposedPorts = {};
|
297
|
+
const addonEnv = {};
|
298
|
+
const PortBindings = {};
|
299
|
+
let HealthCheck = undefined;
|
300
|
+
let Mounts = [];
|
301
|
+
const localPorts = local.ports ?? {};
|
302
|
+
const labels = {};
|
303
|
+
const promises = Object.entries(localPorts).map(async ([portType, value]) => {
|
304
|
+
const portInfo = (0, utils_1.toPortInfo)(value);
|
305
|
+
const dockerPort = `${portInfo.port}/${portInfo.type}`;
|
306
|
+
ExposedPorts[dockerPort] = {};
|
307
|
+
addonEnv[`KAPETA_LOCAL_SERVER_PORT_${portType.toUpperCase()}`] = `${portInfo.port}`;
|
308
|
+
const publicPort = await serviceManager_1.serviceManager.ensureServicePort(this._systemId, operatorId, portType);
|
309
|
+
PortBindings[dockerPort] = [
|
310
|
+
{
|
311
|
+
HostIp: bindHost,
|
312
|
+
HostPort: `${publicPort}`,
|
313
|
+
},
|
314
|
+
];
|
315
|
+
labels[containerManager_1.CONTAINER_LABEL_PORT_PREFIX + publicPort] = portType;
|
316
|
+
});
|
317
|
+
await Promise.all(promises);
|
318
|
+
if (local.env) {
|
319
|
+
Object.entries(local.env).forEach(([key, value]) => {
|
320
|
+
addonEnv[key] = value;
|
321
|
+
});
|
322
|
+
}
|
323
|
+
if (local.mounts) {
|
324
|
+
Mounts = await containerManager_1.containerManager.createVolumes(this._systemId, operatorUri.id, local.mounts);
|
325
|
+
}
|
326
|
+
if (local.health) {
|
327
|
+
HealthCheck = containerManager_1.containerManager.toDockerHealth(local.health);
|
328
|
+
}
|
329
|
+
// For windows we need to default to root
|
330
|
+
const innerHome = process.platform === 'win32' ? '/root/.kapeta' : local_cluster_config_1.default.getKapetaBasedir();
|
331
|
+
const Binds = local.singleton
|
332
|
+
? [`${(0, containerManager_1.toLocalBindVolume)(local_cluster_config_1.default.getKapetaBasedir())}:${innerHome}`]
|
333
|
+
: [
|
341
334
|
`${(0, containerManager_1.toLocalBindVolume)(kapetaYmlPath)}:/kapeta.yml:ro`,
|
342
335
|
`${(0, containerManager_1.toLocalBindVolume)(local_cluster_config_1.default.getKapetaBasedir())}:${innerHome}`,
|
336
|
+
];
|
337
|
+
const systemUri = (0, nodejs_utils_1.parseKapetaUri)(this._systemId);
|
338
|
+
console.log(`Ensuring container for operator block: ${containerName} [singleton: ${!!local.singleton}]`);
|
339
|
+
logs.addLog(`Ensuring container for operator block: ${containerName}`);
|
340
|
+
const out = await this.ensureContainer({
|
341
|
+
Image: dockerImage,
|
342
|
+
name: containerName,
|
343
|
+
ExposedPorts,
|
344
|
+
HealthCheck,
|
345
|
+
HostConfig: {
|
346
|
+
Binds,
|
347
|
+
PortBindings,
|
348
|
+
Mounts,
|
349
|
+
},
|
350
|
+
Labels: {
|
351
|
+
...labels,
|
352
|
+
instance: operatorId,
|
353
|
+
[containerManager_1.COMPOSE_LABEL_PROJECT]: systemUri.id.replace(/[^a-z0-9]/gi, '_'),
|
354
|
+
[containerManager_1.COMPOSE_LABEL_SERVICE]: operatorUri.id.replace(/[^a-z0-9]/gi, '_'),
|
355
|
+
},
|
356
|
+
Env: [
|
357
|
+
`KAPETA_INSTANCE_NAME=${operatorRef}`,
|
358
|
+
`KAPETA_LOCAL_CLUSTER_PORT=${clusterService_1.clusterService.getClusterServicePort()}`,
|
359
|
+
...DOCKER_ENV_VARS,
|
360
|
+
...Object.entries({
|
361
|
+
...env,
|
362
|
+
...addonEnv,
|
363
|
+
}).map(([key, value]) => `${key}=${value}`),
|
343
364
|
],
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
Env: [
|
354
|
-
`KAPETA_INSTANCE_NAME=${blockInstance.ref}`,
|
355
|
-
`KAPETA_LOCAL_CLUSTER_PORT=${clusterService_1.clusterService.getClusterServicePort()}`,
|
356
|
-
...DOCKER_ENV_VARS,
|
357
|
-
...Object.entries({
|
358
|
-
...env,
|
359
|
-
...addonEnv,
|
360
|
-
}).map(([key, value]) => `${key}=${value}`),
|
361
|
-
],
|
365
|
+
});
|
366
|
+
const portTypes = local.ports ? Object.keys(local.ports) : [];
|
367
|
+
if (portTypes.length > 0) {
|
368
|
+
out.portType = portTypes[0];
|
369
|
+
}
|
370
|
+
return out;
|
371
|
+
}, {
|
372
|
+
name: `Starting container for ${providerRef}`,
|
373
|
+
systemId: this._systemId,
|
362
374
|
});
|
363
|
-
|
364
|
-
if (portTypes.length > 0) {
|
365
|
-
out.portType = portTypes[0];
|
366
|
-
}
|
367
|
-
return out;
|
375
|
+
return task.wait();
|
368
376
|
}
|
369
377
|
async getDockerPortBindings(blockInstance, assetVersion, providerVersion) {
|
370
378
|
const bindHost = (0, utils_1.getBindHost)();
|
@@ -4,7 +4,7 @@
|
|
4
4
|
*/
|
5
5
|
import { EntityList } from '@kapeta/schemas';
|
6
6
|
import { AnyMap, PortInfo } from '../types';
|
7
|
-
export declare function getBlockInstanceContainerName(systemId: string, instanceId: string): string
|
7
|
+
export declare function getBlockInstanceContainerName(systemId: string, instanceId: string, blockType?: string): Promise<string>;
|
8
8
|
export declare function toPortInfo(port: PortInfo): {
|
9
9
|
port: number;
|
10
10
|
type: string;
|
@@ -13,7 +13,30 @@ const yaml_1 = __importDefault(require("yaml"));
|
|
13
13
|
const md5_1 = __importDefault(require("md5"));
|
14
14
|
const lodash_1 = __importDefault(require("lodash"));
|
15
15
|
const local_cluster_config_1 = __importDefault(require("@kapeta/local-cluster-config"));
|
16
|
-
|
16
|
+
const definitionsManager_1 = require("../definitionsManager");
|
17
|
+
const nodejs_utils_1 = require("@kapeta/nodejs-utils");
|
18
|
+
const operatorManager_1 = require("../operatorManager");
|
19
|
+
const assetManager_1 = require("../assetManager");
|
20
|
+
async function getBlockInstanceContainerName(systemId, instanceId, blockType) {
|
21
|
+
if (!blockType) {
|
22
|
+
const instance = await assetManager_1.assetManager.getBlockInstance(systemId, instanceId);
|
23
|
+
if (!instance) {
|
24
|
+
throw new Error(`Instance ${instanceId} not found in plan ${systemId}`);
|
25
|
+
}
|
26
|
+
const block = await assetManager_1.assetManager.getAsset(instance.block.ref);
|
27
|
+
if (!block) {
|
28
|
+
throw new Error(`Block ${instance.block.ref} not found`);
|
29
|
+
}
|
30
|
+
blockType = block.data.kind;
|
31
|
+
}
|
32
|
+
const typeDefinition = await definitionsManager_1.definitionsManager.getDefinition(blockType);
|
33
|
+
if (!typeDefinition) {
|
34
|
+
throw new Error(`Block type ${blockType} not found`);
|
35
|
+
}
|
36
|
+
if ((0, nodejs_utils_1.parseKapetaUri)(typeDefinition.definition.kind).fullName === operatorManager_1.KIND_BLOCK_OPERATOR &&
|
37
|
+
typeDefinition.definition.spec?.local?.singleton) {
|
38
|
+
return `kapeta-instance-operator-${(0, md5_1.default)(systemId + blockType)}`;
|
39
|
+
}
|
17
40
|
return `kapeta-block-instance-${(0, md5_1.default)(systemId + instanceId)}`;
|
18
41
|
}
|
19
42
|
exports.getBlockInstanceContainerName = getBlockInstanceContainerName;
|
package/package.json
CHANGED
package/src/containerManager.ts
CHANGED
@@ -694,7 +694,7 @@ class ContainerManager {
|
|
694
694
|
}
|
695
695
|
|
696
696
|
async getLogs(instance: InstanceInfo): Promise<LogEntry[]> {
|
697
|
-
const containerName = getBlockInstanceContainerName(instance.systemId, instance.instanceId);
|
697
|
+
const containerName = await getBlockInstanceContainerName(instance.systemId, instance.instanceId);
|
698
698
|
const containerInfo = await this.getContainerByName(containerName);
|
699
699
|
if (!containerInfo) {
|
700
700
|
return [
|
@@ -711,7 +711,7 @@ class ContainerManager {
|
|
711
711
|
}
|
712
712
|
|
713
713
|
async stopLogListening(systemId: string, instanceId: string) {
|
714
|
-
const containerName = getBlockInstanceContainerName(systemId, instanceId);
|
714
|
+
const containerName = await getBlockInstanceContainerName(systemId, instanceId);
|
715
715
|
if (this.logStreams[containerName]) {
|
716
716
|
if (this.logStreams[containerName]?.timer) {
|
717
717
|
clearTimeout(this.logStreams[containerName].timer);
|
@@ -729,7 +729,7 @@ class ContainerManager {
|
|
729
729
|
}
|
730
730
|
|
731
731
|
async ensureLogListening(systemId: string, instanceId: string, handler: (log: LogEntry) => void) {
|
732
|
-
const containerName = getBlockInstanceContainerName(systemId, instanceId);
|
732
|
+
const containerName = await getBlockInstanceContainerName(systemId, instanceId);
|
733
733
|
try {
|
734
734
|
if (this.logStreams[containerName]?.stream) {
|
735
735
|
// Already listening - will shut itself down
|