@kapeta/local-cluster-service 0.8.2 → 0.9.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 +14 -0
- package/definitions.d.ts +1 -1
- package/dist/cjs/index.js +3 -3
- package/dist/cjs/src/assetManager.js +7 -4
- package/dist/cjs/src/attachments/routes.js +4 -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 +22 -2
- package/dist/cjs/src/containerManager.js +42 -15
- 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 +28 -29
- package/dist/cjs/src/utils/utils.d.ts +2 -0
- package/dist/cjs/src/utils/utils.js +18 -2
- package/dist/esm/index.js +4 -4
- package/dist/esm/src/assetManager.js +7 -4
- package/dist/esm/src/attachments/routes.js +5 -5
- 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 +22 -2
- package/dist/esm/src/containerManager.js +41 -14
- 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 +29 -30
- package/dist/esm/src/utils/utils.d.ts +2 -0
- package/dist/esm/src/utils/utils.js +15 -1
- package/index.ts +10 -8
- package/package.json +2 -1
- package/src/assetManager.ts +7 -4
- package/src/attachments/routes.ts +8 -8
- 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 +63 -16
- package/src/definitionsManager.ts +54 -0
- package/src/filesystemManager.ts +0 -2
- package/src/identities/routes.ts +2 -3
- 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 +14 -10
- package/src/serviceManager.ts +6 -0
- package/src/storageService.ts +1 -1
- package/src/types.ts +44 -14
- package/src/utils/BlockInstanceRunner.ts +34 -34
- package/src/utils/utils.ts +20 -2
package/dist/esm/index.js
CHANGED
@@ -16,7 +16,7 @@ import AssetsRoutes from './src/assets/routes';
|
|
16
16
|
import ProviderRoutes from './src/providers/routes';
|
17
17
|
import AttachmentRoutes from './src/attachments/routes';
|
18
18
|
import { getBindHost } from './src/utils/utils';
|
19
|
-
import request from
|
19
|
+
import request from 'request';
|
20
20
|
let currentServer = null;
|
21
21
|
function createServer() {
|
22
22
|
const app = express();
|
@@ -33,19 +33,19 @@ function createServer() {
|
|
33
33
|
res.send({
|
34
34
|
ok: true,
|
35
35
|
dockerStatus: await containerManager.checkAlive(),
|
36
|
-
socketStatus: socketManager.isAlive()
|
36
|
+
socketStatus: socketManager.isAlive(),
|
37
37
|
});
|
38
38
|
});
|
39
39
|
app.get('/ping', async (req, res) => {
|
40
40
|
res.send({
|
41
|
-
ok: true
|
41
|
+
ok: true,
|
42
42
|
});
|
43
43
|
});
|
44
44
|
app.use('/', (req, res) => {
|
45
45
|
console.error('Invalid request: %s %s', req.method, req.originalUrl);
|
46
46
|
res.status(400).send({
|
47
47
|
ok: false,
|
48
|
-
error: 'Unknown'
|
48
|
+
error: 'Unknown',
|
49
49
|
});
|
50
50
|
});
|
51
51
|
const server = HTTP.createServer(app);
|
@@ -3,12 +3,13 @@ import FS from 'node:fs';
|
|
3
3
|
import FSExtra from 'fs-extra';
|
4
4
|
import YAML from 'yaml';
|
5
5
|
import NodeCache from 'node-cache';
|
6
|
-
import ClusterConfiguration from '@kapeta/local-cluster-config';
|
7
6
|
import { codeGeneratorManager } from './codeGeneratorManager';
|
8
7
|
import { progressListener } from './progressListener';
|
9
8
|
import { parseKapetaUri } from '@kapeta/nodejs-utils';
|
10
9
|
import { repositoryManager } from './repositoryManager';
|
11
10
|
import { Actions } from '@kapeta/nodejs-registry-utils';
|
11
|
+
import { definitionsManager } from './definitionsManager';
|
12
|
+
import { normalizeKapetaUri } from './utils/utils';
|
12
13
|
function enrichAsset(asset) {
|
13
14
|
return {
|
14
15
|
ref: `kapeta://${asset.definition.metadata.name}:${asset.version}`,
|
@@ -47,7 +48,7 @@ class AssetManager {
|
|
47
48
|
*/
|
48
49
|
getAssets(assetKinds) {
|
49
50
|
if (!assetKinds) {
|
50
|
-
const blockTypeProviders =
|
51
|
+
const blockTypeProviders = definitionsManager.getDefinitions([
|
51
52
|
'core/block-type',
|
52
53
|
'core/block-type-operator',
|
53
54
|
]);
|
@@ -56,7 +57,7 @@ class AssetManager {
|
|
56
57
|
});
|
57
58
|
assetKinds.push('core/plan');
|
58
59
|
}
|
59
|
-
const assets =
|
60
|
+
const assets = definitionsManager.getDefinitions(assetKinds);
|
60
61
|
return assets.map(enrichAsset);
|
61
62
|
}
|
62
63
|
getPlans() {
|
@@ -70,13 +71,15 @@ class AssetManager {
|
|
70
71
|
return asset.data;
|
71
72
|
}
|
72
73
|
async getAsset(ref, noCache = false) {
|
74
|
+
ref = normalizeKapetaUri(ref);
|
73
75
|
const cacheKey = `getAsset:${ref}`;
|
74
76
|
if (!noCache && this.cache.has(cacheKey)) {
|
75
77
|
return this.cache.get(cacheKey);
|
76
78
|
}
|
77
79
|
const uri = parseKapetaUri(ref);
|
78
80
|
await repositoryManager.ensureAsset(uri.handle, uri.name, uri.version);
|
79
|
-
let asset =
|
81
|
+
let asset = definitionsManager
|
82
|
+
.getDefinitions()
|
80
83
|
.map(enrichAsset)
|
81
84
|
.find((a) => parseKapetaUri(a.ref).equals(uri));
|
82
85
|
if (!asset) {
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import Router from 'express-promise-router';
|
2
2
|
import { KapetaAPI } from '@kapeta/nodejs-api-client';
|
3
3
|
import { corsHandler } from '../middleware/cors';
|
4
|
-
import { storageService } from
|
4
|
+
import { storageService } from '../storageService';
|
5
5
|
const router = Router();
|
6
6
|
const api = new KapetaAPI();
|
7
7
|
const DEFAULT_REGISTRY_BASE = 'https://registry.kapeta.com';
|
@@ -15,21 +15,21 @@ router.put('/:handle/:name', async (req, res) => {
|
|
15
15
|
if (!req.headers['content-type']) {
|
16
16
|
res.status(400).send({
|
17
17
|
status: 400,
|
18
|
-
error: 'Missing content-type header'
|
18
|
+
error: 'Missing content-type header',
|
19
19
|
});
|
20
20
|
return;
|
21
21
|
}
|
22
22
|
if (!req.headers['content-length']) {
|
23
23
|
res.status(400).send({
|
24
24
|
status: 400,
|
25
|
-
error: 'Missing content-length header'
|
25
|
+
error: 'Missing content-length header',
|
26
26
|
});
|
27
27
|
return;
|
28
28
|
}
|
29
29
|
if (!req.headers['content-disposition']) {
|
30
30
|
res.status(400).send({
|
31
31
|
status: 400,
|
32
|
-
error: 'Missing content-disposition header'
|
32
|
+
error: 'Missing content-disposition header',
|
33
33
|
});
|
34
34
|
return;
|
35
35
|
}
|
@@ -45,7 +45,7 @@ router.put('/:handle/:name', async (req, res) => {
|
|
45
45
|
'content-length': req.headers['content-length'],
|
46
46
|
'content-disposition': req.headers['content-disposition'],
|
47
47
|
},
|
48
|
-
body: req
|
48
|
+
body: req,
|
49
49
|
});
|
50
50
|
res.send(result);
|
51
51
|
}
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import { normalizeKapetaUri } from './utils/utils';
|
1
2
|
const net = require('net');
|
2
3
|
const DEFAULT_SERVER_PORT = 35100;
|
3
4
|
const DEFAULT_START_PORT = 40000;
|
@@ -105,6 +106,7 @@ class ClusterService {
|
|
105
106
|
* @return {string}
|
106
107
|
*/
|
107
108
|
getProxyPath(systemId, consumerInstanceId, consumerResourceName, portType) {
|
109
|
+
systemId = normalizeKapetaUri(systemId);
|
108
110
|
return `/proxy/${encodeURIComponent(systemId)}/${encodeURIComponent(consumerInstanceId)}/${encodeURIComponent(consumerResourceName)}/${encodeURIComponent(portType)}/`;
|
109
111
|
}
|
110
112
|
}
|
@@ -1,12 +1,12 @@
|
|
1
1
|
import Path from 'path';
|
2
2
|
import { registry as Targets, BlockCodeGenerator, CodeWriter } from '@kapeta/codegen';
|
3
|
-
import
|
3
|
+
import { definitionsManager } from './definitionsManager';
|
4
4
|
const TARGET_KIND = 'core/language-target';
|
5
5
|
const BLOCK_TYPE_KIND = 'core/block-type';
|
6
6
|
class CodeGeneratorManager {
|
7
7
|
async reload() {
|
8
8
|
Targets.reset();
|
9
|
-
const languageTargets =
|
9
|
+
const languageTargets = definitionsManager.getDefinitions(TARGET_KIND);
|
10
10
|
for (const languageTarget of languageTargets) {
|
11
11
|
const key = `${languageTarget.definition.metadata.name}:${languageTarget.version}`;
|
12
12
|
try {
|
@@ -28,7 +28,7 @@ class CodeGeneratorManager {
|
|
28
28
|
//Not all block types have targets
|
29
29
|
return false;
|
30
30
|
}
|
31
|
-
const blockTypes =
|
31
|
+
const blockTypes = definitionsManager.getDefinitions(BLOCK_TYPE_KIND);
|
32
32
|
const blockTypeKinds = blockTypes.map((blockType) => blockType.definition.metadata.name.toLowerCase() + ':' + blockType.version);
|
33
33
|
return !!(yamlContent && yamlContent.kind && blockTypeKinds.indexOf(yamlContent.kind.toLowerCase()) > -1);
|
34
34
|
}
|
@@ -32,7 +32,7 @@ router.put('/instance', async (req, res) => {
|
|
32
32
|
if (req.kapeta.instanceId) {
|
33
33
|
configManager.setConfigForSection(req.kapeta.systemId, req.kapeta.instanceId, config);
|
34
34
|
//Restart the instance if it is running after config change
|
35
|
-
await instanceManager.
|
35
|
+
await instanceManager.restart(req.kapeta.systemId, req.kapeta.instanceId);
|
36
36
|
}
|
37
37
|
else {
|
38
38
|
configManager.setConfigForSystem(req.kapeta.systemId, config);
|
@@ -1,30 +1,36 @@
|
|
1
1
|
import { storageService } from './storageService';
|
2
2
|
import { assetManager } from './assetManager';
|
3
3
|
import { parseKapetaUri } from '@kapeta/nodejs-utils';
|
4
|
+
import { normalizeKapetaUri } from './utils/utils';
|
4
5
|
class ConfigManager {
|
5
6
|
_config;
|
6
7
|
constructor() {
|
7
8
|
this._config = storageService.section('config');
|
8
9
|
}
|
9
10
|
_forSystem(systemId) {
|
11
|
+
systemId = normalizeKapetaUri(systemId);
|
10
12
|
if (!this._config[systemId]) {
|
11
13
|
this._config[systemId] = {};
|
12
14
|
}
|
13
15
|
return this._config[systemId];
|
14
16
|
}
|
15
17
|
setConfigForSystem(systemId, config) {
|
18
|
+
systemId = normalizeKapetaUri(systemId);
|
16
19
|
const systemConfig = config || {};
|
17
20
|
storageService.put('config', systemId, systemConfig);
|
18
21
|
}
|
19
22
|
getConfigForSystem(systemId) {
|
23
|
+
systemId = normalizeKapetaUri(systemId);
|
20
24
|
return this._forSystem(systemId);
|
21
25
|
}
|
22
26
|
setConfigForSection(systemId, sectionId, config) {
|
27
|
+
systemId = normalizeKapetaUri(systemId);
|
23
28
|
let systemConfig = this._forSystem(systemId);
|
24
29
|
systemConfig[sectionId] = config || {};
|
25
30
|
storageService.put('config', systemId, systemConfig);
|
26
31
|
}
|
27
32
|
getConfigForSection(systemId, sectionId) {
|
33
|
+
systemId = normalizeKapetaUri(systemId);
|
28
34
|
const systemConfig = this._forSystem(systemId);
|
29
35
|
if (!systemConfig[sectionId]) {
|
30
36
|
systemConfig[sectionId] = {};
|
@@ -48,6 +54,10 @@ class ConfigManager {
|
|
48
54
|
* @returns {Promise<{systemId:string,instanceId:string}>}
|
49
55
|
*/
|
50
56
|
async resolveIdentity(blockRef, systemId) {
|
57
|
+
blockRef = normalizeKapetaUri(blockRef);
|
58
|
+
if (systemId) {
|
59
|
+
systemId = normalizeKapetaUri(systemId);
|
60
|
+
}
|
51
61
|
const planAssets = assetManager.getPlans();
|
52
62
|
const blockUri = parseKapetaUri(blockRef);
|
53
63
|
let matchingIdentities = [];
|
@@ -63,7 +73,7 @@ class ConfigManager {
|
|
63
73
|
const refUri = parseKapetaUri(blockInstance.block.ref);
|
64
74
|
if (refUri.equals(blockUri)) {
|
65
75
|
matchingIdentities.push({
|
66
|
-
systemId: planAsset.ref,
|
76
|
+
systemId: normalizeKapetaUri(planAsset.ref),
|
67
77
|
instanceId: blockInstance.id,
|
68
78
|
});
|
69
79
|
}
|
@@ -84,6 +94,8 @@ class ConfigManager {
|
|
84
94
|
return matchingIdentities[0];
|
85
95
|
}
|
86
96
|
async verifyIdentity(blockRef, systemId, instanceId) {
|
97
|
+
blockRef = normalizeKapetaUri(blockRef);
|
98
|
+
systemId = normalizeKapetaUri(systemId);
|
87
99
|
const planAssets = assetManager.getPlans();
|
88
100
|
const systemUri = systemId ? parseKapetaUri(systemId) : null;
|
89
101
|
const blockUri = 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): {
|
@@ -84,7 +103,8 @@ export declare class ContainerInfo {
|
|
84
103
|
protocol: string;
|
85
104
|
hostPort: string;
|
86
105
|
} | null>;
|
87
|
-
|
106
|
+
inspect(): Promise<any>;
|
107
|
+
status(): Promise<DockerState>;
|
88
108
|
getPorts(): Promise<PortMap | false>;
|
89
109
|
}
|
90
110
|
export declare function getExtraHosts(dockerVersion: string): string[] | undefined;
|
@@ -9,10 +9,11 @@ import ClusterConfiguration from '@kapeta/local-cluster-config';
|
|
9
9
|
import { getBindHost } from './utils/utils';
|
10
10
|
const LABEL_PORT_PREFIX = 'kapeta_port-';
|
11
11
|
const NANO_SECOND = 1000000;
|
12
|
-
const HEALTH_CHECK_INTERVAL =
|
13
|
-
const HEALTH_CHECK_MAX =
|
12
|
+
const HEALTH_CHECK_INTERVAL = 3000;
|
13
|
+
const HEALTH_CHECK_MAX = 20;
|
14
14
|
const IMAGE_PULL_CACHE_TTL = 30 * 60 * 1000;
|
15
15
|
const IMAGE_PULL_CACHE = {};
|
16
|
+
export const HEALTH_CHECK_TIMEOUT = HEALTH_CHECK_INTERVAL * HEALTH_CHECK_MAX * 2;
|
16
17
|
const promisifyStream = (stream) => new Promise((resolve, reject) => {
|
17
18
|
stream.on('data', (d) => console.log(d.toString()));
|
18
19
|
stream.on('end', resolve);
|
@@ -125,9 +126,14 @@ class ContainerManager {
|
|
125
126
|
}
|
126
127
|
async getContainerByName(containerName) {
|
127
128
|
const containers = await this.docker().container.list({ all: true });
|
128
|
-
|
129
|
-
|
129
|
+
const out = containers.find((container) => {
|
130
|
+
const containerData = container.data;
|
131
|
+
return containerData.Names.indexOf(`/${containerName}`) > -1;
|
130
132
|
});
|
133
|
+
if (out) {
|
134
|
+
return new ContainerInfo(out);
|
135
|
+
}
|
136
|
+
return undefined;
|
131
137
|
}
|
132
138
|
async pull(image, cacheForMS = IMAGE_PULL_CACHE_TTL) {
|
133
139
|
let [imageName, tag] = image.split(/:/);
|
@@ -288,17 +294,29 @@ class ContainerManager {
|
|
288
294
|
});
|
289
295
|
}
|
290
296
|
async _isReady(container) {
|
291
|
-
|
297
|
+
let info;
|
298
|
+
try {
|
299
|
+
info = await container.status();
|
300
|
+
}
|
301
|
+
catch (err) {
|
302
|
+
return false;
|
303
|
+
}
|
292
304
|
const infoData = info?.data;
|
293
|
-
|
305
|
+
const state = infoData?.State;
|
306
|
+
if (state?.Status === 'exited' || state?.Status === 'removing' || state?.Status === 'dead') {
|
294
307
|
throw new Error('Container exited unexpectedly');
|
295
308
|
}
|
296
309
|
return infoData?.State?.Running ?? false;
|
297
310
|
}
|
298
311
|
async _isHealthy(container) {
|
299
|
-
|
300
|
-
|
301
|
-
|
312
|
+
try {
|
313
|
+
const info = await container.status();
|
314
|
+
const infoData = info?.data;
|
315
|
+
return infoData?.State?.Health?.Status === 'healthy';
|
316
|
+
}
|
317
|
+
catch (err) {
|
318
|
+
return false;
|
319
|
+
}
|
302
320
|
}
|
303
321
|
/**
|
304
322
|
*
|
@@ -339,7 +357,7 @@ export class ContainerInfo {
|
|
339
357
|
return this._container;
|
340
358
|
}
|
341
359
|
async isRunning() {
|
342
|
-
const inspectResult = await this.
|
360
|
+
const inspectResult = await this.inspect();
|
343
361
|
if (!inspectResult || !inspectResult.State) {
|
344
362
|
return false;
|
345
363
|
}
|
@@ -364,12 +382,21 @@ export class ContainerInfo {
|
|
364
382
|
}
|
365
383
|
return null;
|
366
384
|
}
|
367
|
-
async
|
368
|
-
|
369
|
-
|
385
|
+
async inspect() {
|
386
|
+
try {
|
387
|
+
const result = await this._container.status();
|
388
|
+
return result ? result.data : null;
|
389
|
+
}
|
390
|
+
catch (err) {
|
391
|
+
return null;
|
392
|
+
}
|
393
|
+
}
|
394
|
+
async status() {
|
395
|
+
const result = await this.inspect();
|
396
|
+
return result.State;
|
370
397
|
}
|
371
398
|
async getPorts() {
|
372
|
-
const inspectResult = await this.
|
399
|
+
const inspectResult = await this.inspect();
|
373
400
|
if (!inspectResult || !inspectResult.Config || !inspectResult.Config.Labels) {
|
374
401
|
return false;
|
375
402
|
}
|
@@ -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,38 @@
|
|
1
|
+
import ClusterConfiguration from '@kapeta/local-cluster-config';
|
2
|
+
const CACHE_TTL = 60 * 1000; // 1 min
|
3
|
+
class DefinitionsManager {
|
4
|
+
cache = {};
|
5
|
+
getKey(kindFilter) {
|
6
|
+
if (kindFilter) {
|
7
|
+
if (Array.isArray(kindFilter)) {
|
8
|
+
return kindFilter.join(',');
|
9
|
+
}
|
10
|
+
return kindFilter;
|
11
|
+
}
|
12
|
+
return 'none';
|
13
|
+
}
|
14
|
+
clearCache() {
|
15
|
+
this.cache = {};
|
16
|
+
}
|
17
|
+
doCached(key, getter) {
|
18
|
+
if (this.cache[key]) {
|
19
|
+
if (this.cache[key].expires > Date.now()) {
|
20
|
+
return this.cache[key].definitions;
|
21
|
+
}
|
22
|
+
delete this.cache[key];
|
23
|
+
}
|
24
|
+
this.cache[key] = {
|
25
|
+
expires: Date.now() + CACHE_TTL,
|
26
|
+
definitions: getter(),
|
27
|
+
};
|
28
|
+
return this.cache[key].definitions;
|
29
|
+
}
|
30
|
+
getDefinitions(kindFilter) {
|
31
|
+
const key = this.getKey(kindFilter);
|
32
|
+
return this.doCached(key, () => ClusterConfiguration.getDefinitions(kindFilter));
|
33
|
+
}
|
34
|
+
getProviderDefinitions() {
|
35
|
+
return this.doCached('providers', () => ClusterConfiguration.getProviderDefinitions());
|
36
|
+
}
|
37
|
+
}
|
38
|
+
export const definitionsManager = new DefinitionsManager();
|
@@ -15,9 +15,7 @@ function isFile(path) {
|
|
15
15
|
class FilesystemManager {
|
16
16
|
async writeFile(path, data) {
|
17
17
|
const dirName = Path.dirname(path);
|
18
|
-
console.log('Dir name', dirName, path);
|
19
18
|
if (!FS.existsSync(dirName)) {
|
20
|
-
console.log('Making folder', dirName);
|
21
19
|
FSExtra.mkdirpSync(dirName, {});
|
22
20
|
}
|
23
21
|
FS.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 {};
|