@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.
Files changed (57) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/cjs/index.js +4 -2
  3. package/dist/cjs/src/assetManager.d.ts +2 -2
  4. package/dist/cjs/src/assetManager.js +16 -16
  5. package/dist/cjs/src/assets/routes.js +2 -2
  6. package/dist/cjs/src/authManager.d.ts +12 -0
  7. package/dist/cjs/src/authManager.js +60 -0
  8. package/dist/cjs/src/codeGeneratorManager.d.ts +1 -1
  9. package/dist/cjs/src/codeGeneratorManager.js +3 -3
  10. package/dist/cjs/src/configManager.js +2 -2
  11. package/dist/cjs/src/definitionsManager.d.ts +7 -6
  12. package/dist/cjs/src/definitionsManager.js +102 -18
  13. package/dist/cjs/src/instanceManager.d.ts +1 -1
  14. package/dist/cjs/src/instanceManager.js +4 -4
  15. package/dist/cjs/src/instances/routes.js +2 -2
  16. package/dist/cjs/src/operatorManager.d.ts +1 -1
  17. package/dist/cjs/src/operatorManager.js +7 -9
  18. package/dist/cjs/src/providerManager.d.ts +2 -1
  19. package/dist/cjs/src/providerManager.js +23 -15
  20. package/dist/cjs/src/repositoryManager.d.ts +2 -2
  21. package/dist/cjs/src/repositoryManager.js +8 -9
  22. package/dist/cjs/src/utils/BlockInstanceRunner.js +6 -8
  23. package/dist/esm/index.js +4 -2
  24. package/dist/esm/src/assetManager.d.ts +2 -2
  25. package/dist/esm/src/assetManager.js +16 -16
  26. package/dist/esm/src/assets/routes.js +2 -2
  27. package/dist/esm/src/authManager.d.ts +12 -0
  28. package/dist/esm/src/authManager.js +60 -0
  29. package/dist/esm/src/codeGeneratorManager.d.ts +1 -1
  30. package/dist/esm/src/codeGeneratorManager.js +3 -3
  31. package/dist/esm/src/configManager.js +2 -2
  32. package/dist/esm/src/definitionsManager.d.ts +7 -6
  33. package/dist/esm/src/definitionsManager.js +102 -18
  34. package/dist/esm/src/instanceManager.d.ts +1 -1
  35. package/dist/esm/src/instanceManager.js +4 -4
  36. package/dist/esm/src/instances/routes.js +2 -2
  37. package/dist/esm/src/operatorManager.d.ts +1 -1
  38. package/dist/esm/src/operatorManager.js +7 -9
  39. package/dist/esm/src/providerManager.d.ts +2 -1
  40. package/dist/esm/src/providerManager.js +23 -15
  41. package/dist/esm/src/repositoryManager.d.ts +2 -2
  42. package/dist/esm/src/repositoryManager.js +8 -9
  43. package/dist/esm/src/utils/BlockInstanceRunner.js +6 -8
  44. package/index.ts +4 -2
  45. package/package.json +1 -1
  46. package/src/assetManager.ts +18 -16
  47. package/src/assets/routes.ts +2 -2
  48. package/src/authManager.ts +62 -0
  49. package/src/codeGeneratorManager.ts +3 -3
  50. package/src/configManager.ts +2 -2
  51. package/src/definitionsManager.ts +132 -17
  52. package/src/instanceManager.ts +4 -4
  53. package/src/instances/routes.ts +2 -2
  54. package/src/operatorManager.ts +7 -12
  55. package/src/providerManager.ts +27 -19
  56. package/src/repositoryManager.ts +8 -11
  57. 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
- let asset = definitionsManager_1.definitionsManager
86
- .getDefinitions()
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 (asset) {
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 asset;
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
- return this.getAssets().filter((a) => refs.some((ref) => compareRefs(ref, a.ref)));
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 getHash;
4
- private getFullKey;
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
- getHash(kindFilter) {
12
- if (kindFilter) {
13
- if (Array.isArray(kindFilter)) {
14
- return kindFilter.join(',');
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
- return kindFilter;
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
- return 'none';
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
- getFullKey(kindFilter) {
21
- return `definitionsManager:${this.getHash(kindFilter)}`;
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
- const key = this.getFullKey(kindFilter);
25
- return (0, cacheManager_1.doCached)(key, () => local_cluster_config_1.default.getDefinitions(kindFilter));
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
- return this.getDefinitions().find((d) => {
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('core/plan');
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 blockUri = (0, nodejs_utils_1.parseKapetaUri)(currentInstance.block.ref);
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(): import("@kapeta/local-cluster-config").DefinitionInfo[];
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
- return definitionsManager_1.definitionsManager.getProviderDefinitions().filter((providerDefinition) => providerDefinition.hasWeb);
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 installedProvider = this.getWebProviders().find((providerDefinition) => {
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
- const providerDefinitions = definitionsManager_1.definitionsManager.getProviderDefinitions();
61
- if (providerDefinitions.length > 0) {
62
- console.log('## Loaded the following providers ##');
63
- providerDefinitions.forEach((providerDefinition) => {
64
- console.log(' - %s[%s:%s]', providerDefinition.definition.kind, providerDefinition.definition.metadata.name, providerDefinition.version);
65
- console.log(' from %s', providerDefinition.path);
66
- });
67
- console.log('##');
68
- }
69
- else {
70
- console.log('## No providers found ##');
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 _install;
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;