@kapeta/local-cluster-service 0.6.1 → 0.7.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 (192) hide show
  1. package/.eslintrc.cjs +17 -0
  2. package/.github/workflows/main.yml +22 -22
  3. package/.prettierignore +4 -0
  4. package/.vscode/launch.json +2 -4
  5. package/CHANGELOG.md +7 -0
  6. package/definitions.d.ts +17 -35
  7. package/dist/cjs/index.d.ts +27 -0
  8. package/dist/cjs/index.js +126 -0
  9. package/dist/cjs/package.json +1 -0
  10. package/dist/cjs/src/assetManager.d.ts +31 -0
  11. package/dist/cjs/src/assetManager.js +153 -0
  12. package/dist/cjs/src/assets/routes.d.ts +3 -0
  13. package/dist/cjs/src/assets/routes.js +117 -0
  14. package/dist/cjs/src/clusterService.d.ts +40 -0
  15. package/dist/cjs/src/clusterService.js +114 -0
  16. package/dist/cjs/src/codeGeneratorManager.d.ts +8 -0
  17. package/dist/cjs/src/codeGeneratorManager.js +53 -0
  18. package/dist/cjs/src/config/routes.d.ts +3 -0
  19. package/dist/cjs/src/config/routes.js +126 -0
  20. package/dist/cjs/src/configManager.d.ts +36 -0
  21. package/dist/cjs/src/configManager.js +110 -0
  22. package/dist/cjs/src/containerManager.d.ts +89 -0
  23. package/dist/cjs/src/containerManager.js +365 -0
  24. package/dist/cjs/src/filesystem/routes.d.ts +3 -0
  25. package/dist/cjs/src/filesystem/routes.js +69 -0
  26. package/dist/cjs/src/filesystemManager.d.ts +15 -0
  27. package/dist/cjs/src/filesystemManager.js +87 -0
  28. package/dist/cjs/src/identities/routes.d.ts +3 -0
  29. package/dist/cjs/src/identities/routes.js +18 -0
  30. package/dist/cjs/src/instanceManager.d.ts +56 -0
  31. package/dist/cjs/src/instanceManager.js +424 -0
  32. package/dist/cjs/src/instances/routes.d.ts +3 -0
  33. package/dist/cjs/src/instances/routes.js +134 -0
  34. package/dist/cjs/src/middleware/cors.d.ts +2 -0
  35. package/dist/cjs/src/middleware/cors.js +10 -0
  36. package/dist/cjs/src/middleware/kapeta.d.ts +11 -0
  37. package/dist/cjs/src/middleware/kapeta.js +17 -0
  38. package/dist/cjs/src/middleware/stringBody.d.ts +5 -0
  39. package/dist/cjs/src/middleware/stringBody.js +14 -0
  40. package/dist/cjs/src/networkManager.d.ts +32 -0
  41. package/dist/cjs/src/networkManager.js +109 -0
  42. package/dist/cjs/src/operatorManager.d.ts +36 -0
  43. package/dist/cjs/src/operatorManager.js +165 -0
  44. package/dist/cjs/src/progressListener.d.ts +20 -0
  45. package/dist/cjs/src/progressListener.js +91 -0
  46. package/dist/cjs/src/providerManager.d.ts +9 -0
  47. package/dist/cjs/src/providerManager.js +51 -0
  48. package/dist/cjs/src/providers/routes.d.ts +3 -0
  49. package/dist/cjs/src/providers/routes.js +42 -0
  50. package/dist/cjs/src/proxy/routes.d.ts +3 -0
  51. package/dist/cjs/src/proxy/routes.js +111 -0
  52. package/dist/cjs/src/proxy/types/rest.d.ts +4 -0
  53. package/dist/cjs/src/proxy/types/rest.js +114 -0
  54. package/dist/cjs/src/proxy/types/web.d.ts +4 -0
  55. package/dist/cjs/src/proxy/types/web.js +53 -0
  56. package/dist/cjs/src/repositoryManager.d.ts +17 -0
  57. package/dist/cjs/src/repositoryManager.js +215 -0
  58. package/dist/cjs/src/serviceManager.d.ts +29 -0
  59. package/dist/cjs/src/serviceManager.js +99 -0
  60. package/dist/cjs/src/socketManager.d.ts +14 -0
  61. package/dist/cjs/src/socketManager.js +53 -0
  62. package/dist/cjs/src/storageService.d.ts +17 -0
  63. package/dist/cjs/src/storageService.js +74 -0
  64. package/dist/cjs/src/traffic/routes.d.ts +3 -0
  65. package/dist/cjs/src/traffic/routes.js +18 -0
  66. package/dist/cjs/src/types.d.ts +88 -0
  67. package/dist/cjs/src/types.js +2 -0
  68. package/dist/cjs/src/utils/BlockInstanceRunner.d.ts +29 -0
  69. package/dist/cjs/src/utils/BlockInstanceRunner.js +468 -0
  70. package/dist/cjs/src/utils/LogData.d.ts +19 -0
  71. package/dist/cjs/src/utils/LogData.js +43 -0
  72. package/dist/cjs/src/utils/pathTemplateParser.d.ts +26 -0
  73. package/dist/cjs/src/utils/pathTemplateParser.js +121 -0
  74. package/dist/cjs/src/utils/utils.d.ts +1 -0
  75. package/dist/cjs/src/utils/utils.js +18 -0
  76. package/dist/cjs/start.d.ts +1 -0
  77. package/dist/cjs/start.js +12 -0
  78. package/dist/esm/index.d.ts +27 -0
  79. package/dist/esm/index.js +121 -0
  80. package/dist/esm/package.json +1 -0
  81. package/dist/esm/src/assetManager.d.ts +31 -0
  82. package/{src → dist/esm/src}/assetManager.js +22 -60
  83. package/dist/esm/src/assets/routes.d.ts +3 -0
  84. package/{src → dist/esm/src}/assets/routes.js +21 -36
  85. package/dist/esm/src/clusterService.d.ts +40 -0
  86. package/{src → dist/esm/src}/clusterService.js +14 -37
  87. package/dist/esm/src/codeGeneratorManager.d.ts +8 -0
  88. package/{src → dist/esm/src}/codeGeneratorManager.js +15 -24
  89. package/dist/esm/src/config/routes.d.ts +3 -0
  90. package/{src → dist/esm/src}/config/routes.js +40 -89
  91. package/dist/esm/src/configManager.d.ts +36 -0
  92. package/{src → dist/esm/src}/configManager.js +11 -40
  93. package/dist/esm/src/containerManager.d.ts +89 -0
  94. package/{src → dist/esm/src}/containerManager.js +81 -182
  95. package/dist/esm/src/filesystem/routes.d.ts +3 -0
  96. package/dist/esm/src/filesystem/routes.js +64 -0
  97. package/dist/esm/src/filesystemManager.d.ts +15 -0
  98. package/{src → dist/esm/src}/filesystemManager.js +20 -28
  99. package/dist/esm/src/identities/routes.d.ts +3 -0
  100. package/dist/esm/src/identities/routes.js +13 -0
  101. package/dist/esm/src/instanceManager.d.ts +56 -0
  102. package/{src → dist/esm/src}/instanceManager.js +88 -179
  103. package/dist/esm/src/instances/routes.d.ts +3 -0
  104. package/{src → dist/esm/src}/instances/routes.js +31 -70
  105. package/dist/esm/src/middleware/cors.d.ts +2 -0
  106. package/{src → dist/esm/src}/middleware/cors.js +2 -3
  107. package/dist/esm/src/middleware/kapeta.d.ts +11 -0
  108. package/{src → dist/esm/src}/middleware/kapeta.js +3 -7
  109. package/dist/esm/src/middleware/stringBody.d.ts +5 -0
  110. package/{src → dist/esm/src}/middleware/stringBody.js +2 -3
  111. package/dist/esm/src/networkManager.d.ts +32 -0
  112. package/{src → dist/esm/src}/networkManager.js +16 -33
  113. package/dist/esm/src/operatorManager.d.ts +36 -0
  114. package/{src → dist/esm/src}/operatorManager.js +35 -91
  115. package/dist/esm/src/progressListener.d.ts +20 -0
  116. package/dist/esm/src/progressListener.js +88 -0
  117. package/dist/esm/src/providerManager.d.ts +9 -0
  118. package/dist/esm/src/providerManager.js +45 -0
  119. package/dist/esm/src/providers/routes.d.ts +3 -0
  120. package/{src → dist/esm/src}/providers/routes.js +10 -16
  121. package/dist/esm/src/proxy/routes.d.ts +3 -0
  122. package/dist/esm/src/proxy/routes.js +106 -0
  123. package/dist/esm/src/proxy/types/rest.d.ts +4 -0
  124. package/dist/esm/src/proxy/types/rest.js +107 -0
  125. package/dist/esm/src/proxy/types/web.d.ts +4 -0
  126. package/{src → dist/esm/src}/proxy/types/web.js +13 -35
  127. package/dist/esm/src/repositoryManager.d.ts +17 -0
  128. package/dist/esm/src/repositoryManager.js +209 -0
  129. package/dist/esm/src/serviceManager.d.ts +29 -0
  130. package/{src → dist/esm/src}/serviceManager.js +12 -42
  131. package/dist/esm/src/socketManager.d.ts +14 -0
  132. package/{src → dist/esm/src}/socketManager.js +19 -23
  133. package/dist/esm/src/storageService.d.ts +17 -0
  134. package/{src → dist/esm/src}/storageService.js +8 -27
  135. package/dist/esm/src/traffic/routes.d.ts +3 -0
  136. package/{src → dist/esm/src}/traffic/routes.js +4 -9
  137. package/dist/esm/src/types.d.ts +88 -0
  138. package/dist/esm/src/types.js +1 -0
  139. package/dist/esm/src/utils/BlockInstanceRunner.d.ts +29 -0
  140. package/{src → dist/esm/src}/utils/BlockInstanceRunner.js +137 -256
  141. package/dist/esm/src/utils/LogData.d.ts +19 -0
  142. package/{src → dist/esm/src}/utils/LogData.js +11 -22
  143. package/dist/esm/src/utils/pathTemplateParser.d.ts +26 -0
  144. package/{src → dist/esm/src}/utils/pathTemplateParser.js +21 -40
  145. package/dist/esm/src/utils/utils.d.ts +1 -0
  146. package/dist/esm/src/utils/utils.js +11 -0
  147. package/dist/esm/start.d.ts +1 -0
  148. package/dist/esm/start.js +7 -0
  149. package/index.ts +147 -0
  150. package/package.json +106 -74
  151. package/src/assetManager.ts +191 -0
  152. package/src/assets/routes.ts +132 -0
  153. package/src/clusterService.ts +134 -0
  154. package/src/codeGeneratorManager.ts +57 -0
  155. package/src/config/routes.ts +159 -0
  156. package/src/configManager.ts +148 -0
  157. package/src/containerManager.ts +466 -0
  158. package/src/filesystem/routes.ts +74 -0
  159. package/src/filesystemManager.ts +93 -0
  160. package/src/identities/routes.ts +20 -0
  161. package/src/instanceManager.ts +503 -0
  162. package/src/instances/routes.ts +164 -0
  163. package/src/middleware/cors.ts +9 -0
  164. package/src/middleware/kapeta.ts +27 -0
  165. package/src/middleware/stringBody.ts +16 -0
  166. package/src/networkManager.ts +137 -0
  167. package/src/operatorManager.ts +221 -0
  168. package/src/progressListener.ts +102 -0
  169. package/src/{providerManager.js → providerManager.ts} +15 -31
  170. package/src/providers/routes.ts +46 -0
  171. package/src/proxy/routes.ts +148 -0
  172. package/src/proxy/types/{rest.js → rest.ts} +30 -30
  173. package/src/proxy/types/web.ts +60 -0
  174. package/src/{repositoryManager.js → repositoryManager.ts} +45 -73
  175. package/src/serviceManager.ts +120 -0
  176. package/src/socketManager.ts +57 -0
  177. package/src/storageService.ts +88 -0
  178. package/src/traffic/routes.ts +18 -0
  179. package/src/types.ts +97 -0
  180. package/src/utils/BlockInstanceRunner.ts +555 -0
  181. package/src/utils/LogData.ts +47 -0
  182. package/src/utils/pathTemplateParser.ts +138 -0
  183. package/src/utils/utils.ts +12 -0
  184. package/start.ts +8 -0
  185. package/tsconfig.json +13 -0
  186. package/index.js +0 -127
  187. package/src/filesystem/routes.js +0 -74
  188. package/src/identities/routes.js +0 -19
  189. package/src/progressListener.js +0 -82
  190. package/src/proxy/routes.js +0 -126
  191. package/src/utils/utils.js +0 -13
  192. package/start.js +0 -7
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.clusterService = void 0;
4
+ const net = require('net');
5
+ const DEFAULT_SERVER_PORT = 35100;
6
+ const DEFAULT_START_PORT = 40000;
7
+ const DEFAULT_HOST = '127.0.0.1';
8
+ class ClusterService {
9
+ _port;
10
+ _currentPort;
11
+ _initialized;
12
+ _reservedPorts;
13
+ _host;
14
+ constructor() {
15
+ this._port = DEFAULT_SERVER_PORT;
16
+ this._currentPort = DEFAULT_START_PORT;
17
+ this._initialized = false;
18
+ this._reservedPorts = [];
19
+ this._host = DEFAULT_HOST;
20
+ }
21
+ reservePort(port) {
22
+ const intPort = parseInt(port);
23
+ if (this._reservedPorts.indexOf(intPort) > -1) {
24
+ throw new Error('Port already reserved: ' + intPort);
25
+ }
26
+ this._reservedPorts.push(intPort);
27
+ }
28
+ async init() {
29
+ if (this._initialized) {
30
+ return;
31
+ }
32
+ this._initialized = true;
33
+ await this._findClusterServicePort();
34
+ }
35
+ async _findClusterServicePort() {
36
+ while (true) {
37
+ const isUsed = await this._checkIfPortIsUsed(this._port);
38
+ if (!isUsed) {
39
+ break;
40
+ }
41
+ this._port++;
42
+ }
43
+ }
44
+ /**
45
+ * Gets next available port
46
+ * @return {Promise<number>}
47
+ */
48
+ async getNextAvailablePort() {
49
+ while (true) {
50
+ while (this._reservedPorts.indexOf(this._currentPort) > -1) {
51
+ this._currentPort++;
52
+ }
53
+ const nextPort = this._currentPort++;
54
+ const isUsed = await this._checkIfPortIsUsed(nextPort);
55
+ if (!isUsed) {
56
+ return nextPort;
57
+ }
58
+ }
59
+ }
60
+ _checkIfPortIsUsed(port, host = this._host) {
61
+ return new Promise((resolve, reject) => {
62
+ const server = net.createServer();
63
+ server.once('error', function (err) {
64
+ if (err.code === 'EADDRINUSE') {
65
+ server.close();
66
+ resolve(true);
67
+ return;
68
+ }
69
+ server.close();
70
+ reject(err);
71
+ });
72
+ server.once('listening', function () {
73
+ server.close();
74
+ resolve(false);
75
+ });
76
+ server.listen(port, host);
77
+ });
78
+ }
79
+ /**
80
+ * The port of this local cluster service itself
81
+ */
82
+ getClusterServicePort() {
83
+ return this._port;
84
+ }
85
+ /*
86
+ *Gets the host name ( 127.0.0.1 ) on which Express JS is listening
87
+ */
88
+ getClusterServiceHost() {
89
+ return this._host;
90
+ }
91
+ /**
92
+ * Set the port to be used for this local service
93
+ * @param port
94
+ */
95
+ setClusterServicePort(port) {
96
+ this._port = port;
97
+ }
98
+ setClusterServiceHost(host) {
99
+ this._host = host;
100
+ }
101
+ /**
102
+ * Gets that proxy path of a given request
103
+ *
104
+ * @param systemId
105
+ * @param consumerInstanceId
106
+ * @param consumerResourceName
107
+ * @param portType
108
+ * @return {string}
109
+ */
110
+ getProxyPath(systemId, consumerInstanceId, consumerResourceName, portType) {
111
+ return `/proxy/${encodeURIComponent(systemId)}/${encodeURIComponent(consumerInstanceId)}/${encodeURIComponent(consumerResourceName)}/${encodeURIComponent(portType)}/`;
112
+ }
113
+ }
114
+ exports.clusterService = new ClusterService();
@@ -0,0 +1,8 @@
1
+ import { BlockDefinition } from '@kapeta/schemas';
2
+ declare class CodeGeneratorManager {
3
+ reload(): Promise<void>;
4
+ canGenerateCode(yamlContent: BlockDefinition): boolean;
5
+ generate(yamlFile: string, yamlContent: BlockDefinition): Promise<void>;
6
+ }
7
+ export declare const codeGeneratorManager: CodeGeneratorManager;
8
+ export {};
@@ -0,0 +1,53 @@
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.codeGeneratorManager = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const codegen_1 = require("@kapeta/codegen");
9
+ const local_cluster_config_1 = __importDefault(require("@kapeta/local-cluster-config"));
10
+ const TARGET_KIND = 'core/language-target';
11
+ const BLOCK_TYPE_KIND = 'core/block-type';
12
+ class CodeGeneratorManager {
13
+ async reload() {
14
+ codegen_1.registry.reset();
15
+ const languageTargets = local_cluster_config_1.default.getDefinitions(TARGET_KIND);
16
+ for (const languageTarget of languageTargets) {
17
+ const key = `${languageTarget.definition.metadata.name}:${languageTarget.version}`;
18
+ try {
19
+ const target = require(languageTarget.path);
20
+ if (target.default) {
21
+ codegen_1.registry.register(key, target.default);
22
+ }
23
+ else {
24
+ codegen_1.registry.register(key, target);
25
+ }
26
+ }
27
+ catch (e) {
28
+ console.error('Failed to load target: %s', key, e);
29
+ }
30
+ }
31
+ }
32
+ canGenerateCode(yamlContent) {
33
+ if (!yamlContent.spec.target?.kind) {
34
+ //Not all block types have targets
35
+ return false;
36
+ }
37
+ const blockTypes = local_cluster_config_1.default.getDefinitions(BLOCK_TYPE_KIND);
38
+ const blockTypeKinds = blockTypes.map((blockType) => blockType.definition.metadata.name.toLowerCase() + ':' + blockType.version);
39
+ return !!(yamlContent && yamlContent.kind && blockTypeKinds.indexOf(yamlContent.kind.toLowerCase()) > -1);
40
+ }
41
+ async generate(yamlFile, yamlContent) {
42
+ const baseDir = path_1.default.dirname(yamlFile);
43
+ console.log('Generating code for path: %s', baseDir);
44
+ const codeGenerator = new codegen_1.BlockCodeGenerator(yamlContent);
45
+ const output = await codeGenerator.generate();
46
+ const writer = new codegen_1.CodeWriter(baseDir, {});
47
+ const assets = writer.write(output);
48
+ await codeGenerator.postprocess(baseDir, assets);
49
+ console.log('Code generated for path: %s', baseDir);
50
+ }
51
+ }
52
+ exports.codeGeneratorManager = new CodeGeneratorManager();
53
+ exports.codeGeneratorManager.reload();
@@ -0,0 +1,3 @@
1
+ /// <reference types="express" />
2
+ declare const router: import("express").Router;
3
+ export default router;
@@ -0,0 +1,126 @@
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)();
15
+ const SYSTEM_ID = '$plan';
16
+ router.use('/', cors_1.corsHandler);
17
+ router.use('/', kapeta_1.kapetaHeaders);
18
+ router.use('/', stringBody_1.stringBody);
19
+ /**
20
+ * Returns the full configuration for a given service.
21
+ */
22
+ router.get('/instance', (req, res) => {
23
+ const config = req.kapeta.instanceId
24
+ ? configManager_1.configManager.getConfigForSection(req.kapeta.systemId, req.kapeta.instanceId)
25
+ : configManager_1.configManager.getConfigForSystem(req.kapeta.systemId);
26
+ res.send(config);
27
+ });
28
+ /**
29
+ * Updates the full configuration for a given service.
30
+ */
31
+ router.put('/instance', async (req, res) => {
32
+ try {
33
+ let config = JSON.parse(req.stringBody ?? '{}');
34
+ if (!config) {
35
+ config = {};
36
+ }
37
+ if (req.kapeta.instanceId) {
38
+ configManager_1.configManager.setConfigForSection(req.kapeta.systemId, req.kapeta.instanceId, config);
39
+ //Restart the instance if it is running after config change
40
+ await instanceManager_1.instanceManager.restartIfRunning(req.kapeta.systemId, req.kapeta.instanceId);
41
+ }
42
+ else {
43
+ configManager_1.configManager.setConfigForSystem(req.kapeta.systemId, config);
44
+ }
45
+ }
46
+ catch (err) {
47
+ console.error('Failed to update instance config', err);
48
+ res.status(400).send({ error: err.message });
49
+ return;
50
+ }
51
+ res.status(202).send({ ok: true });
52
+ });
53
+ /**
54
+ * Returns the full configuration for a plan
55
+ */
56
+ router.get('/system', (req, res) => {
57
+ const config = configManager_1.configManager.getConfigForSection(req.kapeta.systemId, SYSTEM_ID);
58
+ res.send(config);
59
+ });
60
+ /**
61
+ * Updates the full configuration for a plan
62
+ */
63
+ router.put('/system', (req, res) => {
64
+ let config = JSON.parse(req.stringBody ?? '{}');
65
+ if (!config) {
66
+ config = {};
67
+ }
68
+ configManager_1.configManager.setConfigForSection(req.kapeta.systemId, SYSTEM_ID, config);
69
+ res.status(202).send({ ok: true });
70
+ });
71
+ /**
72
+ * Resolves and checks the identity of a block instance
73
+ */
74
+ router.get('/identity', async (req, res) => {
75
+ const identity = {
76
+ systemId: req.kapeta.systemId,
77
+ instanceId: req.kapeta.instanceId,
78
+ };
79
+ if (!req.kapeta.blockRef) {
80
+ res.status(400).send({ error: 'Missing required header "X-Kapeta-Block"' });
81
+ return;
82
+ }
83
+ try {
84
+ if (!identity.systemId || !identity.instanceId) {
85
+ const { systemId, instanceId } = await configManager_1.configManager.resolveIdentity(req.kapeta.blockRef, identity.systemId);
86
+ identity.systemId = systemId;
87
+ identity.instanceId = instanceId;
88
+ }
89
+ else {
90
+ await configManager_1.configManager.verifyIdentity(req.kapeta.blockRef, identity.systemId, identity.instanceId);
91
+ }
92
+ res.send(identity);
93
+ }
94
+ catch (err) {
95
+ console.warn('Failed to resolve identity', err);
96
+ res.status(400).send({ error: err.message });
97
+ }
98
+ });
99
+ /**
100
+ * Services call this to request a free port. If a service has
101
+ * already called the endpoint the same port is returned.
102
+ */
103
+ router.get('/provides/:type', async (req, res) => {
104
+ //Get service port
105
+ res.send('' + (await serviceManager_1.serviceManager.ensureServicePort(req.kapeta.systemId, req.kapeta.instanceId, req.params.type)));
106
+ });
107
+ /**
108
+ * Used by services to get info for consumed operator resource.
109
+ *
110
+ * If the operator resource is not already available this will cause it to start an instance and
111
+ * assign port numbers to it etc.
112
+ */
113
+ router.get('/consumes/resource/:resourceType/:portType/:name', async (req, res) => {
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);
115
+ res.send(operatorInfo);
116
+ });
117
+ /**
118
+ * Used by services to get address for their clients.
119
+ *
120
+ * If the remote service is not already registered with a port - we do that here
121
+ * to handle clients for services that hasn't started yet.
122
+ */
123
+ router.get('/consumes/:resourceName/:type', (req, res) => {
124
+ res.send(serviceManager_1.serviceManager.getConsumerAddress(req.kapeta.systemId, req.kapeta.instanceId, req.params.resourceName, req.params.type, req.kapeta.environment));
125
+ });
126
+ exports.default = router;
@@ -0,0 +1,36 @@
1
+ type AnyMap = {
2
+ [key: string]: any;
3
+ };
4
+ interface MatchedIdentity {
5
+ systemId: string;
6
+ instanceId: string;
7
+ }
8
+ declare class ConfigManager {
9
+ private _config;
10
+ constructor();
11
+ _forSystem(systemId: string): any;
12
+ setConfigForSystem(systemId: string, config: AnyMap): void;
13
+ getConfigForSystem(systemId: string): AnyMap;
14
+ setConfigForSection(systemId: string, sectionId: string, config: AnyMap): void;
15
+ getConfigForSection(systemId: string, sectionId: string): any;
16
+ /**
17
+ * Try to identify the plan and instance in a plan automatically based on the block reference
18
+ *
19
+ * It will:
20
+ * 1. Go through all plans available in the assets
21
+ * 2. Look through each plan and see if the plan is referencing the block
22
+ * 3. If only 1 plan references the block - assume that as the system id
23
+ * 4. If only 1 instance in 1 plan references the block - assume that as instance id
24
+ *
25
+ * In case multiple uses of the same block reference we will prompt to user to choose which instance they want to
26
+ * use.
27
+ *
28
+ * @param blockRef block reference
29
+ * @param [systemId] plan reference
30
+ * @returns {Promise<{systemId:string,instanceId:string}>}
31
+ */
32
+ resolveIdentity(blockRef: string, systemId?: string): Promise<MatchedIdentity>;
33
+ verifyIdentity(blockRef: string, systemId: string, instanceId: string): Promise<void>;
34
+ }
35
+ export declare const configManager: ConfigManager;
36
+ export {};
@@ -0,0 +1,110 @@
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
+ class ConfigManager {
8
+ _config;
9
+ constructor() {
10
+ this._config = storageService_1.storageService.section('config');
11
+ }
12
+ _forSystem(systemId) {
13
+ if (!this._config[systemId]) {
14
+ this._config[systemId] = {};
15
+ }
16
+ return this._config[systemId];
17
+ }
18
+ setConfigForSystem(systemId, config) {
19
+ const systemConfig = config || {};
20
+ storageService_1.storageService.put('config', systemId, systemConfig);
21
+ }
22
+ getConfigForSystem(systemId) {
23
+ return this._forSystem(systemId);
24
+ }
25
+ setConfigForSection(systemId, sectionId, config) {
26
+ let systemConfig = this._forSystem(systemId);
27
+ systemConfig[sectionId] = config || {};
28
+ storageService_1.storageService.put('config', systemId, systemConfig);
29
+ }
30
+ getConfigForSection(systemId, sectionId) {
31
+ const systemConfig = this._forSystem(systemId);
32
+ if (!systemConfig[sectionId]) {
33
+ systemConfig[sectionId] = {};
34
+ }
35
+ return systemConfig[sectionId];
36
+ }
37
+ /**
38
+ * Try to identify the plan and instance in a plan automatically based on the block reference
39
+ *
40
+ * It will:
41
+ * 1. Go through all plans available in the assets
42
+ * 2. Look through each plan and see if the plan is referencing the block
43
+ * 3. If only 1 plan references the block - assume that as the system id
44
+ * 4. If only 1 instance in 1 plan references the block - assume that as instance id
45
+ *
46
+ * In case multiple uses of the same block reference we will prompt to user to choose which instance they want to
47
+ * use.
48
+ *
49
+ * @param blockRef block reference
50
+ * @param [systemId] plan reference
51
+ * @returns {Promise<{systemId:string,instanceId:string}>}
52
+ */
53
+ async resolveIdentity(blockRef, systemId) {
54
+ const planAssets = assetManager_1.assetManager.getPlans();
55
+ const blockUri = (0, nodejs_utils_1.parseKapetaUri)(blockRef);
56
+ let matchingIdentities = [];
57
+ planAssets.forEach((planAsset) => {
58
+ if (systemId && planAsset.ref !== systemId) {
59
+ //Skip plans that do not match systemid if provided
60
+ return;
61
+ }
62
+ if (!planAsset.data.spec.blocks) {
63
+ return;
64
+ }
65
+ planAsset.data.spec.blocks.forEach((blockInstance) => {
66
+ const refUri = (0, nodejs_utils_1.parseKapetaUri)(blockInstance.block.ref);
67
+ if (refUri.equals(blockUri)) {
68
+ matchingIdentities.push({
69
+ systemId: planAsset.ref,
70
+ instanceId: blockInstance.id,
71
+ });
72
+ }
73
+ });
74
+ });
75
+ if (matchingIdentities.length === 0) {
76
+ if (systemId) {
77
+ throw new Error(`No uses of block "${blockRef}" was found in plan: "${systemId}"`);
78
+ }
79
+ throw new Error(`No uses of block "${blockRef}" was found in any known plan`);
80
+ }
81
+ if (matchingIdentities.length > 1) {
82
+ if (systemId) {
83
+ throw new Error(`Multiple uses of block "${blockRef}" was found in plan: "${systemId}". Please specify which instance in the plan you wish to run.`);
84
+ }
85
+ throw new Error(`Multiple uses of block "${blockRef}" was found in 1 or more plan. Please specify which instance in which plan you wish to run.`);
86
+ }
87
+ return matchingIdentities[0];
88
+ }
89
+ async verifyIdentity(blockRef, systemId, instanceId) {
90
+ const planAssets = assetManager_1.assetManager.getPlans();
91
+ const systemUri = systemId ? (0, nodejs_utils_1.parseKapetaUri)(systemId) : null;
92
+ const blockUri = (0, nodejs_utils_1.parseKapetaUri)(blockRef);
93
+ let found = false;
94
+ planAssets.forEach((planAsset) => {
95
+ if (systemUri && !(0, nodejs_utils_1.parseKapetaUri)(planAsset.ref).equals(systemUri)) {
96
+ //Skip plans that do not match systemid if provided
97
+ return;
98
+ }
99
+ planAsset.data.spec.blocks.forEach((blockInstance) => {
100
+ if (blockInstance.id === instanceId && (0, nodejs_utils_1.parseKapetaUri)(blockInstance.block.ref).equals(blockUri)) {
101
+ found = true;
102
+ }
103
+ });
104
+ });
105
+ if (!found) {
106
+ throw new Error(`Block "${blockRef}" was not found in plan: "${systemId}" using instance id ${instanceId}. Please verify that the provided information is accurate.`);
107
+ }
108
+ }
109
+ }
110
+ exports.configManager = new ConfigManager();
@@ -0,0 +1,89 @@
1
+ import { Docker } from 'node-docker-api';
2
+ import { Container } from 'node-docker-api/lib/container';
3
+ type StringMap = {
4
+ [key: string]: string;
5
+ };
6
+ export type PortMap = {
7
+ [key: string]: {
8
+ containerPort: string;
9
+ protocol: string;
10
+ hostPort: string;
11
+ };
12
+ };
13
+ export interface DockerMounts {
14
+ Target: string;
15
+ Source: string;
16
+ Type: string;
17
+ ReadOnly: boolean;
18
+ Consistency: string;
19
+ }
20
+ interface Health {
21
+ cmd: string;
22
+ interval?: number;
23
+ timeout?: number;
24
+ retries?: number;
25
+ }
26
+ declare class ContainerManager {
27
+ private _docker;
28
+ private _alive;
29
+ private _mountDir;
30
+ constructor();
31
+ initialize(): Promise<void>;
32
+ isAlive(): boolean;
33
+ getMountPoint(kind: string, mountName: string): string;
34
+ createMounts(kind: string, mountOpts: StringMap): StringMap;
35
+ ping(): Promise<void>;
36
+ docker(): Docker;
37
+ getContainerByName(containerName: string): Promise<Container | undefined>;
38
+ pull(image: string, cacheForMS?: number): Promise<void>;
39
+ toDockerMounts(mounts: StringMap): DockerMounts[];
40
+ toDockerHealth(health: Health): {
41
+ Test: string[];
42
+ Interval: number;
43
+ Timeout: number;
44
+ Retries: number;
45
+ };
46
+ run(image: string, name: string, opts: {
47
+ ports: {};
48
+ mounts: {};
49
+ env: {};
50
+ cmd: string;
51
+ health: Health;
52
+ }): Promise<ContainerInfo>;
53
+ startContainer(opts: any): Promise<Container>;
54
+ waitForReady(container: Container, attempt?: number): Promise<void>;
55
+ waitForHealthy(container: Container, attempt?: number): Promise<void>;
56
+ _isReady(container: Container): Promise<any>;
57
+ _isHealthy(container: Container): Promise<boolean>;
58
+ /**
59
+ *
60
+ * @param name
61
+ * @return {Promise<ContainerInfo>}
62
+ */
63
+ get(name: string): Promise<ContainerInfo | null>;
64
+ }
65
+ export declare class ContainerInfo {
66
+ private readonly _container;
67
+ /**
68
+ *
69
+ * @param {Container} dockerContainer
70
+ */
71
+ constructor(dockerContainer: Container);
72
+ get native(): Container;
73
+ isRunning(): Promise<any>;
74
+ start(): Promise<void>;
75
+ restart(): Promise<void>;
76
+ stop(): Promise<void>;
77
+ remove(opts?: {
78
+ force?: boolean;
79
+ }): Promise<void>;
80
+ getPort(type: string): Promise<{
81
+ containerPort: string;
82
+ protocol: string;
83
+ hostPort: string;
84
+ } | null>;
85
+ getStatus(): Promise<any>;
86
+ getPorts(): Promise<PortMap | false>;
87
+ }
88
+ export declare const containerManager: ContainerManager;
89
+ export {};