@backstage-community/plugin-ocm-backend 5.9.0 → 5.9.1

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 CHANGED
@@ -1,5 +1,12 @@
1
1
  ### Dependencies
2
2
 
3
+ ## 5.9.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 10cfc05: Updated dependency `@openapitools/openapi-generator-cli` to `2.23.4`.
8
+ - 282405e: Update `@kubernetes/client-node` to `1.1.2`
9
+
3
10
  ## 5.9.0
4
11
 
5
12
  ### Minor Changes
@@ -4,7 +4,6 @@ var backendPluginApi = require('@backstage/backend-plugin-api');
4
4
  require('@backstage/catalog-model');
5
5
  require('@backstage/errors');
6
6
  require('@backstage-community/plugin-ocm-common');
7
- require('@kubernetes/client-node');
8
7
  require('semver');
9
8
  var module$1 = require('./providers/module.cjs.js');
10
9
  var router = require('./service/router.cjs.js');
@@ -1 +1 @@
1
- {"version":3,"file":"bundle.cjs.js","sources":["../src/bundle.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createBackendFeatureLoader } from '@backstage/backend-plugin-api';\n\nimport { catalogModuleOCMEntityProvider } from './providers';\nimport { ocmPlugin } from './service/router';\n\n/**\n * @public\n */\nexport const bundle = createBackendFeatureLoader({\n async loader() {\n return [catalogModuleOCMEntityProvider, ocmPlugin];\n },\n});\n"],"names":["createBackendFeatureLoader","catalogModuleOCMEntityProvider","ocmPlugin"],"mappings":";;;;;;;;;;;AAwBO,MAAM,SAASA,2CAA2B,CAAA;AAAA,EAC/C,MAAM,MAAS,GAAA;AACb,IAAO,OAAA,CAACC,yCAAgCC,gBAAS,CAAA;AAAA;AAErD,CAAC;;;;"}
1
+ {"version":3,"file":"bundle.cjs.js","sources":["../src/bundle.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createBackendFeatureLoader } from '@backstage/backend-plugin-api';\n\nimport { catalogModuleOCMEntityProvider } from './providers';\nimport { ocmPlugin } from './service/router';\n\n/**\n * @public\n */\nexport const bundle = createBackendFeatureLoader({\n async loader() {\n return [catalogModuleOCMEntityProvider, ocmPlugin];\n },\n});\n"],"names":["createBackendFeatureLoader","catalogModuleOCMEntityProvider","ocmPlugin"],"mappings":";;;;;;;;;;AAwBO,MAAM,SAASA,2CAA2B,CAAA;AAAA,EAC/C,MAAM,MAAS,GAAA;AACb,IAAO,OAAA,CAACC,yCAAgCC,gBAAS,CAAA;AAAA;AAErD,CAAC;;;;"}
@@ -1,13 +1,12 @@
1
1
  'use strict';
2
2
 
3
- var clientNode = require('@kubernetes/client-node');
4
-
5
- const hubApiClient = (clusterConfig, logger) => {
6
- const kubeConfig = new clientNode.KubeConfig();
3
+ const hubApiClient = async (clusterConfig, logger) => {
4
+ const { KubeConfig, CustomObjectsApi } = await import('@kubernetes/client-node');
5
+ const kubeConfig = new KubeConfig();
7
6
  if (!clusterConfig.serviceAccountToken) {
8
7
  logger.info("Using default kubernetes config");
9
8
  kubeConfig.loadFromDefault();
10
- return kubeConfig.makeApiClient(clientNode.CustomObjectsApi);
9
+ return kubeConfig.makeApiClient(CustomObjectsApi);
11
10
  }
12
11
  logger.info("Loading kubernetes config from config file");
13
12
  const user = {
@@ -32,7 +31,7 @@ const hubApiClient = (clusterConfig, logger) => {
32
31
  contexts: [context],
33
32
  currentContext: context.name
34
33
  });
35
- return kubeConfig.makeApiClient(clientNode.CustomObjectsApi);
34
+ return kubeConfig.makeApiClient(CustomObjectsApi);
36
35
  };
37
36
  const kubeApiResponseHandler = (call) => {
38
37
  return call.catch((e) => {
@@ -1 +1 @@
1
- {"version":3,"file":"kubernetes.cjs.js","sources":["../../src/helpers/kubernetes.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { LoggerService } from '@backstage/backend-plugin-api';\n\nimport {\n CustomObjectsApi,\n KubeConfig,\n KubernetesListObject,\n} from '@kubernetes/client-node';\n\nimport { ManagedCluster, ManagedClusterInfo, OcmConfig } from '../types';\n\nexport const hubApiClient = (\n clusterConfig: OcmConfig,\n logger: LoggerService,\n): CustomObjectsApi => {\n const kubeConfig = new KubeConfig();\n\n if (!clusterConfig.serviceAccountToken) {\n logger.info('Using default kubernetes config');\n kubeConfig.loadFromDefault();\n return kubeConfig.makeApiClient(CustomObjectsApi);\n }\n\n logger.info('Loading kubernetes config from config file');\n\n const user = {\n name: 'backstage',\n token: clusterConfig.serviceAccountToken,\n };\n\n const context = {\n name: clusterConfig.hubResourceName,\n user: user.name,\n cluster: clusterConfig.hubResourceName,\n };\n\n kubeConfig.loadFromOptions({\n clusters: [\n {\n server: clusterConfig.url,\n name: clusterConfig.hubResourceName,\n skipTLSVerify: clusterConfig.skipTLSVerify,\n caData: clusterConfig.caData,\n },\n ],\n users: [user],\n contexts: [context],\n currentContext: context.name,\n });\n return kubeConfig.makeApiClient(CustomObjectsApi);\n};\n\nconst kubeApiResponseHandler = <T>(call: Promise<T>) => {\n return call.catch(e => {\n // r.body should be string or blob binary\n if ('body' in e && typeof e.body === 'string') {\n let body;\n try {\n body = JSON.parse(e.body);\n } catch (error) {\n /* eslint-disable-line no-empty */\n }\n if (body) {\n throw Object.assign(new Error(body.reason), {\n // Name and statusCode are required by the backstage error handler\n statusCode: body.code,\n name: body.reason,\n ...body,\n });\n }\n }\n\n throw Object.assign(new Error(e.message), {\n // If there is no body, default to 500\n statusCode: 500,\n name: e.message,\n });\n });\n};\n\nexport const getManagedCluster = (api: CustomObjectsApi, name: string) => {\n return kubeApiResponseHandler<ManagedCluster>(\n api.getClusterCustomObject({\n plural: 'managedclusters',\n version: 'v1',\n group: 'cluster.open-cluster-management.io',\n name,\n }),\n );\n};\n\nexport const listManagedClusters = (api: CustomObjectsApi) => {\n return kubeApiResponseHandler<KubernetesListObject<ManagedCluster>>(\n api.listClusterCustomObject({\n group: 'cluster.open-cluster-management.io',\n version: 'v1',\n plural: 'managedclusters',\n }),\n );\n};\n\nexport const getManagedClusterInfo = (api: CustomObjectsApi, name: string) => {\n return kubeApiResponseHandler<ManagedClusterInfo>(\n api.getNamespacedCustomObject({\n group: 'internal.open-cluster-management.io',\n version: 'v1beta1',\n name,\n namespace: name,\n plural: 'managedclusterinfos',\n }),\n );\n};\n\nexport const listManagedClusterInfos = (api: CustomObjectsApi) => {\n return kubeApiResponseHandler<KubernetesListObject<ManagedClusterInfo>>(\n api.listClusterCustomObject({\n group: 'internal.open-cluster-management.io',\n version: 'v1beta1',\n plural: 'managedclusterinfos',\n }),\n );\n};\n"],"names":["KubeConfig","CustomObjectsApi"],"mappings":"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"}
1
+ {"version":3,"file":"kubernetes.cjs.js","sources":["../../src/helpers/kubernetes.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { LoggerService } from '@backstage/backend-plugin-api';\n\nimport type {\n CustomObjectsApi,\n KubernetesListObject,\n} from '@kubernetes/client-node';\n\nimport { ManagedCluster, ManagedClusterInfo, OcmConfig } from '../types';\n\nexport const hubApiClient = async (\n clusterConfig: OcmConfig,\n logger: LoggerService,\n): Promise<CustomObjectsApi> => {\n const { KubeConfig, CustomObjectsApi } = await import(\n '@kubernetes/client-node'\n );\n const kubeConfig = new KubeConfig();\n\n if (!clusterConfig.serviceAccountToken) {\n logger.info('Using default kubernetes config');\n kubeConfig.loadFromDefault();\n return kubeConfig.makeApiClient(CustomObjectsApi);\n }\n\n logger.info('Loading kubernetes config from config file');\n\n const user = {\n name: 'backstage',\n token: clusterConfig.serviceAccountToken,\n };\n\n const context = {\n name: clusterConfig.hubResourceName,\n user: user.name,\n cluster: clusterConfig.hubResourceName,\n };\n\n kubeConfig.loadFromOptions({\n clusters: [\n {\n server: clusterConfig.url,\n name: clusterConfig.hubResourceName,\n skipTLSVerify: clusterConfig.skipTLSVerify,\n caData: clusterConfig.caData,\n },\n ],\n users: [user],\n contexts: [context],\n currentContext: context.name,\n });\n return kubeConfig.makeApiClient(CustomObjectsApi);\n};\n\nconst kubeApiResponseHandler = <T>(call: Promise<T>) => {\n return call.catch(e => {\n // r.body should be string or blob binary\n if ('body' in e && typeof e.body === 'string') {\n let body;\n try {\n body = JSON.parse(e.body);\n } catch (error) {\n /* eslint-disable-line no-empty */\n }\n if (body) {\n throw Object.assign(new Error(body.reason), {\n // Name and statusCode are required by the backstage error handler\n statusCode: body.code,\n name: body.reason,\n ...body,\n });\n }\n }\n\n throw Object.assign(new Error(e.message), {\n // If there is no body, default to 500\n statusCode: 500,\n name: e.message,\n });\n });\n};\n\nexport const getManagedCluster = (api: CustomObjectsApi, name: string) => {\n return kubeApiResponseHandler<ManagedCluster>(\n api.getClusterCustomObject({\n plural: 'managedclusters',\n version: 'v1',\n group: 'cluster.open-cluster-management.io',\n name,\n }),\n );\n};\n\nexport const listManagedClusters = (api: CustomObjectsApi) => {\n return kubeApiResponseHandler<KubernetesListObject<ManagedCluster>>(\n api.listClusterCustomObject({\n group: 'cluster.open-cluster-management.io',\n version: 'v1',\n plural: 'managedclusters',\n }),\n );\n};\n\nexport const getManagedClusterInfo = (api: CustomObjectsApi, name: string) => {\n return kubeApiResponseHandler<ManagedClusterInfo>(\n api.getNamespacedCustomObject({\n group: 'internal.open-cluster-management.io',\n version: 'v1beta1',\n name,\n namespace: name,\n plural: 'managedclusterinfos',\n }),\n );\n};\n\nexport const listManagedClusterInfos = (api: CustomObjectsApi) => {\n return kubeApiResponseHandler<KubernetesListObject<ManagedClusterInfo>>(\n api.listClusterCustomObject({\n group: 'internal.open-cluster-management.io',\n version: 'v1beta1',\n plural: 'managedclusterinfos',\n }),\n );\n};\n"],"names":[],"mappings":";;AAwBa,MAAA,YAAA,GAAe,OAC1B,aAAA,EACA,MAC8B,KAAA;AAC9B,EAAA,MAAM,EAAE,UAAY,EAAA,gBAAA,EAAqB,GAAA,MAAM,OAC7C,yBACF,CAAA;AACA,EAAM,MAAA,UAAA,GAAa,IAAI,UAAW,EAAA;AAElC,EAAI,IAAA,CAAC,cAAc,mBAAqB,EAAA;AACtC,IAAA,MAAA,CAAO,KAAK,iCAAiC,CAAA;AAC7C,IAAA,UAAA,CAAW,eAAgB,EAAA;AAC3B,IAAO,OAAA,UAAA,CAAW,cAAc,gBAAgB,CAAA;AAAA;AAGlD,EAAA,MAAA,CAAO,KAAK,4CAA4C,CAAA;AAExD,EAAA,MAAM,IAAO,GAAA;AAAA,IACX,IAAM,EAAA,WAAA;AAAA,IACN,OAAO,aAAc,CAAA;AAAA,GACvB;AAEA,EAAA,MAAM,OAAU,GAAA;AAAA,IACd,MAAM,aAAc,CAAA,eAAA;AAAA,IACpB,MAAM,IAAK,CAAA,IAAA;AAAA,IACX,SAAS,aAAc,CAAA;AAAA,GACzB;AAEA,EAAA,UAAA,CAAW,eAAgB,CAAA;AAAA,IACzB,QAAU,EAAA;AAAA,MACR;AAAA,QACE,QAAQ,aAAc,CAAA,GAAA;AAAA,QACtB,MAAM,aAAc,CAAA,eAAA;AAAA,QACpB,eAAe,aAAc,CAAA,aAAA;AAAA,QAC7B,QAAQ,aAAc,CAAA;AAAA;AACxB,KACF;AAAA,IACA,KAAA,EAAO,CAAC,IAAI,CAAA;AAAA,IACZ,QAAA,EAAU,CAAC,OAAO,CAAA;AAAA,IAClB,gBAAgB,OAAQ,CAAA;AAAA,GACzB,CAAA;AACD,EAAO,OAAA,UAAA,CAAW,cAAc,gBAAgB,CAAA;AAClD;AAEA,MAAM,sBAAA,GAAyB,CAAI,IAAqB,KAAA;AACtD,EAAO,OAAA,IAAA,CAAK,MAAM,CAAK,CAAA,KAAA;AAErB,IAAA,IAAI,MAAU,IAAA,CAAA,IAAK,OAAO,CAAA,CAAE,SAAS,QAAU,EAAA;AAC7C,MAAI,IAAA,IAAA;AACJ,MAAI,IAAA;AACF,QAAO,IAAA,GAAA,IAAA,CAAK,KAAM,CAAA,CAAA,CAAE,IAAI,CAAA;AAAA,eACjB,KAAO,EAAA;AAAA;AAGhB,MAAA,IAAI,IAAM,EAAA;AACR,QAAA,MAAM,OAAO,MAAO,CAAA,IAAI,KAAM,CAAA,IAAA,CAAK,MAAM,CAAG,EAAA;AAAA;AAAA,UAE1C,YAAY,IAAK,CAAA,IAAA;AAAA,UACjB,MAAM,IAAK,CAAA,MAAA;AAAA,UACX,GAAG;AAAA,SACJ,CAAA;AAAA;AACH;AAGF,IAAA,MAAM,OAAO,MAAO,CAAA,IAAI,KAAM,CAAA,CAAA,CAAE,OAAO,CAAG,EAAA;AAAA;AAAA,MAExC,UAAY,EAAA,GAAA;AAAA,MACZ,MAAM,CAAE,CAAA;AAAA,KACT,CAAA;AAAA,GACF,CAAA;AACH,CAAA;AAEa,MAAA,iBAAA,GAAoB,CAAC,GAAA,EAAuB,IAAiB,KAAA;AACxE,EAAO,OAAA,sBAAA;AAAA,IACL,IAAI,sBAAuB,CAAA;AAAA,MACzB,MAAQ,EAAA,iBAAA;AAAA,MACR,OAAS,EAAA,IAAA;AAAA,MACT,KAAO,EAAA,oCAAA;AAAA,MACP;AAAA,KACD;AAAA,GACH;AACF;AAEa,MAAA,mBAAA,GAAsB,CAAC,GAA0B,KAAA;AAC5D,EAAO,OAAA,sBAAA;AAAA,IACL,IAAI,uBAAwB,CAAA;AAAA,MAC1B,KAAO,EAAA,oCAAA;AAAA,MACP,OAAS,EAAA,IAAA;AAAA,MACT,MAAQ,EAAA;AAAA,KACT;AAAA,GACH;AACF;AAEa,MAAA,qBAAA,GAAwB,CAAC,GAAA,EAAuB,IAAiB,KAAA;AAC5E,EAAO,OAAA,sBAAA;AAAA,IACL,IAAI,yBAA0B,CAAA;AAAA,MAC5B,KAAO,EAAA,qCAAA;AAAA,MACP,OAAS,EAAA,SAAA;AAAA,MACT,IAAA;AAAA,MACA,SAAW,EAAA,IAAA;AAAA,MACX,MAAQ,EAAA;AAAA,KACT;AAAA,GACH;AACF;AAEa,MAAA,uBAAA,GAA0B,CAAC,GAA0B,KAAA;AAChE,EAAO,OAAA,sBAAA;AAAA,IACL,IAAI,uBAAwB,CAAA;AAAA,MAC1B,KAAO,EAAA,qCAAA;AAAA,MACP,OAAS,EAAA,SAAA;AAAA,MACT,MAAQ,EAAA;AAAA,KACT;AAAA,GACH;AACF;;;;;;;;"}
package/dist/index.d.ts CHANGED
@@ -31,7 +31,7 @@ declare class ManagedClusterProvider implements EntityProvider {
31
31
  schedule: SchedulerServiceTaskRunner;
32
32
  } | {
33
33
  scheduler: SchedulerService;
34
- }): ManagedClusterProvider[];
34
+ }): Promise<ManagedClusterProvider[]>;
35
35
  connect(connection: EntityProviderConnection): Promise<void>;
36
36
  private createScheduleFn;
37
37
  getProviderName(): string;
@@ -24,31 +24,35 @@ class ManagedClusterProvider {
24
24
  this.owner = owner;
25
25
  this.scheduleFn = this.createScheduleFn(taskRunner);
26
26
  }
27
- static fromConfig(deps, options) {
27
+ static async fromConfig(deps, options) {
28
28
  const { config: config$1, logger } = deps;
29
- return config.readOcmConfigs(config$1).map((providerConfig) => {
30
- const client = kubernetes.hubApiClient(providerConfig, logger);
31
- let taskRunner;
32
- if ("scheduler" in options && providerConfig.schedule) {
33
- taskRunner = options.scheduler.createScheduledTaskRunner(
34
- providerConfig.schedule
35
- );
36
- } else if ("schedule" in options) {
37
- taskRunner = options.schedule;
38
- } else {
39
- throw new errors.InputError(
40
- `No schedule provided via config for OCMProvider:${providerConfig.id}.`
29
+ const providerConfigs = config.readOcmConfigs(config$1);
30
+ const providers = await Promise.all(
31
+ providerConfigs.map(async (providerConfig) => {
32
+ const client = await kubernetes.hubApiClient(providerConfig, logger);
33
+ let taskRunner;
34
+ if ("scheduler" in options && providerConfig.schedule) {
35
+ taskRunner = options.scheduler.createScheduledTaskRunner(
36
+ providerConfig.schedule
37
+ );
38
+ } else if ("schedule" in options) {
39
+ taskRunner = options.schedule;
40
+ } else {
41
+ throw new errors.InputError(
42
+ `No schedule provided via config for OCMProvider:${providerConfig.id}.`
43
+ );
44
+ }
45
+ return new ManagedClusterProvider(
46
+ client,
47
+ providerConfig.hubResourceName,
48
+ providerConfig.id,
49
+ deps,
50
+ providerConfig.owner,
51
+ taskRunner
41
52
  );
42
- }
43
- return new ManagedClusterProvider(
44
- client,
45
- providerConfig.hubResourceName,
46
- providerConfig.id,
47
- deps,
48
- providerConfig.owner,
49
- taskRunner
50
- );
51
- });
53
+ })
54
+ );
55
+ return providers;
52
56
  }
53
57
  async connect(connection) {
54
58
  this.connection = connection;
@@ -1 +1 @@
1
- {"version":3,"file":"ManagedClusterProvider.cjs.js","sources":["../../src/providers/ManagedClusterProvider.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n LoggerService,\n SchedulerService,\n SchedulerServiceTaskRunner,\n} from '@backstage/backend-plugin-api';\nimport {\n ANNOTATION_LOCATION,\n ANNOTATION_ORIGIN_LOCATION,\n ResourceEntity,\n} from '@backstage/catalog-model';\nimport type { Config } from '@backstage/config';\nimport { InputError } from '@backstage/errors';\nimport type {\n EntityProvider,\n EntityProviderConnection,\n} from '@backstage/plugin-catalog-node';\n\nimport { CustomObjectsApi } from '@kubernetes/client-node';\n\nimport {\n ANNOTATION_CLUSTER_ID,\n ANNOTATION_PROVIDER_ID,\n} from '@backstage-community/plugin-ocm-common';\n\nimport {\n ANNOTATION_KUBERNETES_API_SERVER,\n CONSOLE_CLAIM,\n HUB_CLUSTER_NAME_IN_OCM,\n} from '../constants';\nimport { readOcmConfigs } from '../helpers/config';\nimport {\n getManagedCluster,\n hubApiClient,\n listManagedClusters,\n} from '../helpers/kubernetes';\nimport { getClaim, translateOCMToResource } from '../helpers/parser';\n\n/**\n * @public\n * Provides OpenShift cluster resource entities from Open Cluster Management.\n */\nexport class ManagedClusterProvider implements EntityProvider {\n protected readonly client: CustomObjectsApi;\n protected readonly hubResourceName: string;\n protected readonly id: string;\n protected readonly owner: string;\n protected readonly logger: LoggerService;\n private readonly scheduleFn: () => Promise<void>;\n protected connection?: EntityProviderConnection;\n\n protected constructor(\n client: CustomObjectsApi,\n hubResourceName: string,\n id: string,\n deps: { logger: LoggerService },\n owner: string,\n taskRunner: SchedulerServiceTaskRunner,\n ) {\n this.client = client;\n this.hubResourceName = hubResourceName;\n this.id = id;\n this.logger = deps.logger;\n this.owner = owner;\n this.scheduleFn = this.createScheduleFn(taskRunner);\n }\n\n static fromConfig(\n deps: {\n config: Config;\n logger: LoggerService;\n },\n options:\n | { schedule: SchedulerServiceTaskRunner }\n | { scheduler: SchedulerService },\n ) {\n const { config, logger } = deps;\n\n return readOcmConfigs(config).map(providerConfig => {\n const client = hubApiClient(providerConfig, logger);\n let taskRunner;\n if ('scheduler' in options && providerConfig.schedule) {\n // Create a scheduled task runner using the provided scheduler and schedule configuration\n taskRunner = options.scheduler.createScheduledTaskRunner(\n providerConfig.schedule,\n );\n } else if ('schedule' in options) {\n // Use the provided schedule directly\n taskRunner = options.schedule;\n } else {\n throw new InputError(\n `No schedule provided via config for OCMProvider:${providerConfig.id}.`,\n );\n }\n\n return new ManagedClusterProvider(\n client,\n providerConfig.hubResourceName,\n providerConfig.id,\n deps,\n providerConfig.owner,\n taskRunner,\n );\n });\n }\n public async connect(connection: EntityProviderConnection): Promise<void> {\n this.connection = connection;\n await this.scheduleFn();\n }\n\n private createScheduleFn(\n taskRunner: SchedulerServiceTaskRunner,\n ): () => Promise<void> {\n return async () => {\n return taskRunner.run({\n id: `run_ocm_refresh_${this.getProviderName()}`,\n fn: async () => {\n try {\n await this.run();\n } catch (error: any) {\n // Ensure that we don't log any sensitive internal data:\n this.logger.error(\n 'Error while syncing cluster resources from Open Cluster Management',\n {\n // Default Error properties:\n name: error.name,\n message: error.message,\n stack: error.stack,\n // Additional status code if available:\n status: error.response?.status,\n },\n );\n }\n },\n });\n };\n }\n\n getProviderName(): string {\n return `ocm-managed-cluster:${this.id}`;\n }\n\n async run(): Promise<void> {\n if (!this.connection) {\n throw new Error('Not initialized');\n }\n\n this.logger.info(\n `Providing OpenShift cluster resources from Open Cluster Management`,\n );\n const hubConsole = getClaim(\n await getManagedCluster(this.client, HUB_CLUSTER_NAME_IN_OCM),\n CONSOLE_CLAIM,\n );\n\n const resources: ResourceEntity[] = (\n await listManagedClusters(this.client)\n ).items.map(i => {\n const normalizedName = translateOCMToResource(\n i.metadata!.name!,\n this.hubResourceName,\n );\n\n return {\n kind: 'Resource',\n apiVersion: 'backstage.io/v1beta1',\n metadata: {\n name: normalizedName,\n annotations: {\n /**\n * Can also be pulled from ManagedClusterInfo on .spec.masterEndpoint (details in discussion: https://github.com/janus-idp/backstage-plugins/pull/94#discussion_r1093228858)\n */\n [ANNOTATION_KUBERNETES_API_SERVER]:\n i.spec?.managedClusterClientConfigs?.[0]?.url,\n [ANNOTATION_CLUSTER_ID]: i.metadata?.labels?.clusterID!,\n [ANNOTATION_LOCATION]: this.getProviderName(),\n [ANNOTATION_ORIGIN_LOCATION]: this.getProviderName(),\n [ANNOTATION_PROVIDER_ID]: this.id,\n },\n links: [\n {\n url: getClaim(i, CONSOLE_CLAIM),\n title: 'OpenShift Console',\n icon: 'dashboard',\n },\n {\n url: `${hubConsole}/multicloud/infrastructure/clusters/details/${\n i.metadata!.name\n }/`,\n title: 'OCM Console',\n },\n {\n url: `https://console.redhat.com/openshift/details/s/${\n i.metadata!.labels!.clusterID\n }`,\n title: 'OpenShift Cluster Manager',\n },\n ],\n },\n spec: {\n owner: this.owner,\n type: 'kubernetes-cluster',\n },\n };\n });\n\n await this.connection.applyMutation({\n type: 'full',\n entities: resources.map(entity => ({\n entity,\n locationKey: this.getProviderName(),\n })),\n });\n }\n}\n"],"names":["config","readOcmConfigs","hubApiClient","InputError","getClaim","getManagedCluster","HUB_CLUSTER_NAME_IN_OCM","CONSOLE_CLAIM","listManagedClusters","translateOCMToResource","ANNOTATION_KUBERNETES_API_SERVER","ANNOTATION_CLUSTER_ID","ANNOTATION_LOCATION","ANNOTATION_ORIGIN_LOCATION","ANNOTATION_PROVIDER_ID"],"mappings":"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"}
1
+ {"version":3,"file":"ManagedClusterProvider.cjs.js","sources":["../../src/providers/ManagedClusterProvider.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n LoggerService,\n SchedulerService,\n SchedulerServiceTaskRunner,\n} from '@backstage/backend-plugin-api';\nimport {\n ANNOTATION_LOCATION,\n ANNOTATION_ORIGIN_LOCATION,\n ResourceEntity,\n} from '@backstage/catalog-model';\nimport type { Config } from '@backstage/config';\nimport { InputError } from '@backstage/errors';\nimport type {\n EntityProvider,\n EntityProviderConnection,\n} from '@backstage/plugin-catalog-node';\n\nimport { CustomObjectsApi } from '@kubernetes/client-node';\n\nimport {\n ANNOTATION_CLUSTER_ID,\n ANNOTATION_PROVIDER_ID,\n} from '@backstage-community/plugin-ocm-common';\n\nimport {\n ANNOTATION_KUBERNETES_API_SERVER,\n CONSOLE_CLAIM,\n HUB_CLUSTER_NAME_IN_OCM,\n} from '../constants';\nimport { readOcmConfigs } from '../helpers/config';\nimport {\n getManagedCluster,\n hubApiClient,\n listManagedClusters,\n} from '../helpers/kubernetes';\nimport { getClaim, translateOCMToResource } from '../helpers/parser';\n\n/**\n * @public\n * Provides OpenShift cluster resource entities from Open Cluster Management.\n */\nexport class ManagedClusterProvider implements EntityProvider {\n protected readonly client: CustomObjectsApi;\n protected readonly hubResourceName: string;\n protected readonly id: string;\n protected readonly owner: string;\n protected readonly logger: LoggerService;\n private readonly scheduleFn: () => Promise<void>;\n protected connection?: EntityProviderConnection;\n\n protected constructor(\n client: CustomObjectsApi,\n hubResourceName: string,\n id: string,\n deps: { logger: LoggerService },\n owner: string,\n taskRunner: SchedulerServiceTaskRunner,\n ) {\n this.client = client;\n this.hubResourceName = hubResourceName;\n this.id = id;\n this.logger = deps.logger;\n this.owner = owner;\n this.scheduleFn = this.createScheduleFn(taskRunner);\n }\n\n static async fromConfig(\n deps: {\n config: Config;\n logger: LoggerService;\n },\n options:\n | { schedule: SchedulerServiceTaskRunner }\n | { scheduler: SchedulerService },\n ): Promise<ManagedClusterProvider[]> {\n const { config, logger } = deps;\n\n const providerConfigs = readOcmConfigs(config);\n\n const providers = await Promise.all(\n providerConfigs.map(async providerConfig => {\n const client = await hubApiClient(providerConfig, logger);\n let taskRunner;\n if ('scheduler' in options && providerConfig.schedule) {\n // Create a scheduled task runner using the provided scheduler and schedule configuration\n taskRunner = options.scheduler.createScheduledTaskRunner(\n providerConfig.schedule,\n );\n } else if ('schedule' in options) {\n // Use the provided schedule directly\n taskRunner = options.schedule;\n } else {\n throw new InputError(\n `No schedule provided via config for OCMProvider:${providerConfig.id}.`,\n );\n }\n\n return new ManagedClusterProvider(\n client,\n providerConfig.hubResourceName,\n providerConfig.id,\n deps,\n providerConfig.owner,\n taskRunner,\n );\n }),\n );\n\n return providers;\n }\n public async connect(connection: EntityProviderConnection): Promise<void> {\n this.connection = connection;\n await this.scheduleFn();\n }\n\n private createScheduleFn(\n taskRunner: SchedulerServiceTaskRunner,\n ): () => Promise<void> {\n return async () => {\n return taskRunner.run({\n id: `run_ocm_refresh_${this.getProviderName()}`,\n fn: async () => {\n try {\n await this.run();\n } catch (error: any) {\n // Ensure that we don't log any sensitive internal data:\n this.logger.error(\n 'Error while syncing cluster resources from Open Cluster Management',\n {\n // Default Error properties:\n name: error.name,\n message: error.message,\n stack: error.stack,\n // Additional status code if available:\n status: error.response?.status,\n },\n );\n }\n },\n });\n };\n }\n\n getProviderName(): string {\n return `ocm-managed-cluster:${this.id}`;\n }\n\n async run(): Promise<void> {\n if (!this.connection) {\n throw new Error('Not initialized');\n }\n\n this.logger.info(\n `Providing OpenShift cluster resources from Open Cluster Management`,\n );\n const hubConsole = getClaim(\n await getManagedCluster(this.client, HUB_CLUSTER_NAME_IN_OCM),\n CONSOLE_CLAIM,\n );\n\n const resources: ResourceEntity[] = (\n await listManagedClusters(this.client)\n ).items.map(i => {\n const normalizedName = translateOCMToResource(\n i.metadata!.name!,\n this.hubResourceName,\n );\n\n return {\n kind: 'Resource',\n apiVersion: 'backstage.io/v1beta1',\n metadata: {\n name: normalizedName,\n annotations: {\n /**\n * Can also be pulled from ManagedClusterInfo on .spec.masterEndpoint (details in discussion: https://github.com/janus-idp/backstage-plugins/pull/94#discussion_r1093228858)\n */\n [ANNOTATION_KUBERNETES_API_SERVER]:\n i.spec?.managedClusterClientConfigs?.[0]?.url,\n [ANNOTATION_CLUSTER_ID]: i.metadata?.labels?.clusterID!,\n [ANNOTATION_LOCATION]: this.getProviderName(),\n [ANNOTATION_ORIGIN_LOCATION]: this.getProviderName(),\n [ANNOTATION_PROVIDER_ID]: this.id,\n },\n links: [\n {\n url: getClaim(i, CONSOLE_CLAIM),\n title: 'OpenShift Console',\n icon: 'dashboard',\n },\n {\n url: `${hubConsole}/multicloud/infrastructure/clusters/details/${\n i.metadata!.name\n }/`,\n title: 'OCM Console',\n },\n {\n url: `https://console.redhat.com/openshift/details/s/${\n i.metadata!.labels!.clusterID\n }`,\n title: 'OpenShift Cluster Manager',\n },\n ],\n },\n spec: {\n owner: this.owner,\n type: 'kubernetes-cluster',\n },\n };\n });\n\n await this.connection.applyMutation({\n type: 'full',\n entities: resources.map(entity => ({\n entity,\n locationKey: this.getProviderName(),\n })),\n });\n }\n}\n"],"names":["config","readOcmConfigs","hubApiClient","InputError","getClaim","getManagedCluster","HUB_CLUSTER_NAME_IN_OCM","CONSOLE_CLAIM","listManagedClusters","translateOCMToResource","ANNOTATION_KUBERNETES_API_SERVER","ANNOTATION_CLUSTER_ID","ANNOTATION_LOCATION","ANNOTATION_ORIGIN_LOCATION","ANNOTATION_PROVIDER_ID"],"mappings":";;;;;;;;;;AAyDO,MAAM,sBAAiD,CAAA;AAAA,EACzC,MAAA;AAAA,EACA,eAAA;AAAA,EACA,EAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACF,UAAA;AAAA,EACP,UAAA;AAAA,EAEA,YACR,MACA,EAAA,eAAA,EACA,EACA,EAAA,IAAA,EACA,OACA,UACA,EAAA;AACA,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AACd,IAAA,IAAA,CAAK,eAAkB,GAAA,eAAA;AACvB,IAAA,IAAA,CAAK,EAAK,GAAA,EAAA;AACV,IAAA,IAAA,CAAK,SAAS,IAAK,CAAA,MAAA;AACnB,IAAA,IAAA,CAAK,KAAQ,GAAA,KAAA;AACb,IAAK,IAAA,CAAA,UAAA,GAAa,IAAK,CAAA,gBAAA,CAAiB,UAAU,CAAA;AAAA;AACpD,EAEA,aAAa,UACX,CAAA,IAAA,EAIA,OAGmC,EAAA;AACnC,IAAM,MAAA,UAAEA,QAAQ,EAAA,MAAA,EAAW,GAAA,IAAA;AAE3B,IAAM,MAAA,eAAA,GAAkBC,sBAAeD,QAAM,CAAA;AAE7C,IAAM,MAAA,SAAA,GAAY,MAAM,OAAQ,CAAA,GAAA;AAAA,MAC9B,eAAA,CAAgB,GAAI,CAAA,OAAM,cAAkB,KAAA;AAC1C,QAAA,MAAM,MAAS,GAAA,MAAME,uBAAa,CAAA,cAAA,EAAgB,MAAM,CAAA;AACxD,QAAI,IAAA,UAAA;AACJ,QAAI,IAAA,WAAA,IAAe,OAAW,IAAA,cAAA,CAAe,QAAU,EAAA;AAErD,UAAA,UAAA,GAAa,QAAQ,SAAU,CAAA,yBAAA;AAAA,YAC7B,cAAe,CAAA;AAAA,WACjB;AAAA,SACF,MAAA,IAAW,cAAc,OAAS,EAAA;AAEhC,UAAA,UAAA,GAAa,OAAQ,CAAA,QAAA;AAAA,SAChB,MAAA;AACL,UAAA,MAAM,IAAIC,iBAAA;AAAA,YACR,CAAA,gDAAA,EAAmD,eAAe,EAAE,CAAA,CAAA;AAAA,WACtE;AAAA;AAGF,QAAA,OAAO,IAAI,sBAAA;AAAA,UACT,MAAA;AAAA,UACA,cAAe,CAAA,eAAA;AAAA,UACf,cAAe,CAAA,EAAA;AAAA,UACf,IAAA;AAAA,UACA,cAAe,CAAA,KAAA;AAAA,UACf;AAAA,SACF;AAAA,OACD;AAAA,KACH;AAEA,IAAO,OAAA,SAAA;AAAA;AACT,EACA,MAAa,QAAQ,UAAqD,EAAA;AACxE,IAAA,IAAA,CAAK,UAAa,GAAA,UAAA;AAClB,IAAA,MAAM,KAAK,UAAW,EAAA;AAAA;AACxB,EAEQ,iBACN,UACqB,EAAA;AACrB,IAAA,OAAO,YAAY;AACjB,MAAA,OAAO,WAAW,GAAI,CAAA;AAAA,QACpB,EAAI,EAAA,CAAA,gBAAA,EAAmB,IAAK,CAAA,eAAA,EAAiB,CAAA,CAAA;AAAA,QAC7C,IAAI,YAAY;AACd,UAAI,IAAA;AACF,YAAA,MAAM,KAAK,GAAI,EAAA;AAAA,mBACR,KAAY,EAAA;AAEnB,YAAA,IAAA,CAAK,MAAO,CAAA,KAAA;AAAA,cACV,oEAAA;AAAA,cACA;AAAA;AAAA,gBAEE,MAAM,KAAM,CAAA,IAAA;AAAA,gBACZ,SAAS,KAAM,CAAA,OAAA;AAAA,gBACf,OAAO,KAAM,CAAA,KAAA;AAAA;AAAA,gBAEb,MAAA,EAAQ,MAAM,QAAU,EAAA;AAAA;AAC1B,aACF;AAAA;AACF;AACF,OACD,CAAA;AAAA,KACH;AAAA;AACF,EAEA,eAA0B,GAAA;AACxB,IAAO,OAAA,CAAA,oBAAA,EAAuB,KAAK,EAAE,CAAA,CAAA;AAAA;AACvC,EAEA,MAAM,GAAqB,GAAA;AACzB,IAAI,IAAA,CAAC,KAAK,UAAY,EAAA;AACpB,MAAM,MAAA,IAAI,MAAM,iBAAiB,CAAA;AAAA;AAGnC,IAAA,IAAA,CAAK,MAAO,CAAA,IAAA;AAAA,MACV,CAAA,kEAAA;AAAA,KACF;AACA,IAAA,MAAM,UAAa,GAAAC,eAAA;AAAA,MACjB,MAAMC,4BAAA,CAAkB,IAAK,CAAA,MAAA,EAAQC,iCAAuB,CAAA;AAAA,MAC5DC;AAAA,KACF;AAEA,IAAM,MAAA,SAAA,GAAA,CACJ,MAAMC,8BAAoB,CAAA,IAAA,CAAK,MAAM,CACrC,EAAA,KAAA,CAAM,IAAI,CAAK,CAAA,KAAA;AACf,MAAA,MAAM,cAAiB,GAAAC,6BAAA;AAAA,QACrB,EAAE,QAAU,CAAA,IAAA;AAAA,QACZ,IAAK,CAAA;AAAA,OACP;AAEA,MAAO,OAAA;AAAA,QACL,IAAM,EAAA,UAAA;AAAA,QACN,UAAY,EAAA,sBAAA;AAAA,QACZ,QAAU,EAAA;AAAA,UACR,IAAM,EAAA,cAAA;AAAA,UACN,WAAa,EAAA;AAAA;AAAA;AAAA;AAAA,YAIX,CAACC,0CAAgC,GAC/B,EAAE,IAAM,EAAA,2BAAA,GAA8B,CAAC,CAAG,EAAA,GAAA;AAAA,YAC5C,CAACC,qCAAqB,GAAG,CAAA,CAAE,UAAU,MAAQ,EAAA,SAAA;AAAA,YAC7C,CAACC,gCAAmB,GAAG,IAAA,CAAK,eAAgB,EAAA;AAAA,YAC5C,CAACC,uCAA0B,GAAG,IAAA,CAAK,eAAgB,EAAA;AAAA,YACnD,CAACC,sCAAsB,GAAG,IAAK,CAAA;AAAA,WACjC;AAAA,UACA,KAAO,EAAA;AAAA,YACL;AAAA,cACE,GAAA,EAAKV,eAAS,CAAA,CAAA,EAAGG,uBAAa,CAAA;AAAA,cAC9B,KAAO,EAAA,mBAAA;AAAA,cACP,IAAM,EAAA;AAAA,aACR;AAAA,YACA;AAAA,cACE,KAAK,CAAG,EAAA,UAAU,CAChB,4CAAA,EAAA,CAAA,CAAE,SAAU,IACd,CAAA,CAAA,CAAA;AAAA,cACA,KAAO,EAAA;AAAA,aACT;AAAA,YACA;AAAA,cACE,GAAK,EAAA,CAAA,+CAAA,EACH,CAAE,CAAA,QAAA,CAAU,OAAQ,SACtB,CAAA,CAAA;AAAA,cACA,KAAO,EAAA;AAAA;AACT;AACF,SACF;AAAA,QACA,IAAM,EAAA;AAAA,UACJ,OAAO,IAAK,CAAA,KAAA;AAAA,UACZ,IAAM,EAAA;AAAA;AACR,OACF;AAAA,KACD,CAAA;AAED,IAAM,MAAA,IAAA,CAAK,WAAW,aAAc,CAAA;AAAA,MAClC,IAAM,EAAA,MAAA;AAAA,MACN,QAAA,EAAU,SAAU,CAAA,GAAA,CAAI,CAAW,MAAA,MAAA;AAAA,QACjC,MAAA;AAAA,QACA,WAAA,EAAa,KAAK,eAAgB;AAAA,OAClC,CAAA;AAAA,KACH,CAAA;AAAA;AAEL;;;;"}
@@ -17,7 +17,7 @@ const catalogModuleOCMEntityProvider = backendPluginApi.createBackendModule({
17
17
  },
18
18
  async init({ catalog, config, logger, scheduler }) {
19
19
  catalog.addEntityProvider(
20
- ManagedClusterProvider.ManagedClusterProvider.fromConfig(
20
+ await ManagedClusterProvider.ManagedClusterProvider.fromConfig(
21
21
  { config, logger },
22
22
  {
23
23
  schedule: scheduler.createScheduledTaskRunner({
@@ -1 +1 @@
1
- {"version":3,"file":"module.cjs.js","sources":["../../src/providers/module.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createBackendModule,\n} from '@backstage/backend-plugin-api';\nimport { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';\n\nimport { ManagedClusterProvider } from './ManagedClusterProvider';\n\n/**\n * @public\n */\nexport const catalogModuleOCMEntityProvider = createBackendModule({\n moduleId: 'catalog-backend-module-ocm',\n pluginId: 'catalog',\n register(env) {\n env.registerInit({\n deps: {\n catalog: catalogProcessingExtensionPoint,\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n scheduler: coreServices.scheduler,\n },\n async init({ catalog, config, logger, scheduler }) {\n catalog.addEntityProvider(\n ManagedClusterProvider.fromConfig(\n { config, logger },\n {\n schedule: scheduler.createScheduledTaskRunner({\n frequency: { hours: 1 },\n timeout: { minutes: 15 },\n initialDelay: { seconds: 15 },\n }),\n scheduler: scheduler,\n },\n ),\n );\n },\n });\n },\n});\n"],"names":["createBackendModule","catalogProcessingExtensionPoint","coreServices","ManagedClusterProvider"],"mappings":";;;;;;AA2BO,MAAM,iCAAiCA,oCAAoB,CAAA;AAAA,EAChE,QAAU,EAAA,4BAAA;AAAA,EACV,QAAU,EAAA,SAAA;AAAA,EACV,SAAS,GAAK,EAAA;AACZ,IAAA,GAAA,CAAI,YAAa,CAAA;AAAA,MACf,IAAM,EAAA;AAAA,QACJ,OAAS,EAAAC,qCAAA;AAAA,QACT,QAAQC,6BAAa,CAAA,UAAA;AAAA,QACrB,QAAQA,6BAAa,CAAA,MAAA;AAAA,QACrB,WAAWA,6BAAa,CAAA;AAAA,OAC1B;AAAA,MACA,MAAM,IAAK,CAAA,EAAE,SAAS,MAAQ,EAAA,MAAA,EAAQ,WAAa,EAAA;AACjD,QAAQ,OAAA,CAAA,iBAAA;AAAA,UACNC,6CAAuB,CAAA,UAAA;AAAA,YACrB,EAAE,QAAQ,MAAO,EAAA;AAAA,YACjB;AAAA,cACE,QAAA,EAAU,UAAU,yBAA0B,CAAA;AAAA,gBAC5C,SAAA,EAAW,EAAE,KAAA,EAAO,CAAE,EAAA;AAAA,gBACtB,OAAA,EAAS,EAAE,OAAA,EAAS,EAAG,EAAA;AAAA,gBACvB,YAAA,EAAc,EAAE,OAAA,EAAS,EAAG;AAAA,eAC7B,CAAA;AAAA,cACD;AAAA;AACF;AACF,SACF;AAAA;AACF,KACD,CAAA;AAAA;AAEL,CAAC;;;;"}
1
+ {"version":3,"file":"module.cjs.js","sources":["../../src/providers/module.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createBackendModule,\n} from '@backstage/backend-plugin-api';\nimport { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';\n\nimport { ManagedClusterProvider } from './ManagedClusterProvider';\n\n/**\n * @public\n */\nexport const catalogModuleOCMEntityProvider = createBackendModule({\n moduleId: 'catalog-backend-module-ocm',\n pluginId: 'catalog',\n register(env) {\n env.registerInit({\n deps: {\n catalog: catalogProcessingExtensionPoint,\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n scheduler: coreServices.scheduler,\n },\n async init({ catalog, config, logger, scheduler }) {\n catalog.addEntityProvider(\n await ManagedClusterProvider.fromConfig(\n { config, logger },\n {\n schedule: scheduler.createScheduledTaskRunner({\n frequency: { hours: 1 },\n timeout: { minutes: 15 },\n initialDelay: { seconds: 15 },\n }),\n scheduler: scheduler,\n },\n ),\n );\n },\n });\n },\n});\n"],"names":["createBackendModule","catalogProcessingExtensionPoint","coreServices","ManagedClusterProvider"],"mappings":";;;;;;AA2BO,MAAM,iCAAiCA,oCAAoB,CAAA;AAAA,EAChE,QAAU,EAAA,4BAAA;AAAA,EACV,QAAU,EAAA,SAAA;AAAA,EACV,SAAS,GAAK,EAAA;AACZ,IAAA,GAAA,CAAI,YAAa,CAAA;AAAA,MACf,IAAM,EAAA;AAAA,QACJ,OAAS,EAAAC,qCAAA;AAAA,QACT,QAAQC,6BAAa,CAAA,UAAA;AAAA,QACrB,QAAQA,6BAAa,CAAA,MAAA;AAAA,QACrB,WAAWA,6BAAa,CAAA;AAAA,OAC1B;AAAA,MACA,MAAM,IAAK,CAAA,EAAE,SAAS,MAAQ,EAAA,MAAA,EAAQ,WAAa,EAAA;AACjD,QAAQ,OAAA,CAAA,iBAAA;AAAA,UACN,MAAMC,6CAAuB,CAAA,UAAA;AAAA,YAC3B,EAAE,QAAQ,MAAO,EAAA;AAAA,YACjB;AAAA,cACE,QAAA,EAAU,UAAU,yBAA0B,CAAA;AAAA,gBAC5C,SAAA,EAAW,EAAE,KAAA,EAAO,CAAE,EAAA;AAAA,gBACtB,OAAA,EAAS,EAAE,OAAA,EAAS,EAAG,EAAA;AAAA,gBACvB,YAAA,EAAc,EAAE,OAAA,EAAS,EAAG;AAAA,eAC7B,CAAA;AAAA,cACD;AAAA;AACF;AACF,SACF;AAAA;AACF,KACD,CAAA;AAAA;AAEL,CAAC;;;;"}
@@ -24,15 +24,20 @@ async function createRouter(deps) {
24
24
  });
25
25
  router.use(express__default.default.json());
26
26
  router.use(permissionsIntegrationRouter);
27
- const clients = Object.fromEntries(
28
- config.readOcmConfigs(config$1).map((provider) => [
29
- provider.id,
30
- {
31
- client: kubernetes.hubApiClient(provider, logger),
32
- hubResourceName: provider.hubResourceName
33
- }
34
- ])
27
+ const providerConfigs = config.readOcmConfigs(config$1);
28
+ const clientEntries = await Promise.all(
29
+ providerConfigs.map(async (provider) => {
30
+ const client = await kubernetes.hubApiClient(provider, logger);
31
+ return [
32
+ provider.id,
33
+ {
34
+ client,
35
+ hubResourceName: provider.hubResourceName
36
+ }
37
+ ];
38
+ })
35
39
  );
40
+ const clients = Object.fromEntries(clientEntries);
36
41
  const authorize = async (request, permission) => {
37
42
  const decision = (await permissions.authorize([{ permission }], {
38
43
  credentials: await httpAuth.credentials(request)
@@ -1 +1 @@
1
- {"version":3,"file":"router.cjs.js","sources":["../../src/service/router.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport {\n coreServices,\n createBackendPlugin,\n HttpAuthService,\n LoggerService,\n PermissionsService,\n} from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\nimport { NotAllowedError } from '@backstage/errors';\nimport {\n AuthorizeResult,\n BasicPermission,\n} from '@backstage/plugin-permission-common';\nimport { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node';\n\nimport express, { Request } from 'express';\n\nimport {\n Cluster,\n ClusterOverview,\n ocmClusterReadPermission,\n ocmEntityPermissions,\n ocmEntityReadPermission,\n} from '@backstage-community/plugin-ocm-common';\n\nimport { readOcmConfigs } from '../helpers/config';\nimport {\n getManagedCluster,\n getManagedClusterInfo,\n hubApiClient,\n listManagedClusterInfos,\n listManagedClusters,\n} from '../helpers/kubernetes';\nimport {\n getClaim,\n parseClusterStatus,\n parseManagedCluster,\n parseNodeStatus,\n parseUpdateInfo,\n translateOCMToResource,\n translateResourceToOCM,\n} from '../helpers/parser';\nimport { createOpenApiRouter } from '../schema/openapi.generated';\nimport { ManagedClusterInfo } from '../types';\n\nasync function createRouter(deps: {\n config: Config;\n logger: LoggerService;\n httpAuth: HttpAuthService;\n permissions: PermissionsService;\n}) {\n const { config, logger, httpAuth, permissions } = deps;\n const router = await createOpenApiRouter();\n\n const permissionsIntegrationRouter = createPermissionIntegrationRouter({\n permissions: ocmEntityPermissions,\n });\n\n router.use(express.json());\n router.use(permissionsIntegrationRouter);\n\n const clients = Object.fromEntries(\n readOcmConfigs(config).map(provider => [\n provider.id,\n {\n client: hubApiClient(provider, logger),\n hubResourceName: provider.hubResourceName,\n },\n ]),\n );\n\n const authorize = async (request: Request, permission: BasicPermission) => {\n const decision = (\n await permissions.authorize([{ permission: permission }], {\n credentials: await httpAuth.credentials(request),\n })\n )[0];\n\n return decision;\n };\n\n router.get('/status/:providerId/:clusterName', async (request, response) => {\n const decision = await authorize(request, ocmEntityReadPermission);\n\n if (decision.result === AuthorizeResult.DENY) {\n throw new NotAllowedError('Unauthorized');\n }\n\n const { clusterName, providerId } = request.params;\n logger.debug(\n `Incoming status request for ${clusterName} cluster on ${providerId} hub`,\n );\n\n if (!clients.hasOwnProperty(providerId)) {\n throw Object.assign(new Error('Hub not found'), {\n statusCode: 404,\n name: 'HubNotFound',\n });\n }\n\n const normalizedClusterName = translateResourceToOCM(\n clusterName,\n clients[providerId].hubResourceName,\n );\n\n const mc = await getManagedCluster(\n clients[providerId].client,\n normalizedClusterName,\n );\n const mci = await getManagedClusterInfo(\n clients[providerId].client,\n normalizedClusterName,\n );\n\n response.send({\n name: clusterName,\n ...parseManagedCluster(mc),\n ...parseUpdateInfo(mci),\n } as Cluster);\n });\n\n router.get('/status', async (request, response) => {\n const decision = await authorize(request, ocmClusterReadPermission);\n\n if (decision.result === AuthorizeResult.DENY) {\n throw new NotAllowedError('Unauthorized');\n }\n\n logger.debug(`Incoming status request for all clusters`);\n\n const allClusters = await Promise.all(\n Object.values(clients).map(async c => {\n const mcs = await listManagedClusters(c.client);\n const mcis = await listManagedClusterInfos(c.client);\n\n return mcs.items.map(mc => {\n const mci =\n mcis.items.find(\n info => info.metadata?.name === mc.metadata!.name,\n ) || ({} as ManagedClusterInfo);\n\n return {\n name: translateOCMToResource(mc.metadata!.name!, c.hubResourceName),\n status: parseClusterStatus(mc),\n platform: getClaim(mc, 'platform.open-cluster-management.io'),\n openshiftVersion:\n mc.metadata!.labels?.openshiftVersion ??\n getClaim(mc, 'version.openshift.io'),\n nodes: parseNodeStatus(mci),\n ...parseUpdateInfo(mci),\n } as ClusterOverview;\n });\n }),\n );\n\n return response.send(allClusters.flat());\n });\n\n const middleware = MiddlewareFactory.create({ logger, config });\n\n router.use(middleware.error());\n return router;\n}\n\n/**\n * @public\n */\nexport const ocmPlugin = createBackendPlugin({\n pluginId: 'ocm',\n register(env) {\n env.registerInit({\n deps: {\n logger: coreServices.logger,\n config: coreServices.rootConfig,\n http: coreServices.httpRouter,\n httpAuth: coreServices.httpAuth,\n permissions: coreServices.permissions,\n },\n async init({ config, logger, http, httpAuth, permissions }) {\n http.use(await createRouter({ config, logger, httpAuth, permissions }));\n },\n });\n },\n});\n"],"names":["config","createOpenApiRouter","createPermissionIntegrationRouter","ocmEntityPermissions","express","readOcmConfigs","hubApiClient","ocmEntityReadPermission","AuthorizeResult","NotAllowedError","translateResourceToOCM","getManagedCluster","getManagedClusterInfo","parseManagedCluster","parseUpdateInfo","ocmClusterReadPermission","listManagedClusters","listManagedClusterInfos","translateOCMToResource","parseClusterStatus","getClaim","parseNodeStatus","MiddlewareFactory","createBackendPlugin","coreServices"],"mappings":"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"}
1
+ {"version":3,"file":"router.cjs.js","sources":["../../src/service/router.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport {\n coreServices,\n createBackendPlugin,\n HttpAuthService,\n LoggerService,\n PermissionsService,\n} from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\nimport { NotAllowedError } from '@backstage/errors';\nimport {\n AuthorizeResult,\n BasicPermission,\n} from '@backstage/plugin-permission-common';\nimport { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node';\n\nimport express, { Request } from 'express';\n\nimport {\n Cluster,\n ClusterOverview,\n ocmClusterReadPermission,\n ocmEntityPermissions,\n ocmEntityReadPermission,\n} from '@backstage-community/plugin-ocm-common';\n\nimport { readOcmConfigs } from '../helpers/config';\nimport {\n getManagedCluster,\n getManagedClusterInfo,\n hubApiClient,\n listManagedClusterInfos,\n listManagedClusters,\n} from '../helpers/kubernetes';\nimport {\n getClaim,\n parseClusterStatus,\n parseManagedCluster,\n parseNodeStatus,\n parseUpdateInfo,\n translateOCMToResource,\n translateResourceToOCM,\n} from '../helpers/parser';\nimport { createOpenApiRouter } from '../schema/openapi.generated';\nimport { ClientDetails, ManagedClusterInfo } from '../types';\n\nasync function createRouter(deps: {\n config: Config;\n logger: LoggerService;\n httpAuth: HttpAuthService;\n permissions: PermissionsService;\n}) {\n const { config, logger, httpAuth, permissions } = deps;\n const router = await createOpenApiRouter();\n\n const permissionsIntegrationRouter = createPermissionIntegrationRouter({\n permissions: ocmEntityPermissions,\n });\n\n router.use(express.json());\n router.use(permissionsIntegrationRouter);\n\n const providerConfigs = readOcmConfigs(config);\n\n const clientEntries = await Promise.all(\n providerConfigs.map(async provider => {\n const client = await hubApiClient(provider, logger);\n\n return [\n provider.id,\n {\n client: client,\n hubResourceName: provider.hubResourceName,\n },\n ];\n }),\n );\n\n const clients: { [k: string]: ClientDetails } =\n Object.fromEntries(clientEntries);\n\n const authorize = async (request: Request, permission: BasicPermission) => {\n const decision = (\n await permissions.authorize([{ permission: permission }], {\n credentials: await httpAuth.credentials(request),\n })\n )[0];\n\n return decision;\n };\n\n router.get('/status/:providerId/:clusterName', async (request, response) => {\n const decision = await authorize(request, ocmEntityReadPermission);\n\n if (decision.result === AuthorizeResult.DENY) {\n throw new NotAllowedError('Unauthorized');\n }\n\n const { clusterName, providerId } = request.params;\n logger.debug(\n `Incoming status request for ${clusterName} cluster on ${providerId} hub`,\n );\n\n if (!clients.hasOwnProperty(providerId)) {\n throw Object.assign(new Error('Hub not found'), {\n statusCode: 404,\n name: 'HubNotFound',\n });\n }\n\n const normalizedClusterName = translateResourceToOCM(\n clusterName,\n clients[providerId].hubResourceName,\n );\n\n const mc = await getManagedCluster(\n clients[providerId].client,\n normalizedClusterName,\n );\n const mci = await getManagedClusterInfo(\n clients[providerId].client,\n normalizedClusterName,\n );\n\n response.send({\n name: clusterName,\n ...parseManagedCluster(mc),\n ...parseUpdateInfo(mci),\n } as Cluster);\n });\n\n router.get('/status', async (request, response) => {\n const decision = await authorize(request, ocmClusterReadPermission);\n\n if (decision.result === AuthorizeResult.DENY) {\n throw new NotAllowedError('Unauthorized');\n }\n\n logger.debug(`Incoming status request for all clusters`);\n\n const allClusters = await Promise.all(\n Object.values(clients).map(async c => {\n const mcs = await listManagedClusters(c.client);\n const mcis = await listManagedClusterInfos(c.client);\n\n return mcs.items.map(mc => {\n const mci =\n mcis.items.find(\n info => info.metadata?.name === mc.metadata!.name,\n ) || ({} as ManagedClusterInfo);\n\n return {\n name: translateOCMToResource(mc.metadata!.name!, c.hubResourceName),\n status: parseClusterStatus(mc),\n platform: getClaim(mc, 'platform.open-cluster-management.io'),\n openshiftVersion:\n mc.metadata!.labels?.openshiftVersion ??\n getClaim(mc, 'version.openshift.io'),\n nodes: parseNodeStatus(mci),\n ...parseUpdateInfo(mci),\n } as ClusterOverview;\n });\n }),\n );\n\n return response.send(allClusters.flat());\n });\n\n const middleware = MiddlewareFactory.create({ logger, config });\n\n router.use(middleware.error());\n return router;\n}\n\n/**\n * @public\n */\nexport const ocmPlugin = createBackendPlugin({\n pluginId: 'ocm',\n register(env) {\n env.registerInit({\n deps: {\n logger: coreServices.logger,\n config: coreServices.rootConfig,\n http: coreServices.httpRouter,\n httpAuth: coreServices.httpAuth,\n permissions: coreServices.permissions,\n },\n async init({ config, logger, http, httpAuth, permissions }) {\n http.use(await createRouter({ config, logger, httpAuth, permissions }));\n },\n });\n },\n});\n"],"names":["config","createOpenApiRouter","createPermissionIntegrationRouter","ocmEntityPermissions","express","readOcmConfigs","hubApiClient","ocmEntityReadPermission","AuthorizeResult","NotAllowedError","translateResourceToOCM","getManagedCluster","getManagedClusterInfo","parseManagedCluster","parseUpdateInfo","ocmClusterReadPermission","listManagedClusters","listManagedClusterInfos","translateOCMToResource","parseClusterStatus","getClaim","parseNodeStatus","MiddlewareFactory","createBackendPlugin","coreServices"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage-community/plugin-ocm-backend",
3
- "version": "5.9.0",
3
+ "version": "5.9.1",
4
4
  "main": "./dist/index.cjs.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "license": "Apache-2.0",
@@ -43,7 +43,7 @@
43
43
  "postpack": "backstage-cli package postpack",
44
44
  "prepack": "backstage-cli package prepack",
45
45
  "start": "backstage-cli package start",
46
- "test": "backstage-cli package test --passWithNoTests --coverage",
46
+ "test": "NODE_OPTIONS='--no-node-snapshot --experimental-vm-modules' backstage-cli package test --passWithNoTests --coverage",
47
47
  "tsc": "tsc",
48
48
  "prettier:check": "prettier --ignore-unknown --check .",
49
49
  "prettier:fix": "prettier --ignore-unknown --write .",
@@ -61,7 +61,7 @@
61
61
  "@backstage/plugin-catalog-node": "^1.18.0",
62
62
  "@backstage/plugin-permission-common": "^0.9.1",
63
63
  "@backstage/plugin-permission-node": "^0.10.3",
64
- "@kubernetes/client-node": "1.0.0-rc7",
64
+ "@kubernetes/client-node": "1.1.2",
65
65
  "express": "^4.18.2",
66
66
  "semver": "^7.5.4"
67
67
  },
@@ -71,7 +71,7 @@
71
71
  "@backstage/cli": "^0.34.1",
72
72
  "@backstage/config": "^1.3.3",
73
73
  "@backstage/plugin-catalog-backend": "^3.0.1",
74
- "@openapitools/openapi-generator-cli": "2.23.1",
74
+ "@openapitools/openapi-generator-cli": "2.23.4",
75
75
  "@types/express": "4.17.23",
76
76
  "@types/supertest": "2.0.16",
77
77
  "msw": "1.3.5",