@kapeta/local-cluster-service 0.0.0-96f91ef

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 (274) hide show
  1. package/.eslintrc.cjs +25 -0
  2. package/.github/workflows/check-license.yml +17 -0
  3. package/.github/workflows/main.yml +26 -0
  4. package/.prettierignore +4 -0
  5. package/.vscode/launch.json +19 -0
  6. package/CHANGELOG.md +920 -0
  7. package/LICENSE +38 -0
  8. package/README.md +36 -0
  9. package/definitions.d.ts +35 -0
  10. package/dist/cjs/index.d.ts +34 -0
  11. package/dist/cjs/index.js +263 -0
  12. package/dist/cjs/package.json +1 -0
  13. package/dist/cjs/src/RepositoryWatcher.d.ts +30 -0
  14. package/dist/cjs/src/RepositoryWatcher.js +332 -0
  15. package/dist/cjs/src/ai/aiClient.d.ts +20 -0
  16. package/dist/cjs/src/ai/aiClient.js +74 -0
  17. package/dist/cjs/src/ai/routes.d.ts +7 -0
  18. package/dist/cjs/src/ai/routes.js +37 -0
  19. package/dist/cjs/src/ai/transform.d.ts +11 -0
  20. package/dist/cjs/src/ai/transform.js +239 -0
  21. package/dist/cjs/src/ai/types.d.ts +40 -0
  22. package/dist/cjs/src/ai/types.js +2 -0
  23. package/dist/cjs/src/api.d.ts +7 -0
  24. package/dist/cjs/src/api.js +29 -0
  25. package/dist/cjs/src/assetManager.d.ts +41 -0
  26. package/dist/cjs/src/assetManager.js +274 -0
  27. package/dist/cjs/src/assets/routes.d.ts +7 -0
  28. package/dist/cjs/src/assets/routes.js +165 -0
  29. package/dist/cjs/src/attachments/routes.d.ts +7 -0
  30. package/dist/cjs/src/attachments/routes.js +72 -0
  31. package/dist/cjs/src/authManager.d.ts +16 -0
  32. package/dist/cjs/src/authManager.js +64 -0
  33. package/dist/cjs/src/cacheManager.d.ts +20 -0
  34. package/dist/cjs/src/cacheManager.js +51 -0
  35. package/dist/cjs/src/clusterService.d.ts +44 -0
  36. package/dist/cjs/src/clusterService.js +120 -0
  37. package/dist/cjs/src/codeGeneratorManager.d.ts +14 -0
  38. package/dist/cjs/src/codeGeneratorManager.js +93 -0
  39. package/dist/cjs/src/config/routes.d.ts +7 -0
  40. package/dist/cjs/src/config/routes.js +160 -0
  41. package/dist/cjs/src/configManager.d.ts +42 -0
  42. package/dist/cjs/src/configManager.js +136 -0
  43. package/dist/cjs/src/containerManager.d.ts +148 -0
  44. package/dist/cjs/src/containerManager.js +958 -0
  45. package/dist/cjs/src/definitionsManager.d.ts +20 -0
  46. package/dist/cjs/src/definitionsManager.js +171 -0
  47. package/dist/cjs/src/filesystem/routes.d.ts +7 -0
  48. package/dist/cjs/src/filesystem/routes.js +105 -0
  49. package/dist/cjs/src/filesystemManager.d.ts +27 -0
  50. package/dist/cjs/src/filesystemManager.js +118 -0
  51. package/dist/cjs/src/identities/routes.d.ts +7 -0
  52. package/dist/cjs/src/identities/routes.js +37 -0
  53. package/dist/cjs/src/instanceManager.d.ts +69 -0
  54. package/dist/cjs/src/instanceManager.js +910 -0
  55. package/dist/cjs/src/instances/routes.d.ts +7 -0
  56. package/dist/cjs/src/instances/routes.js +179 -0
  57. package/dist/cjs/src/middleware/cors.d.ts +6 -0
  58. package/dist/cjs/src/middleware/cors.js +14 -0
  59. package/dist/cjs/src/middleware/kapeta.d.ts +15 -0
  60. package/dist/cjs/src/middleware/kapeta.js +28 -0
  61. package/dist/cjs/src/middleware/stringBody.d.ts +9 -0
  62. package/dist/cjs/src/middleware/stringBody.js +18 -0
  63. package/dist/cjs/src/networkManager.d.ts +37 -0
  64. package/dist/cjs/src/networkManager.js +119 -0
  65. package/dist/cjs/src/operatorManager.d.ts +41 -0
  66. package/dist/cjs/src/operatorManager.js +211 -0
  67. package/dist/cjs/src/progressListener.d.ts +31 -0
  68. package/dist/cjs/src/progressListener.js +133 -0
  69. package/dist/cjs/src/providerManager.d.ts +11 -0
  70. package/dist/cjs/src/providerManager.js +84 -0
  71. package/dist/cjs/src/providers/routes.d.ts +7 -0
  72. package/dist/cjs/src/providers/routes.js +46 -0
  73. package/dist/cjs/src/proxy/routes.d.ts +7 -0
  74. package/dist/cjs/src/proxy/routes.js +115 -0
  75. package/dist/cjs/src/proxy/types/rest.d.ts +10 -0
  76. package/dist/cjs/src/proxy/types/rest.js +123 -0
  77. package/dist/cjs/src/proxy/types/web.d.ts +8 -0
  78. package/dist/cjs/src/proxy/types/web.js +61 -0
  79. package/dist/cjs/src/repositoryManager.d.ts +35 -0
  80. package/dist/cjs/src/repositoryManager.js +247 -0
  81. package/dist/cjs/src/serviceManager.d.ts +36 -0
  82. package/dist/cjs/src/serviceManager.js +106 -0
  83. package/dist/cjs/src/socketManager.d.ts +32 -0
  84. package/dist/cjs/src/socketManager.js +125 -0
  85. package/dist/cjs/src/storageService.d.ts +21 -0
  86. package/dist/cjs/src/storageService.js +81 -0
  87. package/dist/cjs/src/taskManager.d.ts +70 -0
  88. package/dist/cjs/src/taskManager.js +181 -0
  89. package/dist/cjs/src/tasks/routes.d.ts +7 -0
  90. package/dist/cjs/src/tasks/routes.js +39 -0
  91. package/dist/cjs/src/traffic/routes.d.ts +7 -0
  92. package/dist/cjs/src/traffic/routes.js +22 -0
  93. package/dist/cjs/src/types.d.ts +99 -0
  94. package/dist/cjs/src/types.js +39 -0
  95. package/dist/cjs/src/utils/BlockInstanceRunner.d.ts +28 -0
  96. package/dist/cjs/src/utils/BlockInstanceRunner.js +432 -0
  97. package/dist/cjs/src/utils/DefaultProviderInstaller.d.ts +15 -0
  98. package/dist/cjs/src/utils/DefaultProviderInstaller.js +136 -0
  99. package/dist/cjs/src/utils/InternalConfigProvider.d.ts +38 -0
  100. package/dist/cjs/src/utils/InternalConfigProvider.js +146 -0
  101. package/dist/cjs/src/utils/LogData.d.ts +23 -0
  102. package/dist/cjs/src/utils/LogData.js +46 -0
  103. package/dist/cjs/src/utils/commandLineUtils.d.ts +8 -0
  104. package/dist/cjs/src/utils/commandLineUtils.js +39 -0
  105. package/dist/cjs/src/utils/pathTemplateParser.d.ts +30 -0
  106. package/dist/cjs/src/utils/pathTemplateParser.js +135 -0
  107. package/dist/cjs/src/utils/utils.d.ts +40 -0
  108. package/dist/cjs/src/utils/utils.js +148 -0
  109. package/dist/cjs/start.d.ts +5 -0
  110. package/dist/cjs/start.js +17 -0
  111. package/dist/cjs/test/proxy/types/rest.test.d.ts +5 -0
  112. package/dist/cjs/test/proxy/types/rest.test.js +48 -0
  113. package/dist/cjs/test/utils/pathTemplateParser.test.d.ts +5 -0
  114. package/dist/cjs/test/utils/pathTemplateParser.test.js +27 -0
  115. package/dist/esm/index.d.ts +34 -0
  116. package/dist/esm/index.js +263 -0
  117. package/dist/esm/package.json +1 -0
  118. package/dist/esm/src/RepositoryWatcher.d.ts +30 -0
  119. package/dist/esm/src/RepositoryWatcher.js +332 -0
  120. package/dist/esm/src/ai/aiClient.d.ts +20 -0
  121. package/dist/esm/src/ai/aiClient.js +74 -0
  122. package/dist/esm/src/ai/routes.d.ts +7 -0
  123. package/dist/esm/src/ai/routes.js +37 -0
  124. package/dist/esm/src/ai/transform.d.ts +11 -0
  125. package/dist/esm/src/ai/transform.js +239 -0
  126. package/dist/esm/src/ai/types.d.ts +40 -0
  127. package/dist/esm/src/ai/types.js +2 -0
  128. package/dist/esm/src/api.d.ts +7 -0
  129. package/dist/esm/src/api.js +29 -0
  130. package/dist/esm/src/assetManager.d.ts +41 -0
  131. package/dist/esm/src/assetManager.js +274 -0
  132. package/dist/esm/src/assets/routes.d.ts +7 -0
  133. package/dist/esm/src/assets/routes.js +165 -0
  134. package/dist/esm/src/attachments/routes.d.ts +7 -0
  135. package/dist/esm/src/attachments/routes.js +72 -0
  136. package/dist/esm/src/authManager.d.ts +16 -0
  137. package/dist/esm/src/authManager.js +64 -0
  138. package/dist/esm/src/cacheManager.d.ts +20 -0
  139. package/dist/esm/src/cacheManager.js +51 -0
  140. package/dist/esm/src/clusterService.d.ts +44 -0
  141. package/dist/esm/src/clusterService.js +120 -0
  142. package/dist/esm/src/codeGeneratorManager.d.ts +14 -0
  143. package/dist/esm/src/codeGeneratorManager.js +93 -0
  144. package/dist/esm/src/config/routes.d.ts +7 -0
  145. package/dist/esm/src/config/routes.js +160 -0
  146. package/dist/esm/src/configManager.d.ts +42 -0
  147. package/dist/esm/src/configManager.js +136 -0
  148. package/dist/esm/src/containerManager.d.ts +148 -0
  149. package/dist/esm/src/containerManager.js +958 -0
  150. package/dist/esm/src/definitionsManager.d.ts +20 -0
  151. package/dist/esm/src/definitionsManager.js +171 -0
  152. package/dist/esm/src/filesystem/routes.d.ts +7 -0
  153. package/dist/esm/src/filesystem/routes.js +105 -0
  154. package/dist/esm/src/filesystemManager.d.ts +27 -0
  155. package/dist/esm/src/filesystemManager.js +118 -0
  156. package/dist/esm/src/identities/routes.d.ts +7 -0
  157. package/dist/esm/src/identities/routes.js +37 -0
  158. package/dist/esm/src/instanceManager.d.ts +69 -0
  159. package/dist/esm/src/instanceManager.js +910 -0
  160. package/dist/esm/src/instances/routes.d.ts +7 -0
  161. package/dist/esm/src/instances/routes.js +179 -0
  162. package/dist/esm/src/middleware/cors.d.ts +6 -0
  163. package/dist/esm/src/middleware/cors.js +14 -0
  164. package/dist/esm/src/middleware/kapeta.d.ts +15 -0
  165. package/dist/esm/src/middleware/kapeta.js +28 -0
  166. package/dist/esm/src/middleware/stringBody.d.ts +9 -0
  167. package/dist/esm/src/middleware/stringBody.js +18 -0
  168. package/dist/esm/src/networkManager.d.ts +37 -0
  169. package/dist/esm/src/networkManager.js +119 -0
  170. package/dist/esm/src/operatorManager.d.ts +41 -0
  171. package/dist/esm/src/operatorManager.js +211 -0
  172. package/dist/esm/src/progressListener.d.ts +31 -0
  173. package/dist/esm/src/progressListener.js +133 -0
  174. package/dist/esm/src/providerManager.d.ts +11 -0
  175. package/dist/esm/src/providerManager.js +84 -0
  176. package/dist/esm/src/providers/routes.d.ts +7 -0
  177. package/dist/esm/src/providers/routes.js +46 -0
  178. package/dist/esm/src/proxy/routes.d.ts +7 -0
  179. package/dist/esm/src/proxy/routes.js +115 -0
  180. package/dist/esm/src/proxy/types/rest.d.ts +10 -0
  181. package/dist/esm/src/proxy/types/rest.js +123 -0
  182. package/dist/esm/src/proxy/types/web.d.ts +8 -0
  183. package/dist/esm/src/proxy/types/web.js +61 -0
  184. package/dist/esm/src/repositoryManager.d.ts +35 -0
  185. package/dist/esm/src/repositoryManager.js +247 -0
  186. package/dist/esm/src/serviceManager.d.ts +36 -0
  187. package/dist/esm/src/serviceManager.js +106 -0
  188. package/dist/esm/src/socketManager.d.ts +32 -0
  189. package/dist/esm/src/socketManager.js +125 -0
  190. package/dist/esm/src/storageService.d.ts +21 -0
  191. package/dist/esm/src/storageService.js +81 -0
  192. package/dist/esm/src/taskManager.d.ts +70 -0
  193. package/dist/esm/src/taskManager.js +181 -0
  194. package/dist/esm/src/tasks/routes.d.ts +7 -0
  195. package/dist/esm/src/tasks/routes.js +39 -0
  196. package/dist/esm/src/traffic/routes.d.ts +7 -0
  197. package/dist/esm/src/traffic/routes.js +22 -0
  198. package/dist/esm/src/types.d.ts +99 -0
  199. package/dist/esm/src/types.js +39 -0
  200. package/dist/esm/src/utils/BlockInstanceRunner.d.ts +28 -0
  201. package/dist/esm/src/utils/BlockInstanceRunner.js +432 -0
  202. package/dist/esm/src/utils/DefaultProviderInstaller.d.ts +15 -0
  203. package/dist/esm/src/utils/DefaultProviderInstaller.js +136 -0
  204. package/dist/esm/src/utils/InternalConfigProvider.d.ts +38 -0
  205. package/dist/esm/src/utils/InternalConfigProvider.js +146 -0
  206. package/dist/esm/src/utils/LogData.d.ts +23 -0
  207. package/dist/esm/src/utils/LogData.js +46 -0
  208. package/dist/esm/src/utils/commandLineUtils.d.ts +8 -0
  209. package/dist/esm/src/utils/commandLineUtils.js +39 -0
  210. package/dist/esm/src/utils/pathTemplateParser.d.ts +30 -0
  211. package/dist/esm/src/utils/pathTemplateParser.js +135 -0
  212. package/dist/esm/src/utils/utils.d.ts +40 -0
  213. package/dist/esm/src/utils/utils.js +148 -0
  214. package/dist/esm/start.d.ts +5 -0
  215. package/dist/esm/start.js +17 -0
  216. package/dist/esm/test/proxy/types/rest.test.d.ts +5 -0
  217. package/dist/esm/test/proxy/types/rest.test.js +48 -0
  218. package/dist/esm/test/utils/pathTemplateParser.test.d.ts +5 -0
  219. package/dist/esm/test/utils/pathTemplateParser.test.js +27 -0
  220. package/index.ts +280 -0
  221. package/jest.config.js +8 -0
  222. package/package.json +134 -0
  223. package/src/RepositoryWatcher.ts +363 -0
  224. package/src/ai/aiClient.ts +93 -0
  225. package/src/ai/routes.ts +39 -0
  226. package/src/ai/transform.ts +275 -0
  227. package/src/ai/types.ts +45 -0
  228. package/src/api.ts +32 -0
  229. package/src/assetManager.ts +355 -0
  230. package/src/assets/routes.ts +183 -0
  231. package/src/attachments/routes.ts +79 -0
  232. package/src/authManager.ts +67 -0
  233. package/src/cacheManager.ts +59 -0
  234. package/src/clusterService.ts +142 -0
  235. package/src/codeGeneratorManager.ts +109 -0
  236. package/src/config/routes.ts +201 -0
  237. package/src/configManager.ts +180 -0
  238. package/src/containerManager.ts +1178 -0
  239. package/src/definitionsManager.ts +212 -0
  240. package/src/filesystem/routes.ts +123 -0
  241. package/src/filesystemManager.ts +133 -0
  242. package/src/identities/routes.ts +38 -0
  243. package/src/instanceManager.ts +1160 -0
  244. package/src/instances/routes.ts +203 -0
  245. package/src/middleware/cors.ts +14 -0
  246. package/src/middleware/kapeta.ts +41 -0
  247. package/src/middleware/stringBody.ts +21 -0
  248. package/src/networkManager.ts +148 -0
  249. package/src/operatorManager.ts +294 -0
  250. package/src/progressListener.ts +151 -0
  251. package/src/providerManager.ts +97 -0
  252. package/src/providers/routes.ts +51 -0
  253. package/src/proxy/routes.ts +153 -0
  254. package/src/proxy/types/rest.ts +172 -0
  255. package/src/proxy/types/web.ts +70 -0
  256. package/src/repositoryManager.ts +291 -0
  257. package/src/serviceManager.ts +133 -0
  258. package/src/socketManager.ts +138 -0
  259. package/src/storageService.ts +97 -0
  260. package/src/taskManager.ts +247 -0
  261. package/src/tasks/routes.ts +43 -0
  262. package/src/traffic/routes.ts +23 -0
  263. package/src/types.ts +112 -0
  264. package/src/utils/BlockInstanceRunner.ts +577 -0
  265. package/src/utils/DefaultProviderInstaller.ts +150 -0
  266. package/src/utils/InternalConfigProvider.ts +214 -0
  267. package/src/utils/LogData.ts +50 -0
  268. package/src/utils/commandLineUtils.ts +45 -0
  269. package/src/utils/pathTemplateParser.ts +157 -0
  270. package/src/utils/utils.ts +155 -0
  271. package/start.ts +14 -0
  272. package/test/proxy/types/rest.test.ts +54 -0
  273. package/test/utils/pathTemplateParser.test.ts +29 -0
  274. package/tsconfig.json +15 -0
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright 2023 Kapeta Inc.
4
+ * SPDX-License-Identifier: BUSL-1.1
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ const express_promise_router_1 = __importDefault(require("express-promise-router"));
11
+ const configManager_1 = require("../configManager");
12
+ const serviceManager_1 = require("../serviceManager");
13
+ const operatorManager_1 = require("../operatorManager");
14
+ const instanceManager_1 = require("../instanceManager");
15
+ const cors_1 = require("../middleware/cors");
16
+ const kapeta_1 = require("../middleware/kapeta");
17
+ const stringBody_1 = require("../middleware/stringBody");
18
+ const router = (0, express_promise_router_1.default)();
19
+ router.use('/', cors_1.corsHandler);
20
+ router.use('/', kapeta_1.kapetaHeaders);
21
+ router.use('/', stringBody_1.stringBody);
22
+ /**
23
+ * Returns the full configuration for a given service.
24
+ */
25
+ router.get('/instance', async (req, res) => {
26
+ try {
27
+ let config = {};
28
+ if (req.kapeta.instanceId) {
29
+ config = await configManager_1.configManager.getConfigForBlockInstance(req.kapeta.systemId, req.kapeta.instanceId);
30
+ }
31
+ else {
32
+ config = configManager_1.configManager.getConfigForSystem(req.kapeta.systemId);
33
+ }
34
+ res.send(config);
35
+ }
36
+ catch (err) {
37
+ console.error('Failed to get instance config', err);
38
+ res.status(400).send({ error: err.message });
39
+ return;
40
+ }
41
+ });
42
+ /**
43
+ * Updates the full configuration for a given service.
44
+ */
45
+ router.put('/instance', async (req, res) => {
46
+ try {
47
+ let config = JSON.parse(req.stringBody ?? '{}');
48
+ if (!config) {
49
+ config = {};
50
+ }
51
+ if (req.kapeta.instanceId) {
52
+ configManager_1.configManager.setConfigForSection(req.kapeta.systemId, req.kapeta.instanceId, config);
53
+ //Restart the instance if it is running after config change
54
+ await instanceManager_1.instanceManager.prepareForRestart(req.kapeta.systemId, req.kapeta.instanceId);
55
+ }
56
+ else {
57
+ configManager_1.configManager.setConfigForSystem(req.kapeta.systemId, config);
58
+ }
59
+ }
60
+ catch (err) {
61
+ console.error('Failed to update instance config', err);
62
+ res.status(400).send({ error: err.message });
63
+ return;
64
+ }
65
+ res.status(202).send({ ok: true });
66
+ });
67
+ /**
68
+ * Returns the full configuration for a plan
69
+ */
70
+ router.get('/system', (req, res) => {
71
+ const config = configManager_1.configManager.getConfigForSection(req.kapeta.systemId, configManager_1.SYSTEM_ID);
72
+ res.send(config);
73
+ });
74
+ /**
75
+ * Updates the full configuration for a plan
76
+ */
77
+ router.put('/system', (req, res) => {
78
+ let config = JSON.parse(req.stringBody ?? '{}');
79
+ if (!config) {
80
+ config = {};
81
+ }
82
+ configManager_1.configManager.setConfigForSection(req.kapeta.systemId, configManager_1.SYSTEM_ID, config);
83
+ res.status(202).send({ ok: true });
84
+ });
85
+ /**
86
+ * Resolves and checks the identity of a block instance
87
+ */
88
+ router.get('/identity', async (req, res) => {
89
+ const identity = {
90
+ systemId: req.kapeta.systemId,
91
+ instanceId: req.kapeta.instanceId,
92
+ };
93
+ if (!req.kapeta.blockRef) {
94
+ res.status(400).send({ error: 'Missing required header "X-Kapeta-Block"' });
95
+ return;
96
+ }
97
+ try {
98
+ if (!identity.systemId || !identity.instanceId) {
99
+ const { systemId, instanceId } = await configManager_1.configManager.resolveIdentity(req.kapeta.blockRef, identity.systemId);
100
+ identity.systemId = systemId;
101
+ identity.instanceId = instanceId;
102
+ }
103
+ else {
104
+ await configManager_1.configManager.verifyIdentity(req.kapeta.blockRef, identity.systemId, identity.instanceId);
105
+ }
106
+ res.send(identity);
107
+ }
108
+ catch (err) {
109
+ console.warn('Failed to resolve identity', err);
110
+ res.status(400).send({ error: err.message });
111
+ }
112
+ });
113
+ /**
114
+ * Services call this to request a free port. If a service has
115
+ * already called the endpoint the same port is returned.
116
+ */
117
+ router.get('/provides/:type', async (req, res) => {
118
+ if (req.kapeta.environment === 'docker' && serviceManager_1.HTTP_PORTS.includes(req.params.type)) {
119
+ // Happens when starting a local container with no providers.
120
+ res.send('80');
121
+ return;
122
+ }
123
+ try {
124
+ const port = await serviceManager_1.serviceManager.ensureServicePort(req.kapeta.systemId, req.kapeta.instanceId, req.params.type);
125
+ res.send('' + port);
126
+ }
127
+ catch (err) {
128
+ console.warn('Failed to resolve service port: ' + req.params.type, err);
129
+ res.status(400).send({ error: err.message });
130
+ }
131
+ });
132
+ /**
133
+ * Used by services to get info for consumed operator resource.
134
+ *
135
+ * If the operator resource is not already available this will cause it to start an instance and
136
+ * assign port numbers to it etc.
137
+ */
138
+ router.get('/consumes/resource/:resourceType/:portType/:name', async (req, res) => {
139
+ 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, req.query.ensure !== 'false');
140
+ res.send(operatorInfo);
141
+ });
142
+ /**
143
+ * Used by services to get address for their clients.
144
+ *
145
+ * If the remote service is not already registered with a port - we do that here
146
+ * to handle clients for services that hasn't started yet.
147
+ */
148
+ router.get('/consumes/:resourceName/:type', (req, res) => {
149
+ res.send(serviceManager_1.serviceManager.getConsumerAddress(req.kapeta.systemId, req.kapeta.instanceId, req.params.resourceName, req.params.type, req.kapeta.environment));
150
+ });
151
+ /**
152
+ * Used by services to information about a block operator
153
+ *
154
+ * If the remote service is not already running it will be started
155
+ */
156
+ router.get('/operator/:instanceId', async (req, res) => {
157
+ const operatorInfo = await instanceManager_1.instanceManager.getInstanceOperator(req.kapeta.systemId, req.params.instanceId, req.kapeta.environment, req.query.ensure !== 'false');
158
+ res.send(operatorInfo);
159
+ });
160
+ exports.default = router;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+ export declare const SYSTEM_ID = "$plan";
6
+ type AnyMap = {
7
+ [key: string]: any;
8
+ };
9
+ interface MatchedIdentity {
10
+ systemId: string;
11
+ instanceId: string;
12
+ }
13
+ declare class ConfigManager {
14
+ private _config;
15
+ constructor();
16
+ _forSystem(systemId: string): any;
17
+ setConfigForSystem(systemId: string, config: AnyMap): void;
18
+ getConfigForSystem(systemId: string): AnyMap;
19
+ getConfigForBlockInstance(systemId: string, instanceId: string): Promise<import("./types").AnyMap>;
20
+ setConfigForSection(systemId: string, sectionId: string, config: AnyMap): void;
21
+ getConfigForSection(systemId: string, sectionId: string): any;
22
+ /**
23
+ * Try to identify the plan and instance in a plan automatically based on the block reference
24
+ *
25
+ * It will:
26
+ * 1. Go through all plans available in the assets
27
+ * 2. Look through each plan and see if the plan is referencing the block
28
+ * 3. If only 1 plan references the block - assume that as the system id
29
+ * 4. If only 1 instance in 1 plan references the block - assume that as instance id
30
+ *
31
+ * In case multiple uses of the same block reference we will prompt to user to choose which instance they want to
32
+ * use.
33
+ *
34
+ * @param blockRef block reference
35
+ * @param [systemId] plan reference
36
+ * @returns {Promise<{systemId:string,instanceId:string}>}
37
+ */
38
+ resolveIdentity(blockRef: string, systemId?: string): Promise<MatchedIdentity>;
39
+ verifyIdentity(blockRef: string, systemId: string, instanceId: string): Promise<void>;
40
+ }
41
+ export declare const configManager: ConfigManager;
42
+ export {};
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright 2023 Kapeta Inc.
4
+ * SPDX-License-Identifier: BUSL-1.1
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.configManager = exports.SYSTEM_ID = void 0;
8
+ const storageService_1 = require("./storageService");
9
+ const assetManager_1 = require("./assetManager");
10
+ const nodejs_utils_1 = require("@kapeta/nodejs-utils");
11
+ const utils_1 = require("./utils/utils");
12
+ exports.SYSTEM_ID = '$plan';
13
+ class ConfigManager {
14
+ _config;
15
+ constructor() {
16
+ this._config = storageService_1.storageService.section('config');
17
+ }
18
+ _forSystem(systemId) {
19
+ systemId = (0, nodejs_utils_1.normalizeKapetaUri)(systemId);
20
+ if (!this._config[systemId]) {
21
+ this._config[systemId] = {};
22
+ }
23
+ return this._config[systemId];
24
+ }
25
+ setConfigForSystem(systemId, config) {
26
+ systemId = (0, nodejs_utils_1.normalizeKapetaUri)(systemId);
27
+ const systemConfig = config || {};
28
+ storageService_1.storageService.put('config', systemId, systemConfig);
29
+ }
30
+ getConfigForSystem(systemId) {
31
+ systemId = (0, nodejs_utils_1.normalizeKapetaUri)(systemId);
32
+ return this._forSystem(systemId);
33
+ }
34
+ async getConfigForBlockInstance(systemId, instanceId) {
35
+ const blockInstance = await assetManager_1.assetManager.getBlockInstance(systemId, instanceId);
36
+ const blockAsset = await assetManager_1.assetManager.getAsset(blockInstance.block.ref, true);
37
+ if (!blockAsset) {
38
+ throw new Error(`Block definition not found: ${blockInstance.block.ref}`);
39
+ }
40
+ const instanceConfig = this.getConfigForSection(systemId, instanceId);
41
+ return (0, utils_1.getResolvedConfiguration)(blockAsset.data.spec.configuration, instanceConfig, blockInstance.defaultConfiguration);
42
+ }
43
+ setConfigForSection(systemId, sectionId, config) {
44
+ systemId = (0, nodejs_utils_1.normalizeKapetaUri)(systemId);
45
+ let systemConfig = this._forSystem(systemId);
46
+ systemConfig[sectionId] = config || {};
47
+ storageService_1.storageService.put('config', systemId, systemConfig);
48
+ }
49
+ getConfigForSection(systemId, sectionId) {
50
+ systemId = (0, nodejs_utils_1.normalizeKapetaUri)(systemId);
51
+ const systemConfig = this._forSystem(systemId);
52
+ if (!systemConfig[sectionId]) {
53
+ systemConfig[sectionId] = {};
54
+ }
55
+ return systemConfig[sectionId];
56
+ }
57
+ /**
58
+ * Try to identify the plan and instance in a plan automatically based on the block reference
59
+ *
60
+ * It will:
61
+ * 1. Go through all plans available in the assets
62
+ * 2. Look through each plan and see if the plan is referencing the block
63
+ * 3. If only 1 plan references the block - assume that as the system id
64
+ * 4. If only 1 instance in 1 plan references the block - assume that as instance id
65
+ *
66
+ * In case multiple uses of the same block reference we will prompt to user to choose which instance they want to
67
+ * use.
68
+ *
69
+ * @param blockRef block reference
70
+ * @param [systemId] plan reference
71
+ * @returns {Promise<{systemId:string,instanceId:string}>}
72
+ */
73
+ async resolveIdentity(blockRef, systemId) {
74
+ blockRef = (0, nodejs_utils_1.normalizeKapetaUri)(blockRef);
75
+ if (systemId) {
76
+ systemId = (0, nodejs_utils_1.normalizeKapetaUri)(systemId);
77
+ }
78
+ const planAssets = await assetManager_1.assetManager.getPlans();
79
+ const blockUri = (0, nodejs_utils_1.parseKapetaUri)(blockRef);
80
+ let matchingIdentities = [];
81
+ planAssets.forEach((planAsset) => {
82
+ if (systemId && planAsset.ref !== systemId) {
83
+ //Skip plans that do not match systemid if provided
84
+ return;
85
+ }
86
+ if (!planAsset.data.spec.blocks) {
87
+ return;
88
+ }
89
+ planAsset.data.spec.blocks.forEach((blockInstance) => {
90
+ const refUri = (0, nodejs_utils_1.parseKapetaUri)(blockInstance.block.ref);
91
+ if (refUri.equals(blockUri)) {
92
+ matchingIdentities.push({
93
+ systemId: (0, nodejs_utils_1.normalizeKapetaUri)(planAsset.ref),
94
+ instanceId: blockInstance.id,
95
+ });
96
+ }
97
+ });
98
+ });
99
+ if (matchingIdentities.length === 0) {
100
+ if (systemId) {
101
+ throw new Error(`No uses of block "${blockRef}" was found in plan: "${systemId}"`);
102
+ }
103
+ throw new Error(`No uses of block "${blockRef}" was found in any known plan`);
104
+ }
105
+ if (matchingIdentities.length > 1) {
106
+ if (systemId) {
107
+ throw new Error(`Multiple uses of block "${blockRef}" was found in plan: "${systemId}". Please specify which instance in the plan you wish to run.`);
108
+ }
109
+ 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.`);
110
+ }
111
+ return matchingIdentities[0];
112
+ }
113
+ async verifyIdentity(blockRef, systemId, instanceId) {
114
+ blockRef = (0, nodejs_utils_1.normalizeKapetaUri)(blockRef);
115
+ systemId = (0, nodejs_utils_1.normalizeKapetaUri)(systemId);
116
+ const planAssets = await assetManager_1.assetManager.getPlans();
117
+ const systemUri = systemId ? (0, nodejs_utils_1.parseKapetaUri)(systemId) : null;
118
+ const blockUri = (0, nodejs_utils_1.parseKapetaUri)(blockRef);
119
+ let found = false;
120
+ planAssets.forEach((planAsset) => {
121
+ if (systemUri && !(0, nodejs_utils_1.parseKapetaUri)(planAsset.ref).equals(systemUri)) {
122
+ //Skip plans that do not match systemid if provided
123
+ return;
124
+ }
125
+ planAsset.data.spec.blocks.forEach((blockInstance) => {
126
+ if (blockInstance.id === instanceId && (0, nodejs_utils_1.parseKapetaUri)(blockInstance.block.ref).equals(blockUri)) {
127
+ found = true;
128
+ }
129
+ });
130
+ });
131
+ if (!found) {
132
+ throw new Error(`Block "${blockRef}" was not found in plan: "${systemId}" using instance id ${instanceId}. Please verify that the provided information is accurate.`);
133
+ }
134
+ }
135
+ }
136
+ exports.configManager = new ConfigManager();
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+ /// <reference types="node" />
6
+ import FSExtra from 'fs-extra';
7
+ import Docker from 'dockerode';
8
+ import { InstanceInfo, LogEntry } from './types';
9
+ import { Task } from './taskManager';
10
+ import { LocalInstanceHealth } from '@kapeta/schemas';
11
+ type StringMap = {
12
+ [key: string]: string;
13
+ };
14
+ export type PortMap = {
15
+ [key: string]: {
16
+ containerPort: string;
17
+ protocol: string;
18
+ hostPort: string;
19
+ };
20
+ };
21
+ export interface DockerMounts {
22
+ Target: string;
23
+ Source: string;
24
+ Type: string;
25
+ ReadOnly: boolean;
26
+ Consistency: string;
27
+ Labels?: StringMap;
28
+ }
29
+ export type DockerContainerStatus = 'created' | 'running' | 'paused' | 'restarting' | 'removing' | 'exited' | 'dead';
30
+ export type DockerContainerHealth = 'starting' | 'healthy' | 'unhealthy' | 'none';
31
+ export declare const CONTAINER_LABEL_PORT_PREFIX = "kapeta_port-";
32
+ export declare const COMPOSE_LABEL_PROJECT = "com.docker.compose.project";
33
+ export declare const COMPOSE_LABEL_SERVICE = "com.docker.compose.service";
34
+ export declare const HEALTH_CHECK_TIMEOUT: number;
35
+ declare class ContainerManager {
36
+ private _docker;
37
+ private _alive;
38
+ private _mountDir;
39
+ private _version;
40
+ private _lastDockerAccessCheck;
41
+ private logStreams;
42
+ private _latestImagePulls;
43
+ constructor();
44
+ initialize(): Promise<void>;
45
+ checkAlive(): Promise<boolean>;
46
+ isAlive(): boolean;
47
+ getMountPoint(systemId: string, ref: string, mountName: string): string;
48
+ createMounts(systemId: string, kind: string, mountOpts: StringMap | null | undefined): Promise<StringMap>;
49
+ createVolumes(systemId: string, serviceId: string, mountOpts: StringMap | null | undefined): Promise<DockerMounts[]>;
50
+ ping(): Promise<void>;
51
+ docker(): Docker;
52
+ getContainerByName(containerName: string): Promise<ContainerInfo | undefined>;
53
+ pull(image: string): Promise<boolean>;
54
+ toDockerMounts(mounts: StringMap): DockerMounts[];
55
+ toDockerHealth(health: LocalInstanceHealth): {
56
+ Test: string[];
57
+ Interval: number;
58
+ Timeout: number;
59
+ Retries: any;
60
+ };
61
+ private applyHash;
62
+ ensureContainer(opts: any): Promise<Docker.Container>;
63
+ private createOrUpdateContainer;
64
+ private startContainer;
65
+ waitForReady(container: Docker.Container, attempt?: number): Promise<void>;
66
+ _isReady(container: Docker.Container): Promise<boolean>;
67
+ remove(container: Docker.Container, opts?: {
68
+ force?: boolean;
69
+ }): Promise<void>;
70
+ /**
71
+ *
72
+ * @param name
73
+ * @return {Promise<ContainerInfo>}
74
+ */
75
+ get(name: string): Promise<ContainerInfo | undefined>;
76
+ getLogs(instance: InstanceInfo): Promise<LogEntry[]>;
77
+ stopLogListening(systemId: string, instanceId: string): Promise<void>;
78
+ ensureLogListening(systemId: string, instanceId: string, handler: (log: LogEntry) => void): Promise<void>;
79
+ buildDockerImage(dockerFile: string, imageName: string): Task<void>;
80
+ }
81
+ declare class ClosableLogStream {
82
+ private readonly stream;
83
+ private readonly eventEmitter;
84
+ constructor(stream: FSExtra.ReadStream);
85
+ onLog(listener: (log: LogEntry) => void): () => void;
86
+ onEnd(listener: () => void): () => void;
87
+ onError(listener: (error: Error) => void): () => void;
88
+ close(): Promise<void>;
89
+ }
90
+ export declare class ContainerInfo {
91
+ private readonly _container;
92
+ /**
93
+ *
94
+ * @param {Docker.Container} dockerContainer
95
+ */
96
+ constructor(dockerContainer: Docker.Container);
97
+ get native(): Docker.Container;
98
+ isRunning(): Promise<boolean>;
99
+ start(): Promise<void>;
100
+ restart(): Promise<void>;
101
+ stop(): Promise<void>;
102
+ remove(opts?: {
103
+ force?: boolean;
104
+ }): Promise<void>;
105
+ getPort(type: string): Promise<{
106
+ containerPort: string;
107
+ protocol: string;
108
+ hostPort: string;
109
+ } | null>;
110
+ inspect(): Promise<Docker.ContainerInspectInfo | undefined>;
111
+ status(): Promise<{
112
+ Status: string;
113
+ Running: boolean;
114
+ Paused: boolean;
115
+ Restarting: boolean;
116
+ OOMKilled: boolean;
117
+ Dead: boolean;
118
+ Pid: number;
119
+ ExitCode: number;
120
+ Error: string;
121
+ StartedAt: string;
122
+ FinishedAt: string;
123
+ Health?: {
124
+ Status: string;
125
+ FailingStreak: number;
126
+ Log: {
127
+ Start: string;
128
+ End: string;
129
+ ExitCode: number;
130
+ Output: string;
131
+ }[];
132
+ } | undefined;
133
+ } | undefined>;
134
+ getPorts(): Promise<PortMap | false>;
135
+ getLogStream(): Promise<ClosableLogStream>;
136
+ getLogs(): Promise<LogEntry[]>;
137
+ }
138
+ export declare function getExtraHosts(dockerVersion: string): string[] | undefined;
139
+ /**
140
+ * Ensure that the volume is in the correct format for the docker daemon on the host
141
+ *
142
+ * Windows: c:\path\to\volume -> /c/path/to/volume
143
+ * Linux: /path/to/volume -> /path/to/volume
144
+ * Mac: /path/to/volume -> /path/to/volume
145
+ */
146
+ export declare function toLocalBindVolume(volume: string): string;
147
+ export declare const containerManager: ContainerManager;
148
+ export {};