@kapeta/local-cluster-service 0.16.8 → 0.18.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.
Files changed (96) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/cjs/index.js +6 -2
  3. package/dist/cjs/src/assetManager.d.ts +2 -2
  4. package/dist/cjs/src/assetManager.js +16 -16
  5. package/dist/cjs/src/assets/routes.js +2 -2
  6. package/dist/cjs/src/authManager.d.ts +12 -0
  7. package/dist/cjs/src/authManager.js +60 -0
  8. package/dist/cjs/src/codeGeneratorManager.d.ts +1 -1
  9. package/dist/cjs/src/codeGeneratorManager.js +3 -3
  10. package/dist/cjs/src/configManager.js +2 -2
  11. package/dist/cjs/src/definitionsManager.d.ts +7 -6
  12. package/dist/cjs/src/definitionsManager.js +102 -18
  13. package/dist/cjs/src/instanceManager.d.ts +1 -1
  14. package/dist/cjs/src/instanceManager.js +4 -4
  15. package/dist/cjs/src/instances/routes.js +2 -2
  16. package/dist/cjs/src/operatorManager.d.ts +1 -1
  17. package/dist/cjs/src/operatorManager.js +7 -9
  18. package/dist/cjs/src/providerManager.d.ts +2 -1
  19. package/dist/cjs/src/providerManager.js +23 -15
  20. package/dist/cjs/src/repositoryManager.d.ts +2 -2
  21. package/dist/cjs/src/repositoryManager.js +8 -9
  22. package/dist/cjs/src/socketManager.js +6 -0
  23. package/dist/cjs/src/utils/BlockInstanceRunner.js +6 -8
  24. package/dist/cjs/src/utils/DefaultProviderInstaller.d.ts +11 -0
  25. package/dist/cjs/src/utils/DefaultProviderInstaller.js +129 -0
  26. package/dist/esm/index.js +67 -58
  27. package/dist/esm/src/RepositoryWatcher.js +40 -33
  28. package/dist/esm/src/api.js +14 -9
  29. package/dist/esm/src/assetManager.d.ts +2 -2
  30. package/dist/esm/src/assetManager.js +73 -67
  31. package/dist/esm/src/assets/routes.js +23 -18
  32. package/dist/esm/src/attachments/routes.js +14 -9
  33. package/dist/esm/src/authManager.d.ts +12 -0
  34. package/dist/esm/src/authManager.js +60 -0
  35. package/dist/esm/src/cacheManager.js +13 -5
  36. package/dist/esm/src/clusterService.js +6 -3
  37. package/dist/esm/src/codeGeneratorManager.d.ts +1 -1
  38. package/dist/esm/src/codeGeneratorManager.js +20 -14
  39. package/dist/esm/src/config/routes.js +30 -25
  40. package/dist/esm/src/configManager.js +29 -26
  41. package/dist/esm/src/containerManager.js +48 -39
  42. package/dist/esm/src/definitionsManager.d.ts +7 -6
  43. package/dist/esm/src/definitionsManager.js +114 -24
  44. package/dist/esm/src/filesystem/routes.js +21 -16
  45. package/dist/esm/src/filesystemManager.js +23 -17
  46. package/dist/esm/src/identities/routes.js +13 -8
  47. package/dist/esm/src/instanceManager.d.ts +1 -1
  48. package/dist/esm/src/instanceManager.js +165 -158
  49. package/dist/esm/src/instances/routes.js +39 -34
  50. package/dist/esm/src/middleware/cors.js +5 -1
  51. package/dist/esm/src/middleware/kapeta.js +8 -4
  52. package/dist/esm/src/middleware/stringBody.js +5 -1
  53. package/dist/esm/src/networkManager.js +15 -9
  54. package/dist/esm/src/operatorManager.d.ts +1 -1
  55. package/dist/esm/src/operatorManager.js +48 -44
  56. package/dist/esm/src/progressListener.js +16 -12
  57. package/dist/esm/src/providerManager.d.ts +2 -1
  58. package/dist/esm/src/providerManager.js +43 -29
  59. package/dist/esm/src/providers/routes.js +14 -9
  60. package/dist/esm/src/proxy/routes.js +26 -21
  61. package/dist/esm/src/proxy/types/rest.js +29 -22
  62. package/dist/esm/src/proxy/types/web.js +18 -11
  63. package/dist/esm/src/repositoryManager.d.ts +2 -2
  64. package/dist/esm/src/repositoryManager.js +33 -28
  65. package/dist/esm/src/serviceManager.js +25 -19
  66. package/dist/esm/src/socketManager.js +31 -18
  67. package/dist/esm/src/storageService.js +18 -12
  68. package/dist/esm/src/taskManager.js +12 -8
  69. package/dist/esm/src/tasks/routes.js +14 -9
  70. package/dist/esm/src/traffic/routes.js +12 -7
  71. package/dist/esm/src/types.js +11 -8
  72. package/dist/esm/src/utils/BlockInstanceRunner.js +60 -55
  73. package/dist/esm/src/utils/DefaultProviderInstaller.d.ts +11 -0
  74. package/dist/esm/src/utils/DefaultProviderInstaller.js +129 -0
  75. package/dist/esm/src/utils/LogData.js +5 -1
  76. package/dist/esm/src/utils/commandLineUtils.js +12 -7
  77. package/dist/esm/src/utils/pathTemplateParser.js +7 -2
  78. package/dist/esm/src/utils/utils.js +30 -17
  79. package/dist/esm/start.js +7 -2
  80. package/index.ts +7 -2
  81. package/package.json +10 -4
  82. package/src/assetManager.ts +18 -16
  83. package/src/assets/routes.ts +2 -2
  84. package/src/authManager.ts +62 -0
  85. package/src/codeGeneratorManager.ts +3 -3
  86. package/src/configManager.ts +2 -2
  87. package/src/definitionsManager.ts +132 -17
  88. package/src/instanceManager.ts +5 -5
  89. package/src/instances/routes.ts +2 -2
  90. package/src/operatorManager.ts +7 -12
  91. package/src/providerManager.ts +27 -19
  92. package/src/repositoryManager.ts +8 -11
  93. package/src/socketManager.ts +6 -0
  94. package/src/utils/BlockInstanceRunner.ts +6 -8
  95. package/src/utils/DefaultProviderInstaller.ts +141 -0
  96. package/tsconfig.json +3 -2
@@ -1,23 +1,28 @@
1
- import Router from 'express-promise-router';
2
- import { configManager } from '../configManager';
3
- import { serviceManager } from '../serviceManager';
4
- import { operatorManager } from '../operatorManager';
5
- import { instanceManager } from '../instanceManager';
6
- import { corsHandler } from '../middleware/cors';
7
- import { kapetaHeaders } from '../middleware/kapeta';
8
- import { stringBody } from '../middleware/stringBody';
9
- const router = Router();
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
+ const express_promise_router_1 = __importDefault(require("express-promise-router"));
7
+ const configManager_1 = require("../configManager");
8
+ const serviceManager_1 = require("../serviceManager");
9
+ const operatorManager_1 = require("../operatorManager");
10
+ const instanceManager_1 = require("../instanceManager");
11
+ const cors_1 = require("../middleware/cors");
12
+ const kapeta_1 = require("../middleware/kapeta");
13
+ const stringBody_1 = require("../middleware/stringBody");
14
+ const router = (0, express_promise_router_1.default)();
10
15
  const SYSTEM_ID = '$plan';
11
- router.use('/', corsHandler);
12
- router.use('/', kapetaHeaders);
13
- router.use('/', stringBody);
16
+ router.use('/', cors_1.corsHandler);
17
+ router.use('/', kapeta_1.kapetaHeaders);
18
+ router.use('/', stringBody_1.stringBody);
14
19
  /**
15
20
  * Returns the full configuration for a given service.
16
21
  */
17
22
  router.get('/instance', (req, res) => {
18
23
  const config = req.kapeta.instanceId
19
- ? configManager.getConfigForSection(req.kapeta.systemId, req.kapeta.instanceId)
20
- : configManager.getConfigForSystem(req.kapeta.systemId);
24
+ ? configManager_1.configManager.getConfigForSection(req.kapeta.systemId, req.kapeta.instanceId)
25
+ : configManager_1.configManager.getConfigForSystem(req.kapeta.systemId);
21
26
  res.send(config);
22
27
  });
23
28
  /**
@@ -30,12 +35,12 @@ router.put('/instance', async (req, res) => {
30
35
  config = {};
31
36
  }
32
37
  if (req.kapeta.instanceId) {
33
- configManager.setConfigForSection(req.kapeta.systemId, req.kapeta.instanceId, config);
38
+ configManager_1.configManager.setConfigForSection(req.kapeta.systemId, req.kapeta.instanceId, config);
34
39
  //Restart the instance if it is running after config change
35
- await instanceManager.prepareForRestart(req.kapeta.systemId, req.kapeta.instanceId);
40
+ await instanceManager_1.instanceManager.prepareForRestart(req.kapeta.systemId, req.kapeta.instanceId);
36
41
  }
37
42
  else {
38
- configManager.setConfigForSystem(req.kapeta.systemId, config);
43
+ configManager_1.configManager.setConfigForSystem(req.kapeta.systemId, config);
39
44
  }
40
45
  }
41
46
  catch (err) {
@@ -49,7 +54,7 @@ router.put('/instance', async (req, res) => {
49
54
  * Returns the full configuration for a plan
50
55
  */
51
56
  router.get('/system', (req, res) => {
52
- const config = configManager.getConfigForSection(req.kapeta.systemId, SYSTEM_ID);
57
+ const config = configManager_1.configManager.getConfigForSection(req.kapeta.systemId, SYSTEM_ID);
53
58
  res.send(config);
54
59
  });
55
60
  /**
@@ -60,7 +65,7 @@ router.put('/system', (req, res) => {
60
65
  if (!config) {
61
66
  config = {};
62
67
  }
63
- configManager.setConfigForSection(req.kapeta.systemId, SYSTEM_ID, config);
68
+ configManager_1.configManager.setConfigForSection(req.kapeta.systemId, SYSTEM_ID, config);
64
69
  res.status(202).send({ ok: true });
65
70
  });
66
71
  /**
@@ -77,12 +82,12 @@ router.get('/identity', async (req, res) => {
77
82
  }
78
83
  try {
79
84
  if (!identity.systemId || !identity.instanceId) {
80
- const { systemId, instanceId } = await configManager.resolveIdentity(req.kapeta.blockRef, identity.systemId);
85
+ const { systemId, instanceId } = await configManager_1.configManager.resolveIdentity(req.kapeta.blockRef, identity.systemId);
81
86
  identity.systemId = systemId;
82
87
  identity.instanceId = instanceId;
83
88
  }
84
89
  else {
85
- await configManager.verifyIdentity(req.kapeta.blockRef, identity.systemId, identity.instanceId);
90
+ await configManager_1.configManager.verifyIdentity(req.kapeta.blockRef, identity.systemId, identity.instanceId);
86
91
  }
87
92
  res.send(identity);
88
93
  }
@@ -97,7 +102,7 @@ router.get('/identity', async (req, res) => {
97
102
  */
98
103
  router.get('/provides/:type', async (req, res) => {
99
104
  //Get service port
100
- res.send('' + (await serviceManager.ensureServicePort(req.kapeta.systemId, req.kapeta.instanceId, req.params.type)));
105
+ res.send('' + (await serviceManager_1.serviceManager.ensureServicePort(req.kapeta.systemId, req.kapeta.instanceId, req.params.type)));
101
106
  });
102
107
  /**
103
108
  * Used by services to get info for consumed operator resource.
@@ -106,7 +111,7 @@ router.get('/provides/:type', async (req, res) => {
106
111
  * assign port numbers to it etc.
107
112
  */
108
113
  router.get('/consumes/resource/:resourceType/:portType/:name', async (req, res) => {
109
- const operatorInfo = await operatorManager.getConsumerResourceInfo(req.kapeta.systemId, req.kapeta.instanceId, req.params.resourceType, req.params.portType, req.params.name, req.kapeta.environment);
114
+ const operatorInfo = await operatorManager_1.operatorManager.getConsumerResourceInfo(req.kapeta.systemId, req.kapeta.instanceId, req.params.resourceType, req.params.portType, req.params.name, req.kapeta.environment);
110
115
  res.send(operatorInfo);
111
116
  });
112
117
  /**
@@ -116,6 +121,6 @@ router.get('/consumes/resource/:resourceType/:portType/:name', async (req, res)
116
121
  * to handle clients for services that hasn't started yet.
117
122
  */
118
123
  router.get('/consumes/:resourceName/:type', (req, res) => {
119
- res.send(serviceManager.getConsumerAddress(req.kapeta.systemId, req.kapeta.instanceId, req.params.resourceName, req.params.type, req.kapeta.environment));
124
+ res.send(serviceManager_1.serviceManager.getConsumerAddress(req.kapeta.systemId, req.kapeta.instanceId, req.params.resourceName, req.params.type, req.kapeta.environment));
120
125
  });
121
- export default router;
126
+ exports.default = router;
@@ -1,36 +1,39 @@
1
- import { storageService } from './storageService';
2
- import { assetManager } from './assetManager';
3
- import { parseKapetaUri } from '@kapeta/nodejs-utils';
4
- import { normalizeKapetaUri } from './utils/utils';
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.configManager = void 0;
4
+ const storageService_1 = require("./storageService");
5
+ const assetManager_1 = require("./assetManager");
6
+ const nodejs_utils_1 = require("@kapeta/nodejs-utils");
7
+ const utils_1 = require("./utils/utils");
5
8
  class ConfigManager {
6
9
  _config;
7
10
  constructor() {
8
- this._config = storageService.section('config');
11
+ this._config = storageService_1.storageService.section('config');
9
12
  }
10
13
  _forSystem(systemId) {
11
- systemId = normalizeKapetaUri(systemId);
14
+ systemId = (0, utils_1.normalizeKapetaUri)(systemId);
12
15
  if (!this._config[systemId]) {
13
16
  this._config[systemId] = {};
14
17
  }
15
18
  return this._config[systemId];
16
19
  }
17
20
  setConfigForSystem(systemId, config) {
18
- systemId = normalizeKapetaUri(systemId);
21
+ systemId = (0, utils_1.normalizeKapetaUri)(systemId);
19
22
  const systemConfig = config || {};
20
- storageService.put('config', systemId, systemConfig);
23
+ storageService_1.storageService.put('config', systemId, systemConfig);
21
24
  }
22
25
  getConfigForSystem(systemId) {
23
- systemId = normalizeKapetaUri(systemId);
26
+ systemId = (0, utils_1.normalizeKapetaUri)(systemId);
24
27
  return this._forSystem(systemId);
25
28
  }
26
29
  setConfigForSection(systemId, sectionId, config) {
27
- systemId = normalizeKapetaUri(systemId);
30
+ systemId = (0, utils_1.normalizeKapetaUri)(systemId);
28
31
  let systemConfig = this._forSystem(systemId);
29
32
  systemConfig[sectionId] = config || {};
30
- storageService.put('config', systemId, systemConfig);
33
+ storageService_1.storageService.put('config', systemId, systemConfig);
31
34
  }
32
35
  getConfigForSection(systemId, sectionId) {
33
- systemId = normalizeKapetaUri(systemId);
36
+ systemId = (0, utils_1.normalizeKapetaUri)(systemId);
34
37
  const systemConfig = this._forSystem(systemId);
35
38
  if (!systemConfig[sectionId]) {
36
39
  systemConfig[sectionId] = {};
@@ -54,12 +57,12 @@ class ConfigManager {
54
57
  * @returns {Promise<{systemId:string,instanceId:string}>}
55
58
  */
56
59
  async resolveIdentity(blockRef, systemId) {
57
- blockRef = normalizeKapetaUri(blockRef);
60
+ blockRef = (0, utils_1.normalizeKapetaUri)(blockRef);
58
61
  if (systemId) {
59
- systemId = normalizeKapetaUri(systemId);
62
+ systemId = (0, utils_1.normalizeKapetaUri)(systemId);
60
63
  }
61
- const planAssets = assetManager.getPlans();
62
- const blockUri = parseKapetaUri(blockRef);
64
+ const planAssets = await assetManager_1.assetManager.getPlans();
65
+ const blockUri = (0, nodejs_utils_1.parseKapetaUri)(blockRef);
63
66
  let matchingIdentities = [];
64
67
  planAssets.forEach((planAsset) => {
65
68
  if (systemId && planAsset.ref !== systemId) {
@@ -70,10 +73,10 @@ class ConfigManager {
70
73
  return;
71
74
  }
72
75
  planAsset.data.spec.blocks.forEach((blockInstance) => {
73
- const refUri = parseKapetaUri(blockInstance.block.ref);
76
+ const refUri = (0, nodejs_utils_1.parseKapetaUri)(blockInstance.block.ref);
74
77
  if (refUri.equals(blockUri)) {
75
78
  matchingIdentities.push({
76
- systemId: normalizeKapetaUri(planAsset.ref),
79
+ systemId: (0, utils_1.normalizeKapetaUri)(planAsset.ref),
77
80
  instanceId: blockInstance.id,
78
81
  });
79
82
  }
@@ -94,19 +97,19 @@ class ConfigManager {
94
97
  return matchingIdentities[0];
95
98
  }
96
99
  async verifyIdentity(blockRef, systemId, instanceId) {
97
- blockRef = normalizeKapetaUri(blockRef);
98
- systemId = normalizeKapetaUri(systemId);
99
- const planAssets = assetManager.getPlans();
100
- const systemUri = systemId ? parseKapetaUri(systemId) : null;
101
- const blockUri = parseKapetaUri(blockRef);
100
+ blockRef = (0, utils_1.normalizeKapetaUri)(blockRef);
101
+ systemId = (0, utils_1.normalizeKapetaUri)(systemId);
102
+ const planAssets = await assetManager_1.assetManager.getPlans();
103
+ const systemUri = systemId ? (0, nodejs_utils_1.parseKapetaUri)(systemId) : null;
104
+ const blockUri = (0, nodejs_utils_1.parseKapetaUri)(blockRef);
102
105
  let found = false;
103
106
  planAssets.forEach((planAsset) => {
104
- if (systemUri && !parseKapetaUri(planAsset.ref).equals(systemUri)) {
107
+ if (systemUri && !(0, nodejs_utils_1.parseKapetaUri)(planAsset.ref).equals(systemUri)) {
105
108
  //Skip plans that do not match systemid if provided
106
109
  return;
107
110
  }
108
111
  planAsset.data.spec.blocks.forEach((blockInstance) => {
109
- if (blockInstance.id === instanceId && parseKapetaUri(blockInstance.block.ref).equals(blockUri)) {
112
+ if (blockInstance.id === instanceId && (0, nodejs_utils_1.parseKapetaUri)(blockInstance.block.ref).equals(blockUri)) {
110
113
  found = true;
111
114
  }
112
115
  });
@@ -116,4 +119,4 @@ class ConfigManager {
116
119
  }
117
120
  }
118
121
  }
119
- export const configManager = new ConfigManager();
122
+ exports.configManager = new ConfigManager();
@@ -1,21 +1,27 @@
1
- import Path from 'path';
2
- import { storageService } from './storageService';
3
- import os from 'os';
4
- import _ from 'lodash';
5
- import FSExtra from 'fs-extra';
6
- import { Docker } from 'node-docker-api';
7
- import { parseKapetaUri } from '@kapeta/nodejs-utils';
8
- import ClusterConfiguration from '@kapeta/local-cluster-config';
9
- import uuid from 'node-uuid';
10
- import md5 from 'md5';
11
- import { getBlockInstanceContainerName } from './utils/utils';
12
- import { KapetaAPI } from '@kapeta/nodejs-api-client';
13
- import { taskManager } from './taskManager';
14
- export const CONTAINER_LABEL_PORT_PREFIX = 'kapeta_port-';
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.containerManager = exports.toLocalBindVolume = exports.getExtraHosts = exports.ContainerInfo = exports.HEALTH_CHECK_TIMEOUT = exports.CONTAINER_LABEL_PORT_PREFIX = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const storageService_1 = require("./storageService");
9
+ const os_1 = __importDefault(require("os"));
10
+ const lodash_1 = __importDefault(require("lodash"));
11
+ const fs_extra_1 = __importDefault(require("fs-extra"));
12
+ const node_docker_api_1 = require("node-docker-api");
13
+ const nodejs_utils_1 = require("@kapeta/nodejs-utils");
14
+ const local_cluster_config_1 = __importDefault(require("@kapeta/local-cluster-config"));
15
+ const node_uuid_1 = __importDefault(require("node-uuid"));
16
+ const md5_1 = __importDefault(require("md5"));
17
+ const utils_1 = require("./utils/utils");
18
+ const nodejs_api_client_1 = require("@kapeta/nodejs-api-client");
19
+ const taskManager_1 = require("./taskManager");
20
+ exports.CONTAINER_LABEL_PORT_PREFIX = 'kapeta_port-';
15
21
  const NANO_SECOND = 1000000;
16
22
  const HEALTH_CHECK_INTERVAL = 3000;
17
23
  const HEALTH_CHECK_MAX = 20;
18
- export const HEALTH_CHECK_TIMEOUT = HEALTH_CHECK_INTERVAL * HEALTH_CHECK_MAX * 2;
24
+ exports.HEALTH_CHECK_TIMEOUT = HEALTH_CHECK_INTERVAL * HEALTH_CHECK_MAX * 2;
19
25
  const promisifyStream = (stream, handler) => new Promise((resolve, reject) => {
20
26
  stream.on('data', handler);
21
27
  stream.on('end', resolve);
@@ -31,12 +37,12 @@ class ContainerManager {
31
37
  this._docker = null;
32
38
  this._alive = false;
33
39
  this._version = '';
34
- this._mountDir = Path.join(storageService.getKapetaBasedir(), 'mounts');
35
- FSExtra.mkdirpSync(this._mountDir);
40
+ this._mountDir = path_1.default.join(storageService_1.storageService.getKapetaBasedir(), 'mounts');
41
+ fs_extra_1.default.mkdirpSync(this._mountDir);
36
42
  }
37
43
  async initialize() {
38
44
  // Use the value from cluster-service.yml if configured
39
- const dockerConfig = ClusterConfiguration.getDockerConfig();
45
+ const dockerConfig = local_cluster_config_1.default.getDockerConfig();
40
46
  const connectOptions = Object.keys(dockerConfig).length > 0
41
47
  ? [dockerConfig]
42
48
  : [
@@ -46,7 +52,7 @@ class ContainerManager {
46
52
  { socketPath: '/var/run/docker.sock' },
47
53
  // default macOS
48
54
  {
49
- socketPath: Path.join(os.homedir(), '.docker/run/docker.sock'),
55
+ socketPath: path_1.default.join(os_1.default.homedir(), '.docker/run/docker.sock'),
50
56
  },
51
57
  // Default http
52
58
  { protocol: 'http', host: 'localhost', port: 2375 },
@@ -56,7 +62,7 @@ class ContainerManager {
56
62
  ];
57
63
  for (const opts of connectOptions) {
58
64
  try {
59
- const client = new Docker({
65
+ const client = new node_docker_api_1.Docker({
60
66
  ...opts,
61
67
  timeout: 10000,
62
68
  });
@@ -101,9 +107,9 @@ class ContainerManager {
101
107
  return this._alive;
102
108
  }
103
109
  getMountPoint(systemId, ref, mountName) {
104
- const kindUri = parseKapetaUri(ref);
105
- const systemUri = parseKapetaUri(systemId);
106
- return Path.join(this._mountDir, systemUri.handle, systemUri.name, systemUri.version, kindUri.handle, kindUri.name, kindUri.version, mountName);
110
+ const kindUri = (0, nodejs_utils_1.parseKapetaUri)(ref);
111
+ const systemUri = (0, nodejs_utils_1.parseKapetaUri)(systemId);
112
+ return path_1.default.join(this._mountDir, systemUri.handle, systemUri.name, systemUri.version, kindUri.handle, kindUri.name, kindUri.version, mountName);
107
113
  }
108
114
  async createMounts(systemId, kind, mountOpts) {
109
115
  const mounts = {};
@@ -111,7 +117,7 @@ class ContainerManager {
111
117
  const mountOptList = Object.entries(mountOpts);
112
118
  for (const [mountName, containerPath] of mountOptList) {
113
119
  const hostPath = this.getMountPoint(systemId, kind, mountName);
114
- await FSExtra.mkdirp(hostPath);
120
+ await fs_extra_1.default.mkdirp(hostPath);
115
121
  mounts[containerPath] = hostPath;
116
122
  }
117
123
  }
@@ -167,7 +173,7 @@ class ContainerManager {
167
173
  const taskName = `Pulling image ${friendlyImageName}`;
168
174
  const processor = async (task) => {
169
175
  const timeStarted = Date.now();
170
- const api = new KapetaAPI();
176
+ const api = new nodejs_api_client_1.KapetaAPI();
171
177
  const accessToken = api.hasToken() ? await api.getAccessToken() : null;
172
178
  const auth = accessToken && image.startsWith('docker.kapeta.com/')
173
179
  ? {
@@ -287,7 +293,7 @@ class ContainerManager {
287
293
  };
288
294
  task.emitUpdate();
289
295
  };
290
- const task = taskManager.add(`docker:image:pull:${image}`, processor, {
296
+ const task = taskManager_1.taskManager.add(`docker:image:pull:${image}`, processor, {
291
297
  name: taskName,
292
298
  image,
293
299
  progress: -1,
@@ -297,7 +303,7 @@ class ContainerManager {
297
303
  }
298
304
  toDockerMounts(mounts) {
299
305
  const Mounts = [];
300
- _.forEach(mounts, (Source, Target) => {
306
+ lodash_1.default.forEach(mounts, (Source, Target) => {
301
307
  Mounts.push({
302
308
  Target,
303
309
  Source: toLocalBindVolume(Source),
@@ -320,7 +326,7 @@ class ContainerManager {
320
326
  if (dockerOpts?.Labels?.HASH) {
321
327
  delete dockerOpts.Labels.HASH;
322
328
  }
323
- const hash = md5(JSON.stringify(dockerOpts));
329
+ const hash = (0, md5_1.default)(JSON.stringify(dockerOpts));
324
330
  if (!dockerOpts.Labels) {
325
331
  dockerOpts.Labels = {};
326
332
  }
@@ -425,7 +431,7 @@ class ContainerManager {
425
431
  }
426
432
  }
427
433
  async remove(container, opts) {
428
- const newName = 'deleting-' + uuid.v4();
434
+ const newName = 'deleting-' + node_uuid_1.default.v4();
429
435
  const containerData = container.data;
430
436
  // Rename the container first to avoid name conflicts if people start the same container
431
437
  await container.rename({ name: newName });
@@ -452,7 +458,7 @@ class ContainerManager {
452
458
  return new ContainerInfo(dockerContainer);
453
459
  }
454
460
  async getLogs(instance) {
455
- const containerName = getBlockInstanceContainerName(instance.systemId, instance.instanceId);
461
+ const containerName = (0, utils_1.getBlockInstanceContainerName)(instance.systemId, instance.instanceId);
456
462
  const containerInfo = await this.getContainerByName(containerName);
457
463
  if (!containerInfo) {
458
464
  return [
@@ -467,7 +473,7 @@ class ContainerManager {
467
473
  return containerInfo.getLogs();
468
474
  }
469
475
  }
470
- export class ContainerInfo {
476
+ class ContainerInfo {
471
477
  _container;
472
478
  /**
473
479
  *
@@ -501,7 +507,7 @@ export class ContainerInfo {
501
507
  await this._container.stop();
502
508
  }
503
509
  async remove(opts) {
504
- await containerManager.remove(this._container, opts);
510
+ await exports.containerManager.remove(this._container, opts);
505
511
  }
506
512
  async getPort(type) {
507
513
  const ports = await this.getPorts();
@@ -530,14 +536,14 @@ export class ContainerInfo {
530
536
  }
531
537
  const portTypes = {};
532
538
  const ports = {};
533
- _.forEach(inspectResult.Config.Labels, (portType, name) => {
534
- if (!name.startsWith(CONTAINER_LABEL_PORT_PREFIX)) {
539
+ lodash_1.default.forEach(inspectResult.Config.Labels, (portType, name) => {
540
+ if (!name.startsWith(exports.CONTAINER_LABEL_PORT_PREFIX)) {
535
541
  return;
536
542
  }
537
- const hostPort = name.substr(CONTAINER_LABEL_PORT_PREFIX.length);
543
+ const hostPort = name.substr(exports.CONTAINER_LABEL_PORT_PREFIX.length);
538
544
  portTypes[hostPort] = portType;
539
545
  });
540
- _.forEach(inspectResult.HostConfig.PortBindings, (portBindings, containerPortSpec) => {
546
+ lodash_1.default.forEach(inspectResult.HostConfig.PortBindings, (portBindings, containerPortSpec) => {
541
547
  let [containerPort, protocol] = containerPortSpec.split(/\//);
542
548
  const hostPort = portBindings[0].HostPort;
543
549
  const portType = portTypes[hostPort];
@@ -606,7 +612,8 @@ export class ContainerInfo {
606
612
  return out;
607
613
  }
608
614
  }
609
- export function getExtraHosts(dockerVersion) {
615
+ exports.ContainerInfo = ContainerInfo;
616
+ function getExtraHosts(dockerVersion) {
610
617
  if (process.platform !== 'darwin' && process.platform !== 'win32') {
611
618
  const [major, minor] = dockerVersion.split('.');
612
619
  if (parseInt(major) >= 20 && parseInt(minor) >= 10) {
@@ -619,6 +626,7 @@ export function getExtraHosts(dockerVersion) {
619
626
  }
620
627
  return undefined;
621
628
  }
629
+ exports.getExtraHosts = getExtraHosts;
622
630
  /**
623
631
  * Ensure that the volume is in the correct format for the docker daemon on the host
624
632
  *
@@ -626,7 +634,7 @@ export function getExtraHosts(dockerVersion) {
626
634
  * Linux: /path/to/volume -> /path/to/volume
627
635
  * Mac: /path/to/volume -> /path/to/volume
628
636
  */
629
- export function toLocalBindVolume(volume) {
637
+ function toLocalBindVolume(volume) {
630
638
  if (process.platform === 'win32') {
631
639
  //On Windows we need to convert c:\ to /c/
632
640
  return volume
@@ -637,4 +645,5 @@ export function toLocalBindVolume(volume) {
637
645
  }
638
646
  return volume;
639
647
  }
640
- export const containerManager = new ContainerManager();
648
+ exports.toLocalBindVolume = toLocalBindVolume;
649
+ exports.containerManager = new ContainerManager();
@@ -1,11 +1,12 @@
1
1
  import { DefinitionInfo } from '@kapeta/local-cluster-config';
2
+ export declare const SAMPLE_PLAN_NAME = "kapeta/sample-nodejs-plan";
2
3
  declare class DefinitionsManager {
3
- private getHash;
4
- private getFullKey;
5
- getDefinitions(kindFilter?: string | string[]): DefinitionInfo[];
6
- exists(ref: string): boolean;
7
- getProviderDefinitions(): DefinitionInfo[];
8
- getDefinition(ref: string): DefinitionInfo | undefined;
4
+ private resolveDefinitionsAndSamples;
5
+ private applyFilters;
6
+ getDefinitions(kindFilter?: string | string[]): Promise<DefinitionInfo[]>;
7
+ exists(ref: string): Promise<boolean>;
8
+ getProviderDefinitions(): Promise<DefinitionInfo[]>;
9
+ getDefinition(ref: string): Promise<DefinitionInfo | undefined>;
9
10
  clearCache(): void;
10
11
  }
11
12
  export declare const definitionsManager: DefinitionsManager;
@@ -1,40 +1,130 @@
1
- import ClusterConfiguration from '@kapeta/local-cluster-config';
2
- import { parseKapetaUri } from '@kapeta/nodejs-utils';
3
- import { cacheManager, doCached } from './cacheManager';
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 = exports.SAMPLE_PLAN_NAME = void 0;
7
+ const local_cluster_config_1 = __importDefault(require("@kapeta/local-cluster-config"));
8
+ const nodejs_utils_1 = require("@kapeta/nodejs-utils");
9
+ const cacheManager_1 = require("./cacheManager");
10
+ const nodejs_api_client_1 = require("@kapeta/nodejs-api-client");
11
+ const fs_extra_1 = __importDefault(require("fs-extra"));
12
+ const utils_1 = require("./utils/utils");
13
+ const yaml_1 = __importDefault(require("yaml"));
14
+ const nodejs_registry_utils_1 = require("@kapeta/nodejs-registry-utils");
15
+ const progressListener_1 = require("./progressListener");
16
+ const path_1 = __importDefault(require("path"));
17
+ exports.SAMPLE_PLAN_NAME = 'kapeta/sample-nodejs-plan';
18
+ function applyHandleChange(definition, targetHandle) {
19
+ const originalUri = (0, nodejs_utils_1.parseKapetaUri)(definition.definition.metadata.name);
20
+ definition.definition.metadata.name = `${targetHandle}/${originalUri.name}`;
21
+ return definition;
22
+ }
23
+ function normalizeFilters(kindFilter) {
24
+ let resolvedFilters = [];
25
+ if (kindFilter) {
26
+ if (Array.isArray(kindFilter)) {
27
+ resolvedFilters = [...kindFilter];
28
+ }
29
+ else {
30
+ resolvedFilters = [kindFilter];
31
+ }
32
+ }
33
+ return resolvedFilters.map((k) => k.toLowerCase());
34
+ }
4
35
  class DefinitionsManager {
5
- getHash(kindFilter) {
6
- if (kindFilter) {
7
- if (Array.isArray(kindFilter)) {
8
- return kindFilter.join(',');
36
+ async resolveDefinitionsAndSamples() {
37
+ const definitions = local_cluster_config_1.default.getDefinitions();
38
+ const samplePlan = definitions.find((d) => d.version === 'local' && d.definition.metadata.name === exports.SAMPLE_PLAN_NAME);
39
+ if (!samplePlan) {
40
+ return definitions;
41
+ }
42
+ // We will only rewrite the sample plan once since we change the handle to be the users handle
43
+ const api = new nodejs_api_client_1.KapetaAPI();
44
+ if (!api.hasToken()) {
45
+ // Not logged in yet, so we can't rewrite the sample plan
46
+ return definitions;
47
+ }
48
+ const profile = await api.getCurrentIdentity();
49
+ if (!profile) {
50
+ // Not logged in yet, so we can't rewrite the sample plan
51
+ return definitions;
52
+ }
53
+ console.log('Rewriting sample plan to use handle %s', profile.handle);
54
+ applyHandleChange(samplePlan, profile.handle);
55
+ const planDef = samplePlan.definition;
56
+ const blockRefs = new Set();
57
+ planDef.spec.blocks.forEach((b) => {
58
+ const blockUri = (0, nodejs_utils_1.parseKapetaUri)(b.block.ref);
59
+ if (blockUri.version === 'local') {
60
+ blockRefs.add(blockUri.id);
61
+ b.block.ref = (0, utils_1.normalizeKapetaUri)(`${profile.handle}/${blockUri.name}:local`);
9
62
  }
10
- return kindFilter;
63
+ });
64
+ // Rewrite all blocks that are referenced by the sample plan
65
+ const rewrittenBlocks = Array.from(blockRefs)
66
+ .map((ref) => definitions.find((d) => (0, utils_1.normalizeKapetaUri)(d.definition.metadata.name + ':' + d.version) === (0, utils_1.normalizeKapetaUri)(ref)))
67
+ .filter((d) => d !== undefined)
68
+ .map((d) => applyHandleChange(d, profile.handle));
69
+ // Persist the rewritten assets
70
+ const progressListener = new progressListener_1.ProgressListener();
71
+ const rewrittenAssets = [samplePlan, ...rewrittenBlocks];
72
+ const originalRefs = [`${exports.SAMPLE_PLAN_NAME}:local`, ...Array.from(blockRefs)];
73
+ // Store the original paths on the assets - we'll need them later
74
+ for (const asset of rewrittenAssets) {
75
+ asset.path = await fs_extra_1.default.readlink(asset.path);
76
+ asset.ymlPath = path_1.default.join(asset.path, path_1.default.basename(asset.ymlPath));
77
+ }
78
+ // Uninstall the original assets
79
+ // This removes the symlinks
80
+ console.log('Uninstalling original assets', originalRefs);
81
+ try {
82
+ await nodejs_registry_utils_1.Actions.uninstall(progressListener, originalRefs);
83
+ }
84
+ catch (err) {
85
+ console.warn('Failed to uninstall original assets', err);
11
86
  }
12
- return 'none';
87
+ for (const asset of rewrittenAssets) {
88
+ console.log('Updating %s ', asset.ymlPath);
89
+ await fs_extra_1.default.writeFile(asset.ymlPath, yaml_1.default.stringify(asset.definition));
90
+ console.log('Linking %s ', asset.path);
91
+ await nodejs_registry_utils_1.Actions.link(progressListener, asset.path);
92
+ }
93
+ console.log('Rewrite done for sample plan');
94
+ // Return the rewritten definitions
95
+ return local_cluster_config_1.default.getDefinitions();
13
96
  }
14
- getFullKey(kindFilter) {
15
- return `definitionsManager:${this.getHash(kindFilter)}`;
97
+ applyFilters(definitions, kindFilter) {
98
+ if (kindFilter.length === 0) {
99
+ return definitions;
100
+ }
101
+ return definitions.filter((d) => {
102
+ return kindFilter.includes(d.definition.kind.toLowerCase());
103
+ });
16
104
  }
17
- getDefinitions(kindFilter) {
18
- const key = this.getFullKey(kindFilter);
19
- return doCached(key, () => ClusterConfiguration.getDefinitions(kindFilter));
105
+ async getDefinitions(kindFilter) {
106
+ kindFilter = normalizeFilters(kindFilter);
107
+ const definitions = await (0, cacheManager_1.doCached)('definitionsManager:all', () => this.resolveDefinitionsAndSamples());
108
+ return this.applyFilters(definitions, kindFilter);
20
109
  }
21
- exists(ref) {
22
- return !!this.getDefinition(ref);
110
+ async exists(ref) {
111
+ return !!(await this.getDefinition(ref));
23
112
  }
24
- getProviderDefinitions() {
25
- return doCached('providers', () => ClusterConfiguration.getProviderDefinitions());
113
+ async getProviderDefinitions() {
114
+ return (0, cacheManager_1.doCached)('definitionsManager:providers', () => local_cluster_config_1.default.getProviderDefinitions());
26
115
  }
27
- getDefinition(ref) {
28
- const uri = parseKapetaUri(ref);
29
- return this.getDefinitions().find((d) => {
116
+ async getDefinition(ref) {
117
+ const uri = (0, nodejs_utils_1.parseKapetaUri)(ref);
118
+ const definitions = await this.getDefinitions();
119
+ return definitions.find((d) => {
30
120
  if (!uri.version) {
31
121
  return d.definition.metadata.name === uri.fullName;
32
122
  }
33
- return parseKapetaUri(`${d.definition.metadata.name}:${d.version}`).id === uri.id;
123
+ return (0, nodejs_utils_1.parseKapetaUri)(`${d.definition.metadata.name}:${d.version}`).id === uri.id;
34
124
  });
35
125
  }
36
126
  clearCache() {
37
- cacheManager.removePrefix('definitionsManager:');
127
+ cacheManager_1.cacheManager.removePrefix('definitionsManager:');
38
128
  }
39
129
  }
40
- export const definitionsManager = new DefinitionsManager();
130
+ exports.definitionsManager = new DefinitionsManager();