@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.
- package/.eslintrc.cjs +25 -0
- package/.github/workflows/check-license.yml +17 -0
- package/.github/workflows/main.yml +26 -0
- package/.prettierignore +4 -0
- package/.vscode/launch.json +19 -0
- package/CHANGELOG.md +920 -0
- package/LICENSE +38 -0
- package/README.md +36 -0
- package/definitions.d.ts +35 -0
- package/dist/cjs/index.d.ts +34 -0
- package/dist/cjs/index.js +263 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/src/RepositoryWatcher.d.ts +30 -0
- package/dist/cjs/src/RepositoryWatcher.js +332 -0
- package/dist/cjs/src/ai/aiClient.d.ts +20 -0
- package/dist/cjs/src/ai/aiClient.js +74 -0
- package/dist/cjs/src/ai/routes.d.ts +7 -0
- package/dist/cjs/src/ai/routes.js +37 -0
- package/dist/cjs/src/ai/transform.d.ts +11 -0
- package/dist/cjs/src/ai/transform.js +239 -0
- package/dist/cjs/src/ai/types.d.ts +40 -0
- package/dist/cjs/src/ai/types.js +2 -0
- package/dist/cjs/src/api.d.ts +7 -0
- package/dist/cjs/src/api.js +29 -0
- package/dist/cjs/src/assetManager.d.ts +41 -0
- package/dist/cjs/src/assetManager.js +274 -0
- package/dist/cjs/src/assets/routes.d.ts +7 -0
- package/dist/cjs/src/assets/routes.js +165 -0
- package/dist/cjs/src/attachments/routes.d.ts +7 -0
- package/dist/cjs/src/attachments/routes.js +72 -0
- package/dist/cjs/src/authManager.d.ts +16 -0
- package/dist/cjs/src/authManager.js +64 -0
- package/dist/cjs/src/cacheManager.d.ts +20 -0
- package/dist/cjs/src/cacheManager.js +51 -0
- package/dist/cjs/src/clusterService.d.ts +44 -0
- package/dist/cjs/src/clusterService.js +120 -0
- package/dist/cjs/src/codeGeneratorManager.d.ts +14 -0
- package/dist/cjs/src/codeGeneratorManager.js +93 -0
- package/dist/cjs/src/config/routes.d.ts +7 -0
- package/dist/cjs/src/config/routes.js +160 -0
- package/dist/cjs/src/configManager.d.ts +42 -0
- package/dist/cjs/src/configManager.js +136 -0
- package/dist/cjs/src/containerManager.d.ts +148 -0
- package/dist/cjs/src/containerManager.js +958 -0
- package/dist/cjs/src/definitionsManager.d.ts +20 -0
- package/dist/cjs/src/definitionsManager.js +171 -0
- package/dist/cjs/src/filesystem/routes.d.ts +7 -0
- package/dist/cjs/src/filesystem/routes.js +105 -0
- package/dist/cjs/src/filesystemManager.d.ts +27 -0
- package/dist/cjs/src/filesystemManager.js +118 -0
- package/dist/cjs/src/identities/routes.d.ts +7 -0
- package/dist/cjs/src/identities/routes.js +37 -0
- package/dist/cjs/src/instanceManager.d.ts +69 -0
- package/dist/cjs/src/instanceManager.js +910 -0
- package/dist/cjs/src/instances/routes.d.ts +7 -0
- package/dist/cjs/src/instances/routes.js +179 -0
- package/dist/cjs/src/middleware/cors.d.ts +6 -0
- package/dist/cjs/src/middleware/cors.js +14 -0
- package/dist/cjs/src/middleware/kapeta.d.ts +15 -0
- package/dist/cjs/src/middleware/kapeta.js +28 -0
- package/dist/cjs/src/middleware/stringBody.d.ts +9 -0
- package/dist/cjs/src/middleware/stringBody.js +18 -0
- package/dist/cjs/src/networkManager.d.ts +37 -0
- package/dist/cjs/src/networkManager.js +119 -0
- package/dist/cjs/src/operatorManager.d.ts +41 -0
- package/dist/cjs/src/operatorManager.js +211 -0
- package/dist/cjs/src/progressListener.d.ts +31 -0
- package/dist/cjs/src/progressListener.js +133 -0
- package/dist/cjs/src/providerManager.d.ts +11 -0
- package/dist/cjs/src/providerManager.js +84 -0
- package/dist/cjs/src/providers/routes.d.ts +7 -0
- package/dist/cjs/src/providers/routes.js +46 -0
- package/dist/cjs/src/proxy/routes.d.ts +7 -0
- package/dist/cjs/src/proxy/routes.js +115 -0
- package/dist/cjs/src/proxy/types/rest.d.ts +10 -0
- package/dist/cjs/src/proxy/types/rest.js +123 -0
- package/dist/cjs/src/proxy/types/web.d.ts +8 -0
- package/dist/cjs/src/proxy/types/web.js +61 -0
- package/dist/cjs/src/repositoryManager.d.ts +35 -0
- package/dist/cjs/src/repositoryManager.js +247 -0
- package/dist/cjs/src/serviceManager.d.ts +36 -0
- package/dist/cjs/src/serviceManager.js +106 -0
- package/dist/cjs/src/socketManager.d.ts +32 -0
- package/dist/cjs/src/socketManager.js +125 -0
- package/dist/cjs/src/storageService.d.ts +21 -0
- package/dist/cjs/src/storageService.js +81 -0
- package/dist/cjs/src/taskManager.d.ts +70 -0
- package/dist/cjs/src/taskManager.js +181 -0
- package/dist/cjs/src/tasks/routes.d.ts +7 -0
- package/dist/cjs/src/tasks/routes.js +39 -0
- package/dist/cjs/src/traffic/routes.d.ts +7 -0
- package/dist/cjs/src/traffic/routes.js +22 -0
- package/dist/cjs/src/types.d.ts +99 -0
- package/dist/cjs/src/types.js +39 -0
- package/dist/cjs/src/utils/BlockInstanceRunner.d.ts +28 -0
- package/dist/cjs/src/utils/BlockInstanceRunner.js +432 -0
- package/dist/cjs/src/utils/DefaultProviderInstaller.d.ts +15 -0
- package/dist/cjs/src/utils/DefaultProviderInstaller.js +136 -0
- package/dist/cjs/src/utils/InternalConfigProvider.d.ts +38 -0
- package/dist/cjs/src/utils/InternalConfigProvider.js +146 -0
- package/dist/cjs/src/utils/LogData.d.ts +23 -0
- package/dist/cjs/src/utils/LogData.js +46 -0
- package/dist/cjs/src/utils/commandLineUtils.d.ts +8 -0
- package/dist/cjs/src/utils/commandLineUtils.js +39 -0
- package/dist/cjs/src/utils/pathTemplateParser.d.ts +30 -0
- package/dist/cjs/src/utils/pathTemplateParser.js +135 -0
- package/dist/cjs/src/utils/utils.d.ts +40 -0
- package/dist/cjs/src/utils/utils.js +148 -0
- package/dist/cjs/start.d.ts +5 -0
- package/dist/cjs/start.js +17 -0
- package/dist/cjs/test/proxy/types/rest.test.d.ts +5 -0
- package/dist/cjs/test/proxy/types/rest.test.js +48 -0
- package/dist/cjs/test/utils/pathTemplateParser.test.d.ts +5 -0
- package/dist/cjs/test/utils/pathTemplateParser.test.js +27 -0
- package/dist/esm/index.d.ts +34 -0
- package/dist/esm/index.js +263 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/src/RepositoryWatcher.d.ts +30 -0
- package/dist/esm/src/RepositoryWatcher.js +332 -0
- package/dist/esm/src/ai/aiClient.d.ts +20 -0
- package/dist/esm/src/ai/aiClient.js +74 -0
- package/dist/esm/src/ai/routes.d.ts +7 -0
- package/dist/esm/src/ai/routes.js +37 -0
- package/dist/esm/src/ai/transform.d.ts +11 -0
- package/dist/esm/src/ai/transform.js +239 -0
- package/dist/esm/src/ai/types.d.ts +40 -0
- package/dist/esm/src/ai/types.js +2 -0
- package/dist/esm/src/api.d.ts +7 -0
- package/dist/esm/src/api.js +29 -0
- package/dist/esm/src/assetManager.d.ts +41 -0
- package/dist/esm/src/assetManager.js +274 -0
- package/dist/esm/src/assets/routes.d.ts +7 -0
- package/dist/esm/src/assets/routes.js +165 -0
- package/dist/esm/src/attachments/routes.d.ts +7 -0
- package/dist/esm/src/attachments/routes.js +72 -0
- package/dist/esm/src/authManager.d.ts +16 -0
- package/dist/esm/src/authManager.js +64 -0
- package/dist/esm/src/cacheManager.d.ts +20 -0
- package/dist/esm/src/cacheManager.js +51 -0
- package/dist/esm/src/clusterService.d.ts +44 -0
- package/dist/esm/src/clusterService.js +120 -0
- package/dist/esm/src/codeGeneratorManager.d.ts +14 -0
- package/dist/esm/src/codeGeneratorManager.js +93 -0
- package/dist/esm/src/config/routes.d.ts +7 -0
- package/dist/esm/src/config/routes.js +160 -0
- package/dist/esm/src/configManager.d.ts +42 -0
- package/dist/esm/src/configManager.js +136 -0
- package/dist/esm/src/containerManager.d.ts +148 -0
- package/dist/esm/src/containerManager.js +958 -0
- package/dist/esm/src/definitionsManager.d.ts +20 -0
- package/dist/esm/src/definitionsManager.js +171 -0
- package/dist/esm/src/filesystem/routes.d.ts +7 -0
- package/dist/esm/src/filesystem/routes.js +105 -0
- package/dist/esm/src/filesystemManager.d.ts +27 -0
- package/dist/esm/src/filesystemManager.js +118 -0
- package/dist/esm/src/identities/routes.d.ts +7 -0
- package/dist/esm/src/identities/routes.js +37 -0
- package/dist/esm/src/instanceManager.d.ts +69 -0
- package/dist/esm/src/instanceManager.js +910 -0
- package/dist/esm/src/instances/routes.d.ts +7 -0
- package/dist/esm/src/instances/routes.js +179 -0
- package/dist/esm/src/middleware/cors.d.ts +6 -0
- package/dist/esm/src/middleware/cors.js +14 -0
- package/dist/esm/src/middleware/kapeta.d.ts +15 -0
- package/dist/esm/src/middleware/kapeta.js +28 -0
- package/dist/esm/src/middleware/stringBody.d.ts +9 -0
- package/dist/esm/src/middleware/stringBody.js +18 -0
- package/dist/esm/src/networkManager.d.ts +37 -0
- package/dist/esm/src/networkManager.js +119 -0
- package/dist/esm/src/operatorManager.d.ts +41 -0
- package/dist/esm/src/operatorManager.js +211 -0
- package/dist/esm/src/progressListener.d.ts +31 -0
- package/dist/esm/src/progressListener.js +133 -0
- package/dist/esm/src/providerManager.d.ts +11 -0
- package/dist/esm/src/providerManager.js +84 -0
- package/dist/esm/src/providers/routes.d.ts +7 -0
- package/dist/esm/src/providers/routes.js +46 -0
- package/dist/esm/src/proxy/routes.d.ts +7 -0
- package/dist/esm/src/proxy/routes.js +115 -0
- package/dist/esm/src/proxy/types/rest.d.ts +10 -0
- package/dist/esm/src/proxy/types/rest.js +123 -0
- package/dist/esm/src/proxy/types/web.d.ts +8 -0
- package/dist/esm/src/proxy/types/web.js +61 -0
- package/dist/esm/src/repositoryManager.d.ts +35 -0
- package/dist/esm/src/repositoryManager.js +247 -0
- package/dist/esm/src/serviceManager.d.ts +36 -0
- package/dist/esm/src/serviceManager.js +106 -0
- package/dist/esm/src/socketManager.d.ts +32 -0
- package/dist/esm/src/socketManager.js +125 -0
- package/dist/esm/src/storageService.d.ts +21 -0
- package/dist/esm/src/storageService.js +81 -0
- package/dist/esm/src/taskManager.d.ts +70 -0
- package/dist/esm/src/taskManager.js +181 -0
- package/dist/esm/src/tasks/routes.d.ts +7 -0
- package/dist/esm/src/tasks/routes.js +39 -0
- package/dist/esm/src/traffic/routes.d.ts +7 -0
- package/dist/esm/src/traffic/routes.js +22 -0
- package/dist/esm/src/types.d.ts +99 -0
- package/dist/esm/src/types.js +39 -0
- package/dist/esm/src/utils/BlockInstanceRunner.d.ts +28 -0
- package/dist/esm/src/utils/BlockInstanceRunner.js +432 -0
- package/dist/esm/src/utils/DefaultProviderInstaller.d.ts +15 -0
- package/dist/esm/src/utils/DefaultProviderInstaller.js +136 -0
- package/dist/esm/src/utils/InternalConfigProvider.d.ts +38 -0
- package/dist/esm/src/utils/InternalConfigProvider.js +146 -0
- package/dist/esm/src/utils/LogData.d.ts +23 -0
- package/dist/esm/src/utils/LogData.js +46 -0
- package/dist/esm/src/utils/commandLineUtils.d.ts +8 -0
- package/dist/esm/src/utils/commandLineUtils.js +39 -0
- package/dist/esm/src/utils/pathTemplateParser.d.ts +30 -0
- package/dist/esm/src/utils/pathTemplateParser.js +135 -0
- package/dist/esm/src/utils/utils.d.ts +40 -0
- package/dist/esm/src/utils/utils.js +148 -0
- package/dist/esm/start.d.ts +5 -0
- package/dist/esm/start.js +17 -0
- package/dist/esm/test/proxy/types/rest.test.d.ts +5 -0
- package/dist/esm/test/proxy/types/rest.test.js +48 -0
- package/dist/esm/test/utils/pathTemplateParser.test.d.ts +5 -0
- package/dist/esm/test/utils/pathTemplateParser.test.js +27 -0
- package/index.ts +280 -0
- package/jest.config.js +8 -0
- package/package.json +134 -0
- package/src/RepositoryWatcher.ts +363 -0
- package/src/ai/aiClient.ts +93 -0
- package/src/ai/routes.ts +39 -0
- package/src/ai/transform.ts +275 -0
- package/src/ai/types.ts +45 -0
- package/src/api.ts +32 -0
- package/src/assetManager.ts +355 -0
- package/src/assets/routes.ts +183 -0
- package/src/attachments/routes.ts +79 -0
- package/src/authManager.ts +67 -0
- package/src/cacheManager.ts +59 -0
- package/src/clusterService.ts +142 -0
- package/src/codeGeneratorManager.ts +109 -0
- package/src/config/routes.ts +201 -0
- package/src/configManager.ts +180 -0
- package/src/containerManager.ts +1178 -0
- package/src/definitionsManager.ts +212 -0
- package/src/filesystem/routes.ts +123 -0
- package/src/filesystemManager.ts +133 -0
- package/src/identities/routes.ts +38 -0
- package/src/instanceManager.ts +1160 -0
- package/src/instances/routes.ts +203 -0
- package/src/middleware/cors.ts +14 -0
- package/src/middleware/kapeta.ts +41 -0
- package/src/middleware/stringBody.ts +21 -0
- package/src/networkManager.ts +148 -0
- package/src/operatorManager.ts +294 -0
- package/src/progressListener.ts +151 -0
- package/src/providerManager.ts +97 -0
- package/src/providers/routes.ts +51 -0
- package/src/proxy/routes.ts +153 -0
- package/src/proxy/types/rest.ts +172 -0
- package/src/proxy/types/web.ts +70 -0
- package/src/repositoryManager.ts +291 -0
- package/src/serviceManager.ts +133 -0
- package/src/socketManager.ts +138 -0
- package/src/storageService.ts +97 -0
- package/src/taskManager.ts +247 -0
- package/src/tasks/routes.ts +43 -0
- package/src/traffic/routes.ts +23 -0
- package/src/types.ts +112 -0
- package/src/utils/BlockInstanceRunner.ts +577 -0
- package/src/utils/DefaultProviderInstaller.ts +150 -0
- package/src/utils/InternalConfigProvider.ts +214 -0
- package/src/utils/LogData.ts +50 -0
- package/src/utils/commandLineUtils.ts +45 -0
- package/src/utils/pathTemplateParser.ts +157 -0
- package/src/utils/utils.ts +155 -0
- package/start.ts +14 -0
- package/test/proxy/types/rest.test.ts +54 -0
- package/test/utils/pathTemplateParser.test.ts +29 -0
- package/tsconfig.json +15 -0
@@ -0,0 +1,203 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright 2023 Kapeta Inc.
|
3
|
+
* SPDX-License-Identifier: BUSL-1.1
|
4
|
+
*/
|
5
|
+
|
6
|
+
import Router from 'express-promise-router';
|
7
|
+
import { instanceManager } from '../instanceManager';
|
8
|
+
import { serviceManager } from '../serviceManager';
|
9
|
+
import { corsHandler } from '../middleware/cors';
|
10
|
+
import { NextFunction, Request, Response } from 'express';
|
11
|
+
import { kapetaHeaders, KapetaRequest } from '../middleware/kapeta';
|
12
|
+
import { stringBody } from '../middleware/stringBody';
|
13
|
+
import { DesiredInstanceStatus, InstanceInfo, InstanceOwner, InstanceType, KapetaBodyRequest } from '../types';
|
14
|
+
import { Task } from '../taskManager';
|
15
|
+
|
16
|
+
const router = Router();
|
17
|
+
router.use('/', corsHandler);
|
18
|
+
router.use('/', kapetaHeaders);
|
19
|
+
/**
|
20
|
+
* Get all instances
|
21
|
+
*/
|
22
|
+
router.get('/', (req: Request, res: Response) => {
|
23
|
+
res.send(instanceManager.getInstances());
|
24
|
+
});
|
25
|
+
|
26
|
+
/**
|
27
|
+
* Get all instances
|
28
|
+
*/
|
29
|
+
router.get('/:systemId/instances', async (req: Request, res: Response) => {
|
30
|
+
res.send(await instanceManager.getInstancesForPlan(req.params.systemId));
|
31
|
+
});
|
32
|
+
|
33
|
+
/**
|
34
|
+
* Get single instance in a plan
|
35
|
+
*/
|
36
|
+
router.get('/:systemId/instances/:instanceId', (req: Request, res: Response) => {
|
37
|
+
res.send(instanceManager.getInstance(req.params.systemId, req.params.instanceId));
|
38
|
+
});
|
39
|
+
|
40
|
+
/**
|
41
|
+
* Start all instances in a plan
|
42
|
+
*/
|
43
|
+
router.post('/:systemId/start', async (req: Request, res: Response) => {
|
44
|
+
try {
|
45
|
+
const task = await instanceManager.startAllForPlan(req.params.systemId);
|
46
|
+
|
47
|
+
res.status(202).send({
|
48
|
+
ok: true,
|
49
|
+
taskId: task.id,
|
50
|
+
});
|
51
|
+
} catch (e: any) {
|
52
|
+
res.status(500).send({ ok: false, error: e.message });
|
53
|
+
}
|
54
|
+
});
|
55
|
+
|
56
|
+
/**
|
57
|
+
* Stop all instances in plan
|
58
|
+
*/
|
59
|
+
router.post('/:systemId/stop', async (req: Request, res: Response) => {
|
60
|
+
const task = instanceManager.stopAllForPlan(req.params.systemId);
|
61
|
+
|
62
|
+
res.status(202).send({
|
63
|
+
ok: true,
|
64
|
+
taskId: task.id,
|
65
|
+
});
|
66
|
+
});
|
67
|
+
|
68
|
+
/**
|
69
|
+
* Start single instance in a plan
|
70
|
+
*/
|
71
|
+
router.post('/:systemId/:instanceId/start', async (req: Request, res: Response) => {
|
72
|
+
try {
|
73
|
+
const result = await instanceManager.start(req.params.systemId, req.params.instanceId);
|
74
|
+
if (result instanceof Task) {
|
75
|
+
res.status(202).send({
|
76
|
+
ok: true,
|
77
|
+
taskId: result.id,
|
78
|
+
});
|
79
|
+
} else {
|
80
|
+
res.status(202).send({
|
81
|
+
ok: true,
|
82
|
+
pid: result.pid,
|
83
|
+
type: result.type,
|
84
|
+
});
|
85
|
+
}
|
86
|
+
} catch (e: any) {
|
87
|
+
res.status(500).send({ ok: false, error: e.message });
|
88
|
+
}
|
89
|
+
});
|
90
|
+
|
91
|
+
/**
|
92
|
+
* Stop single instance in a plan
|
93
|
+
*/
|
94
|
+
router.post('/:systemId/:instanceId/stop', async (req: Request, res: Response) => {
|
95
|
+
await instanceManager.stop(req.params.systemId, req.params.instanceId);
|
96
|
+
|
97
|
+
res.status(202).send({ ok: true });
|
98
|
+
});
|
99
|
+
|
100
|
+
/**
|
101
|
+
* Get logs for instance in a plan
|
102
|
+
*/
|
103
|
+
router.get('/:systemId/:instanceId/logs', async (req: Request, res: Response) => {
|
104
|
+
const instanceInfo = instanceManager.getInstance(req.params.systemId, req.params.instanceId);
|
105
|
+
if (!instanceInfo) {
|
106
|
+
res.status(404).send({ ok: false });
|
107
|
+
return;
|
108
|
+
}
|
109
|
+
|
110
|
+
try {
|
111
|
+
const logs = await instanceManager.getLogs(req.params.systemId, req.params.instanceId);
|
112
|
+
res.status(200).send({
|
113
|
+
logs,
|
114
|
+
});
|
115
|
+
} catch (e: any) {
|
116
|
+
res.status(500).send({ ok: false, error: e.message });
|
117
|
+
}
|
118
|
+
});
|
119
|
+
|
120
|
+
/**
|
121
|
+
* Get public address for instance in a plan if available
|
122
|
+
*/
|
123
|
+
router.get('/:systemId/:instanceId/address/public', (req: Request, res: Response) => {
|
124
|
+
const instance = instanceManager.getInstance(req.params.systemId, req.params.instanceId);
|
125
|
+
if (!instance) {
|
126
|
+
res.status(404).send({ ok: false });
|
127
|
+
return;
|
128
|
+
}
|
129
|
+
|
130
|
+
if (!instance.address) {
|
131
|
+
res.status(400).send({ error: `Instance does not have an address. Make sure it's running.` });
|
132
|
+
return;
|
133
|
+
}
|
134
|
+
|
135
|
+
res.status(200).send(instance.address);
|
136
|
+
});
|
137
|
+
|
138
|
+
/**
|
139
|
+
* Get public address for particular resource on instance in a plan if available
|
140
|
+
*/
|
141
|
+
router.get(
|
142
|
+
'/:systemId/:instanceId/provider/:portType/:resourceName/address/public',
|
143
|
+
(req: KapetaRequest, res: Response) => {
|
144
|
+
res.send(
|
145
|
+
serviceManager.getConsumerAddress(
|
146
|
+
req.params.systemId,
|
147
|
+
req.params.instanceId,
|
148
|
+
req.params.resourceName,
|
149
|
+
req.params.portType,
|
150
|
+
req.kapeta?.environment
|
151
|
+
)
|
152
|
+
);
|
153
|
+
}
|
154
|
+
);
|
155
|
+
|
156
|
+
router.use('/', stringBody);
|
157
|
+
router.use('/', (req: KapetaBodyRequest, res: Response, next: NextFunction) => {
|
158
|
+
if (!req.kapeta!.blockRef) {
|
159
|
+
res.status(400).send({ error: 'Missing X-Kapeta-Block header.' });
|
160
|
+
return;
|
161
|
+
}
|
162
|
+
next();
|
163
|
+
});
|
164
|
+
|
165
|
+
/**
|
166
|
+
* Updates the full configuration for a given instance.
|
167
|
+
*/
|
168
|
+
router.put('/', async (req: KapetaBodyRequest, res: Response) => {
|
169
|
+
let instance: InstanceInfo = req.stringBody ? JSON.parse(req.stringBody) : null;
|
170
|
+
if (req.kapeta!.environment === 'docker') {
|
171
|
+
//A bit hacky but we want to avoid overwriting the docker PID with a process PID
|
172
|
+
const oldInstance = instanceManager.getInstance(req.kapeta!.systemId, req.kapeta!.instanceId);
|
173
|
+
if (oldInstance) {
|
174
|
+
instance.pid = oldInstance.pid;
|
175
|
+
instance.desiredStatus = oldInstance.desiredStatus;
|
176
|
+
}
|
177
|
+
instance.type = InstanceType.DOCKER;
|
178
|
+
instance.owner = InstanceOwner.INTERNAL;
|
179
|
+
} else {
|
180
|
+
// Coming from user starting the instance outside of kapeta
|
181
|
+
instance.type = InstanceType.LOCAL;
|
182
|
+
instance.owner = InstanceOwner.EXTERNAL;
|
183
|
+
instance.desiredStatus = DesiredInstanceStatus.EXTERNAL;
|
184
|
+
}
|
185
|
+
|
186
|
+
try {
|
187
|
+
await instanceManager.registerInstanceFromSDK(req.kapeta!.systemId, req.kapeta!.instanceId, instance);
|
188
|
+
res.status(202).send({ ok: true });
|
189
|
+
} catch (e: any) {
|
190
|
+
res.status(400).send({ error: e.message });
|
191
|
+
}
|
192
|
+
});
|
193
|
+
|
194
|
+
/**
|
195
|
+
* Delete instance
|
196
|
+
*/
|
197
|
+
router.delete('/', async (req: KapetaRequest, res: Response) => {
|
198
|
+
await instanceManager.markAsStopped(req.kapeta!.systemId, req.kapeta!.instanceId);
|
199
|
+
|
200
|
+
res.status(202).send({ ok: true });
|
201
|
+
});
|
202
|
+
|
203
|
+
export default router;
|
@@ -0,0 +1,14 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright 2023 Kapeta Inc.
|
3
|
+
* SPDX-License-Identifier: BUSL-1.1
|
4
|
+
*/
|
5
|
+
|
6
|
+
import { NextFunction, Request, Response } from 'express';
|
7
|
+
|
8
|
+
export function corsHandler(req: Request, res: Response, next: NextFunction) {
|
9
|
+
res.set('Access-Control-Allow-Origin', req.headers.origin);
|
10
|
+
res.set('Access-Control-Allow-Methods', 'GET, PUT, POST, DELETE, HEAD, PATCH');
|
11
|
+
res.set('Access-Control-Allow-Headers', '*');
|
12
|
+
|
13
|
+
next();
|
14
|
+
}
|
@@ -0,0 +1,41 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright 2023 Kapeta Inc.
|
3
|
+
* SPDX-License-Identifier: BUSL-1.1
|
4
|
+
*/
|
5
|
+
|
6
|
+
import { NextFunction, Request, Response } from 'express';
|
7
|
+
import { EnvironmentType } from '../types';
|
8
|
+
import { normalizeKapetaUri } from '@kapeta/nodejs-utils';
|
9
|
+
|
10
|
+
export interface KapetaRequest extends Request {
|
11
|
+
kapeta?: {
|
12
|
+
blockRef: string;
|
13
|
+
instanceId: string;
|
14
|
+
systemId: string;
|
15
|
+
environment?: EnvironmentType;
|
16
|
+
};
|
17
|
+
}
|
18
|
+
|
19
|
+
export function kapetaHeaders(req: KapetaRequest, res: Response, next: NextFunction) {
|
20
|
+
let blockRef: string = req.headers['x-kapeta-block'] as string;
|
21
|
+
let systemId: string = req.headers['x-kapeta-system'] as string;
|
22
|
+
let instanceId: string = req.headers['x-kapeta-instance'] as string;
|
23
|
+
let environment: string = req.headers['x-kapeta-environment'] as string;
|
24
|
+
|
25
|
+
if (blockRef) {
|
26
|
+
blockRef = normalizeKapetaUri(blockRef);
|
27
|
+
}
|
28
|
+
|
29
|
+
if (systemId) {
|
30
|
+
systemId = normalizeKapetaUri(systemId);
|
31
|
+
}
|
32
|
+
|
33
|
+
req.kapeta = {
|
34
|
+
blockRef,
|
35
|
+
instanceId,
|
36
|
+
systemId,
|
37
|
+
environment: environment ? (environment as EnvironmentType) : undefined,
|
38
|
+
};
|
39
|
+
|
40
|
+
next();
|
41
|
+
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright 2023 Kapeta Inc.
|
3
|
+
* SPDX-License-Identifier: BUSL-1.1
|
4
|
+
*/
|
5
|
+
|
6
|
+
import { NextFunction, Request, Response } from 'express';
|
7
|
+
|
8
|
+
export type StringBodyRequest = Request<any> & {
|
9
|
+
stringBody?: string;
|
10
|
+
};
|
11
|
+
|
12
|
+
export function stringBody(req: StringBodyRequest, res: Response, next: NextFunction) {
|
13
|
+
// push the data to body
|
14
|
+
const body: Buffer[] = [];
|
15
|
+
req.on('data', (chunk) => {
|
16
|
+
body.push(chunk);
|
17
|
+
}).on('end', () => {
|
18
|
+
req.stringBody = Buffer.concat(body).toString();
|
19
|
+
next();
|
20
|
+
});
|
21
|
+
}
|
@@ -0,0 +1,148 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright 2023 Kapeta Inc.
|
3
|
+
* SPDX-License-Identifier: BUSL-1.1
|
4
|
+
*/
|
5
|
+
|
6
|
+
import { Connection } from '@kapeta/schemas';
|
7
|
+
import uuid from 'node-uuid';
|
8
|
+
import { SimpleRequest, SimpleResponse } from './types';
|
9
|
+
import { normalizeKapetaUri } from '@kapeta/nodejs-utils';
|
10
|
+
|
11
|
+
class NetworkManager {
|
12
|
+
private _connections: { [systemId: string]: { [connectionId: string]: Traffic[] } };
|
13
|
+
private _sources: { [systemId: string]: { [instanceId: string]: Traffic[] } };
|
14
|
+
private _targets: { [systemId: string]: { [instanceId: string]: Traffic[] } };
|
15
|
+
|
16
|
+
static toConnectionId(connection: Connection) {
|
17
|
+
return [
|
18
|
+
connection.provider.blockId,
|
19
|
+
connection.provider.resourceName,
|
20
|
+
connection.consumer.blockId,
|
21
|
+
connection.consumer.resourceName,
|
22
|
+
].join('_');
|
23
|
+
}
|
24
|
+
|
25
|
+
constructor() {
|
26
|
+
this._connections = {};
|
27
|
+
this._sources = {};
|
28
|
+
this._targets = {};
|
29
|
+
}
|
30
|
+
|
31
|
+
_ensureSystem(systemId: string) {
|
32
|
+
systemId = normalizeKapetaUri(systemId);
|
33
|
+
if (!this._connections[systemId]) {
|
34
|
+
this._connections[systemId] = {};
|
35
|
+
}
|
36
|
+
|
37
|
+
if (!this._sources[systemId]) {
|
38
|
+
this._sources[systemId] = {};
|
39
|
+
}
|
40
|
+
|
41
|
+
if (!this._targets[systemId]) {
|
42
|
+
this._targets[systemId] = {};
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
_ensureConnection(systemId: string, connectionId: string) {
|
47
|
+
systemId = normalizeKapetaUri(systemId);
|
48
|
+
this._ensureSystem(systemId);
|
49
|
+
|
50
|
+
if (!this._connections[systemId][connectionId]) {
|
51
|
+
this._connections[systemId][connectionId] = [];
|
52
|
+
}
|
53
|
+
|
54
|
+
return this._connections[systemId][connectionId];
|
55
|
+
}
|
56
|
+
|
57
|
+
_ensureSource(systemId: string, sourceBlockInstanceId: string) {
|
58
|
+
systemId = normalizeKapetaUri(systemId);
|
59
|
+
this._ensureSystem(systemId);
|
60
|
+
|
61
|
+
if (!this._sources[systemId][sourceBlockInstanceId]) {
|
62
|
+
this._sources[systemId][sourceBlockInstanceId] = [];
|
63
|
+
}
|
64
|
+
|
65
|
+
return this._sources[systemId][sourceBlockInstanceId];
|
66
|
+
}
|
67
|
+
|
68
|
+
_ensureTarget(systemId: string, targetBlockInstanceId: string) {
|
69
|
+
systemId = normalizeKapetaUri(systemId);
|
70
|
+
this._ensureSystem(systemId);
|
71
|
+
|
72
|
+
if (!this._targets[systemId][targetBlockInstanceId]) {
|
73
|
+
this._targets[systemId][targetBlockInstanceId] = [];
|
74
|
+
}
|
75
|
+
|
76
|
+
return this._targets[systemId][targetBlockInstanceId];
|
77
|
+
}
|
78
|
+
|
79
|
+
addRequest(
|
80
|
+
systemId: string,
|
81
|
+
connection: Connection,
|
82
|
+
request: SimpleRequest,
|
83
|
+
consumerMethodId?: string,
|
84
|
+
providerMethodId?: string
|
85
|
+
) {
|
86
|
+
systemId = normalizeKapetaUri(systemId);
|
87
|
+
const traffic = new Traffic(connection, request, consumerMethodId, providerMethodId);
|
88
|
+
|
89
|
+
this._ensureConnection(systemId, traffic.connectionId).push(traffic);
|
90
|
+
this._ensureSource(systemId, connection.provider.blockId).push(traffic);
|
91
|
+
this._ensureTarget(systemId, connection.consumer.blockId).push(traffic);
|
92
|
+
|
93
|
+
return traffic;
|
94
|
+
}
|
95
|
+
|
96
|
+
getTrafficForConnection(systemId: string, connectionId: string) {
|
97
|
+
return this._ensureConnection(systemId, connectionId);
|
98
|
+
}
|
99
|
+
|
100
|
+
getTrafficForSource(systemId: string, blockInstanceId: string) {
|
101
|
+
return this._ensureSource(systemId, blockInstanceId);
|
102
|
+
}
|
103
|
+
|
104
|
+
getTrafficForTarget(systemId: string, blockInstanceId: string) {
|
105
|
+
return this._ensureTarget(systemId, blockInstanceId);
|
106
|
+
}
|
107
|
+
}
|
108
|
+
|
109
|
+
class Traffic {
|
110
|
+
public readonly id: string;
|
111
|
+
public readonly connectionId: string;
|
112
|
+
public readonly consumerMethodId: string | undefined;
|
113
|
+
public readonly providerMethodId: string | undefined;
|
114
|
+
public readonly created: number;
|
115
|
+
public readonly request: SimpleRequest;
|
116
|
+
public ended: null | number;
|
117
|
+
public error: null | string;
|
118
|
+
public response: SimpleResponse | null;
|
119
|
+
|
120
|
+
constructor(connection: Connection, request: SimpleRequest, consumerMethodId?: string, providerMethodId?: string) {
|
121
|
+
this.id = uuid.v4();
|
122
|
+
this.connectionId = NetworkManager.toConnectionId(connection);
|
123
|
+
this.consumerMethodId = consumerMethodId;
|
124
|
+
this.providerMethodId = providerMethodId;
|
125
|
+
this.request = request;
|
126
|
+
this.response = null;
|
127
|
+
this.error = null;
|
128
|
+
this.ended = null;
|
129
|
+
this.created = new Date().getTime();
|
130
|
+
}
|
131
|
+
|
132
|
+
asError(err: any) {
|
133
|
+
this.ended = new Date().getTime();
|
134
|
+
this.response = {
|
135
|
+
code: 0,
|
136
|
+
headers: {},
|
137
|
+
body: null,
|
138
|
+
};
|
139
|
+
this.error = err + '';
|
140
|
+
}
|
141
|
+
|
142
|
+
withResponse(response: SimpleResponse) {
|
143
|
+
this.ended = new Date().getTime();
|
144
|
+
this.response = response;
|
145
|
+
}
|
146
|
+
}
|
147
|
+
|
148
|
+
export const networkManager = new NetworkManager();
|