@kapeta/local-cluster-service 0.6.0 → 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.
- package/.eslintrc.cjs +17 -0
- package/.github/workflows/main.yml +22 -22
- package/.prettierignore +4 -0
- package/.vscode/launch.json +2 -4
- package/CHANGELOG.md +14 -0
- package/definitions.d.ts +17 -35
- package/dist/cjs/index.d.ts +27 -0
- package/dist/cjs/index.js +126 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/src/assetManager.d.ts +31 -0
- package/dist/cjs/src/assetManager.js +153 -0
- package/dist/cjs/src/assets/routes.d.ts +3 -0
- package/dist/cjs/src/assets/routes.js +117 -0
- package/dist/cjs/src/clusterService.d.ts +40 -0
- package/dist/cjs/src/clusterService.js +114 -0
- package/dist/cjs/src/codeGeneratorManager.d.ts +8 -0
- package/dist/cjs/src/codeGeneratorManager.js +53 -0
- package/dist/cjs/src/config/routes.d.ts +3 -0
- package/dist/cjs/src/config/routes.js +126 -0
- package/dist/cjs/src/configManager.d.ts +36 -0
- package/dist/cjs/src/configManager.js +110 -0
- package/dist/cjs/src/containerManager.d.ts +89 -0
- package/dist/cjs/src/containerManager.js +365 -0
- package/dist/cjs/src/filesystem/routes.d.ts +3 -0
- package/dist/cjs/src/filesystem/routes.js +69 -0
- package/dist/cjs/src/filesystemManager.d.ts +15 -0
- package/dist/cjs/src/filesystemManager.js +87 -0
- package/dist/cjs/src/identities/routes.d.ts +3 -0
- package/dist/cjs/src/identities/routes.js +18 -0
- package/dist/cjs/src/instanceManager.d.ts +56 -0
- package/dist/cjs/src/instanceManager.js +424 -0
- package/dist/cjs/src/instances/routes.d.ts +3 -0
- package/dist/cjs/src/instances/routes.js +134 -0
- package/dist/cjs/src/middleware/cors.d.ts +2 -0
- package/dist/cjs/src/middleware/cors.js +10 -0
- package/dist/cjs/src/middleware/kapeta.d.ts +11 -0
- package/dist/cjs/src/middleware/kapeta.js +17 -0
- package/dist/cjs/src/middleware/stringBody.d.ts +5 -0
- package/dist/cjs/src/middleware/stringBody.js +14 -0
- package/dist/cjs/src/networkManager.d.ts +32 -0
- package/dist/cjs/src/networkManager.js +109 -0
- package/dist/cjs/src/operatorManager.d.ts +36 -0
- package/dist/cjs/src/operatorManager.js +165 -0
- package/dist/cjs/src/progressListener.d.ts +20 -0
- package/dist/cjs/src/progressListener.js +91 -0
- package/dist/cjs/src/providerManager.d.ts +9 -0
- package/dist/cjs/src/providerManager.js +51 -0
- package/dist/cjs/src/providers/routes.d.ts +3 -0
- package/dist/cjs/src/providers/routes.js +42 -0
- package/dist/cjs/src/proxy/routes.d.ts +3 -0
- package/dist/cjs/src/proxy/routes.js +111 -0
- package/dist/cjs/src/proxy/types/rest.d.ts +4 -0
- package/dist/cjs/src/proxy/types/rest.js +114 -0
- package/dist/cjs/src/proxy/types/web.d.ts +4 -0
- package/dist/cjs/src/proxy/types/web.js +53 -0
- package/dist/cjs/src/repositoryManager.d.ts +17 -0
- package/dist/cjs/src/repositoryManager.js +215 -0
- package/dist/cjs/src/serviceManager.d.ts +29 -0
- package/dist/cjs/src/serviceManager.js +99 -0
- package/dist/cjs/src/socketManager.d.ts +14 -0
- package/dist/cjs/src/socketManager.js +53 -0
- package/dist/cjs/src/storageService.d.ts +17 -0
- package/dist/cjs/src/storageService.js +74 -0
- package/dist/cjs/src/traffic/routes.d.ts +3 -0
- package/dist/cjs/src/traffic/routes.js +18 -0
- package/dist/cjs/src/types.d.ts +88 -0
- package/dist/cjs/src/types.js +2 -0
- package/dist/cjs/src/utils/BlockInstanceRunner.d.ts +29 -0
- package/dist/cjs/src/utils/BlockInstanceRunner.js +468 -0
- package/dist/cjs/src/utils/LogData.d.ts +19 -0
- package/dist/cjs/src/utils/LogData.js +43 -0
- package/dist/cjs/src/utils/pathTemplateParser.d.ts +26 -0
- package/dist/cjs/src/utils/pathTemplateParser.js +121 -0
- package/dist/cjs/src/utils/utils.d.ts +1 -0
- package/dist/cjs/src/utils/utils.js +18 -0
- package/dist/cjs/start.d.ts +1 -0
- package/dist/cjs/start.js +12 -0
- package/dist/esm/index.d.ts +27 -0
- package/dist/esm/index.js +121 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/src/assetManager.d.ts +31 -0
- package/{src → dist/esm/src}/assetManager.js +22 -60
- package/dist/esm/src/assets/routes.d.ts +3 -0
- package/{src → dist/esm/src}/assets/routes.js +21 -36
- package/dist/esm/src/clusterService.d.ts +40 -0
- package/{src → dist/esm/src}/clusterService.js +14 -37
- package/dist/esm/src/codeGeneratorManager.d.ts +8 -0
- package/{src → dist/esm/src}/codeGeneratorManager.js +15 -24
- package/dist/esm/src/config/routes.d.ts +3 -0
- package/dist/esm/src/config/routes.js +121 -0
- package/dist/esm/src/configManager.d.ts +36 -0
- package/{src → dist/esm/src}/configManager.js +11 -40
- package/dist/esm/src/containerManager.d.ts +89 -0
- package/{src → dist/esm/src}/containerManager.js +81 -182
- package/dist/esm/src/filesystem/routes.d.ts +3 -0
- package/dist/esm/src/filesystem/routes.js +64 -0
- package/dist/esm/src/filesystemManager.d.ts +15 -0
- package/{src → dist/esm/src}/filesystemManager.js +20 -28
- package/dist/esm/src/identities/routes.d.ts +3 -0
- package/dist/esm/src/identities/routes.js +13 -0
- package/dist/esm/src/instanceManager.d.ts +56 -0
- package/{src → dist/esm/src}/instanceManager.js +94 -175
- package/dist/esm/src/instances/routes.d.ts +3 -0
- package/{src → dist/esm/src}/instances/routes.js +31 -70
- package/dist/esm/src/middleware/cors.d.ts +2 -0
- package/{src → dist/esm/src}/middleware/cors.js +2 -3
- package/dist/esm/src/middleware/kapeta.d.ts +11 -0
- package/{src → dist/esm/src}/middleware/kapeta.js +3 -7
- package/dist/esm/src/middleware/stringBody.d.ts +5 -0
- package/{src → dist/esm/src}/middleware/stringBody.js +2 -3
- package/dist/esm/src/networkManager.d.ts +32 -0
- package/{src → dist/esm/src}/networkManager.js +16 -33
- package/dist/esm/src/operatorManager.d.ts +36 -0
- package/{src → dist/esm/src}/operatorManager.js +35 -91
- package/dist/esm/src/progressListener.d.ts +20 -0
- package/dist/esm/src/progressListener.js +88 -0
- package/dist/esm/src/providerManager.d.ts +9 -0
- package/dist/esm/src/providerManager.js +45 -0
- package/dist/esm/src/providers/routes.d.ts +3 -0
- package/{src → dist/esm/src}/providers/routes.js +10 -16
- package/dist/esm/src/proxy/routes.d.ts +3 -0
- package/dist/esm/src/proxy/routes.js +106 -0
- package/dist/esm/src/proxy/types/rest.d.ts +4 -0
- package/dist/esm/src/proxy/types/rest.js +107 -0
- package/dist/esm/src/proxy/types/web.d.ts +4 -0
- package/{src → dist/esm/src}/proxy/types/web.js +13 -35
- package/dist/esm/src/repositoryManager.d.ts +17 -0
- package/dist/esm/src/repositoryManager.js +209 -0
- package/dist/esm/src/serviceManager.d.ts +29 -0
- package/{src → dist/esm/src}/serviceManager.js +12 -42
- package/dist/esm/src/socketManager.d.ts +14 -0
- package/{src → dist/esm/src}/socketManager.js +19 -23
- package/dist/esm/src/storageService.d.ts +17 -0
- package/{src → dist/esm/src}/storageService.js +8 -27
- package/dist/esm/src/traffic/routes.d.ts +3 -0
- package/{src → dist/esm/src}/traffic/routes.js +4 -9
- package/dist/esm/src/types.d.ts +88 -0
- package/dist/esm/src/types.js +1 -0
- package/dist/esm/src/utils/BlockInstanceRunner.d.ts +29 -0
- package/{src → dist/esm/src}/utils/BlockInstanceRunner.js +137 -256
- package/dist/esm/src/utils/LogData.d.ts +19 -0
- package/{src → dist/esm/src}/utils/LogData.js +11 -22
- package/dist/esm/src/utils/pathTemplateParser.d.ts +26 -0
- package/{src → dist/esm/src}/utils/pathTemplateParser.js +21 -40
- package/dist/esm/src/utils/utils.d.ts +1 -0
- package/dist/esm/src/utils/utils.js +11 -0
- package/dist/esm/start.d.ts +1 -0
- package/dist/esm/start.js +7 -0
- package/index.ts +147 -0
- package/package.json +106 -74
- package/src/assetManager.ts +191 -0
- package/src/assets/routes.ts +132 -0
- package/src/clusterService.ts +134 -0
- package/src/codeGeneratorManager.ts +57 -0
- package/src/config/routes.ts +159 -0
- package/src/configManager.ts +148 -0
- package/src/containerManager.ts +466 -0
- package/src/filesystem/routes.ts +74 -0
- package/src/filesystemManager.ts +93 -0
- package/src/identities/routes.ts +20 -0
- package/src/instanceManager.ts +503 -0
- package/src/instances/routes.ts +164 -0
- package/src/middleware/cors.ts +9 -0
- package/src/middleware/kapeta.ts +27 -0
- package/src/middleware/stringBody.ts +16 -0
- package/src/networkManager.ts +137 -0
- package/src/operatorManager.ts +221 -0
- package/src/progressListener.ts +102 -0
- package/src/{providerManager.js → providerManager.ts} +15 -31
- package/src/providers/routes.ts +46 -0
- package/src/proxy/routes.ts +148 -0
- package/src/proxy/types/{rest.js → rest.ts} +30 -30
- package/src/proxy/types/web.ts +60 -0
- package/src/{repositoryManager.js → repositoryManager.ts} +45 -73
- package/src/serviceManager.ts +120 -0
- package/src/socketManager.ts +57 -0
- package/src/storageService.ts +88 -0
- package/src/traffic/routes.ts +18 -0
- package/src/types.ts +97 -0
- package/src/utils/BlockInstanceRunner.ts +555 -0
- package/src/utils/LogData.ts +47 -0
- package/src/utils/pathTemplateParser.ts +138 -0
- package/src/utils/utils.ts +12 -0
- package/start.ts +8 -0
- package/tsconfig.json +13 -0
- package/index.js +0 -127
- package/src/config/routes.js +0 -160
- package/src/filesystem/routes.js +0 -74
- package/src/identities/routes.js +0 -19
- package/src/progressListener.js +0 -82
- package/src/proxy/routes.js +0 -126
- package/src/utils/utils.js +0 -13
- package/start.js +0 -7
@@ -1,35 +1,31 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
import Router from 'express-promise-router';
|
2
|
+
import YAML from 'yaml';
|
3
|
+
import { assetManager } from '../assetManager';
|
4
|
+
import { corsHandler } from '../middleware/cors';
|
5
|
+
import { stringBody } from '../middleware/stringBody';
|
5
6
|
function parseBody(req) {
|
6
7
|
switch (req.headers['content-type']) {
|
7
8
|
case 'application/json':
|
8
9
|
case 'application/x-json':
|
9
10
|
case 'text/json':
|
10
|
-
return JSON.parse(req.stringBody);
|
11
|
-
|
11
|
+
return JSON.parse(req.stringBody ?? '{}');
|
12
12
|
case 'application/yaml':
|
13
13
|
case 'application/x-yaml':
|
14
14
|
case 'text/yaml':
|
15
15
|
case 'text/x-yaml':
|
16
16
|
default:
|
17
|
-
return YAML.parse(req.stringBody);
|
17
|
+
return YAML.parse(req.stringBody ?? '{}');
|
18
18
|
}
|
19
19
|
}
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
router.use('/', require('../middleware/cors'));
|
24
|
-
router.use('/', require('../middleware/stringBody'));
|
25
|
-
|
20
|
+
const router = Router();
|
21
|
+
router.use('/', corsHandler);
|
22
|
+
router.use('/', stringBody);
|
26
23
|
/**
|
27
24
|
* Get all local assets available
|
28
25
|
*/
|
29
26
|
router.get('/', (req, res) => {
|
30
27
|
res.send(assetManager.getAssets());
|
31
28
|
});
|
32
|
-
|
33
29
|
/**
|
34
30
|
* Get single asset
|
35
31
|
*/
|
@@ -38,14 +34,13 @@ router.get('/read', async (req, res) => {
|
|
38
34
|
res.status(400).send({ error: 'Query parameter "ref" is missing' });
|
39
35
|
return;
|
40
36
|
}
|
41
|
-
|
42
37
|
try {
|
43
38
|
res.send(await assetManager.getAsset(req.query.ref, true));
|
44
|
-
}
|
39
|
+
}
|
40
|
+
catch (err) {
|
45
41
|
res.status(400).send({ error: err.message });
|
46
42
|
}
|
47
43
|
});
|
48
|
-
|
49
44
|
/**
|
50
45
|
* Creates a new local file and registers it as an asset
|
51
46
|
*/
|
@@ -54,19 +49,16 @@ router.post('/create', async (req, res) => {
|
|
54
49
|
res.status(400).send({ error: 'Query parameter "path" is missing' });
|
55
50
|
return;
|
56
51
|
}
|
57
|
-
|
58
52
|
const content = parseBody(req);
|
59
|
-
|
60
53
|
try {
|
61
54
|
const assets = await assetManager.createAsset(req.query.path, content);
|
62
|
-
|
63
55
|
res.status(200).send(assets);
|
64
|
-
}
|
56
|
+
}
|
57
|
+
catch (err) {
|
65
58
|
console.log('Failed while creating asset', req.query.path, err.message);
|
66
59
|
res.status(400).send({ error: err.message });
|
67
60
|
}
|
68
61
|
});
|
69
|
-
|
70
62
|
/**
|
71
63
|
* Updates reference with new content
|
72
64
|
*/
|
@@ -75,19 +67,16 @@ router.put('/update', async (req, res) => {
|
|
75
67
|
res.status(400).send({ error: 'Query parameter "ref" is missing' });
|
76
68
|
return;
|
77
69
|
}
|
78
|
-
|
79
70
|
const content = parseBody(req);
|
80
|
-
|
81
71
|
try {
|
82
72
|
await assetManager.updateAsset(req.query.ref, content);
|
83
|
-
|
84
73
|
res.sendStatus(204);
|
85
|
-
}
|
74
|
+
}
|
75
|
+
catch (err) {
|
86
76
|
console.log('Failed while updating asset', req.query.ref, err.message);
|
87
77
|
res.status(400).send({ error: err.message });
|
88
78
|
}
|
89
79
|
});
|
90
|
-
|
91
80
|
/**
|
92
81
|
* Unregisters an asset (doesn't delete the asset)
|
93
82
|
*/
|
@@ -96,16 +85,14 @@ router.delete('/', async (req, res) => {
|
|
96
85
|
res.status(400).send({ error: 'Query parameter "ref" is missing' });
|
97
86
|
return;
|
98
87
|
}
|
99
|
-
|
100
88
|
try {
|
101
89
|
await assetManager.unregisterAsset(req.query.ref);
|
102
|
-
|
103
90
|
res.status(204).send();
|
104
|
-
}
|
91
|
+
}
|
92
|
+
catch (err) {
|
105
93
|
res.status(400).send({ error: err.message });
|
106
94
|
}
|
107
95
|
});
|
108
|
-
|
109
96
|
/**
|
110
97
|
* Registers an existing file as an asset
|
111
98
|
*/
|
@@ -114,14 +101,12 @@ router.put('/import', async (req, res) => {
|
|
114
101
|
res.status(400).send({ error: 'Query parameter "ref" is missing' });
|
115
102
|
return;
|
116
103
|
}
|
117
|
-
|
118
104
|
try {
|
119
105
|
const assets = await assetManager.importFile(req.query.ref);
|
120
|
-
|
121
106
|
res.status(200).send(assets);
|
122
|
-
}
|
107
|
+
}
|
108
|
+
catch (err) {
|
123
109
|
res.status(400).send({ error: err.message });
|
124
110
|
}
|
125
111
|
});
|
126
|
-
|
127
|
-
module.exports = router;
|
112
|
+
export default router;
|
@@ -0,0 +1,40 @@
|
|
1
|
+
declare class ClusterService {
|
2
|
+
private _port;
|
3
|
+
private _currentPort;
|
4
|
+
private _initialized;
|
5
|
+
private _reservedPorts;
|
6
|
+
private _host;
|
7
|
+
constructor();
|
8
|
+
reservePort(port: number | string): void;
|
9
|
+
init(): Promise<void>;
|
10
|
+
_findClusterServicePort(): Promise<void>;
|
11
|
+
/**
|
12
|
+
* Gets next available port
|
13
|
+
* @return {Promise<number>}
|
14
|
+
*/
|
15
|
+
getNextAvailablePort(): Promise<number>;
|
16
|
+
_checkIfPortIsUsed(port: number, host?: string): Promise<unknown>;
|
17
|
+
/**
|
18
|
+
* The port of this local cluster service itself
|
19
|
+
*/
|
20
|
+
getClusterServicePort(): number;
|
21
|
+
getClusterServiceHost(): string;
|
22
|
+
/**
|
23
|
+
* Set the port to be used for this local service
|
24
|
+
* @param port
|
25
|
+
*/
|
26
|
+
setClusterServicePort(port: number): void;
|
27
|
+
setClusterServiceHost(host: string): void;
|
28
|
+
/**
|
29
|
+
* Gets that proxy path of a given request
|
30
|
+
*
|
31
|
+
* @param systemId
|
32
|
+
* @param consumerInstanceId
|
33
|
+
* @param consumerResourceName
|
34
|
+
* @param portType
|
35
|
+
* @return {string}
|
36
|
+
*/
|
37
|
+
getProxyPath(systemId: string, consumerInstanceId: string, consumerResourceName: string, portType: string): string;
|
38
|
+
}
|
39
|
+
export declare const clusterService: ClusterService;
|
40
|
+
export {};
|
@@ -2,9 +2,12 @@ const net = require('net');
|
|
2
2
|
const DEFAULT_SERVER_PORT = 35100;
|
3
3
|
const DEFAULT_START_PORT = 40000;
|
4
4
|
const DEFAULT_HOST = '127.0.0.1';
|
5
|
-
|
6
5
|
class ClusterService {
|
7
|
-
|
6
|
+
_port;
|
7
|
+
_currentPort;
|
8
|
+
_initialized;
|
9
|
+
_reservedPorts;
|
10
|
+
_host;
|
8
11
|
constructor() {
|
9
12
|
this._port = DEFAULT_SERVER_PORT;
|
10
13
|
this._currentPort = DEFAULT_START_PORT;
|
@@ -12,51 +15,38 @@ class ClusterService {
|
|
12
15
|
this._reservedPorts = [];
|
13
16
|
this._host = DEFAULT_HOST;
|
14
17
|
}
|
15
|
-
|
16
18
|
reservePort(port) {
|
17
19
|
const intPort = parseInt(port);
|
18
20
|
if (this._reservedPorts.indexOf(intPort) > -1) {
|
19
21
|
throw new Error('Port already reserved: ' + intPort);
|
20
22
|
}
|
21
|
-
|
22
23
|
this._reservedPorts.push(intPort);
|
23
24
|
}
|
24
|
-
|
25
25
|
async init() {
|
26
26
|
if (this._initialized) {
|
27
27
|
return;
|
28
28
|
}
|
29
|
-
|
30
29
|
this._initialized = true;
|
31
30
|
await this._findClusterServicePort();
|
32
|
-
|
33
31
|
}
|
34
|
-
|
35
32
|
async _findClusterServicePort() {
|
36
|
-
while(true) {
|
37
|
-
|
33
|
+
while (true) {
|
38
34
|
const isUsed = await this._checkIfPortIsUsed(this._port);
|
39
35
|
if (!isUsed) {
|
40
36
|
break;
|
41
37
|
}
|
42
|
-
|
43
38
|
this._port++;
|
44
|
-
|
45
39
|
}
|
46
40
|
}
|
47
|
-
|
48
|
-
|
49
41
|
/**
|
50
42
|
* Gets next available port
|
51
43
|
* @return {Promise<number>}
|
52
44
|
*/
|
53
45
|
async getNextAvailablePort() {
|
54
|
-
while(true) {
|
55
|
-
|
46
|
+
while (true) {
|
56
47
|
while (this._reservedPorts.indexOf(this._currentPort) > -1) {
|
57
48
|
this._currentPort++;
|
58
49
|
}
|
59
|
-
|
60
50
|
const nextPort = this._currentPort++;
|
61
51
|
const isUsed = await this._checkIfPortIsUsed(nextPort);
|
62
52
|
if (!isUsed) {
|
@@ -64,47 +54,37 @@ class ClusterService {
|
|
64
54
|
}
|
65
55
|
}
|
66
56
|
}
|
67
|
-
|
68
|
-
_checkIfPortIsUsed(port, host=this._host) {
|
57
|
+
_checkIfPortIsUsed(port, host = this._host) {
|
69
58
|
return new Promise((resolve, reject) => {
|
70
59
|
const server = net.createServer();
|
71
|
-
|
72
|
-
server.once('error', function(err) {
|
60
|
+
server.once('error', function (err) {
|
73
61
|
if (err.code === 'EADDRINUSE') {
|
74
62
|
server.close();
|
75
63
|
resolve(true);
|
76
64
|
return;
|
77
65
|
}
|
78
|
-
|
79
66
|
server.close();
|
80
67
|
reject(err);
|
81
68
|
});
|
82
|
-
|
83
|
-
server.once('listening', function() {
|
69
|
+
server.once('listening', function () {
|
84
70
|
server.close();
|
85
71
|
resolve(false);
|
86
72
|
});
|
87
|
-
|
88
|
-
server.listen( port, host );
|
73
|
+
server.listen(port, host);
|
89
74
|
});
|
90
|
-
|
91
75
|
}
|
92
|
-
|
93
|
-
|
94
76
|
/**
|
95
77
|
* The port of this local cluster service itself
|
96
78
|
*/
|
97
79
|
getClusterServicePort() {
|
98
80
|
return this._port;
|
99
81
|
}
|
100
|
-
|
101
|
-
/*
|
82
|
+
/*
|
102
83
|
*Gets the host name ( 127.0.0.1 ) on which Express JS is listening
|
103
84
|
*/
|
104
|
-
|
85
|
+
getClusterServiceHost() {
|
105
86
|
return this._host;
|
106
87
|
}
|
107
|
-
|
108
88
|
/**
|
109
89
|
* Set the port to be used for this local service
|
110
90
|
* @param port
|
@@ -112,11 +92,9 @@ class ClusterService {
|
|
112
92
|
setClusterServicePort(port) {
|
113
93
|
this._port = port;
|
114
94
|
}
|
115
|
-
|
116
95
|
setClusterServiceHost(host) {
|
117
96
|
this._host = host;
|
118
97
|
}
|
119
|
-
|
120
98
|
/**
|
121
99
|
* Gets that proxy path of a given request
|
122
100
|
*
|
@@ -130,5 +108,4 @@ class ClusterService {
|
|
130
108
|
return `/proxy/${encodeURIComponent(systemId)}/${encodeURIComponent(consumerInstanceId)}/${encodeURIComponent(consumerResourceName)}/${encodeURIComponent(portType)}/`;
|
131
109
|
}
|
132
110
|
}
|
133
|
-
|
134
|
-
module.exports = new ClusterService();
|
111
|
+
export const 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 {};
|
@@ -1,56 +1,47 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
const ClusterConfiguration = require('@kapeta/local-cluster-config').default;
|
1
|
+
import Path from 'path';
|
2
|
+
import { registry as Targets, BlockCodeGenerator, CodeWriter } from '@kapeta/codegen';
|
3
|
+
import ClusterConfiguration from '@kapeta/local-cluster-config';
|
5
4
|
const TARGET_KIND = 'core/language-target';
|
6
5
|
const BLOCK_TYPE_KIND = 'core/block-type';
|
7
|
-
|
8
6
|
class CodeGeneratorManager {
|
9
|
-
|
10
|
-
reload() {
|
7
|
+
async reload() {
|
11
8
|
Targets.reset();
|
12
9
|
const languageTargets = ClusterConfiguration.getDefinitions(TARGET_KIND);
|
13
|
-
|
14
|
-
const key = `${languageTarget.definition.metadata.name}:${languageTarget.version}
|
10
|
+
for (const languageTarget of languageTargets) {
|
11
|
+
const key = `${languageTarget.definition.metadata.name}:${languageTarget.version}`;
|
15
12
|
try {
|
16
13
|
const target = require(languageTarget.path);
|
17
14
|
if (target.default) {
|
18
15
|
Targets.register(key, target.default);
|
19
|
-
}
|
16
|
+
}
|
17
|
+
else {
|
20
18
|
Targets.register(key, target);
|
21
19
|
}
|
22
|
-
}
|
20
|
+
}
|
21
|
+
catch (e) {
|
23
22
|
console.error('Failed to load target: %s', key, e);
|
24
23
|
}
|
25
|
-
}
|
24
|
+
}
|
26
25
|
}
|
27
|
-
|
28
26
|
canGenerateCode(yamlContent) {
|
29
27
|
if (!yamlContent.spec.target?.kind) {
|
30
28
|
//Not all block types have targets
|
31
29
|
return false;
|
32
30
|
}
|
33
|
-
|
34
31
|
const blockTypes = ClusterConfiguration.getDefinitions(BLOCK_TYPE_KIND);
|
35
|
-
const blockTypeKinds = blockTypes.map(blockType => blockType.definition.metadata.name.toLowerCase() + ':' + blockType.version);
|
36
|
-
return yamlContent && yamlContent.kind && blockTypeKinds.indexOf(yamlContent.kind.toLowerCase()) > -1;
|
32
|
+
const blockTypeKinds = blockTypes.map((blockType) => blockType.definition.metadata.name.toLowerCase() + ':' + blockType.version);
|
33
|
+
return !!(yamlContent && yamlContent.kind && blockTypeKinds.indexOf(yamlContent.kind.toLowerCase()) > -1);
|
37
34
|
}
|
38
|
-
|
39
35
|
async generate(yamlFile, yamlContent) {
|
40
36
|
const baseDir = Path.dirname(yamlFile);
|
41
37
|
console.log('Generating code for path: %s', baseDir);
|
42
38
|
const codeGenerator = new BlockCodeGenerator(yamlContent);
|
43
|
-
|
44
39
|
const output = await codeGenerator.generate();
|
45
40
|
const writer = new CodeWriter(baseDir, {});
|
46
41
|
const assets = writer.write(output);
|
47
|
-
|
48
42
|
await codeGenerator.postprocess(baseDir, assets);
|
49
|
-
|
50
43
|
console.log('Code generated for path: %s', baseDir);
|
51
44
|
}
|
52
45
|
}
|
53
|
-
|
54
|
-
|
55
|
-
manager.reload();
|
56
|
-
module.exports = manager;
|
46
|
+
export const codeGeneratorManager = new CodeGeneratorManager();
|
47
|
+
codeGeneratorManager.reload();
|
@@ -0,0 +1,121 @@
|
|
1
|
+
import Router from 'express-promise-router';
|
2
|
+
import { configManager } from '../configManager';
|
3
|
+
import { serviceManager } from '../serviceManager';
|
4
|
+
import { operatorManager } from '../operatorManager';
|
5
|
+
import { instanceManager } from '../instanceManager';
|
6
|
+
import { corsHandler } from '../middleware/cors';
|
7
|
+
import { kapetaHeaders } from '../middleware/kapeta';
|
8
|
+
import { stringBody } from '../middleware/stringBody';
|
9
|
+
const router = Router();
|
10
|
+
const SYSTEM_ID = '$plan';
|
11
|
+
router.use('/', corsHandler);
|
12
|
+
router.use('/', kapetaHeaders);
|
13
|
+
router.use('/', stringBody);
|
14
|
+
/**
|
15
|
+
* Returns the full configuration for a given service.
|
16
|
+
*/
|
17
|
+
router.get('/instance', (req, res) => {
|
18
|
+
const config = req.kapeta.instanceId
|
19
|
+
? configManager.getConfigForSection(req.kapeta.systemId, req.kapeta.instanceId)
|
20
|
+
: configManager.getConfigForSystem(req.kapeta.systemId);
|
21
|
+
res.send(config);
|
22
|
+
});
|
23
|
+
/**
|
24
|
+
* Updates the full configuration for a given service.
|
25
|
+
*/
|
26
|
+
router.put('/instance', async (req, res) => {
|
27
|
+
try {
|
28
|
+
let config = JSON.parse(req.stringBody ?? '{}');
|
29
|
+
if (!config) {
|
30
|
+
config = {};
|
31
|
+
}
|
32
|
+
if (req.kapeta.instanceId) {
|
33
|
+
configManager.setConfigForSection(req.kapeta.systemId, req.kapeta.instanceId, config);
|
34
|
+
//Restart the instance if it is running after config change
|
35
|
+
await instanceManager.restartIfRunning(req.kapeta.systemId, req.kapeta.instanceId);
|
36
|
+
}
|
37
|
+
else {
|
38
|
+
configManager.setConfigForSystem(req.kapeta.systemId, config);
|
39
|
+
}
|
40
|
+
}
|
41
|
+
catch (err) {
|
42
|
+
console.error('Failed to update instance config', err);
|
43
|
+
res.status(400).send({ error: err.message });
|
44
|
+
return;
|
45
|
+
}
|
46
|
+
res.status(202).send({ ok: true });
|
47
|
+
});
|
48
|
+
/**
|
49
|
+
* Returns the full configuration for a plan
|
50
|
+
*/
|
51
|
+
router.get('/system', (req, res) => {
|
52
|
+
const config = configManager.getConfigForSection(req.kapeta.systemId, SYSTEM_ID);
|
53
|
+
res.send(config);
|
54
|
+
});
|
55
|
+
/**
|
56
|
+
* Updates the full configuration for a plan
|
57
|
+
*/
|
58
|
+
router.put('/system', (req, res) => {
|
59
|
+
let config = JSON.parse(req.stringBody ?? '{}');
|
60
|
+
if (!config) {
|
61
|
+
config = {};
|
62
|
+
}
|
63
|
+
configManager.setConfigForSection(req.kapeta.systemId, SYSTEM_ID, config);
|
64
|
+
res.status(202).send({ ok: true });
|
65
|
+
});
|
66
|
+
/**
|
67
|
+
* Resolves and checks the identity of a block instance
|
68
|
+
*/
|
69
|
+
router.get('/identity', async (req, res) => {
|
70
|
+
const identity = {
|
71
|
+
systemId: req.kapeta.systemId,
|
72
|
+
instanceId: req.kapeta.instanceId,
|
73
|
+
};
|
74
|
+
if (!req.kapeta.blockRef) {
|
75
|
+
res.status(400).send({ error: 'Missing required header "X-Kapeta-Block"' });
|
76
|
+
return;
|
77
|
+
}
|
78
|
+
try {
|
79
|
+
if (!identity.systemId || !identity.instanceId) {
|
80
|
+
const { systemId, instanceId } = await configManager.resolveIdentity(req.kapeta.blockRef, identity.systemId);
|
81
|
+
identity.systemId = systemId;
|
82
|
+
identity.instanceId = instanceId;
|
83
|
+
}
|
84
|
+
else {
|
85
|
+
await configManager.verifyIdentity(req.kapeta.blockRef, identity.systemId, identity.instanceId);
|
86
|
+
}
|
87
|
+
res.send(identity);
|
88
|
+
}
|
89
|
+
catch (err) {
|
90
|
+
console.warn('Failed to resolve identity', err);
|
91
|
+
res.status(400).send({ error: err.message });
|
92
|
+
}
|
93
|
+
});
|
94
|
+
/**
|
95
|
+
* Services call this to request a free port. If a service has
|
96
|
+
* already called the endpoint the same port is returned.
|
97
|
+
*/
|
98
|
+
router.get('/provides/:type', async (req, res) => {
|
99
|
+
//Get service port
|
100
|
+
res.send('' + (await serviceManager.ensureServicePort(req.kapeta.systemId, req.kapeta.instanceId, req.params.type)));
|
101
|
+
});
|
102
|
+
/**
|
103
|
+
* Used by services to get info for consumed operator resource.
|
104
|
+
*
|
105
|
+
* If the operator resource is not already available this will cause it to start an instance and
|
106
|
+
* assign port numbers to it etc.
|
107
|
+
*/
|
108
|
+
router.get('/consumes/resource/:resourceType/:portType/:name', async (req, res) => {
|
109
|
+
const operatorInfo = await operatorManager.getConsumerResourceInfo(req.kapeta.systemId, req.kapeta.instanceId, req.params.resourceType, req.params.portType, req.params.name, req.kapeta.environment);
|
110
|
+
res.send(operatorInfo);
|
111
|
+
});
|
112
|
+
/**
|
113
|
+
* Used by services to get address for their clients.
|
114
|
+
*
|
115
|
+
* If the remote service is not already registered with a port - we do that here
|
116
|
+
* to handle clients for services that hasn't started yet.
|
117
|
+
*/
|
118
|
+
router.get('/consumes/:resourceName/:type', (req, res) => {
|
119
|
+
res.send(serviceManager.getConsumerAddress(req.kapeta.systemId, req.kapeta.instanceId, req.params.resourceName, req.params.type, req.kapeta.environment));
|
120
|
+
});
|
121
|
+
export 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 {};
|