@kapeta/local-cluster-service 0.8.3 → 0.9.1
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 +14 -0
- package/dist/cjs/src/assetManager.js +7 -4
- package/dist/cjs/src/clusterService.js +2 -0
- package/dist/cjs/src/codeGeneratorManager.js +3 -3
- package/dist/cjs/src/config/routes.js +1 -1
- package/dist/cjs/src/configManager.js +13 -1
- package/dist/cjs/src/containerManager.d.ts +25 -2
- package/dist/cjs/src/containerManager.js +51 -16
- package/dist/cjs/src/definitionsManager.d.ts +11 -0
- package/dist/cjs/src/definitionsManager.js +44 -0
- package/dist/cjs/src/filesystemManager.js +0 -2
- package/dist/cjs/src/instanceManager.d.ts +23 -47
- package/dist/cjs/src/instanceManager.js +416 -235
- package/dist/cjs/src/instances/routes.js +23 -14
- package/dist/cjs/src/middleware/kapeta.js +7 -0
- package/dist/cjs/src/networkManager.js +6 -0
- package/dist/cjs/src/operatorManager.js +8 -4
- package/dist/cjs/src/providerManager.js +3 -3
- package/dist/cjs/src/repositoryManager.js +7 -3
- package/dist/cjs/src/serviceManager.js +5 -0
- package/dist/cjs/src/types.d.ts +39 -13
- package/dist/cjs/src/types.js +28 -0
- package/dist/cjs/src/utils/BlockInstanceRunner.d.ts +3 -3
- package/dist/cjs/src/utils/BlockInstanceRunner.js +34 -32
- package/dist/cjs/src/utils/utils.d.ts +2 -0
- package/dist/cjs/src/utils/utils.js +17 -1
- package/dist/esm/src/assetManager.js +7 -4
- package/dist/esm/src/clusterService.js +2 -0
- package/dist/esm/src/codeGeneratorManager.js +3 -3
- package/dist/esm/src/config/routes.js +1 -1
- package/dist/esm/src/configManager.js +13 -1
- package/dist/esm/src/containerManager.d.ts +25 -2
- package/dist/esm/src/containerManager.js +50 -15
- package/dist/esm/src/definitionsManager.d.ts +11 -0
- package/dist/esm/src/definitionsManager.js +38 -0
- package/dist/esm/src/filesystemManager.js +0 -2
- package/dist/esm/src/instanceManager.d.ts +23 -47
- package/dist/esm/src/instanceManager.js +416 -236
- package/dist/esm/src/instances/routes.js +23 -14
- package/dist/esm/src/middleware/kapeta.js +7 -0
- package/dist/esm/src/networkManager.js +6 -0
- package/dist/esm/src/operatorManager.js +8 -4
- package/dist/esm/src/providerManager.js +3 -3
- package/dist/esm/src/repositoryManager.js +7 -3
- package/dist/esm/src/serviceManager.js +5 -0
- package/dist/esm/src/types.d.ts +39 -13
- package/dist/esm/src/types.js +27 -1
- package/dist/esm/src/utils/BlockInstanceRunner.d.ts +3 -3
- package/dist/esm/src/utils/BlockInstanceRunner.js +35 -33
- package/dist/esm/src/utils/utils.d.ts +2 -0
- package/dist/esm/src/utils/utils.js +14 -0
- package/package.json +2 -1
- package/src/assetManager.ts +7 -4
- package/src/clusterService.ts +3 -0
- package/src/codeGeneratorManager.ts +3 -2
- package/src/config/routes.ts +1 -1
- package/src/configManager.ts +13 -1
- package/src/containerManager.ts +72 -16
- package/src/definitionsManager.ts +54 -0
- package/src/filesystemManager.ts +0 -2
- package/src/instanceManager.ts +495 -266
- package/src/instances/routes.ts +23 -17
- package/src/middleware/kapeta.ts +10 -0
- package/src/networkManager.ts +6 -0
- package/src/operatorManager.ts +11 -6
- package/src/providerManager.ts +3 -2
- package/src/repositoryManager.ts +7 -3
- package/src/serviceManager.ts +6 -0
- package/src/types.ts +44 -14
- package/src/utils/BlockInstanceRunner.ts +39 -36
- package/src/utils/utils.ts +18 -0
package/CHANGELOG.md
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
## [0.9.1](https://github.com/kapetacom/local-cluster-service/compare/v0.9.0...v0.9.1) (2023-07-26)
|
2
|
+
|
3
|
+
|
4
|
+
### Bug Fixes
|
5
|
+
|
6
|
+
* Rename containers before deleting to avoid name conflicts ([#49](https://github.com/kapetacom/local-cluster-service/issues/49)) ([ac977f0](https://github.com/kapetacom/local-cluster-service/commit/ac977f0a9f18f57a517342d51e4c1e1fee68e4ff))
|
7
|
+
|
8
|
+
# [0.9.0](https://github.com/kapetacom/local-cluster-service/compare/v0.8.3...v0.9.0) (2023-07-24)
|
9
|
+
|
10
|
+
|
11
|
+
### Features
|
12
|
+
|
13
|
+
* Improves stability and consistency when starting blocks ([#48](https://github.com/kapetacom/local-cluster-service/issues/48)) ([87afeba](https://github.com/kapetacom/local-cluster-service/commit/87afebaa87f054865519186df61c6f51f1c2c5f0))
|
14
|
+
|
1
15
|
## [0.8.3](https://github.com/kapetacom/local-cluster-service/compare/v0.8.2...v0.8.3) (2023-07-23)
|
2
16
|
|
3
17
|
|
@@ -9,12 +9,13 @@ const node_fs_1 = __importDefault(require("node:fs"));
|
|
9
9
|
const fs_extra_1 = __importDefault(require("fs-extra"));
|
10
10
|
const yaml_1 = __importDefault(require("yaml"));
|
11
11
|
const node_cache_1 = __importDefault(require("node-cache"));
|
12
|
-
const local_cluster_config_1 = __importDefault(require("@kapeta/local-cluster-config"));
|
13
12
|
const codeGeneratorManager_1 = require("./codeGeneratorManager");
|
14
13
|
const progressListener_1 = require("./progressListener");
|
15
14
|
const nodejs_utils_1 = require("@kapeta/nodejs-utils");
|
16
15
|
const repositoryManager_1 = require("./repositoryManager");
|
17
16
|
const nodejs_registry_utils_1 = require("@kapeta/nodejs-registry-utils");
|
17
|
+
const definitionsManager_1 = require("./definitionsManager");
|
18
|
+
const utils_1 = require("./utils/utils");
|
18
19
|
function enrichAsset(asset) {
|
19
20
|
return {
|
20
21
|
ref: `kapeta://${asset.definition.metadata.name}:${asset.version}`,
|
@@ -53,7 +54,7 @@ class AssetManager {
|
|
53
54
|
*/
|
54
55
|
getAssets(assetKinds) {
|
55
56
|
if (!assetKinds) {
|
56
|
-
const blockTypeProviders =
|
57
|
+
const blockTypeProviders = definitionsManager_1.definitionsManager.getDefinitions([
|
57
58
|
'core/block-type',
|
58
59
|
'core/block-type-operator',
|
59
60
|
]);
|
@@ -62,7 +63,7 @@ class AssetManager {
|
|
62
63
|
});
|
63
64
|
assetKinds.push('core/plan');
|
64
65
|
}
|
65
|
-
const assets =
|
66
|
+
const assets = definitionsManager_1.definitionsManager.getDefinitions(assetKinds);
|
66
67
|
return assets.map(enrichAsset);
|
67
68
|
}
|
68
69
|
getPlans() {
|
@@ -76,13 +77,15 @@ class AssetManager {
|
|
76
77
|
return asset.data;
|
77
78
|
}
|
78
79
|
async getAsset(ref, noCache = false) {
|
80
|
+
ref = (0, utils_1.normalizeKapetaUri)(ref);
|
79
81
|
const cacheKey = `getAsset:${ref}`;
|
80
82
|
if (!noCache && this.cache.has(cacheKey)) {
|
81
83
|
return this.cache.get(cacheKey);
|
82
84
|
}
|
83
85
|
const uri = (0, nodejs_utils_1.parseKapetaUri)(ref);
|
84
86
|
await repositoryManager_1.repositoryManager.ensureAsset(uri.handle, uri.name, uri.version);
|
85
|
-
let asset =
|
87
|
+
let asset = definitionsManager_1.definitionsManager
|
88
|
+
.getDefinitions()
|
86
89
|
.map(enrichAsset)
|
87
90
|
.find((a) => (0, nodejs_utils_1.parseKapetaUri)(a.ref).equals(uri));
|
88
91
|
if (!asset) {
|
@@ -1,6 +1,7 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.clusterService = void 0;
|
4
|
+
const utils_1 = require("./utils/utils");
|
4
5
|
const net = require('net');
|
5
6
|
const DEFAULT_SERVER_PORT = 35100;
|
6
7
|
const DEFAULT_START_PORT = 40000;
|
@@ -108,6 +109,7 @@ class ClusterService {
|
|
108
109
|
* @return {string}
|
109
110
|
*/
|
110
111
|
getProxyPath(systemId, consumerInstanceId, consumerResourceName, portType) {
|
112
|
+
systemId = (0, utils_1.normalizeKapetaUri)(systemId);
|
111
113
|
return `/proxy/${encodeURIComponent(systemId)}/${encodeURIComponent(consumerInstanceId)}/${encodeURIComponent(consumerResourceName)}/${encodeURIComponent(portType)}/`;
|
112
114
|
}
|
113
115
|
}
|
@@ -6,13 +6,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.codeGeneratorManager = void 0;
|
7
7
|
const path_1 = __importDefault(require("path"));
|
8
8
|
const codegen_1 = require("@kapeta/codegen");
|
9
|
-
const
|
9
|
+
const definitionsManager_1 = require("./definitionsManager");
|
10
10
|
const TARGET_KIND = 'core/language-target';
|
11
11
|
const BLOCK_TYPE_KIND = 'core/block-type';
|
12
12
|
class CodeGeneratorManager {
|
13
13
|
async reload() {
|
14
14
|
codegen_1.registry.reset();
|
15
|
-
const languageTargets =
|
15
|
+
const languageTargets = definitionsManager_1.definitionsManager.getDefinitions(TARGET_KIND);
|
16
16
|
for (const languageTarget of languageTargets) {
|
17
17
|
const key = `${languageTarget.definition.metadata.name}:${languageTarget.version}`;
|
18
18
|
try {
|
@@ -34,7 +34,7 @@ class CodeGeneratorManager {
|
|
34
34
|
//Not all block types have targets
|
35
35
|
return false;
|
36
36
|
}
|
37
|
-
const blockTypes =
|
37
|
+
const blockTypes = definitionsManager_1.definitionsManager.getDefinitions(BLOCK_TYPE_KIND);
|
38
38
|
const blockTypeKinds = blockTypes.map((blockType) => blockType.definition.metadata.name.toLowerCase() + ':' + blockType.version);
|
39
39
|
return !!(yamlContent && yamlContent.kind && blockTypeKinds.indexOf(yamlContent.kind.toLowerCase()) > -1);
|
40
40
|
}
|
@@ -37,7 +37,7 @@ router.put('/instance', async (req, res) => {
|
|
37
37
|
if (req.kapeta.instanceId) {
|
38
38
|
configManager_1.configManager.setConfigForSection(req.kapeta.systemId, req.kapeta.instanceId, config);
|
39
39
|
//Restart the instance if it is running after config change
|
40
|
-
await instanceManager_1.instanceManager.
|
40
|
+
await instanceManager_1.instanceManager.restart(req.kapeta.systemId, req.kapeta.instanceId);
|
41
41
|
}
|
42
42
|
else {
|
43
43
|
configManager_1.configManager.setConfigForSystem(req.kapeta.systemId, config);
|
@@ -4,30 +4,36 @@ exports.configManager = void 0;
|
|
4
4
|
const storageService_1 = require("./storageService");
|
5
5
|
const assetManager_1 = require("./assetManager");
|
6
6
|
const nodejs_utils_1 = require("@kapeta/nodejs-utils");
|
7
|
+
const utils_1 = require("./utils/utils");
|
7
8
|
class ConfigManager {
|
8
9
|
_config;
|
9
10
|
constructor() {
|
10
11
|
this._config = storageService_1.storageService.section('config');
|
11
12
|
}
|
12
13
|
_forSystem(systemId) {
|
14
|
+
systemId = (0, utils_1.normalizeKapetaUri)(systemId);
|
13
15
|
if (!this._config[systemId]) {
|
14
16
|
this._config[systemId] = {};
|
15
17
|
}
|
16
18
|
return this._config[systemId];
|
17
19
|
}
|
18
20
|
setConfigForSystem(systemId, config) {
|
21
|
+
systemId = (0, utils_1.normalizeKapetaUri)(systemId);
|
19
22
|
const systemConfig = config || {};
|
20
23
|
storageService_1.storageService.put('config', systemId, systemConfig);
|
21
24
|
}
|
22
25
|
getConfigForSystem(systemId) {
|
26
|
+
systemId = (0, utils_1.normalizeKapetaUri)(systemId);
|
23
27
|
return this._forSystem(systemId);
|
24
28
|
}
|
25
29
|
setConfigForSection(systemId, sectionId, config) {
|
30
|
+
systemId = (0, utils_1.normalizeKapetaUri)(systemId);
|
26
31
|
let systemConfig = this._forSystem(systemId);
|
27
32
|
systemConfig[sectionId] = config || {};
|
28
33
|
storageService_1.storageService.put('config', systemId, systemConfig);
|
29
34
|
}
|
30
35
|
getConfigForSection(systemId, sectionId) {
|
36
|
+
systemId = (0, utils_1.normalizeKapetaUri)(systemId);
|
31
37
|
const systemConfig = this._forSystem(systemId);
|
32
38
|
if (!systemConfig[sectionId]) {
|
33
39
|
systemConfig[sectionId] = {};
|
@@ -51,6 +57,10 @@ class ConfigManager {
|
|
51
57
|
* @returns {Promise<{systemId:string,instanceId:string}>}
|
52
58
|
*/
|
53
59
|
async resolveIdentity(blockRef, systemId) {
|
60
|
+
blockRef = (0, utils_1.normalizeKapetaUri)(blockRef);
|
61
|
+
if (systemId) {
|
62
|
+
systemId = (0, utils_1.normalizeKapetaUri)(systemId);
|
63
|
+
}
|
54
64
|
const planAssets = assetManager_1.assetManager.getPlans();
|
55
65
|
const blockUri = (0, nodejs_utils_1.parseKapetaUri)(blockRef);
|
56
66
|
let matchingIdentities = [];
|
@@ -66,7 +76,7 @@ class ConfigManager {
|
|
66
76
|
const refUri = (0, nodejs_utils_1.parseKapetaUri)(blockInstance.block.ref);
|
67
77
|
if (refUri.equals(blockUri)) {
|
68
78
|
matchingIdentities.push({
|
69
|
-
systemId: planAsset.ref,
|
79
|
+
systemId: (0, utils_1.normalizeKapetaUri)(planAsset.ref),
|
70
80
|
instanceId: blockInstance.id,
|
71
81
|
});
|
72
82
|
}
|
@@ -87,6 +97,8 @@ class ConfigManager {
|
|
87
97
|
return matchingIdentities[0];
|
88
98
|
}
|
89
99
|
async verifyIdentity(blockRef, systemId, instanceId) {
|
100
|
+
blockRef = (0, utils_1.normalizeKapetaUri)(blockRef);
|
101
|
+
systemId = (0, utils_1.normalizeKapetaUri)(systemId);
|
90
102
|
const planAssets = assetManager_1.assetManager.getPlans();
|
91
103
|
const systemUri = systemId ? (0, nodejs_utils_1.parseKapetaUri)(systemId) : null;
|
92
104
|
const blockUri = (0, nodejs_utils_1.parseKapetaUri)(blockRef);
|
@@ -17,12 +17,31 @@ export interface DockerMounts {
|
|
17
17
|
ReadOnly: boolean;
|
18
18
|
Consistency: string;
|
19
19
|
}
|
20
|
+
interface DockerState {
|
21
|
+
Status: 'created' | 'running' | 'paused' | 'restarting' | 'removing' | 'exited' | 'dead';
|
22
|
+
Running: boolean;
|
23
|
+
Paused: boolean;
|
24
|
+
Restarting: boolean;
|
25
|
+
OOMKilled: boolean;
|
26
|
+
Dead: boolean;
|
27
|
+
Pid: number;
|
28
|
+
ExitCode: number;
|
29
|
+
Error: string;
|
30
|
+
StartedAt: string;
|
31
|
+
FinishedAt: string;
|
32
|
+
Health?: {
|
33
|
+
Status: 'starting' | 'healthy' | 'unhealthy' | 'none';
|
34
|
+
FailingStreak: number;
|
35
|
+
Log: any[] | null;
|
36
|
+
};
|
37
|
+
}
|
20
38
|
interface Health {
|
21
39
|
cmd: string;
|
22
40
|
interval?: number;
|
23
41
|
timeout?: number;
|
24
42
|
retries?: number;
|
25
43
|
}
|
44
|
+
export declare const HEALTH_CHECK_TIMEOUT: number;
|
26
45
|
declare class ContainerManager {
|
27
46
|
private _docker;
|
28
47
|
private _alive;
|
@@ -36,7 +55,7 @@ declare class ContainerManager {
|
|
36
55
|
createMounts(kind: string, mountOpts: StringMap): StringMap;
|
37
56
|
ping(): Promise<void>;
|
38
57
|
docker(): Docker;
|
39
|
-
getContainerByName(containerName: string): Promise<
|
58
|
+
getContainerByName(containerName: string): Promise<ContainerInfo | undefined>;
|
40
59
|
pull(image: string, cacheForMS?: number): Promise<void>;
|
41
60
|
toDockerMounts(mounts: StringMap): DockerMounts[];
|
42
61
|
toDockerHealth(health: Health): {
|
@@ -57,6 +76,9 @@ declare class ContainerManager {
|
|
57
76
|
waitForHealthy(container: Container, attempt?: number): Promise<void>;
|
58
77
|
_isReady(container: Container): Promise<any>;
|
59
78
|
_isHealthy(container: Container): Promise<boolean>;
|
79
|
+
remove(container: Container, opts?: {
|
80
|
+
force?: boolean;
|
81
|
+
}): Promise<void>;
|
60
82
|
/**
|
61
83
|
*
|
62
84
|
* @param name
|
@@ -84,7 +106,8 @@ export declare class ContainerInfo {
|
|
84
106
|
protocol: string;
|
85
107
|
hostPort: string;
|
86
108
|
} | null>;
|
87
|
-
|
109
|
+
inspect(): Promise<any>;
|
110
|
+
status(): Promise<DockerState>;
|
88
111
|
getPorts(): Promise<PortMap | false>;
|
89
112
|
}
|
90
113
|
export declare function getExtraHosts(dockerVersion: string): string[] | undefined;
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
4
|
};
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
exports.containerManager = exports.toLocalBindVolume = exports.getExtraHosts = exports.ContainerInfo = void 0;
|
6
|
+
exports.containerManager = exports.toLocalBindVolume = exports.getExtraHosts = exports.ContainerInfo = exports.HEALTH_CHECK_TIMEOUT = void 0;
|
7
7
|
const path_1 = __importDefault(require("path"));
|
8
8
|
const storageService_1 = require("./storageService");
|
9
9
|
const os_1 = __importDefault(require("os"));
|
@@ -13,12 +13,14 @@ const node_docker_api_1 = require("node-docker-api");
|
|
13
13
|
const nodejs_utils_1 = require("@kapeta/nodejs-utils");
|
14
14
|
const local_cluster_config_1 = __importDefault(require("@kapeta/local-cluster-config"));
|
15
15
|
const utils_1 = require("./utils/utils");
|
16
|
+
const node_uuid_1 = __importDefault(require("node-uuid"));
|
16
17
|
const LABEL_PORT_PREFIX = 'kapeta_port-';
|
17
18
|
const NANO_SECOND = 1000000;
|
18
|
-
const HEALTH_CHECK_INTERVAL =
|
19
|
-
const HEALTH_CHECK_MAX =
|
19
|
+
const HEALTH_CHECK_INTERVAL = 3000;
|
20
|
+
const HEALTH_CHECK_MAX = 20;
|
20
21
|
const IMAGE_PULL_CACHE_TTL = 30 * 60 * 1000;
|
21
22
|
const IMAGE_PULL_CACHE = {};
|
23
|
+
exports.HEALTH_CHECK_TIMEOUT = HEALTH_CHECK_INTERVAL * HEALTH_CHECK_MAX * 2;
|
22
24
|
const promisifyStream = (stream) => new Promise((resolve, reject) => {
|
23
25
|
stream.on('data', (d) => console.log(d.toString()));
|
24
26
|
stream.on('end', resolve);
|
@@ -131,9 +133,14 @@ class ContainerManager {
|
|
131
133
|
}
|
132
134
|
async getContainerByName(containerName) {
|
133
135
|
const containers = await this.docker().container.list({ all: true });
|
134
|
-
|
135
|
-
|
136
|
+
const out = containers.find((container) => {
|
137
|
+
const containerData = container.data;
|
138
|
+
return containerData.Names.indexOf(`/${containerName}`) > -1;
|
136
139
|
});
|
140
|
+
if (out) {
|
141
|
+
return new ContainerInfo(out);
|
142
|
+
}
|
143
|
+
return undefined;
|
137
144
|
}
|
138
145
|
async pull(image, cacheForMS = IMAGE_PULL_CACHE_TTL) {
|
139
146
|
let [imageName, tag] = image.split(/:/);
|
@@ -294,17 +301,36 @@ class ContainerManager {
|
|
294
301
|
});
|
295
302
|
}
|
296
303
|
async _isReady(container) {
|
297
|
-
|
304
|
+
let info;
|
305
|
+
try {
|
306
|
+
info = await container.status();
|
307
|
+
}
|
308
|
+
catch (err) {
|
309
|
+
return false;
|
310
|
+
}
|
298
311
|
const infoData = info?.data;
|
299
|
-
|
312
|
+
const state = infoData?.State;
|
313
|
+
if (state?.Status === 'exited' || state?.Status === 'removing' || state?.Status === 'dead') {
|
300
314
|
throw new Error('Container exited unexpectedly');
|
301
315
|
}
|
302
316
|
return infoData?.State?.Running ?? false;
|
303
317
|
}
|
304
318
|
async _isHealthy(container) {
|
305
|
-
|
306
|
-
|
307
|
-
|
319
|
+
try {
|
320
|
+
const info = await container.status();
|
321
|
+
const infoData = info?.data;
|
322
|
+
return infoData?.State?.Health?.Status === 'healthy';
|
323
|
+
}
|
324
|
+
catch (err) {
|
325
|
+
return false;
|
326
|
+
}
|
327
|
+
}
|
328
|
+
async remove(container, opts) {
|
329
|
+
const newName = 'deleting-' + node_uuid_1.default.v4();
|
330
|
+
const containerData = container.data;
|
331
|
+
// Rename the container first to avoid name conflicts if people start the same container
|
332
|
+
await container.rename({ name: newName });
|
333
|
+
await container.delete({ force: !!opts?.force });
|
308
334
|
}
|
309
335
|
/**
|
310
336
|
*
|
@@ -345,7 +371,7 @@ class ContainerInfo {
|
|
345
371
|
return this._container;
|
346
372
|
}
|
347
373
|
async isRunning() {
|
348
|
-
const inspectResult = await this.
|
374
|
+
const inspectResult = await this.inspect();
|
349
375
|
if (!inspectResult || !inspectResult.State) {
|
350
376
|
return false;
|
351
377
|
}
|
@@ -361,7 +387,7 @@ class ContainerInfo {
|
|
361
387
|
await this._container.stop();
|
362
388
|
}
|
363
389
|
async remove(opts) {
|
364
|
-
await this._container
|
390
|
+
await exports.containerManager.remove(this._container, opts);
|
365
391
|
}
|
366
392
|
async getPort(type) {
|
367
393
|
const ports = await this.getPorts();
|
@@ -370,12 +396,21 @@ class ContainerInfo {
|
|
370
396
|
}
|
371
397
|
return null;
|
372
398
|
}
|
373
|
-
async
|
374
|
-
|
375
|
-
|
399
|
+
async inspect() {
|
400
|
+
try {
|
401
|
+
const result = await this._container.status();
|
402
|
+
return result ? result.data : null;
|
403
|
+
}
|
404
|
+
catch (err) {
|
405
|
+
return null;
|
406
|
+
}
|
407
|
+
}
|
408
|
+
async status() {
|
409
|
+
const result = await this.inspect();
|
410
|
+
return result.State;
|
376
411
|
}
|
377
412
|
async getPorts() {
|
378
|
-
const inspectResult = await this.
|
413
|
+
const inspectResult = await this.inspect();
|
379
414
|
if (!inspectResult || !inspectResult.Config || !inspectResult.Config.Labels) {
|
380
415
|
return false;
|
381
416
|
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import { DefinitionInfo } from '@kapeta/local-cluster-config';
|
2
|
+
declare class DefinitionsManager {
|
3
|
+
private cache;
|
4
|
+
private getKey;
|
5
|
+
clearCache(): void;
|
6
|
+
private doCached;
|
7
|
+
getDefinitions(kindFilter?: string | string[]): DefinitionInfo[];
|
8
|
+
getProviderDefinitions(): DefinitionInfo[];
|
9
|
+
}
|
10
|
+
export declare const definitionsManager: DefinitionsManager;
|
11
|
+
export {};
|
@@ -0,0 +1,44 @@
|
|
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.definitionsManager = void 0;
|
7
|
+
const local_cluster_config_1 = __importDefault(require("@kapeta/local-cluster-config"));
|
8
|
+
const CACHE_TTL = 60 * 1000; // 1 min
|
9
|
+
class DefinitionsManager {
|
10
|
+
cache = {};
|
11
|
+
getKey(kindFilter) {
|
12
|
+
if (kindFilter) {
|
13
|
+
if (Array.isArray(kindFilter)) {
|
14
|
+
return kindFilter.join(',');
|
15
|
+
}
|
16
|
+
return kindFilter;
|
17
|
+
}
|
18
|
+
return 'none';
|
19
|
+
}
|
20
|
+
clearCache() {
|
21
|
+
this.cache = {};
|
22
|
+
}
|
23
|
+
doCached(key, getter) {
|
24
|
+
if (this.cache[key]) {
|
25
|
+
if (this.cache[key].expires > Date.now()) {
|
26
|
+
return this.cache[key].definitions;
|
27
|
+
}
|
28
|
+
delete this.cache[key];
|
29
|
+
}
|
30
|
+
this.cache[key] = {
|
31
|
+
expires: Date.now() + CACHE_TTL,
|
32
|
+
definitions: getter(),
|
33
|
+
};
|
34
|
+
return this.cache[key].definitions;
|
35
|
+
}
|
36
|
+
getDefinitions(kindFilter) {
|
37
|
+
const key = this.getKey(kindFilter);
|
38
|
+
return this.doCached(key, () => local_cluster_config_1.default.getDefinitions(kindFilter));
|
39
|
+
}
|
40
|
+
getProviderDefinitions() {
|
41
|
+
return this.doCached('providers', () => local_cluster_config_1.default.getProviderDefinitions());
|
42
|
+
}
|
43
|
+
}
|
44
|
+
exports.definitionsManager = new DefinitionsManager();
|
@@ -21,9 +21,7 @@ function isFile(path) {
|
|
21
21
|
class FilesystemManager {
|
22
22
|
async writeFile(path, data) {
|
23
23
|
const dirName = path_1.default.dirname(path);
|
24
|
-
console.log('Dir name', dirName, path);
|
25
24
|
if (!fs_1.default.existsSync(dirName)) {
|
26
|
-
console.log('Making folder', dirName);
|
27
25
|
fs_extra_1.default.mkdirpSync(dirName, {});
|
28
26
|
}
|
29
27
|
fs_1.default.writeFileSync(path, data);
|
@@ -1,56 +1,32 @@
|
|
1
|
-
import { InstanceInfo
|
2
|
-
declare class InstanceManager {
|
1
|
+
import { InstanceInfo } from './types';
|
2
|
+
export declare class InstanceManager {
|
3
3
|
private _interval;
|
4
|
-
|
5
|
-
* Contains an array of running instances that have self-registered with this
|
6
|
-
* cluster service. This is done by the Kapeta SDKs
|
7
|
-
*/
|
8
|
-
private _instances;
|
9
|
-
/**
|
10
|
-
* Contains the process info for the instances started by this manager. In memory only
|
11
|
-
* so can't be relied on for knowing everything that's running.
|
12
|
-
*
|
13
|
-
*/
|
14
|
-
private _processes;
|
4
|
+
private readonly _instances;
|
15
5
|
constructor();
|
16
|
-
|
17
|
-
_checkInstances(): Promise<void>;
|
18
|
-
_isRunning(instance: InstanceInfo): Promise<any>;
|
19
|
-
_getInstanceStatus(instance: InstanceInfo): Promise<string>;
|
6
|
+
private checkInstancesLater;
|
20
7
|
getInstances(): InstanceInfo[];
|
21
8
|
getInstancesForPlan(systemId: string): InstanceInfo[];
|
22
|
-
/**
|
23
|
-
* Get instance information
|
24
|
-
*
|
25
|
-
* @param {string} systemId
|
26
|
-
* @param {string} instanceId
|
27
|
-
* @return {*}
|
28
|
-
*/
|
29
9
|
getInstance(systemId: string, instanceId: string): InstanceInfo | undefined;
|
10
|
+
saveInternalInstance(instance: InstanceInfo): Promise<InstanceInfo>;
|
30
11
|
/**
|
31
|
-
*
|
32
|
-
*
|
33
|
-
* @param {string} instanceId
|
34
|
-
* @param {InstanceInfo} info
|
35
|
-
* @return {Promise<void>}
|
36
|
-
*/
|
37
|
-
registerInstance(systemId: string, instanceId: string, info: Omit<InstanceInfo, 'systemId' | 'instanceId'>): Promise<void>;
|
38
|
-
setInstanceAsStopped(systemId: string, instanceId: string): void;
|
39
|
-
_emit(systemId: string, type: string, payload: any): void;
|
40
|
-
createProcessesForPlan(planRef: string): Promise<ProcessInfo[]>;
|
41
|
-
_stopInstance(instance: InstanceInfo): Promise<void>;
|
42
|
-
stopAllForPlan(planRef: string): Promise<void>;
|
43
|
-
createProcess(planRef: string, instanceId: string): Promise<ProcessInfo>;
|
44
|
-
/**
|
45
|
-
*
|
46
|
-
* @param {string} planRef
|
47
|
-
* @param {string} instanceId
|
48
|
-
* @return {ProcessInfo|null}
|
12
|
+
* Method is called when instance is started from the Kapeta SDKs (e.g. NodeJS SDK)
|
13
|
+
* which self-registers with the cluster service locally on startup.
|
49
14
|
*/
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
15
|
+
registerInstanceFromSDK(systemId: string, instanceId: string, info: Omit<InstanceInfo, 'systemId' | 'instanceId'>): Promise<InstanceInfo | undefined>;
|
16
|
+
private getHealthUrl;
|
17
|
+
markAsStopped(systemId: string, instanceId: string): void;
|
18
|
+
startAllForPlan(systemId: string): Promise<InstanceInfo[]>;
|
19
|
+
stop(systemId: string, instanceId: string): Promise<void>;
|
20
|
+
stopAllForPlan(systemId: string): Promise<void>;
|
21
|
+
start(systemId: string, instanceId: string): Promise<InstanceInfo>;
|
22
|
+
restart(systemId: string, instanceId: string): Promise<InstanceInfo>;
|
23
|
+
stopAll(): Promise<void>;
|
24
|
+
private stopInstances;
|
25
|
+
private save;
|
26
|
+
private checkInstances;
|
27
|
+
private getExternalStatus;
|
28
|
+
private requestInstanceStatus;
|
29
|
+
private emitSystemEvent;
|
30
|
+
private emitInstanceEvent;
|
54
31
|
}
|
55
32
|
export declare const instanceManager: InstanceManager;
|
56
|
-
export {};
|