@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.
Files changed (54) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/src/assetManager.js +5 -6
  3. package/dist/cjs/src/clusterService.js +2 -2
  4. package/dist/cjs/src/codeGeneratorManager.js +2 -2
  5. package/dist/cjs/src/config/routes.js +13 -2
  6. package/dist/cjs/src/configManager.js +10 -10
  7. package/dist/cjs/src/definitionsManager.js +2 -3
  8. package/dist/cjs/src/instanceManager.js +18 -15
  9. package/dist/cjs/src/middleware/kapeta.js +3 -3
  10. package/dist/cjs/src/networkManager.js +6 -6
  11. package/dist/cjs/src/operatorManager.js +3 -3
  12. package/dist/cjs/src/repositoryManager.js +2 -2
  13. package/dist/cjs/src/serviceManager.d.ts +1 -0
  14. package/dist/cjs/src/serviceManager.js +9 -9
  15. package/dist/cjs/src/socketManager.js +3 -3
  16. package/dist/cjs/src/utils/BlockInstanceRunner.js +38 -16
  17. package/dist/cjs/src/utils/utils.d.ts +0 -1
  18. package/dist/cjs/src/utils/utils.js +1 -13
  19. package/dist/cjs/test/proxy/types/rest.test.js +16 -17
  20. package/dist/esm/src/assetManager.js +5 -6
  21. package/dist/esm/src/clusterService.js +2 -2
  22. package/dist/esm/src/codeGeneratorManager.js +2 -2
  23. package/dist/esm/src/config/routes.js +13 -2
  24. package/dist/esm/src/configManager.js +10 -10
  25. package/dist/esm/src/definitionsManager.js +2 -3
  26. package/dist/esm/src/instanceManager.js +18 -15
  27. package/dist/esm/src/middleware/kapeta.js +3 -3
  28. package/dist/esm/src/networkManager.js +6 -6
  29. package/dist/esm/src/operatorManager.js +3 -3
  30. package/dist/esm/src/repositoryManager.js +2 -2
  31. package/dist/esm/src/serviceManager.d.ts +1 -0
  32. package/dist/esm/src/serviceManager.js +9 -9
  33. package/dist/esm/src/socketManager.js +3 -3
  34. package/dist/esm/src/utils/BlockInstanceRunner.js +38 -16
  35. package/dist/esm/src/utils/utils.d.ts +0 -1
  36. package/dist/esm/src/utils/utils.js +1 -13
  37. package/dist/esm/test/proxy/types/rest.test.js +16 -17
  38. package/package.json +1 -1
  39. package/src/assetManager.ts +1 -2
  40. package/src/clusterService.ts +1 -1
  41. package/src/codeGeneratorManager.ts +1 -1
  42. package/src/config/routes.ts +17 -6
  43. package/src/configManager.ts +2 -2
  44. package/src/definitionsManager.ts +1 -2
  45. package/src/instanceManager.ts +8 -3
  46. package/src/middleware/kapeta.ts +1 -2
  47. package/src/networkManager.ts +1 -1
  48. package/src/operatorManager.ts +3 -3
  49. package/src/repositoryManager.ts +1 -1
  50. package/src/serviceManager.ts +2 -2
  51. package/src/socketManager.ts +1 -1
  52. package/src/utils/BlockInstanceRunner.ts +73 -32
  53. package/src/utils/utils.ts +0 -13
  54. 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, normalizeKapetaUri, readYML } from './utils';
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
- return (
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.spec?.target?.kind);
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(kindUri);
173
+ const targetVersion = await getProvider(targetKindUri);
158
174
 
159
175
  if (!targetVersion) {
160
- throw new Error(`Target not found: ${kindUri.id}`);
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: ${kindUri.id}`);
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(blockInstance, assetVersion);
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 { PortBindings, ExposedPorts, addonEnv } = await this.getDockerPortBindings(blockInstance, assetVersion);
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 promises = Object.entries(spec.local.ports as { [p: string]: { port: string; type: string } }).map(
336
- async ([portType, value]) => {
337
- const dockerPort = `${value.port}/${value.type}`;
338
- ExposedPorts[dockerPort] = {};
339
- addonEnv[`KAPETA_LOCAL_SERVER_PORT_${portType.toUpperCase()}`] = value.port;
340
- const publicPort = await serviceManager.ensureServicePort(this._systemId, blockInstance.id, portType);
341
- PortBindings[dockerPort] = [
342
- {
343
- HostIp: bindHost,
344
- HostPort: `${publicPort}`,
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(blockInstance: BlockProcessParams, assetVersion: DefinitionInfo) {
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);
@@ -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 "../../../src/proxy/types/rest";
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, "POST", "/names?name=Ib");
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: "Name[]"
22
+ ref: 'Name[]',
23
23
  },
24
- method: "GET",
25
- path: "/names",
26
- arguments: {}
24
+ method: 'GET',
25
+ path: '/names',
26
+ arguments: {},
27
27
  },
28
28
  {
29
29
  responseType: {
30
- ref: "Name"
30
+ ref: 'Name',
31
31
  },
32
- method: "POST",
33
- path: "/names",
32
+ method: 'POST',
33
+ path: '/names',
34
34
  arguments: {
35
35
  name: {
36
- type: "string",
37
- transport: "QUERY"
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
+ }