@kapeta/local-cluster-service 0.20.3 → 0.21.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/dist/cjs/src/assetManager.js +5 -6
- package/dist/cjs/src/clusterService.js +2 -2
- package/dist/cjs/src/codeGeneratorManager.js +2 -2
- package/dist/cjs/src/config/routes.js +13 -2
- package/dist/cjs/src/configManager.js +10 -10
- package/dist/cjs/src/definitionsManager.js +2 -3
- package/dist/cjs/src/instanceManager.js +18 -15
- package/dist/cjs/src/middleware/kapeta.js +3 -3
- package/dist/cjs/src/networkManager.js +6 -6
- package/dist/cjs/src/operatorManager.js +3 -3
- package/dist/cjs/src/repositoryManager.js +2 -2
- package/dist/cjs/src/serviceManager.d.ts +1 -0
- package/dist/cjs/src/serviceManager.js +9 -9
- package/dist/cjs/src/socketManager.js +3 -3
- package/dist/cjs/src/utils/BlockInstanceRunner.js +32 -14
- package/dist/cjs/src/utils/utils.d.ts +0 -1
- package/dist/cjs/src/utils/utils.js +1 -13
- package/dist/cjs/test/proxy/types/rest.test.js +16 -17
- package/dist/esm/src/assetManager.js +5 -6
- package/dist/esm/src/clusterService.js +2 -2
- package/dist/esm/src/codeGeneratorManager.js +2 -2
- package/dist/esm/src/config/routes.js +13 -2
- package/dist/esm/src/configManager.js +10 -10
- package/dist/esm/src/definitionsManager.js +2 -3
- package/dist/esm/src/instanceManager.js +18 -15
- package/dist/esm/src/middleware/kapeta.js +3 -3
- package/dist/esm/src/networkManager.js +6 -6
- package/dist/esm/src/operatorManager.js +3 -3
- package/dist/esm/src/repositoryManager.js +2 -2
- package/dist/esm/src/serviceManager.d.ts +1 -0
- package/dist/esm/src/serviceManager.js +9 -9
- package/dist/esm/src/socketManager.js +3 -3
- package/dist/esm/src/utils/BlockInstanceRunner.js +32 -14
- package/dist/esm/src/utils/utils.d.ts +0 -1
- package/dist/esm/src/utils/utils.js +1 -13
- package/dist/esm/test/proxy/types/rest.test.js +16 -17
- package/package.json +2 -2
- package/src/assetManager.ts +1 -2
- package/src/clusterService.ts +1 -1
- package/src/codeGeneratorManager.ts +1 -1
- package/src/config/routes.ts +17 -6
- package/src/configManager.ts +2 -2
- package/src/definitionsManager.ts +1 -2
- package/src/instanceManager.ts +8 -3
- package/src/middleware/kapeta.ts +1 -2
- package/src/networkManager.ts +1 -1
- package/src/operatorManager.ts +3 -3
- package/src/repositoryManager.ts +1 -1
- package/src/serviceManager.ts +2 -2
- package/src/socketManager.ts +1 -1
- package/src/utils/BlockInstanceRunner.ts +65 -30
- package/src/utils/utils.ts +0 -13
- package/test/proxy/types/rest.test.ts +22 -22
@@ -1,8 +1,8 @@
|
|
1
1
|
import FS from 'node:fs';
|
2
2
|
import ClusterConfig, { DefinitionInfo } from '@kapeta/local-cluster-config';
|
3
|
-
import { getBindHost, getBlockInstanceContainerName,
|
4
|
-
import { KapetaURI, parseKapetaUri } from '@kapeta/nodejs-utils';
|
5
|
-
import { serviceManager } from '../serviceManager';
|
3
|
+
import { getBindHost, getBlockInstanceContainerName, readYML } from './utils';
|
4
|
+
import { KapetaURI, parseKapetaUri, normalizeKapetaUri } from '@kapeta/nodejs-utils';
|
5
|
+
import { DEFAULT_PORT_TYPE, serviceManager } from '../serviceManager';
|
6
6
|
import {
|
7
7
|
COMPOSE_LABEL_PROJECT,
|
8
8
|
COMPOSE_LABEL_SERVICE,
|
@@ -39,14 +39,22 @@ async function getProvider(uri: KapetaURI) {
|
|
39
39
|
});
|
40
40
|
}
|
41
41
|
|
42
|
-
function getProviderPorts(assetVersion: DefinitionInfo): string[] {
|
43
|
-
|
42
|
+
function getProviderPorts(assetVersion: DefinitionInfo, providerVersion: DefinitionInfo): string[] {
|
43
|
+
const out =
|
44
44
|
assetVersion.definition?.spec?.providers
|
45
45
|
?.map((provider: any) => {
|
46
46
|
return provider.spec?.port?.type;
|
47
47
|
})
|
48
|
-
.filter((t: any) => !!t) ?? []
|
49
|
-
|
48
|
+
.filter((t: any) => !!t) ?? [];
|
49
|
+
|
50
|
+
if (out.length === 0) {
|
51
|
+
if (providerVersion.definition.spec?.defaultPort?.type) {
|
52
|
+
return [providerVersion.definition.spec?.defaultPort?.type];
|
53
|
+
}
|
54
|
+
return [DEFAULT_PORT_TYPE];
|
55
|
+
}
|
56
|
+
|
57
|
+
return out;
|
50
58
|
}
|
51
59
|
|
52
60
|
export class BlockInstanceRunner {
|
@@ -114,7 +122,7 @@ export class BlockInstanceRunner {
|
|
114
122
|
processInfo = await this._startOperatorProcess(blockInstance, blockUri, providerVersion, env);
|
115
123
|
} else {
|
116
124
|
//We need a port type to know how to connect to the block consistently
|
117
|
-
const portTypes = getProviderPorts(assetVersion);
|
125
|
+
const portTypes = getProviderPorts(assetVersion, providerVersion);
|
118
126
|
|
119
127
|
if (blockUri.version === 'local') {
|
120
128
|
processInfo = await this._startLocalProcess(blockInstance, blockUri, env, assetVersion);
|
@@ -152,18 +160,26 @@ export class BlockInstanceRunner {
|
|
152
160
|
throw new Error('Missing target kind in block definition');
|
153
161
|
}
|
154
162
|
|
155
|
-
const kindUri = parseKapetaUri(assetVersion.definition.
|
163
|
+
const kindUri = parseKapetaUri(assetVersion.definition.kind);
|
156
164
|
|
157
|
-
const
|
165
|
+
const providerVersion = await getProvider(kindUri);
|
166
|
+
|
167
|
+
if (!providerVersion) {
|
168
|
+
throw new Error(`Block type not found: ${kindUri.id}`);
|
169
|
+
}
|
170
|
+
|
171
|
+
const targetKindUri = parseKapetaUri(assetVersion.definition.spec?.target?.kind);
|
172
|
+
|
173
|
+
const targetVersion = await getProvider(targetKindUri);
|
158
174
|
|
159
175
|
if (!targetVersion) {
|
160
|
-
throw new Error(`Target not found: ${
|
176
|
+
throw new Error(`Target not found: ${targetKindUri.id}`);
|
161
177
|
}
|
162
178
|
|
163
179
|
const localContainer = targetVersion.definition.spec.local;
|
164
180
|
|
165
181
|
if (!localContainer) {
|
166
|
-
throw new Error(`Missing local container information from target: ${
|
182
|
+
throw new Error(`Missing local container information from target: ${targetKindUri.id}`);
|
167
183
|
}
|
168
184
|
|
169
185
|
const dockerImage = localContainer.image;
|
@@ -184,7 +200,11 @@ export class BlockInstanceRunner {
|
|
184
200
|
delete localContainer.Labels;
|
185
201
|
delete localContainer.Env;
|
186
202
|
|
187
|
-
const { PortBindings, ExposedPorts, addonEnv } = await this.getDockerPortBindings(
|
203
|
+
const { PortBindings, ExposedPorts, addonEnv } = await this.getDockerPortBindings(
|
204
|
+
blockInstance,
|
205
|
+
assetVersion,
|
206
|
+
providerVersion
|
207
|
+
);
|
188
208
|
|
189
209
|
let HealthCheck = undefined;
|
190
210
|
if (localContainer.healthcheck) {
|
@@ -254,7 +274,19 @@ export class BlockInstanceRunner {
|
|
254
274
|
throw new Error(`Missing docker image information: ${JSON.stringify(versionInfo?.artifact?.details)}`);
|
255
275
|
}
|
256
276
|
|
257
|
-
const
|
277
|
+
const kindUri = parseKapetaUri(assetVersion.definition.kind);
|
278
|
+
|
279
|
+
const providerVersion = await getProvider(kindUri);
|
280
|
+
|
281
|
+
if (!providerVersion) {
|
282
|
+
throw new Error(`Block type not found: ${kindUri.id}`);
|
283
|
+
}
|
284
|
+
|
285
|
+
const { PortBindings, ExposedPorts, addonEnv } = await this.getDockerPortBindings(
|
286
|
+
blockInstance,
|
287
|
+
assetVersion,
|
288
|
+
providerVersion
|
289
|
+
);
|
258
290
|
|
259
291
|
const containerName = getBlockInstanceContainerName(this._systemId, blockInstance.id);
|
260
292
|
|
@@ -332,20 +364,19 @@ export class BlockInstanceRunner {
|
|
332
364
|
const PortBindings: AnyMap = {};
|
333
365
|
let HealthCheck = undefined;
|
334
366
|
let Mounts: DockerMounts[] = [];
|
335
|
-
const
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
);
|
367
|
+
const localPorts = spec.local.ports as { [p: string]: { port: string; type: string } };
|
368
|
+
const promises = Object.entries(localPorts).map(async ([portType, value]) => {
|
369
|
+
const dockerPort = `${value.port}/${value.type}`;
|
370
|
+
ExposedPorts[dockerPort] = {};
|
371
|
+
addonEnv[`KAPETA_LOCAL_SERVER_PORT_${portType.toUpperCase()}`] = value.port;
|
372
|
+
const publicPort = await serviceManager.ensureServicePort(this._systemId, blockInstance.id, portType);
|
373
|
+
PortBindings[dockerPort] = [
|
374
|
+
{
|
375
|
+
HostIp: bindHost,
|
376
|
+
HostPort: `${publicPort}`,
|
377
|
+
},
|
378
|
+
];
|
379
|
+
});
|
349
380
|
|
350
381
|
await Promise.all(promises);
|
351
382
|
|
@@ -406,13 +437,17 @@ export class BlockInstanceRunner {
|
|
406
437
|
return out;
|
407
438
|
}
|
408
439
|
|
409
|
-
private async getDockerPortBindings(
|
440
|
+
private async getDockerPortBindings(
|
441
|
+
blockInstance: BlockProcessParams,
|
442
|
+
assetVersion: DefinitionInfo,
|
443
|
+
providerVersion: DefinitionInfo
|
444
|
+
) {
|
410
445
|
const bindHost = getBindHost();
|
411
446
|
const ExposedPorts: AnyMap = {};
|
412
447
|
const addonEnv: StringMap = {};
|
413
448
|
const PortBindings: AnyMap = {};
|
414
449
|
|
415
|
-
const portTypes = getProviderPorts(assetVersion);
|
450
|
+
const portTypes = getProviderPorts(assetVersion, providerVersion);
|
416
451
|
let port = 80;
|
417
452
|
const promises = portTypes.map(async (portType) => {
|
418
453
|
const publicPort = await serviceManager.ensureServicePort(this._systemId, blockInstance.id, portType);
|
package/src/utils/utils.ts
CHANGED
@@ -10,19 +10,6 @@ export function getBlockInstanceContainerName(systemId: string, instanceId: stri
|
|
10
10
|
return `kapeta-block-instance-${md5(systemId + instanceId)}`;
|
11
11
|
}
|
12
12
|
|
13
|
-
export function normalizeKapetaUri(uri: string) {
|
14
|
-
if (!uri) {
|
15
|
-
return '';
|
16
|
-
}
|
17
|
-
|
18
|
-
const uriObj = parseKapetaUri(uri);
|
19
|
-
if (!uriObj.version) {
|
20
|
-
return `kapeta://${parseKapetaUri(uri).fullName}`;
|
21
|
-
}
|
22
|
-
|
23
|
-
return `kapeta://${parseKapetaUri(uri).id}`;
|
24
|
-
}
|
25
|
-
|
26
13
|
export function readYML(path: string) {
|
27
14
|
const rawYaml = FS.readFileSync(path);
|
28
15
|
|
@@ -1,17 +1,17 @@
|
|
1
|
-
import {getRestMethodId} from
|
2
|
-
import {Resource, ResourceMetadata} from '@kapeta/schemas';
|
1
|
+
import { getRestMethodId } from '../../../src/proxy/types/rest';
|
2
|
+
import { Resource, ResourceMetadata } from '@kapeta/schemas';
|
3
3
|
|
4
4
|
describe('getRestMethodId', () => {
|
5
5
|
it('should match @Query in url', () => {
|
6
6
|
const restResource = new TestResource();
|
7
7
|
|
8
|
-
const restMethodId = getRestMethodId(restResource,
|
8
|
+
const restMethodId = getRestMethodId(restResource, 'POST', '/names?name=Ib');
|
9
9
|
expect(restMethodId).toBeDefined();
|
10
|
-
})
|
10
|
+
});
|
11
11
|
});
|
12
12
|
|
13
13
|
class TestResource implements Resource {
|
14
|
-
kind =
|
14
|
+
kind = '';
|
15
15
|
metadata = new TestResourceMetaData();
|
16
16
|
|
17
17
|
get spec(): { [p: string]: any } {
|
@@ -19,31 +19,31 @@ class TestResource implements Resource {
|
|
19
19
|
methods: [
|
20
20
|
{
|
21
21
|
responseType: {
|
22
|
-
ref:
|
22
|
+
ref: 'Name[]',
|
23
23
|
},
|
24
|
-
method:
|
25
|
-
path:
|
26
|
-
arguments: {}
|
24
|
+
method: 'GET',
|
25
|
+
path: '/names',
|
26
|
+
arguments: {},
|
27
27
|
},
|
28
28
|
{
|
29
29
|
responseType: {
|
30
|
-
ref:
|
30
|
+
ref: 'Name',
|
31
31
|
},
|
32
|
-
method:
|
33
|
-
path:
|
32
|
+
method: 'POST',
|
33
|
+
path: '/names',
|
34
34
|
arguments: {
|
35
35
|
name: {
|
36
|
-
type:
|
37
|
-
transport:
|
38
|
-
}
|
39
|
-
}
|
40
|
-
}
|
41
|
-
]
|
42
|
-
}
|
43
|
-
}
|
36
|
+
type: 'string',
|
37
|
+
transport: 'QUERY',
|
38
|
+
},
|
39
|
+
},
|
40
|
+
},
|
41
|
+
],
|
42
|
+
};
|
43
|
+
}
|
44
44
|
}
|
45
45
|
|
46
46
|
class TestResourceMetaData implements ResourceMetadata {
|
47
47
|
[property: string]: any;
|
48
|
-
name: string =
|
49
|
-
}
|
48
|
+
name: string = '';
|
49
|
+
}
|