@backstage/plugin-kubernetes-backend 0.21.2-next.1 → 0.21.2

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,30 @@
1
1
  # @backstage/plugin-kubernetes-backend
2
2
 
3
+ ## 0.21.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 6b6b5de: Added `endpointType` config option to the GKE cluster locator, allowing use of DNS-based control plane endpoints instead of public IP endpoints. Set `endpointType: 'dns'` to use GKE DNS endpoints (e.g. `gke-<uid>.<region>.gke.goog`) which provide proper TLS certificates and IAM-based access control.
8
+ - Updated dependencies
9
+ - @backstage/backend-plugin-api@1.8.0
10
+ - @backstage/catalog-client@1.14.0
11
+ - @backstage/plugin-catalog-node@2.1.0
12
+ - @backstage/plugin-permission-common@0.9.7
13
+ - @backstage/plugin-permission-node@0.10.11
14
+ - @backstage/catalog-model@1.7.7
15
+ - @backstage/plugin-kubernetes-node@0.4.2
16
+
17
+ ## 0.21.2-next.2
18
+
19
+ ### Patch Changes
20
+
21
+ - Updated dependencies
22
+ - @backstage/backend-plugin-api@1.8.0-next.1
23
+ - @backstage/catalog-client@1.14.0-next.2
24
+ - @backstage/plugin-catalog-node@2.1.0-next.2
25
+ - @backstage/plugin-kubernetes-node@0.4.2-next.1
26
+ - @backstage/plugin-permission-node@0.10.11-next.1
27
+
3
28
  ## 0.21.2-next.1
4
29
 
5
30
  ### Patch Changes
package/config.d.ts CHANGED
@@ -90,6 +90,13 @@ export interface Config {
90
90
  skipTLSVerify?: boolean;
91
91
  /** @visibility frontend */
92
92
  skipMetricsLookup?: boolean;
93
+ /**
94
+ * The type of endpoint to use for connecting to the cluster.
95
+ * 'public' uses the public IP endpoint (default).
96
+ * 'dns' uses the DNS-based control plane endpoint.
97
+ * @visibility frontend
98
+ */
99
+ endpointType?: 'public' | 'dns';
93
100
  }
94
101
  >;
95
102
  customResources?: Array<{
@@ -26,18 +26,21 @@ function _interopNamespaceCompat(e) {
26
26
 
27
27
  var container__namespace = /*#__PURE__*/_interopNamespaceCompat(container);
28
28
 
29
+ const VALID_ENDPOINT_TYPES = ["public", "dns"];
29
30
  class GkeClusterLocator {
30
31
  options;
31
32
  client;
33
+ logger;
32
34
  clusterDetails;
33
35
  hasClusterDetails;
34
- constructor(options, client, clusterDetails = void 0, hasClusterDetails = false) {
36
+ constructor(options, client, logger, clusterDetails = void 0, hasClusterDetails = false) {
35
37
  this.options = options;
36
38
  this.client = client;
39
+ this.logger = logger;
37
40
  this.clusterDetails = clusterDetails;
38
41
  this.hasClusterDetails = hasClusterDetails;
39
42
  }
40
- static fromConfigWithClient(config, client, refreshInterval) {
43
+ static fromConfigWithClient(config, client, logger, refreshInterval) {
41
44
  const matchingResourceLabels = config.getOptionalConfigArray("matchingResourceLabels")?.map((mrl) => {
42
45
  return { key: mrl.getString("key"), value: mrl.getString("value") };
43
46
  }) ?? [];
@@ -49,9 +52,10 @@ class GkeClusterLocator {
49
52
  skipTLSVerify: config.getOptionalBoolean("skipTLSVerify") ?? false,
50
53
  skipMetricsLookup: config.getOptionalBoolean("skipMetricsLookup") ?? false,
51
54
  exposeDashboard: config.getOptionalBoolean("exposeDashboard") ?? false,
52
- matchingResourceLabels
55
+ matchingResourceLabels,
56
+ endpointType: parseEndpointType(config.getOptionalString("endpointType"))
53
57
  };
54
- const gkeClusterLocator = new GkeClusterLocator(options, client);
58
+ const gkeClusterLocator = new GkeClusterLocator(options, client, logger);
55
59
  if (refreshInterval) {
56
60
  runPeriodically.runPeriodically(
57
61
  () => gkeClusterLocator.refreshClusters(),
@@ -61,13 +65,14 @@ class GkeClusterLocator {
61
65
  return gkeClusterLocator;
62
66
  }
63
67
  // Added an `x-goog-api-client` header to API requests made by the GKE cluster locator to clearly identify API requests from this plugin.
64
- static fromConfig(config, refreshInterval = void 0) {
68
+ static fromConfig(config, logger, refreshInterval = void 0) {
65
69
  return GkeClusterLocator.fromConfigWithClient(
66
70
  config,
67
71
  new container__namespace.v1.ClusterManagerClient({
68
72
  libName: `backstage/kubernetes-backend.GkeClusterLocator`,
69
73
  libVersion: _package.default.version
70
74
  }),
75
+ logger,
71
76
  refreshInterval
72
77
  );
73
78
  }
@@ -77,6 +82,18 @@ class GkeClusterLocator {
77
82
  }
78
83
  return this.clusterDetails ?? [];
79
84
  }
85
+ getClusterUrl(cluster) {
86
+ if (this.options.endpointType === "dns") {
87
+ const dnsEndpoint = cluster.controlPlaneEndpointsConfig?.dnsEndpointConfig?.endpoint;
88
+ if (dnsEndpoint) {
89
+ return `https://${dnsEndpoint}`;
90
+ }
91
+ this.logger.info(
92
+ `Cluster '${cluster.name ?? "unknown"}' has endpointType 'dns' configured but no DNS endpoint available, falling back to public IP`
93
+ );
94
+ }
95
+ return `https://${cluster.endpoint ?? ""}`;
96
+ }
80
97
  // TODO pass caData into the object
81
98
  async refreshClusters() {
82
99
  const {
@@ -103,7 +120,7 @@ class GkeClusterLocator {
103
120
  }).map((r) => ({
104
121
  // TODO filter out clusters which don't have name or endpoint
105
122
  name: r.name ?? "unknown",
106
- url: `https://${r.endpoint ?? ""}`,
123
+ url: this.getClusterUrl(r),
107
124
  authMetadata: { [pluginKubernetesCommon.ANNOTATION_KUBERNETES_AUTH_PROVIDER]: authProvider },
108
125
  skipTLSVerify,
109
126
  skipMetricsLookup,
@@ -125,6 +142,24 @@ class GkeClusterLocator {
125
142
  }
126
143
  }
127
144
  }
145
+ function isValidEndpointType(value) {
146
+ return VALID_ENDPOINT_TYPES.includes(
147
+ value
148
+ );
149
+ }
150
+ function parseEndpointType(value) {
151
+ if (value === void 0) {
152
+ return "public";
153
+ }
154
+ if (isValidEndpointType(value)) {
155
+ return value;
156
+ }
157
+ throw new Error(
158
+ `Invalid endpointType '${value}', must be one of: ${VALID_ENDPOINT_TYPES.join(
159
+ ", "
160
+ )}`
161
+ );
162
+ }
128
163
 
129
164
  exports.GkeClusterLocator = GkeClusterLocator;
130
165
  //# sourceMappingURL=GkeClusterLocator.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GkeClusterLocator.cjs.js","sources":["../../src/cluster-locator/GkeClusterLocator.ts"],"sourcesContent":["/*\n * Copyright 2021 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 { ANNOTATION_KUBERNETES_AUTH_PROVIDER } from '@backstage/plugin-kubernetes-common';\nimport { Config } from '@backstage/config';\nimport { ForwardedError } from '@backstage/errors';\nimport * as container from '@google-cloud/container';\nimport { Duration } from 'luxon';\nimport { runPeriodically } from '../service/runPeriodically';\nimport {\n ClusterDetails,\n KubernetesClustersSupplier,\n} from '@backstage/plugin-kubernetes-node';\nimport packageinfo from '../../package.json';\n\ninterface MatchResourceLabelEntry {\n key: string;\n value: string;\n}\n\ntype GkeClusterLocatorOptions = {\n projectId: string;\n authProvider: string;\n region?: string;\n skipTLSVerify?: boolean;\n skipMetricsLookup?: boolean;\n exposeDashboard?: boolean;\n matchingResourceLabels?: MatchResourceLabelEntry[];\n};\n\nexport class GkeClusterLocator implements KubernetesClustersSupplier {\n private readonly options: GkeClusterLocatorOptions;\n private readonly client: container.v1.ClusterManagerClient;\n private clusterDetails: ClusterDetails[] | undefined;\n private hasClusterDetails: boolean;\n\n constructor(\n options: GkeClusterLocatorOptions,\n client: container.v1.ClusterManagerClient,\n clusterDetails: ClusterDetails[] | undefined = undefined,\n hasClusterDetails: boolean = false,\n ) {\n this.options = options;\n this.client = client;\n this.clusterDetails = clusterDetails;\n this.hasClusterDetails = hasClusterDetails;\n }\n\n static fromConfigWithClient(\n config: Config,\n client: container.v1.ClusterManagerClient,\n refreshInterval?: Duration,\n ): GkeClusterLocator {\n const matchingResourceLabels: MatchResourceLabelEntry[] =\n config.getOptionalConfigArray('matchingResourceLabels')?.map(mrl => {\n return { key: mrl.getString('key'), value: mrl.getString('value') };\n }) ?? [];\n\n const storeAuthProviderString =\n config.getOptionalString('authProvider') === 'googleServiceAccount'\n ? 'googleServiceAccount'\n : 'google';\n\n const options = {\n projectId: config.getString('projectId'),\n authProvider: storeAuthProviderString,\n region: config.getOptionalString('region') ?? '-',\n skipTLSVerify: config.getOptionalBoolean('skipTLSVerify') ?? false,\n skipMetricsLookup:\n config.getOptionalBoolean('skipMetricsLookup') ?? false,\n exposeDashboard: config.getOptionalBoolean('exposeDashboard') ?? false,\n matchingResourceLabels,\n };\n const gkeClusterLocator = new GkeClusterLocator(options, client);\n if (refreshInterval) {\n runPeriodically(\n () => gkeClusterLocator.refreshClusters(),\n refreshInterval.toMillis(),\n );\n }\n return gkeClusterLocator;\n }\n\n // Added an `x-goog-api-client` header to API requests made by the GKE cluster locator to clearly identify API requests from this plugin.\n static fromConfig(\n config: Config,\n refreshInterval: Duration | undefined = undefined,\n ): GkeClusterLocator {\n return GkeClusterLocator.fromConfigWithClient(\n config,\n new container.v1.ClusterManagerClient({\n libName: `backstage/kubernetes-backend.GkeClusterLocator`,\n libVersion: packageinfo.version,\n }),\n refreshInterval,\n );\n }\n\n async getClusters(): Promise<ClusterDetails[]> {\n if (!this.hasClusterDetails) {\n // refresh at least once when first called, when retries are disabled and in tests\n await this.refreshClusters();\n }\n return this.clusterDetails ?? [];\n }\n\n // TODO pass caData into the object\n async refreshClusters(): Promise<void> {\n const {\n projectId,\n region,\n authProvider,\n skipTLSVerify,\n skipMetricsLookup,\n exposeDashboard,\n matchingResourceLabels,\n } = this.options;\n const request = {\n parent: `projects/${projectId}/locations/${region}`,\n };\n\n try {\n const [response] = await this.client.listClusters(request);\n this.clusterDetails = (response.clusters ?? [])\n .filter(r => {\n return matchingResourceLabels?.every(mrl => {\n if (!r.resourceLabels) {\n return false;\n }\n return r.resourceLabels[mrl.key] === mrl.value;\n });\n })\n .map(r => ({\n // TODO filter out clusters which don't have name or endpoint\n name: r.name ?? 'unknown',\n url: `https://${r.endpoint ?? ''}`,\n authMetadata: { [ANNOTATION_KUBERNETES_AUTH_PROVIDER]: authProvider },\n skipTLSVerify,\n skipMetricsLookup,\n ...(exposeDashboard\n ? {\n dashboardApp: 'gke',\n dashboardParameters: {\n projectId,\n region,\n clusterName: r.name,\n },\n }\n : {}),\n }));\n this.hasClusterDetails = true;\n } catch (e) {\n throw new ForwardedError(\n `There was an error retrieving clusters from GKE for projectId=${projectId} region=${region}`,\n e,\n );\n }\n }\n}\n"],"names":["runPeriodically","container","packageinfo","ANNOTATION_KUBERNETES_AUTH_PROVIDER","ForwardedError"],"mappings":"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"}
1
+ {"version":3,"file":"GkeClusterLocator.cjs.js","sources":["../../src/cluster-locator/GkeClusterLocator.ts"],"sourcesContent":["/*\n * Copyright 2021 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 { ANNOTATION_KUBERNETES_AUTH_PROVIDER } from '@backstage/plugin-kubernetes-common';\nimport { Config } from '@backstage/config';\nimport { ForwardedError } from '@backstage/errors';\nimport * as container from '@google-cloud/container';\nimport { Duration } from 'luxon';\nimport { runPeriodically } from '../service/runPeriodically';\nimport {\n ClusterDetails,\n KubernetesClustersSupplier,\n} from '@backstage/plugin-kubernetes-node';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport packageinfo from '../../package.json';\n\ninterface MatchResourceLabelEntry {\n key: string;\n value: string;\n}\n\ntype GkeClusterLocatorOptions = {\n projectId: string;\n authProvider: string;\n region?: string;\n skipTLSVerify?: boolean;\n skipMetricsLookup?: boolean;\n exposeDashboard?: boolean;\n matchingResourceLabels?: MatchResourceLabelEntry[];\n endpointType?: 'public' | 'dns';\n};\n\nconst VALID_ENDPOINT_TYPES = ['public', 'dns'] as const;\n\nexport class GkeClusterLocator implements KubernetesClustersSupplier {\n private readonly options: GkeClusterLocatorOptions;\n private readonly client: container.v1.ClusterManagerClient;\n private readonly logger: LoggerService;\n private clusterDetails: ClusterDetails[] | undefined;\n private hasClusterDetails: boolean;\n\n constructor(\n options: GkeClusterLocatorOptions,\n client: container.v1.ClusterManagerClient,\n logger: LoggerService,\n clusterDetails: ClusterDetails[] | undefined = undefined,\n hasClusterDetails: boolean = false,\n ) {\n this.options = options;\n this.client = client;\n this.logger = logger;\n this.clusterDetails = clusterDetails;\n this.hasClusterDetails = hasClusterDetails;\n }\n\n static fromConfigWithClient(\n config: Config,\n client: container.v1.ClusterManagerClient,\n logger: LoggerService,\n refreshInterval?: Duration,\n ): GkeClusterLocator {\n const matchingResourceLabels: MatchResourceLabelEntry[] =\n config.getOptionalConfigArray('matchingResourceLabels')?.map(mrl => {\n return { key: mrl.getString('key'), value: mrl.getString('value') };\n }) ?? [];\n\n const storeAuthProviderString =\n config.getOptionalString('authProvider') === 'googleServiceAccount'\n ? 'googleServiceAccount'\n : 'google';\n\n const options = {\n projectId: config.getString('projectId'),\n authProvider: storeAuthProviderString,\n region: config.getOptionalString('region') ?? '-',\n skipTLSVerify: config.getOptionalBoolean('skipTLSVerify') ?? false,\n skipMetricsLookup:\n config.getOptionalBoolean('skipMetricsLookup') ?? false,\n exposeDashboard: config.getOptionalBoolean('exposeDashboard') ?? false,\n matchingResourceLabels,\n endpointType: parseEndpointType(config.getOptionalString('endpointType')),\n };\n const gkeClusterLocator = new GkeClusterLocator(options, client, logger);\n if (refreshInterval) {\n runPeriodically(\n () => gkeClusterLocator.refreshClusters(),\n refreshInterval.toMillis(),\n );\n }\n return gkeClusterLocator;\n }\n\n // Added an `x-goog-api-client` header to API requests made by the GKE cluster locator to clearly identify API requests from this plugin.\n static fromConfig(\n config: Config,\n logger: LoggerService,\n refreshInterval: Duration | undefined = undefined,\n ): GkeClusterLocator {\n return GkeClusterLocator.fromConfigWithClient(\n config,\n new container.v1.ClusterManagerClient({\n libName: `backstage/kubernetes-backend.GkeClusterLocator`,\n libVersion: packageinfo.version,\n }),\n logger,\n refreshInterval,\n );\n }\n\n async getClusters(): Promise<ClusterDetails[]> {\n if (!this.hasClusterDetails) {\n // refresh at least once when first called, when retries are disabled and in tests\n await this.refreshClusters();\n }\n return this.clusterDetails ?? [];\n }\n\n private getClusterUrl(\n cluster: container.protos.google.container.v1.ICluster,\n ): string {\n if (this.options.endpointType === 'dns') {\n const dnsEndpoint =\n cluster.controlPlaneEndpointsConfig?.dnsEndpointConfig?.endpoint;\n if (dnsEndpoint) {\n return `https://${dnsEndpoint}`;\n }\n this.logger.info(\n `Cluster '${\n cluster.name ?? 'unknown'\n }' has endpointType 'dns' configured but no DNS endpoint available, falling back to public IP`,\n );\n }\n return `https://${cluster.endpoint ?? ''}`;\n }\n\n // TODO pass caData into the object\n async refreshClusters(): Promise<void> {\n const {\n projectId,\n region,\n authProvider,\n skipTLSVerify,\n skipMetricsLookup,\n exposeDashboard,\n matchingResourceLabels,\n } = this.options;\n const request = {\n parent: `projects/${projectId}/locations/${region}`,\n };\n\n try {\n const [response] = await this.client.listClusters(request);\n this.clusterDetails = (response.clusters ?? [])\n .filter(r => {\n return matchingResourceLabels?.every(mrl => {\n if (!r.resourceLabels) {\n return false;\n }\n return r.resourceLabels[mrl.key] === mrl.value;\n });\n })\n .map(r => ({\n // TODO filter out clusters which don't have name or endpoint\n name: r.name ?? 'unknown',\n url: this.getClusterUrl(r),\n authMetadata: { [ANNOTATION_KUBERNETES_AUTH_PROVIDER]: authProvider },\n skipTLSVerify,\n skipMetricsLookup,\n ...(exposeDashboard\n ? {\n dashboardApp: 'gke',\n dashboardParameters: {\n projectId,\n region,\n clusterName: r.name,\n },\n }\n : {}),\n }));\n this.hasClusterDetails = true;\n } catch (e) {\n throw new ForwardedError(\n `There was an error retrieving clusters from GKE for projectId=${projectId} region=${region}`,\n e,\n );\n }\n }\n}\n\nfunction isValidEndpointType(\n value: string,\n): value is (typeof VALID_ENDPOINT_TYPES)[number] {\n return VALID_ENDPOINT_TYPES.includes(\n value as (typeof VALID_ENDPOINT_TYPES)[number],\n );\n}\n\nfunction parseEndpointType(value: string | undefined): 'public' | 'dns' {\n if (value === undefined) {\n return 'public';\n }\n if (isValidEndpointType(value)) {\n return value;\n }\n throw new Error(\n `Invalid endpointType '${value}', must be one of: ${VALID_ENDPOINT_TYPES.join(\n ', ',\n )}`,\n );\n}\n"],"names":["runPeriodically","container","packageinfo","ANNOTATION_KUBERNETES_AUTH_PROVIDER","ForwardedError"],"mappings":"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"}
@@ -54,6 +54,7 @@ const getCombinedClusterSupplier = (rootConfig, catalogService, authStrategy, lo
54
54
  case "gke":
55
55
  return GkeClusterLocator.GkeClusterLocator.fromConfig(
56
56
  clusterLocatorMethod,
57
+ logger,
57
58
  refreshInterval
58
59
  );
59
60
  default:
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../src/cluster-locator/index.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 { Config } from '@backstage/config';\nimport { Duration } from 'luxon';\nimport { ConfigClusterLocator } from './ConfigClusterLocator';\nimport { GkeClusterLocator } from './GkeClusterLocator';\nimport { CatalogClusterLocator } from './CatalogClusterLocator';\nimport { LocalKubectlProxyClusterLocator } from './LocalKubectlProxyLocator';\nimport {\n AuthService,\n BackstageCredentials,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport {\n AuthenticationStrategy,\n ClusterDetails,\n KubernetesClustersSupplier,\n} from '@backstage/plugin-kubernetes-node';\nimport { CatalogService } from '@backstage/plugin-catalog-node';\n\nclass CombinedClustersSupplier implements KubernetesClustersSupplier {\n readonly clusterSuppliers: KubernetesClustersSupplier[];\n readonly logger: LoggerService;\n\n constructor(\n clusterSuppliers: KubernetesClustersSupplier[],\n logger: LoggerService,\n ) {\n this.clusterSuppliers = clusterSuppliers;\n this.logger = logger;\n }\n\n async getClusters(options: {\n credentials: BackstageCredentials;\n }): Promise<ClusterDetails[]> {\n const clusters = await Promise.all(\n this.clusterSuppliers.map(supplier => supplier.getClusters(options)),\n )\n .then(res => {\n return res.flat();\n })\n .catch(e => {\n throw e;\n });\n return this.warnDuplicates(clusters);\n }\n\n private warnDuplicates(clusters: ClusterDetails[]): ClusterDetails[] {\n const clusterNames = new Set<string>();\n const duplicatedNames = new Set<string>();\n for (const clusterName of clusters.map(c => c.name)) {\n if (clusterNames.has(clusterName)) {\n duplicatedNames.add(clusterName);\n } else {\n clusterNames.add(clusterName);\n }\n }\n for (const clusterName of duplicatedNames) {\n this.logger.warn(`Duplicate cluster name '${clusterName}'`);\n }\n return clusters;\n }\n}\n\nexport const getCombinedClusterSupplier = (\n rootConfig: Config,\n catalogService: CatalogService,\n authStrategy: AuthenticationStrategy,\n logger: LoggerService,\n refreshInterval: Duration | undefined = undefined,\n auth: AuthService,\n): KubernetesClustersSupplier => {\n const clusterSuppliers = rootConfig\n .getConfigArray('kubernetes.clusterLocatorMethods')\n .map(clusterLocatorMethod => {\n const type = clusterLocatorMethod.getString('type');\n switch (type) {\n case 'catalog':\n return CatalogClusterLocator.fromConfig(catalogService, auth);\n case 'localKubectlProxy':\n return new LocalKubectlProxyClusterLocator();\n case 'config':\n return ConfigClusterLocator.fromConfig(\n clusterLocatorMethod,\n authStrategy,\n );\n case 'gke':\n return GkeClusterLocator.fromConfig(\n clusterLocatorMethod,\n refreshInterval,\n );\n default:\n throw new Error(\n `Unsupported kubernetes.clusterLocatorMethods: \"${type}\"`,\n );\n }\n });\n\n return new CombinedClustersSupplier(clusterSuppliers, logger);\n};\n"],"names":["CatalogClusterLocator","LocalKubectlProxyClusterLocator","ConfigClusterLocator","GkeClusterLocator"],"mappings":";;;;;;;AAkCA,MAAM,wBAAA,CAA+D;AAAA,EAC1D,gBAAA;AAAA,EACA,MAAA;AAAA,EAET,WAAA,CACE,kBACA,MAAA,EACA;AACA,IAAA,IAAA,CAAK,gBAAA,GAAmB,gBAAA;AACxB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,MAAM,YAAY,OAAA,EAEY;AAC5B,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,GAAA;AAAA,MAC7B,KAAK,gBAAA,CAAiB,GAAA,CAAI,cAAY,QAAA,CAAS,WAAA,CAAY,OAAO,CAAC;AAAA,KACrE,CACG,KAAK,CAAA,GAAA,KAAO;AACX,MAAA,OAAO,IAAI,IAAA,EAAK;AAAA,IAClB,CAAC,CAAA,CACA,KAAA,CAAM,CAAA,CAAA,KAAK;AACV,MAAA,MAAM,CAAA;AAAA,IACR,CAAC,CAAA;AACH,IAAA,OAAO,IAAA,CAAK,eAAe,QAAQ,CAAA;AAAA,EACrC;AAAA,EAEQ,eAAe,QAAA,EAA8C;AACnE,IAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AACrC,IAAA,MAAM,eAAA,uBAAsB,GAAA,EAAY;AACxC,IAAA,KAAA,MAAW,eAAe,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA,EAAG;AACnD,MAAA,IAAI,YAAA,CAAa,GAAA,CAAI,WAAW,CAAA,EAAG;AACjC,QAAA,eAAA,CAAgB,IAAI,WAAW,CAAA;AAAA,MACjC,CAAA,MAAO;AACL,QAAA,YAAA,CAAa,IAAI,WAAW,CAAA;AAAA,MAC9B;AAAA,IACF;AACA,IAAA,KAAA,MAAW,eAAe,eAAA,EAAiB;AACzC,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,wBAAA,EAA2B,WAAW,CAAA,CAAA,CAAG,CAAA;AAAA,IAC5D;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AACF;AAEO,MAAM,0BAAA,GAA6B,CACxC,UAAA,EACA,cAAA,EACA,cACA,MAAA,EACA,eAAA,GAAwC,QACxC,IAAA,KAC+B;AAC/B,EAAA,MAAM,mBAAmB,UAAA,CACtB,cAAA,CAAe,kCAAkC,CAAA,CACjD,IAAI,CAAA,oBAAA,KAAwB;AAC3B,IAAA,MAAM,IAAA,GAAO,oBAAA,CAAqB,SAAA,CAAU,MAAM,CAAA;AAClD,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,SAAA;AACH,QAAA,OAAOA,2CAAA,CAAsB,UAAA,CAAW,cAAA,EAAgB,IAAI,CAAA;AAAA,MAC9D,KAAK,mBAAA;AACH,QAAA,OAAO,IAAIC,wDAAA,EAAgC;AAAA,MAC7C,KAAK,QAAA;AACH,QAAA,OAAOC,yCAAA,CAAqB,UAAA;AAAA,UAC1B,oBAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,KAAK,KAAA;AACH,QAAA,OAAOC,mCAAA,CAAkB,UAAA;AAAA,UACvB,oBAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AACE,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,kDAAkD,IAAI,CAAA,CAAA;AAAA,SACxD;AAAA;AACJ,EACF,CAAC,CAAA;AAEH,EAAA,OAAO,IAAI,wBAAA,CAAyB,gBAAA,EAAkB,MAAM,CAAA;AAC9D;;;;"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../../src/cluster-locator/index.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 { Config } from '@backstage/config';\nimport { Duration } from 'luxon';\nimport { ConfigClusterLocator } from './ConfigClusterLocator';\nimport { GkeClusterLocator } from './GkeClusterLocator';\nimport { CatalogClusterLocator } from './CatalogClusterLocator';\nimport { LocalKubectlProxyClusterLocator } from './LocalKubectlProxyLocator';\nimport {\n AuthService,\n BackstageCredentials,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport {\n AuthenticationStrategy,\n ClusterDetails,\n KubernetesClustersSupplier,\n} from '@backstage/plugin-kubernetes-node';\nimport { CatalogService } from '@backstage/plugin-catalog-node';\n\nclass CombinedClustersSupplier implements KubernetesClustersSupplier {\n readonly clusterSuppliers: KubernetesClustersSupplier[];\n readonly logger: LoggerService;\n\n constructor(\n clusterSuppliers: KubernetesClustersSupplier[],\n logger: LoggerService,\n ) {\n this.clusterSuppliers = clusterSuppliers;\n this.logger = logger;\n }\n\n async getClusters(options: {\n credentials: BackstageCredentials;\n }): Promise<ClusterDetails[]> {\n const clusters = await Promise.all(\n this.clusterSuppliers.map(supplier => supplier.getClusters(options)),\n )\n .then(res => {\n return res.flat();\n })\n .catch(e => {\n throw e;\n });\n return this.warnDuplicates(clusters);\n }\n\n private warnDuplicates(clusters: ClusterDetails[]): ClusterDetails[] {\n const clusterNames = new Set<string>();\n const duplicatedNames = new Set<string>();\n for (const clusterName of clusters.map(c => c.name)) {\n if (clusterNames.has(clusterName)) {\n duplicatedNames.add(clusterName);\n } else {\n clusterNames.add(clusterName);\n }\n }\n for (const clusterName of duplicatedNames) {\n this.logger.warn(`Duplicate cluster name '${clusterName}'`);\n }\n return clusters;\n }\n}\n\nexport const getCombinedClusterSupplier = (\n rootConfig: Config,\n catalogService: CatalogService,\n authStrategy: AuthenticationStrategy,\n logger: LoggerService,\n refreshInterval: Duration | undefined = undefined,\n auth: AuthService,\n): KubernetesClustersSupplier => {\n const clusterSuppliers = rootConfig\n .getConfigArray('kubernetes.clusterLocatorMethods')\n .map(clusterLocatorMethod => {\n const type = clusterLocatorMethod.getString('type');\n switch (type) {\n case 'catalog':\n return CatalogClusterLocator.fromConfig(catalogService, auth);\n case 'localKubectlProxy':\n return new LocalKubectlProxyClusterLocator();\n case 'config':\n return ConfigClusterLocator.fromConfig(\n clusterLocatorMethod,\n authStrategy,\n );\n case 'gke':\n return GkeClusterLocator.fromConfig(\n clusterLocatorMethod,\n logger,\n refreshInterval,\n );\n default:\n throw new Error(\n `Unsupported kubernetes.clusterLocatorMethods: \"${type}\"`,\n );\n }\n });\n\n return new CombinedClustersSupplier(clusterSuppliers, logger);\n};\n"],"names":["CatalogClusterLocator","LocalKubectlProxyClusterLocator","ConfigClusterLocator","GkeClusterLocator"],"mappings":";;;;;;;AAkCA,MAAM,wBAAA,CAA+D;AAAA,EAC1D,gBAAA;AAAA,EACA,MAAA;AAAA,EAET,WAAA,CACE,kBACA,MAAA,EACA;AACA,IAAA,IAAA,CAAK,gBAAA,GAAmB,gBAAA;AACxB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,MAAM,YAAY,OAAA,EAEY;AAC5B,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,GAAA;AAAA,MAC7B,KAAK,gBAAA,CAAiB,GAAA,CAAI,cAAY,QAAA,CAAS,WAAA,CAAY,OAAO,CAAC;AAAA,KACrE,CACG,KAAK,CAAA,GAAA,KAAO;AACX,MAAA,OAAO,IAAI,IAAA,EAAK;AAAA,IAClB,CAAC,CAAA,CACA,KAAA,CAAM,CAAA,CAAA,KAAK;AACV,MAAA,MAAM,CAAA;AAAA,IACR,CAAC,CAAA;AACH,IAAA,OAAO,IAAA,CAAK,eAAe,QAAQ,CAAA;AAAA,EACrC;AAAA,EAEQ,eAAe,QAAA,EAA8C;AACnE,IAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AACrC,IAAA,MAAM,eAAA,uBAAsB,GAAA,EAAY;AACxC,IAAA,KAAA,MAAW,eAAe,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA,EAAG;AACnD,MAAA,IAAI,YAAA,CAAa,GAAA,CAAI,WAAW,CAAA,EAAG;AACjC,QAAA,eAAA,CAAgB,IAAI,WAAW,CAAA;AAAA,MACjC,CAAA,MAAO;AACL,QAAA,YAAA,CAAa,IAAI,WAAW,CAAA;AAAA,MAC9B;AAAA,IACF;AACA,IAAA,KAAA,MAAW,eAAe,eAAA,EAAiB;AACzC,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,wBAAA,EAA2B,WAAW,CAAA,CAAA,CAAG,CAAA;AAAA,IAC5D;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AACF;AAEO,MAAM,0BAAA,GAA6B,CACxC,UAAA,EACA,cAAA,EACA,cACA,MAAA,EACA,eAAA,GAAwC,QACxC,IAAA,KAC+B;AAC/B,EAAA,MAAM,mBAAmB,UAAA,CACtB,cAAA,CAAe,kCAAkC,CAAA,CACjD,IAAI,CAAA,oBAAA,KAAwB;AAC3B,IAAA,MAAM,IAAA,GAAO,oBAAA,CAAqB,SAAA,CAAU,MAAM,CAAA;AAClD,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,SAAA;AACH,QAAA,OAAOA,2CAAA,CAAsB,UAAA,CAAW,cAAA,EAAgB,IAAI,CAAA;AAAA,MAC9D,KAAK,mBAAA;AACH,QAAA,OAAO,IAAIC,wDAAA,EAAgC;AAAA,MAC7C,KAAK,QAAA;AACH,QAAA,OAAOC,yCAAA,CAAqB,UAAA;AAAA,UAC1B,oBAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,KAAK,KAAA;AACH,QAAA,OAAOC,mCAAA,CAAkB,UAAA;AAAA,UACvB,oBAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AACE,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,kDAAkD,IAAI,CAAA,CAAA;AAAA,SACxD;AAAA;AACJ,EACF,CAAC,CAAA;AAEH,EAAA,OAAO,IAAI,wBAAA,CAAyB,gBAAA,EAAkB,MAAM,CAAA;AAC9D;;;;"}
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var version = "0.21.2-next.1";
5
+ var version = "0.21.2";
6
6
  var packageinfo = {
7
7
  version: version};
8
8
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-kubernetes-backend",
3
- "version": "0.21.2-next.1",
3
+ "version": "0.21.2",
4
4
  "description": "A Backstage backend plugin that integrates towards Kubernetes",
5
5
  "backstage": {
6
6
  "role": "backend-plugin",
@@ -49,18 +49,18 @@
49
49
  "@aws-crypto/sha256-js": "^5.0.0",
50
50
  "@aws-sdk/credential-providers": "^3.350.0",
51
51
  "@azure/identity": "^4.0.0",
52
- "@backstage/backend-plugin-api": "1.7.1-next.0",
53
- "@backstage/catalog-client": "1.14.0-next.1",
54
- "@backstage/catalog-model": "1.7.6",
55
- "@backstage/config": "1.3.6",
56
- "@backstage/errors": "1.2.7",
57
- "@backstage/integration-aws-node": "0.1.20",
58
- "@backstage/plugin-catalog-node": "2.1.0-next.1",
59
- "@backstage/plugin-kubernetes-common": "0.9.10",
60
- "@backstage/plugin-kubernetes-node": "0.4.2-next.0",
61
- "@backstage/plugin-permission-common": "0.9.6",
62
- "@backstage/plugin-permission-node": "0.10.11-next.0",
63
- "@backstage/types": "1.2.2",
52
+ "@backstage/backend-plugin-api": "^1.8.0",
53
+ "@backstage/catalog-client": "^1.14.0",
54
+ "@backstage/catalog-model": "^1.7.7",
55
+ "@backstage/config": "^1.3.6",
56
+ "@backstage/errors": "^1.2.7",
57
+ "@backstage/integration-aws-node": "^0.1.20",
58
+ "@backstage/plugin-catalog-node": "^2.1.0",
59
+ "@backstage/plugin-kubernetes-common": "^0.9.10",
60
+ "@backstage/plugin-kubernetes-node": "^0.4.2",
61
+ "@backstage/plugin-permission-common": "^0.9.7",
62
+ "@backstage/plugin-permission-node": "^0.10.11",
63
+ "@backstage/types": "^1.2.2",
64
64
  "@google-cloud/container": "^5.0.0",
65
65
  "@jest-mock/express": "^2.0.1",
66
66
  "@kubernetes/client-node": "1.4.0",
@@ -75,11 +75,11 @@
75
75
  "node-fetch": "^2.7.0"
76
76
  },
77
77
  "devDependencies": {
78
- "@backstage/backend-defaults": "0.16.0-next.1",
79
- "@backstage/backend-test-utils": "1.11.1-next.1",
80
- "@backstage/cli": "0.36.0-next.1",
81
- "@backstage/plugin-permission-backend": "0.7.10-next.0",
82
- "@backstage/plugin-permission-backend-module-allow-all-policy": "0.2.17-next.0",
78
+ "@backstage/backend-defaults": "^0.16.0",
79
+ "@backstage/backend-test-utils": "^1.11.1",
80
+ "@backstage/cli": "^0.36.0",
81
+ "@backstage/plugin-permission-backend": "^0.7.10",
82
+ "@backstage/plugin-permission-backend-module-allow-all-policy": "^0.2.17",
83
83
  "@types/express": "^4.17.6",
84
84
  "msw": "^1.0.0",
85
85
  "supertest": "^7.0.0",