@kapeta/local-cluster-service 0.17.0 → 0.18.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/CHANGELOG.md +7 -0
- package/dist/cjs/index.js +4 -2
- package/dist/cjs/src/assetManager.d.ts +2 -2
- package/dist/cjs/src/assetManager.js +16 -16
- package/dist/cjs/src/assets/routes.js +2 -2
- package/dist/cjs/src/authManager.d.ts +12 -0
- package/dist/cjs/src/authManager.js +60 -0
- package/dist/cjs/src/codeGeneratorManager.d.ts +1 -1
- package/dist/cjs/src/codeGeneratorManager.js +3 -3
- package/dist/cjs/src/configManager.js +2 -2
- package/dist/cjs/src/definitionsManager.d.ts +7 -6
- package/dist/cjs/src/definitionsManager.js +102 -18
- package/dist/cjs/src/instanceManager.d.ts +1 -1
- package/dist/cjs/src/instanceManager.js +4 -4
- package/dist/cjs/src/instances/routes.js +2 -2
- package/dist/cjs/src/operatorManager.d.ts +1 -1
- package/dist/cjs/src/operatorManager.js +7 -9
- package/dist/cjs/src/providerManager.d.ts +2 -1
- package/dist/cjs/src/providerManager.js +23 -15
- package/dist/cjs/src/repositoryManager.d.ts +2 -2
- package/dist/cjs/src/repositoryManager.js +8 -9
- package/dist/cjs/src/utils/BlockInstanceRunner.js +6 -8
- package/dist/esm/index.js +4 -2
- package/dist/esm/src/assetManager.d.ts +2 -2
- package/dist/esm/src/assetManager.js +16 -16
- package/dist/esm/src/assets/routes.js +2 -2
- package/dist/esm/src/authManager.d.ts +12 -0
- package/dist/esm/src/authManager.js +60 -0
- package/dist/esm/src/codeGeneratorManager.d.ts +1 -1
- package/dist/esm/src/codeGeneratorManager.js +3 -3
- package/dist/esm/src/configManager.js +2 -2
- package/dist/esm/src/definitionsManager.d.ts +7 -6
- package/dist/esm/src/definitionsManager.js +102 -18
- package/dist/esm/src/instanceManager.d.ts +1 -1
- package/dist/esm/src/instanceManager.js +4 -4
- package/dist/esm/src/instances/routes.js +2 -2
- package/dist/esm/src/operatorManager.d.ts +1 -1
- package/dist/esm/src/operatorManager.js +7 -9
- package/dist/esm/src/providerManager.d.ts +2 -1
- package/dist/esm/src/providerManager.js +23 -15
- package/dist/esm/src/repositoryManager.d.ts +2 -2
- package/dist/esm/src/repositoryManager.js +8 -9
- package/dist/esm/src/utils/BlockInstanceRunner.js +6 -8
- package/index.ts +4 -2
- package/package.json +1 -1
- package/src/assetManager.ts +18 -16
- package/src/assets/routes.ts +2 -2
- package/src/authManager.ts +62 -0
- package/src/codeGeneratorManager.ts +3 -3
- package/src/configManager.ts +2 -2
- package/src/definitionsManager.ts +132 -17
- package/src/instanceManager.ts +4 -4
- package/src/instances/routes.ts +2 -2
- package/src/operatorManager.ts +7 -12
- package/src/providerManager.ts +27 -19
- package/src/repositoryManager.ts +8 -11
- package/src/utils/BlockInstanceRunner.ts +6 -8
package/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
# [0.18.0](https://github.com/kapetacom/local-cluster-service/compare/v0.17.0...v0.18.0) (2023-09-02)
|
2
|
+
|
3
|
+
|
4
|
+
### Features
|
5
|
+
|
6
|
+
* Auto-rename sample plan when available ([#66](https://github.com/kapetacom/local-cluster-service/issues/66)) ([d95b844](https://github.com/kapetacom/local-cluster-service/commit/d95b844baff7e5bfceb354c854526881051f2308))
|
7
|
+
|
1
8
|
# [0.17.0](https://github.com/kapetacom/local-cluster-service/compare/v0.16.8...v0.17.0) (2023-09-02)
|
2
9
|
|
3
10
|
|
package/dist/cjs/index.js
CHANGED
@@ -27,6 +27,7 @@ const request_1 = __importDefault(require("request"));
|
|
27
27
|
const repositoryManager_1 = require("./src/repositoryManager");
|
28
28
|
const commandLineUtils_1 = require("./src/utils/commandLineUtils");
|
29
29
|
const DefaultProviderInstaller_1 = require("./src/utils/DefaultProviderInstaller");
|
30
|
+
const authManager_1 = require("./src/authManager");
|
30
31
|
let currentServer = null;
|
31
32
|
function createServer() {
|
32
33
|
const app = (0, express_1.default)();
|
@@ -127,6 +128,7 @@ exports.default = {
|
|
127
128
|
throw new Error(`Cluster service already running on: ${clusterHost}:${clusterPort}.`);
|
128
129
|
}
|
129
130
|
await clusterService_1.clusterService.init();
|
131
|
+
await authManager_1.authManager.listenForChanges();
|
130
132
|
currentServer = createServer();
|
131
133
|
const port = clusterService_1.clusterService.getClusterServicePort();
|
132
134
|
const host = clusterService_1.clusterService.getClusterServiceHost();
|
@@ -149,7 +151,7 @@ exports.default = {
|
|
149
151
|
reject(err);
|
150
152
|
});
|
151
153
|
const bindHost = (0, utils_1.getBindHost)(host);
|
152
|
-
currentServer.listen(port, bindHost, () => {
|
154
|
+
currentServer.listen(port, bindHost, async () => {
|
153
155
|
try {
|
154
156
|
(0, commandLineUtils_1.ensureCLI)().catch((e) => console.error('Failed to install CLI.', e));
|
155
157
|
}
|
@@ -158,7 +160,7 @@ exports.default = {
|
|
158
160
|
}
|
159
161
|
try {
|
160
162
|
// Start installation process for all default providers
|
161
|
-
repositoryManager_1.repositoryManager.ensureDefaultProviders();
|
163
|
+
await repositoryManager_1.repositoryManager.ensureDefaultProviders();
|
162
164
|
}
|
163
165
|
catch (e) {
|
164
166
|
console.error('Failed to install default providers.', e);
|
@@ -17,8 +17,8 @@ declare class AssetManager {
|
|
17
17
|
* @param {string[]} [assetKinds]
|
18
18
|
* @returns {{path: *, ref: string, data: *, editable: boolean, kind: *, exists: boolean}[]}
|
19
19
|
*/
|
20
|
-
getAssets(assetKinds?: string[]): EnrichedAsset[]
|
21
|
-
getPlans(): EnrichedAsset[]
|
20
|
+
getAssets(assetKinds?: string[]): Promise<EnrichedAsset[]>;
|
21
|
+
getPlans(): Promise<EnrichedAsset[]>;
|
22
22
|
getPlan(ref: string, noCache?: boolean): Promise<Definition>;
|
23
23
|
getAsset(ref: string, noCache?: boolean, autoFetch?: boolean): Promise<EnrichedAsset | undefined>;
|
24
24
|
createAsset(path: string, yaml: BlockDefinition, sourceOfChange?: SourceOfChange): Promise<EnrichedAsset[]>;
|
@@ -48,9 +48,9 @@ class AssetManager {
|
|
48
48
|
* @param {string[]} [assetKinds]
|
49
49
|
* @returns {{path: *, ref: string, data: *, editable: boolean, kind: *, exists: boolean}[]}
|
50
50
|
*/
|
51
|
-
getAssets(assetKinds) {
|
51
|
+
async getAssets(assetKinds) {
|
52
52
|
if (!assetKinds) {
|
53
|
-
const blockTypeProviders = definitionsManager_1.definitionsManager.getDefinitions([
|
53
|
+
const blockTypeProviders = await definitionsManager_1.definitionsManager.getDefinitions([
|
54
54
|
'core/block-type',
|
55
55
|
'core/block-type-operator',
|
56
56
|
]);
|
@@ -59,10 +59,10 @@ class AssetManager {
|
|
59
59
|
});
|
60
60
|
assetKinds.push('core/plan');
|
61
61
|
}
|
62
|
-
const assets = definitionsManager_1.definitionsManager.getDefinitions(assetKinds);
|
62
|
+
const assets = await definitionsManager_1.definitionsManager.getDefinitions(assetKinds);
|
63
63
|
return assets.map(enrichAsset);
|
64
64
|
}
|
65
|
-
getPlans() {
|
65
|
+
async getPlans() {
|
66
66
|
return this.getAssets(['core/plan']);
|
67
67
|
}
|
68
68
|
async getPlan(ref, noCache = false) {
|
@@ -82,17 +82,16 @@ class AssetManager {
|
|
82
82
|
if (autoFetch) {
|
83
83
|
await repositoryManager_1.repositoryManager.ensureAsset(uri.handle, uri.name, uri.version, true);
|
84
84
|
}
|
85
|
-
|
86
|
-
|
87
|
-
.map(enrichAsset)
|
88
|
-
.find((a) => (0, nodejs_utils_1.parseKapetaUri)(a.ref).equals(uri));
|
89
|
-
if (autoFetch && !asset) {
|
85
|
+
const definitionInfo = await definitionsManager_1.definitionsManager.getDefinition(ref);
|
86
|
+
if (autoFetch && !definitionInfo) {
|
90
87
|
throw new Error('Asset not found: ' + ref);
|
91
88
|
}
|
92
|
-
if (
|
89
|
+
if (definitionInfo) {
|
90
|
+
const asset = enrichAsset(definitionInfo);
|
93
91
|
cacheManager_1.cacheManager.set(cacheKey, asset, CACHE_TTL);
|
92
|
+
return asset;
|
94
93
|
}
|
95
|
-
return
|
94
|
+
return undefined;
|
96
95
|
}
|
97
96
|
async createAsset(path, yaml, sourceOfChange = 'filesystem') {
|
98
97
|
if (await fs_extra_1.default.pathExists(path)) {
|
@@ -113,7 +112,7 @@ class AssetManager {
|
|
113
112
|
definitionsManager_1.definitionsManager.clearCache();
|
114
113
|
console.log(`Created asset at: ${path}`);
|
115
114
|
const ref = `kapeta://${yaml.metadata.name}:local`;
|
116
|
-
this.maybeGenerateCode(ref, path, yaml);
|
115
|
+
await this.maybeGenerateCode(ref, path, yaml);
|
117
116
|
return asset;
|
118
117
|
}
|
119
118
|
async updateAsset(ref, yaml, sourceOfChange = 'filesystem') {
|
@@ -133,7 +132,7 @@ class AssetManager {
|
|
133
132
|
console.log(`Updated asset at: ${asset.ymlPath}`);
|
134
133
|
cacheManager_1.cacheManager.remove(toKey(ref));
|
135
134
|
definitionsManager_1.definitionsManager.clearCache();
|
136
|
-
this.maybeGenerateCode(asset.ref, asset.ymlPath, yaml);
|
135
|
+
await this.maybeGenerateCode(asset.ref, asset.ymlPath, yaml);
|
137
136
|
}
|
138
137
|
async importFile(filePath) {
|
139
138
|
if (filePath.startsWith('file://')) {
|
@@ -152,7 +151,8 @@ class AssetManager {
|
|
152
151
|
cacheManager_1.cacheManager.remove(key);
|
153
152
|
});
|
154
153
|
definitionsManager_1.definitionsManager.clearCache();
|
155
|
-
|
154
|
+
const assets = await this.getAssets();
|
155
|
+
return assets.filter((a) => refs.some((ref) => compareRefs(ref, a.ref)));
|
156
156
|
}
|
157
157
|
async unregisterAsset(ref) {
|
158
158
|
const asset = await this.getAsset(ref, true);
|
@@ -176,9 +176,9 @@ class AssetManager {
|
|
176
176
|
definitionsManager_1.definitionsManager.clearCache();
|
177
177
|
return await repositoryManager_1.repositoryManager.ensureAsset(uri.handle, uri.name, uri.version, false);
|
178
178
|
}
|
179
|
-
maybeGenerateCode(ref, ymlPath, block) {
|
179
|
+
async maybeGenerateCode(ref, ymlPath, block) {
|
180
180
|
ref = (0, utils_1.normalizeKapetaUri)(ref);
|
181
|
-
if (codeGeneratorManager_1.codeGeneratorManager.canGenerateCode(block)) {
|
181
|
+
if (await codeGeneratorManager_1.codeGeneratorManager.canGenerateCode(block)) {
|
182
182
|
const assetTitle = block.metadata.title ? block.metadata.title : (0, nodejs_utils_1.parseKapetaUri)(block.metadata.name).name;
|
183
183
|
taskManager_1.taskManager.add(`codegen:${ref}`, async () => {
|
184
184
|
await codeGeneratorManager_1.codeGeneratorManager.generate(ymlPath, block);
|
@@ -28,8 +28,8 @@ router.use('/', stringBody_1.stringBody);
|
|
28
28
|
/**
|
29
29
|
* Get all local assets available
|
30
30
|
*/
|
31
|
-
router.get('/', (req, res) => {
|
32
|
-
res.send(assetManager_1.assetManager.getAssets([]));
|
31
|
+
router.get('/', async (req, res) => {
|
32
|
+
res.send(await assetManager_1.assetManager.getAssets([]));
|
33
33
|
});
|
34
34
|
/**
|
35
35
|
* Get single asset
|
@@ -0,0 +1,12 @@
|
|
1
|
+
/// <reference types="node" />
|
2
|
+
import { EventEmitter } from 'node:events';
|
3
|
+
declare class AuthManager extends EventEmitter {
|
4
|
+
private watcher?;
|
5
|
+
private hadToken;
|
6
|
+
constructor();
|
7
|
+
listenForChanges(): void;
|
8
|
+
private hasToken;
|
9
|
+
private handleFileChange;
|
10
|
+
}
|
11
|
+
export declare const authManager: AuthManager;
|
12
|
+
export {};
|
@@ -0,0 +1,60 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.authManager = void 0;
|
7
|
+
const node_events_1 = require("node:events");
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
9
|
+
const chokidar_1 = __importDefault(require("chokidar"));
|
10
|
+
const local_cluster_config_1 = __importDefault(require("@kapeta/local-cluster-config"));
|
11
|
+
const definitionsManager_1 = require("./definitionsManager");
|
12
|
+
const nodejs_api_client_1 = require("@kapeta/nodejs-api-client");
|
13
|
+
const socketManager_1 = require("./socketManager");
|
14
|
+
class AuthManager extends node_events_1.EventEmitter {
|
15
|
+
watcher;
|
16
|
+
hadToken;
|
17
|
+
constructor() {
|
18
|
+
super();
|
19
|
+
this.hadToken = this.hasToken();
|
20
|
+
}
|
21
|
+
listenForChanges() {
|
22
|
+
const parentDir = node_path_1.default.dirname(local_cluster_config_1.default.getKapetaBasedir());
|
23
|
+
//We watch the parent dir to catch changes to the base dir itself
|
24
|
+
this.watcher = chokidar_1.default.watch(parentDir, {
|
25
|
+
followSymlinks: false,
|
26
|
+
ignorePermissionErrors: true,
|
27
|
+
disableGlobbing: true,
|
28
|
+
persistent: true,
|
29
|
+
ignoreInitial: true,
|
30
|
+
depth: 1,
|
31
|
+
ignored: (path) => {
|
32
|
+
return !path.startsWith(local_cluster_config_1.default.getKapetaBasedir());
|
33
|
+
},
|
34
|
+
});
|
35
|
+
this.watcher.add(local_cluster_config_1.default.getKapetaBasedir());
|
36
|
+
this.watcher.on('all', this.handleFileChange.bind(this));
|
37
|
+
this.watcher.on('error', (error) => {
|
38
|
+
console.log('Error watching repository', error);
|
39
|
+
});
|
40
|
+
this.watcher.on('ready', () => {
|
41
|
+
console.log('Watching for auth changes: %s', local_cluster_config_1.default.getKapetaBasedir());
|
42
|
+
});
|
43
|
+
}
|
44
|
+
hasToken() {
|
45
|
+
const api = new nodejs_api_client_1.KapetaAPI();
|
46
|
+
return api.hasToken();
|
47
|
+
}
|
48
|
+
async handleFileChange(eventName, path) {
|
49
|
+
const hasTokenNow = this.hasToken();
|
50
|
+
if (this.hadToken !== hasTokenNow) {
|
51
|
+
socketManager_1.socketManager.emitGlobal('auth-change', {});
|
52
|
+
if (hasTokenNow) {
|
53
|
+
// Clear the cache in case we need to rewrite the sample plan
|
54
|
+
definitionsManager_1.definitionsManager.clearCache();
|
55
|
+
}
|
56
|
+
this.hadToken = hasTokenNow;
|
57
|
+
}
|
58
|
+
}
|
59
|
+
}
|
60
|
+
exports.authManager = new AuthManager();
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { BlockDefinition } from '@kapeta/schemas';
|
2
2
|
declare class CodeGeneratorManager {
|
3
3
|
reload(): Promise<void>;
|
4
|
-
canGenerateCode(yamlContent: BlockDefinition): boolean
|
4
|
+
canGenerateCode(yamlContent: BlockDefinition): Promise<boolean>;
|
5
5
|
generate(yamlFile: string, yamlContent: BlockDefinition): Promise<void>;
|
6
6
|
}
|
7
7
|
export declare const codeGeneratorManager: CodeGeneratorManager;
|
@@ -12,7 +12,7 @@ const BLOCK_TYPE_KIND = 'core/block-type';
|
|
12
12
|
class CodeGeneratorManager {
|
13
13
|
async reload() {
|
14
14
|
codegen_1.registry.reset();
|
15
|
-
const languageTargets = definitionsManager_1.definitionsManager.getDefinitions(TARGET_KIND);
|
15
|
+
const languageTargets = await definitionsManager_1.definitionsManager.getDefinitions(TARGET_KIND);
|
16
16
|
for (const languageTarget of languageTargets) {
|
17
17
|
const key = `${languageTarget.definition.metadata.name}:${languageTarget.version}`;
|
18
18
|
try {
|
@@ -29,12 +29,12 @@ class CodeGeneratorManager {
|
|
29
29
|
}
|
30
30
|
}
|
31
31
|
}
|
32
|
-
canGenerateCode(yamlContent) {
|
32
|
+
async canGenerateCode(yamlContent) {
|
33
33
|
if (!yamlContent.spec.target?.kind) {
|
34
34
|
//Not all block types have targets
|
35
35
|
return false;
|
36
36
|
}
|
37
|
-
const blockTypes = definitionsManager_1.definitionsManager.getDefinitions(BLOCK_TYPE_KIND);
|
37
|
+
const blockTypes = await definitionsManager_1.definitionsManager.getDefinitions(BLOCK_TYPE_KIND);
|
38
38
|
const blockTypeKinds = blockTypes.map((blockType) => blockType.definition.metadata.name.toLowerCase() + ':' + blockType.version);
|
39
39
|
return !!(yamlContent && yamlContent.kind && blockTypeKinds.indexOf(yamlContent.kind.toLowerCase()) > -1);
|
40
40
|
}
|
@@ -61,7 +61,7 @@ class ConfigManager {
|
|
61
61
|
if (systemId) {
|
62
62
|
systemId = (0, utils_1.normalizeKapetaUri)(systemId);
|
63
63
|
}
|
64
|
-
const planAssets = assetManager_1.assetManager.getPlans();
|
64
|
+
const planAssets = await assetManager_1.assetManager.getPlans();
|
65
65
|
const blockUri = (0, nodejs_utils_1.parseKapetaUri)(blockRef);
|
66
66
|
let matchingIdentities = [];
|
67
67
|
planAssets.forEach((planAsset) => {
|
@@ -99,7 +99,7 @@ class ConfigManager {
|
|
99
99
|
async verifyIdentity(blockRef, systemId, instanceId) {
|
100
100
|
blockRef = (0, utils_1.normalizeKapetaUri)(blockRef);
|
101
101
|
systemId = (0, utils_1.normalizeKapetaUri)(systemId);
|
102
|
-
const planAssets = assetManager_1.assetManager.getPlans();
|
102
|
+
const planAssets = await assetManager_1.assetManager.getPlans();
|
103
103
|
const systemUri = systemId ? (0, nodejs_utils_1.parseKapetaUri)(systemId) : null;
|
104
104
|
const blockUri = (0, nodejs_utils_1.parseKapetaUri)(blockRef);
|
105
105
|
let found = false;
|
@@ -1,11 +1,12 @@
|
|
1
1
|
import { DefinitionInfo } from '@kapeta/local-cluster-config';
|
2
|
+
export declare const SAMPLE_PLAN_NAME = "kapeta/sample-nodejs-plan";
|
2
3
|
declare class DefinitionsManager {
|
3
|
-
private
|
4
|
-
private
|
5
|
-
getDefinitions(kindFilter?: string | string[]): DefinitionInfo[]
|
6
|
-
exists(ref: string): boolean
|
7
|
-
getProviderDefinitions(): DefinitionInfo[]
|
8
|
-
getDefinition(ref: string): DefinitionInfo | undefined
|
4
|
+
private resolveDefinitionsAndSamples;
|
5
|
+
private applyFilters;
|
6
|
+
getDefinitions(kindFilter?: string | string[]): Promise<DefinitionInfo[]>;
|
7
|
+
exists(ref: string): Promise<boolean>;
|
8
|
+
getProviderDefinitions(): Promise<DefinitionInfo[]>;
|
9
|
+
getDefinition(ref: string): Promise<DefinitionInfo | undefined>;
|
9
10
|
clearCache(): void;
|
10
11
|
}
|
11
12
|
export declare const definitionsManager: DefinitionsManager;
|
@@ -3,36 +3,120 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
4
|
};
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
exports.definitionsManager = void 0;
|
6
|
+
exports.definitionsManager = exports.SAMPLE_PLAN_NAME = void 0;
|
7
7
|
const local_cluster_config_1 = __importDefault(require("@kapeta/local-cluster-config"));
|
8
8
|
const nodejs_utils_1 = require("@kapeta/nodejs-utils");
|
9
9
|
const cacheManager_1 = require("./cacheManager");
|
10
|
+
const nodejs_api_client_1 = require("@kapeta/nodejs-api-client");
|
11
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
12
|
+
const utils_1 = require("./utils/utils");
|
13
|
+
const yaml_1 = __importDefault(require("yaml"));
|
14
|
+
const nodejs_registry_utils_1 = require("@kapeta/nodejs-registry-utils");
|
15
|
+
const progressListener_1 = require("./progressListener");
|
16
|
+
const path_1 = __importDefault(require("path"));
|
17
|
+
exports.SAMPLE_PLAN_NAME = 'kapeta/sample-nodejs-plan';
|
18
|
+
function applyHandleChange(definition, targetHandle) {
|
19
|
+
const originalUri = (0, nodejs_utils_1.parseKapetaUri)(definition.definition.metadata.name);
|
20
|
+
definition.definition.metadata.name = `${targetHandle}/${originalUri.name}`;
|
21
|
+
return definition;
|
22
|
+
}
|
23
|
+
function normalizeFilters(kindFilter) {
|
24
|
+
let resolvedFilters = [];
|
25
|
+
if (kindFilter) {
|
26
|
+
if (Array.isArray(kindFilter)) {
|
27
|
+
resolvedFilters = [...kindFilter];
|
28
|
+
}
|
29
|
+
else {
|
30
|
+
resolvedFilters = [kindFilter];
|
31
|
+
}
|
32
|
+
}
|
33
|
+
return resolvedFilters.map((k) => k.toLowerCase());
|
34
|
+
}
|
10
35
|
class DefinitionsManager {
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
36
|
+
async resolveDefinitionsAndSamples() {
|
37
|
+
const definitions = local_cluster_config_1.default.getDefinitions();
|
38
|
+
const samplePlan = definitions.find((d) => d.version === 'local' && d.definition.metadata.name === exports.SAMPLE_PLAN_NAME);
|
39
|
+
if (!samplePlan) {
|
40
|
+
return definitions;
|
41
|
+
}
|
42
|
+
// We will only rewrite the sample plan once since we change the handle to be the users handle
|
43
|
+
const api = new nodejs_api_client_1.KapetaAPI();
|
44
|
+
if (!api.hasToken()) {
|
45
|
+
// Not logged in yet, so we can't rewrite the sample plan
|
46
|
+
return definitions;
|
47
|
+
}
|
48
|
+
const profile = await api.getCurrentIdentity();
|
49
|
+
if (!profile) {
|
50
|
+
// Not logged in yet, so we can't rewrite the sample plan
|
51
|
+
return definitions;
|
52
|
+
}
|
53
|
+
console.log('Rewriting sample plan to use handle %s', profile.handle);
|
54
|
+
applyHandleChange(samplePlan, profile.handle);
|
55
|
+
const planDef = samplePlan.definition;
|
56
|
+
const blockRefs = new Set();
|
57
|
+
planDef.spec.blocks.forEach((b) => {
|
58
|
+
const blockUri = (0, nodejs_utils_1.parseKapetaUri)(b.block.ref);
|
59
|
+
if (blockUri.version === 'local') {
|
60
|
+
blockRefs.add(blockUri.id);
|
61
|
+
b.block.ref = (0, utils_1.normalizeKapetaUri)(`${profile.handle}/${blockUri.name}:local`);
|
15
62
|
}
|
16
|
-
|
63
|
+
});
|
64
|
+
// Rewrite all blocks that are referenced by the sample plan
|
65
|
+
const rewrittenBlocks = Array.from(blockRefs)
|
66
|
+
.map((ref) => definitions.find((d) => (0, utils_1.normalizeKapetaUri)(d.definition.metadata.name + ':' + d.version) === (0, utils_1.normalizeKapetaUri)(ref)))
|
67
|
+
.filter((d) => d !== undefined)
|
68
|
+
.map((d) => applyHandleChange(d, profile.handle));
|
69
|
+
// Persist the rewritten assets
|
70
|
+
const progressListener = new progressListener_1.ProgressListener();
|
71
|
+
const rewrittenAssets = [samplePlan, ...rewrittenBlocks];
|
72
|
+
const originalRefs = [`${exports.SAMPLE_PLAN_NAME}:local`, ...Array.from(blockRefs)];
|
73
|
+
// Store the original paths on the assets - we'll need them later
|
74
|
+
for (const asset of rewrittenAssets) {
|
75
|
+
asset.path = await fs_extra_1.default.readlink(asset.path);
|
76
|
+
asset.ymlPath = path_1.default.join(asset.path, path_1.default.basename(asset.ymlPath));
|
77
|
+
}
|
78
|
+
// Uninstall the original assets
|
79
|
+
// This removes the symlinks
|
80
|
+
console.log('Uninstalling original assets', originalRefs);
|
81
|
+
try {
|
82
|
+
await nodejs_registry_utils_1.Actions.uninstall(progressListener, originalRefs);
|
83
|
+
}
|
84
|
+
catch (err) {
|
85
|
+
console.warn('Failed to uninstall original assets', err);
|
17
86
|
}
|
18
|
-
|
87
|
+
for (const asset of rewrittenAssets) {
|
88
|
+
console.log('Updating %s ', asset.ymlPath);
|
89
|
+
await fs_extra_1.default.writeFile(asset.ymlPath, yaml_1.default.stringify(asset.definition));
|
90
|
+
console.log('Linking %s ', asset.path);
|
91
|
+
await nodejs_registry_utils_1.Actions.link(progressListener, asset.path);
|
92
|
+
}
|
93
|
+
console.log('Rewrite done for sample plan');
|
94
|
+
// Return the rewritten definitions
|
95
|
+
return local_cluster_config_1.default.getDefinitions();
|
19
96
|
}
|
20
|
-
|
21
|
-
|
97
|
+
applyFilters(definitions, kindFilter) {
|
98
|
+
if (kindFilter.length === 0) {
|
99
|
+
return definitions;
|
100
|
+
}
|
101
|
+
return definitions.filter((d) => {
|
102
|
+
return kindFilter.includes(d.definition.kind.toLowerCase());
|
103
|
+
});
|
22
104
|
}
|
23
|
-
getDefinitions(kindFilter) {
|
24
|
-
|
25
|
-
|
105
|
+
async getDefinitions(kindFilter) {
|
106
|
+
kindFilter = normalizeFilters(kindFilter);
|
107
|
+
const definitions = await (0, cacheManager_1.doCached)('definitionsManager:all', () => this.resolveDefinitionsAndSamples());
|
108
|
+
return this.applyFilters(definitions, kindFilter);
|
26
109
|
}
|
27
|
-
exists(ref) {
|
28
|
-
return !!this.getDefinition(ref);
|
110
|
+
async exists(ref) {
|
111
|
+
return !!(await this.getDefinition(ref));
|
29
112
|
}
|
30
|
-
getProviderDefinitions() {
|
31
|
-
return (0, cacheManager_1.doCached)('providers', () => local_cluster_config_1.default.getProviderDefinitions());
|
113
|
+
async getProviderDefinitions() {
|
114
|
+
return (0, cacheManager_1.doCached)('definitionsManager:providers', () => local_cluster_config_1.default.getProviderDefinitions());
|
32
115
|
}
|
33
|
-
getDefinition(ref) {
|
116
|
+
async getDefinition(ref) {
|
34
117
|
const uri = (0, nodejs_utils_1.parseKapetaUri)(ref);
|
35
|
-
|
118
|
+
const definitions = await this.getDefinitions();
|
119
|
+
return definitions.find((d) => {
|
36
120
|
if (!uri.version) {
|
37
121
|
return d.definition.metadata.name === uri.fullName;
|
38
122
|
}
|
@@ -7,7 +7,7 @@ export declare class InstanceManager {
|
|
7
7
|
constructor();
|
8
8
|
private checkInstancesLater;
|
9
9
|
getInstances(): InstanceInfo[];
|
10
|
-
getInstancesForPlan(systemId: string): InstanceInfo[]
|
10
|
+
getInstancesForPlan(systemId: string): Promise<InstanceInfo[]>;
|
11
11
|
getInstance(systemId: string, instanceId: string): InstanceInfo | undefined;
|
12
12
|
private exclusive;
|
13
13
|
getLogs(systemId: string, instanceId: string): Promise<LogEntry[]>;
|
@@ -47,12 +47,12 @@ class InstanceManager {
|
|
47
47
|
}
|
48
48
|
return [...this._instances];
|
49
49
|
}
|
50
|
-
getInstancesForPlan(systemId) {
|
50
|
+
async getInstancesForPlan(systemId) {
|
51
51
|
if (!this._instances) {
|
52
52
|
return [];
|
53
53
|
}
|
54
54
|
systemId = (0, utils_1.normalizeKapetaUri)(systemId);
|
55
|
-
const planInfo = definitionsManager_1.definitionsManager.getDefinition(systemId);
|
55
|
+
const planInfo = await definitionsManager_1.definitionsManager.getDefinition(systemId);
|
56
56
|
if (!planInfo) {
|
57
57
|
return [];
|
58
58
|
}
|
@@ -362,9 +362,9 @@ class InstanceManager {
|
|
362
362
|
await this.saveInternalInstance(instance);
|
363
363
|
const blockSpec = blockAsset.data.spec;
|
364
364
|
if (blockSpec.consumers) {
|
365
|
-
const promises = blockSpec.consumers.map((consumer) => {
|
365
|
+
const promises = blockSpec.consumers.map(async (consumer) => {
|
366
366
|
const consumerUri = (0, nodejs_utils_1.parseKapetaUri)(consumer.kind);
|
367
|
-
const asset = definitionsManager_1.definitionsManager.getDefinition(consumer.kind);
|
367
|
+
const asset = await definitionsManager_1.definitionsManager.getDefinition(consumer.kind);
|
368
368
|
if (!asset) {
|
369
369
|
// Definition not found
|
370
370
|
return Promise.resolve();
|
@@ -23,8 +23,8 @@ router.get('/', (req, res) => {
|
|
23
23
|
/**
|
24
24
|
* Get all instances
|
25
25
|
*/
|
26
|
-
router.get('/:systemId/instances', (req, res) => {
|
27
|
-
res.send(instanceManager_1.instanceManager.getInstancesForPlan(req.params.systemId));
|
26
|
+
router.get('/:systemId/instances', async (req, res) => {
|
27
|
+
res.send(await instanceManager_1.instanceManager.getInstancesForPlan(req.params.systemId));
|
28
28
|
});
|
29
29
|
/**
|
30
30
|
* Get single instance in a plan
|
@@ -21,7 +21,7 @@ declare class OperatorManager {
|
|
21
21
|
* @param {string} version
|
22
22
|
* @return {Operator}
|
23
23
|
*/
|
24
|
-
getOperator(resourceType: string, version: string): Operator
|
24
|
+
getOperator(resourceType: string, version: string): Promise<Operator>;
|
25
25
|
/**
|
26
26
|
* Get information about a specific consumed resource
|
27
27
|
*/
|
@@ -17,6 +17,7 @@ const lodash_1 = __importDefault(require("lodash"));
|
|
17
17
|
const async_lock_1 = __importDefault(require("async-lock"));
|
18
18
|
const taskManager_1 = require("./taskManager");
|
19
19
|
exports.KIND_OPERATOR = 'core/resource-type-operator';
|
20
|
+
const KIND_PLAN = 'core/plan';
|
20
21
|
class Operator {
|
21
22
|
_data;
|
22
23
|
constructor(data) {
|
@@ -49,8 +50,8 @@ class OperatorManager {
|
|
49
50
|
* @param {string} version
|
50
51
|
* @return {Operator}
|
51
52
|
*/
|
52
|
-
getOperator(resourceType, version) {
|
53
|
-
const operators = definitionsManager_1.definitionsManager.getDefinitions(exports.KIND_OPERATOR);
|
53
|
+
async getOperator(resourceType, version) {
|
54
|
+
const operators = await definitionsManager_1.definitionsManager.getDefinitions(exports.KIND_OPERATOR);
|
54
55
|
const operator = operators.find((operator) => operator.definition &&
|
55
56
|
operator.definition.metadata &&
|
56
57
|
operator.definition.metadata.name &&
|
@@ -69,7 +70,7 @@ class OperatorManager {
|
|
69
70
|
*/
|
70
71
|
async getConsumerResourceInfo(systemId, fromServiceId, resourceType, portType, name, environment) {
|
71
72
|
systemId = (0, utils_1.normalizeKapetaUri)(systemId);
|
72
|
-
const plans = definitionsManager_1.definitionsManager.getDefinitions(
|
73
|
+
const plans = await definitionsManager_1.definitionsManager.getDefinitions(KIND_PLAN);
|
73
74
|
const planUri = (0, nodejs_utils_1.parseKapetaUri)(systemId);
|
74
75
|
const currentPlan = plans.find((plan) => plan.definition.metadata.name === planUri.fullName && plan.version === planUri.version);
|
75
76
|
if (!currentPlan) {
|
@@ -79,10 +80,7 @@ class OperatorManager {
|
|
79
80
|
if (!currentInstance) {
|
80
81
|
throw new Error(`Unknown instance: ${fromServiceId} in plan ${systemId}`);
|
81
82
|
}
|
82
|
-
const
|
83
|
-
const blockDefinition = definitionsManager_1.definitionsManager
|
84
|
-
.getDefinitions()
|
85
|
-
.find((definition) => definition.version === blockUri.version && definition.definition.metadata.name === blockUri.fullName);
|
83
|
+
const blockDefinition = await definitionsManager_1.definitionsManager.getDefinition(currentInstance.block.ref);
|
86
84
|
if (!blockDefinition) {
|
87
85
|
throw new Error(`Unknown block: ${currentInstance.block.ref} in plan ${systemId}`);
|
88
86
|
}
|
@@ -91,7 +89,7 @@ class OperatorManager {
|
|
91
89
|
throw new Error(`Unknown resource: ${name} in block ${currentInstance.block.ref} in plan ${systemId}`);
|
92
90
|
}
|
93
91
|
const kindUri = (0, nodejs_utils_1.parseKapetaUri)(blockResource.kind);
|
94
|
-
const operator = this.getOperator(resourceType, kindUri.version);
|
92
|
+
const operator = await this.getOperator(resourceType, kindUri.version);
|
95
93
|
const credentials = operator.getCredentials();
|
96
94
|
const container = await this.ensureResource(systemId, resourceType, kindUri.version);
|
97
95
|
const portInfo = await container.getPort(portType);
|
@@ -122,7 +120,7 @@ class OperatorManager {
|
|
122
120
|
systemId = (0, utils_1.normalizeKapetaUri)(systemId);
|
123
121
|
const key = `${systemId}#${resourceType}:${version}`;
|
124
122
|
return await this.operatorLock.acquire(key, async () => {
|
125
|
-
const operator = this.getOperator(resourceType, version);
|
123
|
+
const operator = await this.getOperator(resourceType, version);
|
126
124
|
const operatorData = operator.getLocalData();
|
127
125
|
const portTypes = Object.keys(operatorData.ports);
|
128
126
|
portTypes.sort();
|
@@ -1,5 +1,6 @@
|
|
1
|
+
import { DefinitionInfo } from '@kapeta/local-cluster-config';
|
1
2
|
declare class ProviderManager {
|
2
|
-
getWebProviders():
|
3
|
+
getWebProviders(): Promise<DefinitionInfo[]>;
|
3
4
|
getProviderWebJS(handle: string, name: string, version: string, sourceMap?: boolean): Promise<unknown>;
|
4
5
|
}
|
5
6
|
export declare const providerManager: ProviderManager;
|
@@ -11,8 +11,9 @@ const cacheManager_1 = require("./cacheManager");
|
|
11
11
|
const request_1 = __importDefault(require("request"));
|
12
12
|
const PROVIDER_FILE_BASE = 'https://providers.kapeta.com/files';
|
13
13
|
class ProviderManager {
|
14
|
-
getWebProviders() {
|
15
|
-
|
14
|
+
async getWebProviders() {
|
15
|
+
const providers = await definitionsManager_1.definitionsManager.getProviderDefinitions();
|
16
|
+
return providers.filter((providerDefinition) => providerDefinition.hasWeb);
|
16
17
|
}
|
17
18
|
async getProviderWebJS(handle, name, version, sourceMap = false) {
|
18
19
|
const fullName = `${handle}/${name}`;
|
@@ -22,7 +23,8 @@ class ProviderManager {
|
|
22
23
|
if (file && (await fs_extra_1.default.pathExists(file))) {
|
23
24
|
return fs_extra_1.default.readFile(file, 'utf8');
|
24
25
|
}
|
25
|
-
const
|
26
|
+
const providers = await this.getWebProviders();
|
27
|
+
const installedProvider = providers.find((providerDefinition) => {
|
26
28
|
return providerDefinition.definition.metadata.name === fullName && providerDefinition.version === version;
|
27
29
|
});
|
28
30
|
if (installedProvider) {
|
@@ -57,16 +59,22 @@ class ProviderManager {
|
|
57
59
|
});
|
58
60
|
}
|
59
61
|
}
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
providerDefinitions.
|
64
|
-
console.log('
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
}
|
69
|
-
|
70
|
-
|
71
|
-
|
62
|
+
definitionsManager_1.definitionsManager
|
63
|
+
.getProviderDefinitions()
|
64
|
+
.then((providerDefinitions) => {
|
65
|
+
if (providerDefinitions.length > 0) {
|
66
|
+
console.log('## Loaded the following providers ##');
|
67
|
+
providerDefinitions.forEach((providerDefinition) => {
|
68
|
+
console.log(' - %s[%s:%s]', providerDefinition.definition.kind, providerDefinition.definition.metadata.name, providerDefinition.version);
|
69
|
+
console.log(' from %s', providerDefinition.path);
|
70
|
+
});
|
71
|
+
console.log('##');
|
72
|
+
}
|
73
|
+
else {
|
74
|
+
console.log('## No providers found ##');
|
75
|
+
}
|
76
|
+
})
|
77
|
+
.catch((e) => {
|
78
|
+
console.error('Failed to load providers', e);
|
79
|
+
});
|
72
80
|
exports.providerManager = new ProviderManager();
|
@@ -12,8 +12,8 @@ declare class RepositoryManager {
|
|
12
12
|
*/
|
13
13
|
setSourceOfChangeFor(file: string, source: SourceOfChange): Promise<void>;
|
14
14
|
clearSourceOfChangeFor(file: string): Promise<void>;
|
15
|
-
ensureDefaultProviders(): void
|
16
|
-
private
|
15
|
+
ensureDefaultProviders(): Promise<void>;
|
16
|
+
private scheduleInstallation;
|
17
17
|
ensureAsset(handle: string, name: string, version: string, wait?: boolean): Promise<undefined | Task[]>;
|
18
18
|
}
|
19
19
|
export declare const repositoryManager: RepositoryManager;
|