@kapeta/local-cluster-service 0.54.9 → 0.54.11
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/CHANGELOG.md +17 -0
- package/dist/cjs/index.js +6 -1
- package/dist/cjs/src/instanceManager.d.ts +2 -0
- package/dist/cjs/src/instanceManager.js +7 -0
- package/dist/cjs/src/repositoryManager.js +0 -1
- package/dist/cjs/src/storm/codegen.js +5 -3
- package/dist/cjs/src/storm/event-parser.js +9 -3
- package/dist/esm/index.js +6 -1
- package/dist/esm/src/instanceManager.d.ts +2 -0
- package/dist/esm/src/instanceManager.js +7 -0
- package/dist/esm/src/repositoryManager.js +0 -1
- package/dist/esm/src/storm/codegen.js +5 -3
- package/dist/esm/src/storm/event-parser.js +9 -3
- package/index.ts +6 -1
- package/package.json +1 -1
- package/src/instanceManager.ts +9 -1
- package/src/repositoryManager.ts +0 -1
- package/src/storm/codegen.ts +5 -3
- package/src/storm/event-parser.ts +10 -4
package/CHANGELOG.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
## [0.54.11](https://github.com/kapetacom/local-cluster-service/compare/v0.54.10...v0.54.11) (2024-07-10)
|
2
|
+
|
3
|
+
|
4
|
+
### Bug Fixes
|
5
|
+
|
6
|
+
* handle unpredictable AI outputs ([#189](https://github.com/kapetacom/local-cluster-service/issues/189)) ([651c1dc](https://github.com/kapetacom/local-cluster-service/commit/651c1dc1c15e5392fc4f4b09f27ce42e4f7ae7a5))
|
7
|
+
|
8
|
+
## [0.54.10](https://github.com/kapetacom/local-cluster-service/compare/v0.54.9...v0.54.10) (2024-07-09)
|
9
|
+
|
10
|
+
|
11
|
+
### Bug Fixes
|
12
|
+
|
13
|
+
* make instanceManager watch explicit w/ start+stop ([ff86ca7](https://github.com/kapetacom/local-cluster-service/commit/ff86ca7c9077a5901c3578a6920298ba6bfb21e3))
|
14
|
+
* make repositoryManager watch explicit w/ start+stop in index ([f7c08e7](https://github.com/kapetacom/local-cluster-service/commit/f7c08e70947a185cfb8e8ca4e83183af297d85aa))
|
15
|
+
* send QA and Building events ([955d171](https://github.com/kapetacom/local-cluster-service/commit/955d17128aed1f51ded68d723e10c501d0000696))
|
16
|
+
* temporarily disable code verify and fixing while codegen is unstable ([08e54b6](https://github.com/kapetacom/local-cluster-service/commit/08e54b61bdab402a84370d985e5d25d2fa9f9588))
|
17
|
+
|
1
18
|
## [0.54.9](https://github.com/kapetacom/local-cluster-service/compare/v0.54.8...v0.54.9) (2024-07-02)
|
2
19
|
|
3
20
|
|
package/dist/cjs/index.js
CHANGED
@@ -61,6 +61,7 @@ const authManager_1 = require("./src/authManager");
|
|
61
61
|
const codeGeneratorManager_1 = require("./src/codeGeneratorManager");
|
62
62
|
const Sentry = __importStar(require("@sentry/node"));
|
63
63
|
const assetManager_1 = require("./src/assetManager");
|
64
|
+
const instanceManager_1 = require("./src/instanceManager");
|
64
65
|
Sentry.init({
|
65
66
|
dsn: 'https://0b7cc946d82c591473d6f95fff5e210b@o4505820837249024.ingest.sentry.io/4506212692000768',
|
66
67
|
enabled: process.env.NODE_ENV !== 'development',
|
@@ -191,6 +192,8 @@ exports.default = {
|
|
191
192
|
}
|
192
193
|
await clusterService_1.clusterService.init();
|
193
194
|
authManager_1.authManager.listenForChanges();
|
195
|
+
instanceManager_1.instanceManager.startMonitoring();
|
196
|
+
repositoryManager_1.repositoryManager.listenForChanges();
|
194
197
|
currentServer = createServer();
|
195
198
|
const port = clusterService_1.clusterService.getClusterServicePort();
|
196
199
|
const host = clusterService_1.clusterService.getClusterServiceHost();
|
@@ -250,7 +253,9 @@ exports.default = {
|
|
250
253
|
* Stops any currently running cluster services.
|
251
254
|
* @return {Promise<boolean>} Returns true if the service was stopped - false if no service was running.
|
252
255
|
*/
|
253
|
-
stop: function () {
|
256
|
+
stop: async function () {
|
257
|
+
instanceManager_1.instanceManager.stopMonitoring();
|
258
|
+
await repositoryManager_1.repositoryManager.stopListening();
|
254
259
|
if (currentServer) {
|
255
260
|
return new Promise(function (resolve) {
|
256
261
|
if (currentServer) {
|
@@ -10,6 +10,8 @@ export declare class InstanceManager {
|
|
10
10
|
private readonly _instances;
|
11
11
|
private readonly instanceLocks;
|
12
12
|
constructor();
|
13
|
+
startMonitoring(): void;
|
14
|
+
stopMonitoring(): void;
|
13
15
|
private checkInstancesLater;
|
14
16
|
getInstances(): InstanceInfo[];
|
15
17
|
getInstancesForPlan(systemId: string): Promise<InstanceInfo[]>;
|
@@ -32,9 +32,16 @@ class InstanceManager {
|
|
32
32
|
instanceLocks = new async_lock_1.default();
|
33
33
|
constructor() {
|
34
34
|
this._instances = storageService_1.storageService.section('instances', []);
|
35
|
+
}
|
36
|
+
startMonitoring() {
|
35
37
|
// We need to wait a bit before running the first check
|
36
38
|
this.checkInstancesLater(1000);
|
37
39
|
}
|
40
|
+
stopMonitoring() {
|
41
|
+
if (this._interval) {
|
42
|
+
clearTimeout(this._interval);
|
43
|
+
}
|
44
|
+
}
|
38
45
|
checkInstancesLater(time = CHECK_INTERVAL) {
|
39
46
|
if (this._interval) {
|
40
47
|
clearTimeout(this._interval);
|
@@ -42,7 +42,6 @@ class RepositoryManager extends node_events_1.EventEmitter {
|
|
42
42
|
super();
|
43
43
|
this._registryService = new nodejs_registry_utils_1.RegistryService(nodejs_registry_utils_1.Config.data.registry.url);
|
44
44
|
this.watcher = new RepositoryWatcher_1.RepositoryWatcher();
|
45
|
-
this.listenForChanges();
|
46
45
|
this.watcher.on('change', (file, source) => {
|
47
46
|
this.emit('change', file, source);
|
48
47
|
});
|
@@ -390,10 +390,12 @@ class StormCodegen {
|
|
390
390
|
await (0, promises_1.writeFile)(kapetaYmlPath, kapetaYaml);
|
391
391
|
const blockRef = block.uri;
|
392
392
|
this.emitBlockStatus(blockUri, block.aiName, events_1.StormEventBlockStatusType.QA);
|
393
|
-
|
394
|
-
|
393
|
+
/* TODO: temporarily disabled - enable again when codegen is more stable
|
394
|
+
const filesToBeFixed = serviceFiles.concat(contextFiles).concat(screenFilesConverted);
|
395
|
+
const codeGenerator = new BlockCodeGenerator(blockDefinition);
|
396
|
+
*/
|
395
397
|
this.emitBlockStatus(blockUri, block.aiName, events_1.StormEventBlockStatusType.BUILDING);
|
396
|
-
await this.verifyAndFixCode(blockUri, block.aiName, codeGenerator, basePath, filesToBeFixed, allFiles);
|
398
|
+
// await this.verifyAndFixCode(blockUri, block.aiName, codeGenerator, basePath, filesToBeFixed, allFiles);
|
397
399
|
this.out.emit('data', {
|
398
400
|
type: 'BLOCK_READY',
|
399
401
|
reason: 'Block ready',
|
@@ -386,12 +386,12 @@ class StormEventParser {
|
|
386
386
|
const blockSpec = blockDefinitionInfo.content.spec;
|
387
387
|
const apiResources = {};
|
388
388
|
let dbResource = undefined;
|
389
|
-
blockInfo.resources.forEach((resource) => {
|
389
|
+
(blockInfo.resources || []).forEach((resource) => {
|
390
390
|
const port = {
|
391
391
|
type: this.toPortType(resource.type),
|
392
392
|
};
|
393
393
|
switch (resource.type) {
|
394
|
-
case 'API':
|
394
|
+
case 'API': {
|
395
395
|
const apiResource = {
|
396
396
|
kind: this.toResourceKind(resource.type),
|
397
397
|
metadata: {
|
@@ -411,6 +411,7 @@ class StormEventParser {
|
|
411
411
|
apiResources[resource.name] = apiResource;
|
412
412
|
blockSpec.providers.push(apiResource);
|
413
413
|
break;
|
414
|
+
}
|
414
415
|
case 'CLIENT':
|
415
416
|
blockSpec.consumers.push({
|
416
417
|
kind: this.toResourceKind(resource.type),
|
@@ -508,7 +509,12 @@ class StormEventParser {
|
|
508
509
|
// available rest resource
|
509
510
|
const firstKey = Object.keys(apiResources)[0];
|
510
511
|
const firstEntry = apiResources[firstKey];
|
511
|
-
firstEntry
|
512
|
+
if (firstEntry) {
|
513
|
+
firstEntry.spec.source.value += api + '\n\n';
|
514
|
+
}
|
515
|
+
else {
|
516
|
+
console.warn('Unable to find resource for API', api);
|
517
|
+
}
|
512
518
|
}
|
513
519
|
});
|
514
520
|
blockInfo.types.forEach((type) => {
|
package/dist/esm/index.js
CHANGED
@@ -61,6 +61,7 @@ const authManager_1 = require("./src/authManager");
|
|
61
61
|
const codeGeneratorManager_1 = require("./src/codeGeneratorManager");
|
62
62
|
const Sentry = __importStar(require("@sentry/node"));
|
63
63
|
const assetManager_1 = require("./src/assetManager");
|
64
|
+
const instanceManager_1 = require("./src/instanceManager");
|
64
65
|
Sentry.init({
|
65
66
|
dsn: 'https://0b7cc946d82c591473d6f95fff5e210b@o4505820837249024.ingest.sentry.io/4506212692000768',
|
66
67
|
enabled: process.env.NODE_ENV !== 'development',
|
@@ -191,6 +192,8 @@ exports.default = {
|
|
191
192
|
}
|
192
193
|
await clusterService_1.clusterService.init();
|
193
194
|
authManager_1.authManager.listenForChanges();
|
195
|
+
instanceManager_1.instanceManager.startMonitoring();
|
196
|
+
repositoryManager_1.repositoryManager.listenForChanges();
|
194
197
|
currentServer = createServer();
|
195
198
|
const port = clusterService_1.clusterService.getClusterServicePort();
|
196
199
|
const host = clusterService_1.clusterService.getClusterServiceHost();
|
@@ -250,7 +253,9 @@ exports.default = {
|
|
250
253
|
* Stops any currently running cluster services.
|
251
254
|
* @return {Promise<boolean>} Returns true if the service was stopped - false if no service was running.
|
252
255
|
*/
|
253
|
-
stop: function () {
|
256
|
+
stop: async function () {
|
257
|
+
instanceManager_1.instanceManager.stopMonitoring();
|
258
|
+
await repositoryManager_1.repositoryManager.stopListening();
|
254
259
|
if (currentServer) {
|
255
260
|
return new Promise(function (resolve) {
|
256
261
|
if (currentServer) {
|
@@ -10,6 +10,8 @@ export declare class InstanceManager {
|
|
10
10
|
private readonly _instances;
|
11
11
|
private readonly instanceLocks;
|
12
12
|
constructor();
|
13
|
+
startMonitoring(): void;
|
14
|
+
stopMonitoring(): void;
|
13
15
|
private checkInstancesLater;
|
14
16
|
getInstances(): InstanceInfo[];
|
15
17
|
getInstancesForPlan(systemId: string): Promise<InstanceInfo[]>;
|
@@ -32,9 +32,16 @@ class InstanceManager {
|
|
32
32
|
instanceLocks = new async_lock_1.default();
|
33
33
|
constructor() {
|
34
34
|
this._instances = storageService_1.storageService.section('instances', []);
|
35
|
+
}
|
36
|
+
startMonitoring() {
|
35
37
|
// We need to wait a bit before running the first check
|
36
38
|
this.checkInstancesLater(1000);
|
37
39
|
}
|
40
|
+
stopMonitoring() {
|
41
|
+
if (this._interval) {
|
42
|
+
clearTimeout(this._interval);
|
43
|
+
}
|
44
|
+
}
|
38
45
|
checkInstancesLater(time = CHECK_INTERVAL) {
|
39
46
|
if (this._interval) {
|
40
47
|
clearTimeout(this._interval);
|
@@ -42,7 +42,6 @@ class RepositoryManager extends node_events_1.EventEmitter {
|
|
42
42
|
super();
|
43
43
|
this._registryService = new nodejs_registry_utils_1.RegistryService(nodejs_registry_utils_1.Config.data.registry.url);
|
44
44
|
this.watcher = new RepositoryWatcher_1.RepositoryWatcher();
|
45
|
-
this.listenForChanges();
|
46
45
|
this.watcher.on('change', (file, source) => {
|
47
46
|
this.emit('change', file, source);
|
48
47
|
});
|
@@ -390,10 +390,12 @@ class StormCodegen {
|
|
390
390
|
await (0, promises_1.writeFile)(kapetaYmlPath, kapetaYaml);
|
391
391
|
const blockRef = block.uri;
|
392
392
|
this.emitBlockStatus(blockUri, block.aiName, events_1.StormEventBlockStatusType.QA);
|
393
|
-
|
394
|
-
|
393
|
+
/* TODO: temporarily disabled - enable again when codegen is more stable
|
394
|
+
const filesToBeFixed = serviceFiles.concat(contextFiles).concat(screenFilesConverted);
|
395
|
+
const codeGenerator = new BlockCodeGenerator(blockDefinition);
|
396
|
+
*/
|
395
397
|
this.emitBlockStatus(blockUri, block.aiName, events_1.StormEventBlockStatusType.BUILDING);
|
396
|
-
await this.verifyAndFixCode(blockUri, block.aiName, codeGenerator, basePath, filesToBeFixed, allFiles);
|
398
|
+
// await this.verifyAndFixCode(blockUri, block.aiName, codeGenerator, basePath, filesToBeFixed, allFiles);
|
397
399
|
this.out.emit('data', {
|
398
400
|
type: 'BLOCK_READY',
|
399
401
|
reason: 'Block ready',
|
@@ -386,12 +386,12 @@ class StormEventParser {
|
|
386
386
|
const blockSpec = blockDefinitionInfo.content.spec;
|
387
387
|
const apiResources = {};
|
388
388
|
let dbResource = undefined;
|
389
|
-
blockInfo.resources.forEach((resource) => {
|
389
|
+
(blockInfo.resources || []).forEach((resource) => {
|
390
390
|
const port = {
|
391
391
|
type: this.toPortType(resource.type),
|
392
392
|
};
|
393
393
|
switch (resource.type) {
|
394
|
-
case 'API':
|
394
|
+
case 'API': {
|
395
395
|
const apiResource = {
|
396
396
|
kind: this.toResourceKind(resource.type),
|
397
397
|
metadata: {
|
@@ -411,6 +411,7 @@ class StormEventParser {
|
|
411
411
|
apiResources[resource.name] = apiResource;
|
412
412
|
blockSpec.providers.push(apiResource);
|
413
413
|
break;
|
414
|
+
}
|
414
415
|
case 'CLIENT':
|
415
416
|
blockSpec.consumers.push({
|
416
417
|
kind: this.toResourceKind(resource.type),
|
@@ -508,7 +509,12 @@ class StormEventParser {
|
|
508
509
|
// available rest resource
|
509
510
|
const firstKey = Object.keys(apiResources)[0];
|
510
511
|
const firstEntry = apiResources[firstKey];
|
511
|
-
firstEntry
|
512
|
+
if (firstEntry) {
|
513
|
+
firstEntry.spec.source.value += api + '\n\n';
|
514
|
+
}
|
515
|
+
else {
|
516
|
+
console.warn('Unable to find resource for API', api);
|
517
|
+
}
|
512
518
|
}
|
513
519
|
});
|
514
520
|
blockInfo.types.forEach((type) => {
|
package/index.ts
CHANGED
@@ -35,6 +35,7 @@ import { authManager } from './src/authManager';
|
|
35
35
|
import { codeGeneratorManager } from './src/codeGeneratorManager';
|
36
36
|
import * as Sentry from '@sentry/node';
|
37
37
|
import { assetManager } from './src/assetManager';
|
38
|
+
import { instanceManager } from './src/instanceManager';
|
38
39
|
|
39
40
|
Sentry.init({
|
40
41
|
dsn: 'https://0b7cc946d82c591473d6f95fff5e210b@o4505820837249024.ingest.sentry.io/4506212692000768',
|
@@ -197,6 +198,8 @@ export default {
|
|
197
198
|
await clusterService.init();
|
198
199
|
|
199
200
|
authManager.listenForChanges();
|
201
|
+
instanceManager.startMonitoring();
|
202
|
+
repositoryManager.listenForChanges();
|
200
203
|
|
201
204
|
currentServer = createServer();
|
202
205
|
|
@@ -266,7 +269,9 @@ export default {
|
|
266
269
|
* Stops any currently running cluster services.
|
267
270
|
* @return {Promise<boolean>} Returns true if the service was stopped - false if no service was running.
|
268
271
|
*/
|
269
|
-
stop: function () {
|
272
|
+
stop: async function () {
|
273
|
+
instanceManager.stopMonitoring();
|
274
|
+
await repositoryManager.stopListening();
|
270
275
|
if (currentServer) {
|
271
276
|
return new Promise(function (resolve) {
|
272
277
|
if (currentServer) {
|
package/package.json
CHANGED
package/src/instanceManager.ts
CHANGED
@@ -49,7 +49,7 @@ const DEFAULT_HEALTH_PORT_TYPE = 'http';
|
|
49
49
|
const MIN_TIME_RUNNING = 30000; //If something didnt run for more than 30 secs - it failed
|
50
50
|
|
51
51
|
export class InstanceManager {
|
52
|
-
private _interval:
|
52
|
+
private _interval: ReturnType<typeof setTimeout> | undefined = undefined;
|
53
53
|
|
54
54
|
private readonly _instances: InstanceInfo[] = [];
|
55
55
|
|
@@ -57,11 +57,19 @@ export class InstanceManager {
|
|
57
57
|
|
58
58
|
constructor() {
|
59
59
|
this._instances = storageService.section('instances', []);
|
60
|
+
}
|
60
61
|
|
62
|
+
public startMonitoring() {
|
61
63
|
// We need to wait a bit before running the first check
|
62
64
|
this.checkInstancesLater(1000);
|
63
65
|
}
|
64
66
|
|
67
|
+
public stopMonitoring() {
|
68
|
+
if (this._interval) {
|
69
|
+
clearTimeout(this._interval);
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
65
73
|
private checkInstancesLater(time = CHECK_INTERVAL) {
|
66
74
|
if (this._interval) {
|
67
75
|
clearTimeout(this._interval);
|
package/src/repositoryManager.ts
CHANGED
@@ -43,7 +43,6 @@ class RepositoryManager extends EventEmitter {
|
|
43
43
|
super();
|
44
44
|
this._registryService = new RegistryService(Config.data.registry.url);
|
45
45
|
this.watcher = new RepositoryWatcher();
|
46
|
-
this.listenForChanges();
|
47
46
|
|
48
47
|
this.watcher.on('change', (file: string, source: SourceOfChange) => {
|
49
48
|
this.emit('change', file, source);
|
package/src/storm/codegen.ts
CHANGED
@@ -480,11 +480,13 @@ export class StormCodegen {
|
|
480
480
|
|
481
481
|
this.emitBlockStatus(blockUri, block.aiName, StormEventBlockStatusType.QA);
|
482
482
|
|
483
|
-
|
484
|
-
|
483
|
+
/* TODO: temporarily disabled - enable again when codegen is more stable
|
484
|
+
const filesToBeFixed = serviceFiles.concat(contextFiles).concat(screenFilesConverted);
|
485
|
+
const codeGenerator = new BlockCodeGenerator(blockDefinition);
|
486
|
+
*/
|
485
487
|
|
486
488
|
this.emitBlockStatus(blockUri, block.aiName, StormEventBlockStatusType.BUILDING);
|
487
|
-
await this.verifyAndFixCode(blockUri, block.aiName, codeGenerator, basePath, filesToBeFixed, allFiles);
|
489
|
+
// await this.verifyAndFixCode(blockUri, block.aiName, codeGenerator, basePath, filesToBeFixed, allFiles);
|
488
490
|
|
489
491
|
this.out.emit('data', {
|
490
492
|
type: 'BLOCK_READY',
|
@@ -26,7 +26,8 @@ import {
|
|
26
26
|
DSLAPIParser,
|
27
27
|
DSLController,
|
28
28
|
DSLConverters,
|
29
|
-
DSLDataTypeParser,
|
29
|
+
DSLDataTypeParser,
|
30
|
+
DSLEntityType,
|
30
31
|
DSLMethod,
|
31
32
|
DSLParser,
|
32
33
|
KAPLANG_ID,
|
@@ -540,12 +541,12 @@ export class StormEventParser {
|
|
540
541
|
const apiResources: { [key: string]: Resource | undefined } = {};
|
541
542
|
let dbResource: Resource | undefined = undefined;
|
542
543
|
|
543
|
-
blockInfo.resources.forEach((resource) => {
|
544
|
+
(blockInfo.resources || []).forEach((resource) => {
|
544
545
|
const port = {
|
545
546
|
type: this.toPortType(resource.type),
|
546
547
|
};
|
547
548
|
switch (resource.type) {
|
548
|
-
case 'API':
|
549
|
+
case 'API': {
|
549
550
|
const apiResource = {
|
550
551
|
kind: this.toResourceKind(resource.type),
|
551
552
|
metadata: {
|
@@ -565,6 +566,7 @@ export class StormEventParser {
|
|
565
566
|
apiResources[resource.name] = apiResource;
|
566
567
|
blockSpec.providers!.push(apiResource);
|
567
568
|
break;
|
569
|
+
}
|
568
570
|
case 'CLIENT':
|
569
571
|
blockSpec.consumers!.push({
|
570
572
|
kind: this.toResourceKind(resource.type),
|
@@ -665,7 +667,11 @@ export class StormEventParser {
|
|
665
667
|
// available rest resource
|
666
668
|
const firstKey = Object.keys(apiResources)[0];
|
667
669
|
const firstEntry = apiResources[firstKey];
|
668
|
-
firstEntry
|
670
|
+
if (firstEntry) {
|
671
|
+
firstEntry.spec.source.value += api + '\n\n';
|
672
|
+
} else {
|
673
|
+
console.warn('Unable to find resource for API', api);
|
674
|
+
}
|
669
675
|
}
|
670
676
|
});
|
671
677
|
|