@kapeta/local-cluster-service 0.20.4 → 0.21.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 +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 +38 -16
- 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 +38 -16
- 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 +1 -1
- 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 +73 -32
- 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);
|
164
|
+
|
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);
|
156
172
|
|
157
|
-
const targetVersion = await getProvider(
|
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,13 +200,23 @@ 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) {
|
191
211
|
HealthCheck = containerManager.toDockerHealth({ cmd: localContainer.healthcheck });
|
192
212
|
}
|
193
213
|
|
214
|
+
const realLocalPath = FS.realpathSync(baseDir);
|
215
|
+
|
216
|
+
const Mounts = containerManager.toDockerMounts({
|
217
|
+
[workingDir]: toLocalBindVolume(realLocalPath)
|
218
|
+
});
|
219
|
+
|
194
220
|
const systemUri = parseKapetaUri(this._systemId);
|
195
221
|
|
196
222
|
return this.ensureContainer({
|
@@ -219,10 +245,10 @@ export class BlockInstanceRunner {
|
|
219
245
|
HostConfig: {
|
220
246
|
...customHostConfigs,
|
221
247
|
Binds: [
|
222
|
-
`${toLocalBindVolume(ClusterConfig.getKapetaBasedir())}:${homeDir}/.kapeta
|
223
|
-
`${toLocalBindVolume(baseDir)}:${workingDir}`,
|
248
|
+
`${toLocalBindVolume(ClusterConfig.getKapetaBasedir())}:${homeDir}/.kapeta`
|
224
249
|
],
|
225
250
|
PortBindings,
|
251
|
+
Mounts
|
226
252
|
},
|
227
253
|
});
|
228
254
|
}
|
@@ -254,7 +280,19 @@ export class BlockInstanceRunner {
|
|
254
280
|
throw new Error(`Missing docker image information: ${JSON.stringify(versionInfo?.artifact?.details)}`);
|
255
281
|
}
|
256
282
|
|
257
|
-
const
|
283
|
+
const kindUri = parseKapetaUri(assetVersion.definition.kind);
|
284
|
+
|
285
|
+
const providerVersion = await getProvider(kindUri);
|
286
|
+
|
287
|
+
if (!providerVersion) {
|
288
|
+
throw new Error(`Block type not found: ${kindUri.id}`);
|
289
|
+
}
|
290
|
+
|
291
|
+
const { PortBindings, ExposedPorts, addonEnv } = await this.getDockerPortBindings(
|
292
|
+
blockInstance,
|
293
|
+
assetVersion,
|
294
|
+
providerVersion
|
295
|
+
);
|
258
296
|
|
259
297
|
const containerName = getBlockInstanceContainerName(this._systemId, blockInstance.id);
|
260
298
|
|
@@ -332,20 +370,19 @@ export class BlockInstanceRunner {
|
|
332
370
|
const PortBindings: AnyMap = {};
|
333
371
|
let HealthCheck = undefined;
|
334
372
|
let Mounts: DockerMounts[] = [];
|
335
|
-
const
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
);
|
373
|
+
const localPorts = spec.local.ports as { [p: string]: { port: string; type: string } };
|
374
|
+
const promises = Object.entries(localPorts).map(async ([portType, value]) => {
|
375
|
+
const dockerPort = `${value.port}/${value.type}`;
|
376
|
+
ExposedPorts[dockerPort] = {};
|
377
|
+
addonEnv[`KAPETA_LOCAL_SERVER_PORT_${portType.toUpperCase()}`] = value.port;
|
378
|
+
const publicPort = await serviceManager.ensureServicePort(this._systemId, blockInstance.id, portType);
|
379
|
+
PortBindings[dockerPort] = [
|
380
|
+
{
|
381
|
+
HostIp: bindHost,
|
382
|
+
HostPort: `${publicPort}`,
|
383
|
+
},
|
384
|
+
];
|
385
|
+
});
|
349
386
|
|
350
387
|
await Promise.all(promises);
|
351
388
|
|
@@ -406,13 +443,17 @@ export class BlockInstanceRunner {
|
|
406
443
|
return out;
|
407
444
|
}
|
408
445
|
|
409
|
-
private async getDockerPortBindings(
|
446
|
+
private async getDockerPortBindings(
|
447
|
+
blockInstance: BlockProcessParams,
|
448
|
+
assetVersion: DefinitionInfo,
|
449
|
+
providerVersion: DefinitionInfo
|
450
|
+
) {
|
410
451
|
const bindHost = getBindHost();
|
411
452
|
const ExposedPorts: AnyMap = {};
|
412
453
|
const addonEnv: StringMap = {};
|
413
454
|
const PortBindings: AnyMap = {};
|
414
455
|
|
415
|
-
const portTypes = getProviderPorts(assetVersion);
|
456
|
+
const portTypes = getProviderPorts(assetVersion, providerVersion);
|
416
457
|
let port = 80;
|
417
458
|
const promises = portTypes.map(async (portType) => {
|
418
459
|
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
|
+
}
|