@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,201 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+
6
+ import Router from 'express-promise-router';
7
+ import { configManager, SYSTEM_ID } from '../configManager';
8
+ import { HTTP_PORTS, serviceManager } from '../serviceManager';
9
+ import { operatorManager } from '../operatorManager';
10
+ import { instanceManager } from '../instanceManager';
11
+ import { corsHandler } from '../middleware/cors';
12
+ import { kapetaHeaders, KapetaRequest } from '../middleware/kapeta';
13
+ import { stringBody } from '../middleware/stringBody';
14
+ import { AnyMap, KapetaBodyRequest } from '../types';
15
+ import { Response } from 'express';
16
+
17
+ const router = Router();
18
+
19
+ router.use('/', corsHandler);
20
+ router.use('/', kapetaHeaders);
21
+ router.use('/', stringBody);
22
+
23
+ /**
24
+ * Returns the full configuration for a given service.
25
+ */
26
+ router.get('/instance', async (req: KapetaBodyRequest, res: Response) => {
27
+ try {
28
+ let config: AnyMap = {};
29
+ if (req.kapeta!.instanceId) {
30
+ config = await configManager.getConfigForBlockInstance(req.kapeta!.systemId, req.kapeta!.instanceId);
31
+ } else {
32
+ config = configManager.getConfigForSystem(req.kapeta!.systemId);
33
+ }
34
+
35
+ res.send(config);
36
+ } catch (err: any) {
37
+ console.error('Failed to get instance config', err);
38
+ res.status(400).send({ error: err.message });
39
+ return;
40
+ }
41
+ });
42
+
43
+ /**
44
+ * Updates the full configuration for a given service.
45
+ */
46
+ router.put('/instance', async (req: KapetaBodyRequest, res) => {
47
+ try {
48
+ let config = JSON.parse(req.stringBody ?? '{}');
49
+ if (!config) {
50
+ config = {};
51
+ }
52
+
53
+ if (req.kapeta!.instanceId) {
54
+ configManager.setConfigForSection(req.kapeta!.systemId, req.kapeta!.instanceId, config);
55
+ //Restart the instance if it is running after config change
56
+ await instanceManager.prepareForRestart(req.kapeta!.systemId, req.kapeta!.instanceId);
57
+ } else {
58
+ configManager.setConfigForSystem(req.kapeta!.systemId, config);
59
+ }
60
+ } catch (err: any) {
61
+ console.error('Failed to update instance config', err);
62
+ res.status(400).send({ error: err.message });
63
+ return;
64
+ }
65
+
66
+ res.status(202).send({ ok: true });
67
+ });
68
+
69
+ /**
70
+ * Returns the full configuration for a plan
71
+ */
72
+ router.get('/system', (req: KapetaRequest, res) => {
73
+ const config = configManager.getConfigForSection(req.kapeta!.systemId, SYSTEM_ID);
74
+
75
+ res.send(config);
76
+ });
77
+
78
+ /**
79
+ * Updates the full configuration for a plan
80
+ */
81
+ router.put('/system', (req: KapetaBodyRequest, res) => {
82
+ let config = JSON.parse(req.stringBody ?? '{}');
83
+ if (!config) {
84
+ config = {};
85
+ }
86
+ configManager.setConfigForSection(req.kapeta!.systemId, SYSTEM_ID, config);
87
+ res.status(202).send({ ok: true });
88
+ });
89
+
90
+ /**
91
+ * Resolves and checks the identity of a block instance
92
+ */
93
+ router.get('/identity', async (req: KapetaRequest, res) => {
94
+ const identity = {
95
+ systemId: req.kapeta!.systemId,
96
+ instanceId: req.kapeta!.instanceId,
97
+ };
98
+
99
+ if (!req.kapeta!.blockRef) {
100
+ res.status(400).send({ error: 'Missing required header "X-Kapeta-Block"' });
101
+ return;
102
+ }
103
+
104
+ try {
105
+ if (!identity.systemId || !identity.instanceId) {
106
+ const { systemId, instanceId } = await configManager.resolveIdentity(
107
+ req.kapeta!.blockRef,
108
+ identity.systemId
109
+ );
110
+ identity.systemId = systemId;
111
+ identity.instanceId = instanceId;
112
+ } else {
113
+ await configManager.verifyIdentity(req.kapeta!.blockRef, identity.systemId, identity.instanceId);
114
+ }
115
+
116
+ res.send(identity);
117
+ } catch (err: any) {
118
+ console.warn('Failed to resolve identity', err);
119
+ res.status(400).send({ error: err.message });
120
+ }
121
+ });
122
+
123
+ /**
124
+ * Services call this to request a free port. If a service has
125
+ * already called the endpoint the same port is returned.
126
+ */
127
+ router.get('/provides/:type', async (req: KapetaRequest, res) => {
128
+ if (req.kapeta!.environment === 'docker' && HTTP_PORTS.includes(req.params.type)) {
129
+ // Happens when starting a local container with no providers.
130
+ res.send('80');
131
+ return;
132
+ }
133
+
134
+ try {
135
+ const port = await serviceManager.ensureServicePort(
136
+ req.kapeta!.systemId,
137
+ req.kapeta!.instanceId,
138
+ req.params.type
139
+ );
140
+ res.send('' + port);
141
+ } catch (err: any) {
142
+ console.warn('Failed to resolve service port: ' + req.params.type, err);
143
+ res.status(400).send({ error: err.message });
144
+ }
145
+ });
146
+
147
+ /**
148
+ * Used by services to get info for consumed operator resource.
149
+ *
150
+ * If the operator resource is not already available this will cause it to start an instance and
151
+ * assign port numbers to it etc.
152
+ */
153
+ router.get('/consumes/resource/:resourceType/:portType/:name', async (req: KapetaRequest, res) => {
154
+ const operatorInfo = await operatorManager.getConsumerResourceInfo(
155
+ req.kapeta!.systemId,
156
+ req.kapeta!.instanceId,
157
+ req.params.resourceType,
158
+ req.params.portType,
159
+ req.params.name,
160
+ req.kapeta!.environment,
161
+ req.query.ensure !== 'false'
162
+ );
163
+
164
+ res.send(operatorInfo);
165
+ });
166
+
167
+ /**
168
+ * Used by services to get address for their clients.
169
+ *
170
+ * If the remote service is not already registered with a port - we do that here
171
+ * to handle clients for services that hasn't started yet.
172
+ */
173
+ router.get('/consumes/:resourceName/:type', (req: KapetaRequest, res) => {
174
+ res.send(
175
+ serviceManager.getConsumerAddress(
176
+ req.kapeta!.systemId,
177
+ req.kapeta!.instanceId,
178
+ req.params.resourceName,
179
+ req.params.type,
180
+ req.kapeta!.environment
181
+ )
182
+ );
183
+ });
184
+
185
+ /**
186
+ * Used by services to information about a block operator
187
+ *
188
+ * If the remote service is not already running it will be started
189
+ */
190
+ router.get('/operator/:instanceId', async (req: KapetaRequest, res) => {
191
+ const operatorInfo = await instanceManager.getInstanceOperator(
192
+ req.kapeta!.systemId,
193
+ req.params.instanceId,
194
+ req.kapeta!.environment,
195
+ req.query.ensure !== 'false'
196
+ );
197
+
198
+ res.send(operatorInfo);
199
+ });
200
+
201
+ export default router;
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+
6
+ import { EnrichedAsset } from './assetManager';
7
+ import { BlockInstance } from '@kapeta/schemas';
8
+ import { storageService } from './storageService';
9
+ import { assetManager } from './assetManager';
10
+ import { normalizeKapetaUri, parseKapetaUri } from '@kapeta/nodejs-utils';
11
+ import { getResolvedConfiguration } from './utils/utils';
12
+
13
+ export const SYSTEM_ID = '$plan';
14
+ type AnyMap = { [key: string]: any };
15
+
16
+ interface MatchedIdentity {
17
+ systemId: string;
18
+ instanceId: string;
19
+ }
20
+
21
+ class ConfigManager {
22
+ private _config: AnyMap;
23
+
24
+ constructor() {
25
+ this._config = storageService.section('config');
26
+ }
27
+
28
+ _forSystem(systemId: string) {
29
+ systemId = normalizeKapetaUri(systemId);
30
+ if (!this._config[systemId]) {
31
+ this._config[systemId] = {};
32
+ }
33
+
34
+ return this._config[systemId];
35
+ }
36
+
37
+ setConfigForSystem(systemId: string, config: AnyMap) {
38
+ systemId = normalizeKapetaUri(systemId);
39
+ const systemConfig = config || {};
40
+
41
+ storageService.put('config', systemId, systemConfig);
42
+ }
43
+
44
+ getConfigForSystem(systemId: string): AnyMap {
45
+ systemId = normalizeKapetaUri(systemId);
46
+ return this._forSystem(systemId);
47
+ }
48
+
49
+ async getConfigForBlockInstance(systemId: string, instanceId: string) {
50
+ const blockInstance = await assetManager.getBlockInstance(systemId, instanceId);
51
+ const blockAsset = await assetManager.getAsset(blockInstance.block.ref, true);
52
+ if (!blockAsset) {
53
+ throw new Error(`Block definition not found: ${blockInstance.block.ref}`);
54
+ }
55
+ const instanceConfig = this.getConfigForSection(systemId, instanceId);
56
+ return getResolvedConfiguration(
57
+ blockAsset.data.spec.configuration,
58
+ instanceConfig,
59
+ blockInstance.defaultConfiguration
60
+ );
61
+ }
62
+
63
+ setConfigForSection(systemId: string, sectionId: string, config: AnyMap) {
64
+ systemId = normalizeKapetaUri(systemId);
65
+ let systemConfig = this._forSystem(systemId);
66
+ systemConfig[sectionId] = config || {};
67
+
68
+ storageService.put('config', systemId, systemConfig);
69
+ }
70
+
71
+ getConfigForSection(systemId: string, sectionId: string) {
72
+ systemId = normalizeKapetaUri(systemId);
73
+ const systemConfig = this._forSystem(systemId);
74
+
75
+ if (!systemConfig[sectionId]) {
76
+ systemConfig[sectionId] = {};
77
+ }
78
+
79
+ return systemConfig[sectionId];
80
+ }
81
+
82
+ /**
83
+ * Try to identify the plan and instance in a plan automatically based on the block reference
84
+ *
85
+ * It will:
86
+ * 1. Go through all plans available in the assets
87
+ * 2. Look through each plan and see if the plan is referencing the block
88
+ * 3. If only 1 plan references the block - assume that as the system id
89
+ * 4. If only 1 instance in 1 plan references the block - assume that as instance id
90
+ *
91
+ * In case multiple uses of the same block reference we will prompt to user to choose which instance they want to
92
+ * use.
93
+ *
94
+ * @param blockRef block reference
95
+ * @param [systemId] plan reference
96
+ * @returns {Promise<{systemId:string,instanceId:string}>}
97
+ */
98
+ async resolveIdentity(blockRef: string, systemId?: string) {
99
+ blockRef = normalizeKapetaUri(blockRef);
100
+ if (systemId) {
101
+ systemId = normalizeKapetaUri(systemId);
102
+ }
103
+ const planAssets = await assetManager.getPlans();
104
+
105
+ const blockUri = parseKapetaUri(blockRef);
106
+
107
+ let matchingIdentities: MatchedIdentity[] = [];
108
+ planAssets.forEach((planAsset: EnrichedAsset) => {
109
+ if (systemId && planAsset.ref !== systemId) {
110
+ //Skip plans that do not match systemid if provided
111
+ return;
112
+ }
113
+
114
+ if (!planAsset.data.spec.blocks) {
115
+ return;
116
+ }
117
+
118
+ planAsset.data.spec.blocks.forEach((blockInstance: BlockInstance) => {
119
+ const refUri = parseKapetaUri(blockInstance.block.ref);
120
+ if (refUri.equals(blockUri)) {
121
+ matchingIdentities.push({
122
+ systemId: normalizeKapetaUri(planAsset.ref),
123
+ instanceId: blockInstance.id,
124
+ });
125
+ }
126
+ });
127
+ });
128
+
129
+ if (matchingIdentities.length === 0) {
130
+ if (systemId) {
131
+ throw new Error(`No uses of block "${blockRef}" was found in plan: "${systemId}"`);
132
+ }
133
+
134
+ throw new Error(`No uses of block "${blockRef}" was found in any known plan`);
135
+ }
136
+
137
+ if (matchingIdentities.length > 1) {
138
+ if (systemId) {
139
+ throw new Error(
140
+ `Multiple uses of block "${blockRef}" was found in plan: "${systemId}". Please specify which instance in the plan you wish to run.`
141
+ );
142
+ }
143
+
144
+ throw new Error(
145
+ `Multiple uses of block "${blockRef}" was found in 1 or more plan. Please specify which instance in which plan you wish to run.`
146
+ );
147
+ }
148
+
149
+ return matchingIdentities[0];
150
+ }
151
+
152
+ async verifyIdentity(blockRef: string, systemId: string, instanceId: string) {
153
+ blockRef = normalizeKapetaUri(blockRef);
154
+ systemId = normalizeKapetaUri(systemId);
155
+ const planAssets = await assetManager.getPlans();
156
+ const systemUri = systemId ? parseKapetaUri(systemId) : null;
157
+ const blockUri = parseKapetaUri(blockRef);
158
+ let found = false;
159
+ planAssets.forEach((planAsset: EnrichedAsset) => {
160
+ if (systemUri && !parseKapetaUri(planAsset.ref).equals(systemUri)) {
161
+ //Skip plans that do not match systemid if provided
162
+ return;
163
+ }
164
+
165
+ planAsset.data.spec.blocks.forEach((blockInstance: BlockInstance) => {
166
+ if (blockInstance.id === instanceId && parseKapetaUri(blockInstance.block.ref).equals(blockUri)) {
167
+ found = true;
168
+ }
169
+ });
170
+ });
171
+
172
+ if (!found) {
173
+ throw new Error(
174
+ `Block "${blockRef}" was not found in plan: "${systemId}" using instance id ${instanceId}. Please verify that the provided information is accurate.`
175
+ );
176
+ }
177
+ }
178
+ }
179
+
180
+ export const configManager = new ConfigManager();