@backstage/plugin-kubernetes-backend 0.20.0-next.1 → 0.20.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 (45) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/config.d.ts +7 -0
  3. package/dist/auth/AksStrategy.cjs.js.map +1 -1
  4. package/dist/auth/AnonymousStrategy.cjs.js.map +1 -1
  5. package/dist/auth/AwsIamStrategy.cjs.js.map +1 -1
  6. package/dist/auth/AzureIdentityStrategy.cjs.js.map +1 -1
  7. package/dist/auth/DispatchStrategy.cjs.js.map +1 -1
  8. package/dist/auth/GoogleServiceAccountStrategy.cjs.js +22 -2
  9. package/dist/auth/GoogleServiceAccountStrategy.cjs.js.map +1 -1
  10. package/dist/auth/GoogleStrategy.cjs.js.map +1 -1
  11. package/dist/auth/OidcStrategy.cjs.js.map +1 -1
  12. package/dist/auth/ServiceAccountStrategy.cjs.js.map +1 -1
  13. package/dist/auth/buildDefaultAuthStrategyMap.cjs.js +27 -0
  14. package/dist/auth/buildDefaultAuthStrategyMap.cjs.js.map +1 -0
  15. package/dist/auth/requirePermission.cjs.js.map +1 -1
  16. package/dist/cluster-locator/CatalogClusterLocator.cjs.js +7 -10
  17. package/dist/cluster-locator/CatalogClusterLocator.cjs.js.map +1 -1
  18. package/dist/cluster-locator/ConfigClusterLocator.cjs.js.map +1 -1
  19. package/dist/cluster-locator/GkeClusterLocator.cjs.js.map +1 -1
  20. package/dist/cluster-locator/LocalKubectlProxyLocator.cjs.js.map +1 -1
  21. package/dist/cluster-locator/index.cjs.js +2 -2
  22. package/dist/cluster-locator/index.cjs.js.map +1 -1
  23. package/dist/index.d.ts +26 -1
  24. package/dist/package.json.cjs.js +2 -127
  25. package/dist/package.json.cjs.js.map +1 -1
  26. package/dist/plugin.cjs.js +60 -25
  27. package/dist/plugin.cjs.js.map +1 -1
  28. package/dist/routes/resourcesRoutes.cjs.js +3 -5
  29. package/dist/routes/resourcesRoutes.cjs.js.map +1 -1
  30. package/dist/service/KubernetesFanOutHandler.cjs.js.map +1 -1
  31. package/dist/service/KubernetesFetcher.cjs.js.map +1 -1
  32. package/dist/service/KubernetesInitializer.cjs.js +143 -0
  33. package/dist/service/KubernetesInitializer.cjs.js.map +1 -0
  34. package/dist/service/KubernetesProxy.cjs.js.map +1 -1
  35. package/dist/service/KubernetesRouter.cjs.js +167 -0
  36. package/dist/service/KubernetesRouter.cjs.js.map +1 -0
  37. package/dist/service/runPeriodically.cjs.js.map +1 -1
  38. package/dist/service-locator/CatalogRelationServiceLocator.cjs.js.map +1 -1
  39. package/dist/service-locator/MultiTenantServiceLocator.cjs.js.map +1 -1
  40. package/dist/service-locator/SingleTenantServiceLocator.cjs.js.map +1 -1
  41. package/dist/service-locator/buildDefaultServiceLocator.cjs.js +31 -0
  42. package/dist/service-locator/buildDefaultServiceLocator.cjs.js.map +1 -0
  43. package/package.json +20 -20
  44. package/dist/service/KubernetesBuilder.cjs.js +0 -374
  45. package/dist/service/KubernetesBuilder.cjs.js.map +0 -1
@@ -1,374 +0,0 @@
1
- 'use strict';
2
-
3
- var pluginKubernetesCommon = require('@backstage/plugin-kubernetes-common');
4
- var pluginPermissionNode = require('@backstage/plugin-permission-node');
5
- var express = require('express');
6
- var Router = require('express-promise-router');
7
- var luxon = require('luxon');
8
- var AksStrategy = require('../auth/AksStrategy.cjs.js');
9
- var AnonymousStrategy = require('../auth/AnonymousStrategy.cjs.js');
10
- var AwsIamStrategy = require('../auth/AwsIamStrategy.cjs.js');
11
- var AzureIdentityStrategy = require('../auth/AzureIdentityStrategy.cjs.js');
12
- var GoogleStrategy = require('../auth/GoogleStrategy.cjs.js');
13
- var GoogleServiceAccountStrategy = require('../auth/GoogleServiceAccountStrategy.cjs.js');
14
- var DispatchStrategy = require('../auth/DispatchStrategy.cjs.js');
15
- var ServiceAccountStrategy = require('../auth/ServiceAccountStrategy.cjs.js');
16
- var OidcStrategy = require('../auth/OidcStrategy.cjs.js');
17
- var index = require('../cluster-locator/index.cjs.js');
18
- var resourcesRoutes = require('../routes/resourcesRoutes.cjs.js');
19
- var CatalogRelationServiceLocator = require('../service-locator/CatalogRelationServiceLocator.cjs.js');
20
- var MultiTenantServiceLocator = require('../service-locator/MultiTenantServiceLocator.cjs.js');
21
- var SingleTenantServiceLocator = require('../service-locator/SingleTenantServiceLocator.cjs.js');
22
- var KubernetesFanOutHandler = require('./KubernetesFanOutHandler.cjs.js');
23
- var KubernetesFetcher = require('./KubernetesFetcher.cjs.js');
24
- var KubernetesProxy = require('./KubernetesProxy.cjs.js');
25
- var requirePermission = require('../auth/requirePermission.cjs.js');
26
-
27
- function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
28
-
29
- var express__default = /*#__PURE__*/_interopDefaultCompat(express);
30
- var Router__default = /*#__PURE__*/_interopDefaultCompat(Router);
31
-
32
- class KubernetesBuilder {
33
- constructor(env) {
34
- this.env = env;
35
- }
36
- clusterSupplier;
37
- defaultClusterRefreshInterval = luxon.Duration.fromObject({
38
- minutes: 60
39
- });
40
- objectsProvider;
41
- fetcher;
42
- serviceLocator;
43
- proxy;
44
- authStrategyMap;
45
- static createBuilder(env) {
46
- return new KubernetesBuilder(env);
47
- }
48
- async build() {
49
- const logger = this.env.logger;
50
- const config = this.env.config;
51
- const permissions = this.env.permissions;
52
- logger.info("Initializing Kubernetes backend");
53
- if (!config.has("kubernetes")) {
54
- if (process.env.NODE_ENV !== "development") {
55
- throw new Error("Kubernetes configuration is missing");
56
- }
57
- logger.warn(
58
- "Failed to initialize kubernetes backend: kubernetes config is missing"
59
- );
60
- return {
61
- router: Router__default.default()
62
- };
63
- }
64
- const customResources = this.buildCustomResources();
65
- const fetcher = this.getFetcher();
66
- const clusterSupplier = this.getClusterSupplier();
67
- const authStrategyMap = this.getAuthStrategyMap();
68
- const proxy = this.getProxy(
69
- logger,
70
- clusterSupplier,
71
- this.env.discovery,
72
- this.env.httpAuth
73
- );
74
- const serviceLocator = this.getServiceLocator();
75
- const objectsProvider = this.getObjectsProvider({
76
- logger,
77
- fetcher,
78
- config,
79
- serviceLocator,
80
- customResources,
81
- objectTypesToFetch: this.getObjectTypesToFetch()
82
- });
83
- const router = this.buildRouter(
84
- objectsProvider,
85
- clusterSupplier,
86
- this.env.catalogApi,
87
- proxy,
88
- permissions,
89
- this.env.auth,
90
- this.env.httpAuth
91
- );
92
- return {
93
- clusterSupplier,
94
- customResources,
95
- fetcher,
96
- proxy,
97
- objectsProvider,
98
- router,
99
- serviceLocator,
100
- authStrategyMap
101
- };
102
- }
103
- setClusterSupplier(clusterSupplier) {
104
- this.clusterSupplier = clusterSupplier;
105
- return this;
106
- }
107
- setDefaultClusterRefreshInterval(refreshInterval) {
108
- this.defaultClusterRefreshInterval = refreshInterval;
109
- return this;
110
- }
111
- setObjectsProvider(objectsProvider) {
112
- this.objectsProvider = objectsProvider;
113
- return this;
114
- }
115
- setFetcher(fetcher) {
116
- this.fetcher = fetcher;
117
- return this;
118
- }
119
- setServiceLocator(serviceLocator) {
120
- this.serviceLocator = serviceLocator;
121
- return this;
122
- }
123
- setProxy(proxy) {
124
- this.proxy = proxy;
125
- return this;
126
- }
127
- setAuthStrategyMap(authStrategyMap) {
128
- this.authStrategyMap = authStrategyMap;
129
- }
130
- addAuthStrategy(key, strategy) {
131
- if (key.includes("-")) {
132
- throw new Error("Strategy name can not include dashes");
133
- }
134
- this.getAuthStrategyMap()[key] = strategy;
135
- return this;
136
- }
137
- buildCustomResources() {
138
- const customResources = (this.env.config.getOptionalConfigArray("kubernetes.customResources") ?? []).map(
139
- (c) => ({
140
- group: c.getString("group"),
141
- apiVersion: c.getString("apiVersion"),
142
- plural: c.getString("plural"),
143
- objectType: "customresources"
144
- })
145
- );
146
- this.env.logger.info(
147
- `action=LoadingCustomResources numOfCustomResources=${customResources.length}`
148
- );
149
- return customResources;
150
- }
151
- buildClusterSupplier(refreshInterval) {
152
- const config = this.env.config;
153
- this.clusterSupplier = index.getCombinedClusterSupplier(
154
- config,
155
- this.env.catalogApi,
156
- new DispatchStrategy.DispatchStrategy({ authStrategyMap: this.getAuthStrategyMap() }),
157
- this.env.logger,
158
- refreshInterval,
159
- this.env.auth
160
- );
161
- return this.clusterSupplier;
162
- }
163
- buildObjectsProvider(options) {
164
- const authStrategyMap = this.getAuthStrategyMap();
165
- this.objectsProvider = new KubernetesFanOutHandler.KubernetesFanOutHandler({
166
- ...options,
167
- authStrategy: new DispatchStrategy.DispatchStrategy({
168
- authStrategyMap
169
- })
170
- });
171
- return this.objectsProvider;
172
- }
173
- buildFetcher() {
174
- this.fetcher = new KubernetesFetcher.KubernetesClientBasedFetcher({
175
- logger: this.env.logger
176
- });
177
- return this.fetcher;
178
- }
179
- buildServiceLocator(method, clusterSupplier) {
180
- switch (method) {
181
- case "multiTenant":
182
- this.serviceLocator = this.buildMultiTenantServiceLocator(clusterSupplier);
183
- break;
184
- case "singleTenant":
185
- this.serviceLocator = this.buildSingleTenantServiceLocator(clusterSupplier);
186
- break;
187
- case "catalogRelation":
188
- this.serviceLocator = this.buildCatalogRelationServiceLocator(clusterSupplier);
189
- break;
190
- case "http":
191
- this.serviceLocator = this.buildHttpServiceLocator(clusterSupplier);
192
- break;
193
- default:
194
- throw new Error(
195
- `Unsupported kubernetes.serviceLocatorMethod "${method}"`
196
- );
197
- }
198
- return this.serviceLocator;
199
- }
200
- buildMultiTenantServiceLocator(clusterSupplier) {
201
- return new MultiTenantServiceLocator.MultiTenantServiceLocator(clusterSupplier);
202
- }
203
- buildSingleTenantServiceLocator(clusterSupplier) {
204
- return new SingleTenantServiceLocator.SingleTenantServiceLocator(clusterSupplier);
205
- }
206
- buildCatalogRelationServiceLocator(clusterSupplier) {
207
- return new CatalogRelationServiceLocator.CatalogRelationServiceLocator(clusterSupplier);
208
- }
209
- buildHttpServiceLocator(_clusterSupplier) {
210
- throw new Error("not implemented");
211
- }
212
- buildProxy(logger, clusterSupplier, discovery, httpAuth) {
213
- const authStrategyMap = this.getAuthStrategyMap();
214
- const authStrategy = new DispatchStrategy.DispatchStrategy({
215
- authStrategyMap
216
- });
217
- this.proxy = new KubernetesProxy.KubernetesProxy({
218
- logger,
219
- clusterSupplier,
220
- authStrategy,
221
- discovery,
222
- httpAuth
223
- });
224
- return this.proxy;
225
- }
226
- buildRouter(objectsProvider, clusterSupplier, catalogApi, proxy, permissionApi, authService, httpAuth) {
227
- const logger = this.env.logger;
228
- const router = Router__default.default();
229
- router.use("/proxy", proxy.createRequestHandler({ permissionApi }));
230
- router.use(express__default.default.json());
231
- router.use(
232
- pluginPermissionNode.createPermissionIntegrationRouter({
233
- permissions: pluginKubernetesCommon.kubernetesPermissions
234
- })
235
- );
236
- router.post("/services/:serviceId", async (req, res) => {
237
- await requirePermission.requirePermission(
238
- permissionApi,
239
- pluginKubernetesCommon.kubernetesResourcesReadPermission,
240
- httpAuth,
241
- req
242
- );
243
- const serviceId = req.params.serviceId;
244
- const requestBody = req.body;
245
- try {
246
- const response = await objectsProvider.getKubernetesObjectsByEntity(
247
- {
248
- entity: requestBody.entity,
249
- auth: requestBody.auth || {}
250
- },
251
- { credentials: await httpAuth.credentials(req) }
252
- );
253
- res.json(response);
254
- } catch (e) {
255
- logger.error(
256
- `action=retrieveObjectsByServiceId service=${serviceId}, error=${e}`
257
- );
258
- res.status(500).json({ error: e.message });
259
- }
260
- });
261
- router.get("/clusters", async (req, res) => {
262
- await requirePermission.requirePermission(
263
- permissionApi,
264
- pluginKubernetesCommon.kubernetesClustersReadPermission,
265
- httpAuth,
266
- req
267
- );
268
- const credentials = await httpAuth.credentials(req);
269
- const clusterDetails = await this.fetchClusterDetails(clusterSupplier, {
270
- credentials
271
- });
272
- res.json({
273
- items: clusterDetails.map((cd) => {
274
- const oidcTokenProvider = cd.authMetadata[pluginKubernetesCommon.ANNOTATION_KUBERNETES_OIDC_TOKEN_PROVIDER];
275
- const authProvider = cd.authMetadata[pluginKubernetesCommon.ANNOTATION_KUBERNETES_AUTH_PROVIDER];
276
- const strategy = this.getAuthStrategyMap()[authProvider];
277
- let auth = {};
278
- if (strategy) {
279
- auth = strategy.presentAuthMetadata(cd.authMetadata);
280
- }
281
- return {
282
- name: cd.name,
283
- title: cd.title,
284
- dashboardUrl: cd.dashboardUrl,
285
- authProvider,
286
- ...oidcTokenProvider && { oidcTokenProvider },
287
- ...auth && Object.keys(auth).length !== 0 && { auth }
288
- };
289
- })
290
- });
291
- });
292
- resourcesRoutes.addResourceRoutesToRouter(
293
- router,
294
- catalogApi,
295
- objectsProvider,
296
- authService,
297
- httpAuth,
298
- permissionApi
299
- );
300
- return router;
301
- }
302
- buildAuthStrategyMap() {
303
- this.authStrategyMap = {
304
- aks: new AksStrategy.AksStrategy(),
305
- aws: new AwsIamStrategy.AwsIamStrategy({ config: this.env.config }),
306
- azure: new AzureIdentityStrategy.AzureIdentityStrategy(this.env.logger),
307
- google: new GoogleStrategy.GoogleStrategy(),
308
- googleServiceAccount: new GoogleServiceAccountStrategy.GoogleServiceAccountStrategy(),
309
- localKubectlProxy: new AnonymousStrategy.AnonymousStrategy(),
310
- oidc: new OidcStrategy.OidcStrategy(),
311
- serviceAccount: new ServiceAccountStrategy.ServiceAccountStrategy()
312
- };
313
- return this.authStrategyMap;
314
- }
315
- async fetchClusterDetails(clusterSupplier, options) {
316
- const clusterDetails = await clusterSupplier.getClusters(options);
317
- this.env.logger.debug(
318
- `action=loadClusterDetails numOfClustersLoaded=${clusterDetails.length}`
319
- );
320
- return clusterDetails;
321
- }
322
- getServiceLocatorMethod() {
323
- return this.env.config.getString(
324
- "kubernetes.serviceLocatorMethod.type"
325
- );
326
- }
327
- getFetcher() {
328
- return this.fetcher ?? this.buildFetcher();
329
- }
330
- getClusterSupplier() {
331
- return this.clusterSupplier ?? this.buildClusterSupplier(this.defaultClusterRefreshInterval);
332
- }
333
- getServiceLocator() {
334
- return this.serviceLocator ?? this.buildServiceLocator(
335
- this.getServiceLocatorMethod(),
336
- this.getClusterSupplier()
337
- );
338
- }
339
- getObjectsProvider(options) {
340
- return this.objectsProvider ?? this.buildObjectsProvider(options);
341
- }
342
- getObjectTypesToFetch() {
343
- const objectTypesToFetchStrings = this.env.config.getOptionalStringArray(
344
- "kubernetes.objectTypes"
345
- );
346
- const apiVersionOverrides = this.env.config.getOptionalConfig(
347
- "kubernetes.apiVersionOverrides"
348
- );
349
- let objectTypesToFetch;
350
- if (objectTypesToFetchStrings) {
351
- objectTypesToFetch = KubernetesFanOutHandler.ALL_OBJECTS.filter(
352
- (obj) => objectTypesToFetchStrings.includes(obj.objectType)
353
- );
354
- }
355
- if (apiVersionOverrides) {
356
- objectTypesToFetch = objectTypesToFetch ?? KubernetesFanOutHandler.DEFAULT_OBJECTS;
357
- for (const obj of objectTypesToFetch) {
358
- if (apiVersionOverrides.has(obj.objectType)) {
359
- obj.apiVersion = apiVersionOverrides.getString(obj.objectType);
360
- }
361
- }
362
- }
363
- return objectTypesToFetch;
364
- }
365
- getProxy(logger, clusterSupplier, discovery, httpAuth) {
366
- return this.proxy ?? this.buildProxy(logger, clusterSupplier, discovery, httpAuth);
367
- }
368
- getAuthStrategyMap() {
369
- return this.authStrategyMap ?? this.buildAuthStrategyMap();
370
- }
371
- }
372
-
373
- exports.KubernetesBuilder = KubernetesBuilder;
374
- //# sourceMappingURL=KubernetesBuilder.cjs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"KubernetesBuilder.cjs.js","sources":["../../src/service/KubernetesBuilder.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 */\nimport { CatalogApi } from '@backstage/catalog-client';\nimport { Config } from '@backstage/config';\nimport {\n ANNOTATION_KUBERNETES_AUTH_PROVIDER,\n ANNOTATION_KUBERNETES_OIDC_TOKEN_PROVIDER,\n kubernetesClustersReadPermission,\n kubernetesPermissions,\n kubernetesResourcesReadPermission,\n} from '@backstage/plugin-kubernetes-common';\nimport { PermissionEvaluator } from '@backstage/plugin-permission-common';\nimport { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node';\nimport express from 'express';\nimport Router from 'express-promise-router';\nimport { Duration } from 'luxon';\n\nimport {\n AksStrategy,\n AnonymousStrategy,\n AwsIamStrategy,\n AzureIdentityStrategy,\n DispatchStrategy,\n GoogleServiceAccountStrategy,\n GoogleStrategy,\n OidcStrategy,\n ServiceAccountStrategy,\n} from '../auth';\nimport { getCombinedClusterSupplier } from '../cluster-locator';\n\nimport {\n AuthService,\n BackstageCredentials,\n DiscoveryService,\n HttpAuthService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport {\n AuthenticationStrategy,\n AuthMetadata,\n CustomResource,\n KubernetesClustersSupplier,\n KubernetesFetcher,\n KubernetesObjectsProvider,\n KubernetesObjectTypes,\n KubernetesServiceLocator,\n} from '@backstage/plugin-kubernetes-node';\nimport { addResourceRoutesToRouter } from '../routes/resourcesRoutes';\nimport { CatalogRelationServiceLocator } from '../service-locator/CatalogRelationServiceLocator';\nimport { MultiTenantServiceLocator } from '../service-locator/MultiTenantServiceLocator';\nimport { SingleTenantServiceLocator } from '../service-locator/SingleTenantServiceLocator';\nimport {\n KubernetesObjectsProviderOptions,\n ObjectsByEntityRequest,\n ServiceLocatorMethod,\n} from '../types/types';\nimport {\n ALL_OBJECTS,\n DEFAULT_OBJECTS,\n KubernetesFanOutHandler,\n} from './KubernetesFanOutHandler';\nimport { KubernetesClientBasedFetcher } from './KubernetesFetcher';\nimport { KubernetesProxy } from './KubernetesProxy';\nimport { requirePermission } from '../auth/requirePermission';\n\n/**\n * @deprecated Please migrate to the new backend system as this will be removed in the future.\n * @public\n */\nexport interface KubernetesEnvironment {\n logger: LoggerService;\n config: Config;\n catalogApi: CatalogApi;\n discovery: DiscoveryService;\n permissions: PermissionEvaluator;\n auth: AuthService;\n httpAuth: HttpAuthService;\n}\n\n/**\n * The return type of the `KubernetesBuilder.build` method\n * @deprecated Please migrate to the new backend system as this will be removed in the future.\n * @public\n */\nexport type KubernetesBuilderReturn = Promise<{\n router: express.Router;\n clusterSupplier: KubernetesClustersSupplier;\n customResources: CustomResource[];\n fetcher: KubernetesFetcher;\n proxy: KubernetesProxy;\n objectsProvider: KubernetesObjectsProvider;\n serviceLocator: KubernetesServiceLocator;\n authStrategyMap: { [key: string]: AuthenticationStrategy };\n}>;\n\nexport class KubernetesBuilder {\n private clusterSupplier?: KubernetesClustersSupplier;\n private defaultClusterRefreshInterval: Duration = Duration.fromObject({\n minutes: 60,\n });\n private objectsProvider?: KubernetesObjectsProvider;\n private fetcher?: KubernetesFetcher;\n private serviceLocator?: KubernetesServiceLocator;\n private proxy?: KubernetesProxy;\n private authStrategyMap?: { [key: string]: AuthenticationStrategy };\n\n static createBuilder(env: KubernetesEnvironment) {\n return new KubernetesBuilder(env);\n }\n\n constructor(protected readonly env: KubernetesEnvironment) {}\n\n public async build(): KubernetesBuilderReturn {\n const logger = this.env.logger;\n const config = this.env.config;\n const permissions = this.env.permissions;\n\n logger.info('Initializing Kubernetes backend');\n\n if (!config.has('kubernetes')) {\n if (process.env.NODE_ENV !== 'development') {\n throw new Error('Kubernetes configuration is missing');\n }\n logger.warn(\n 'Failed to initialize kubernetes backend: kubernetes config is missing',\n );\n return {\n router: Router(),\n } as unknown as KubernetesBuilderReturn;\n }\n\n const customResources = this.buildCustomResources();\n\n const fetcher = this.getFetcher();\n\n const clusterSupplier = this.getClusterSupplier();\n\n const authStrategyMap = this.getAuthStrategyMap();\n\n const proxy = this.getProxy(\n logger,\n clusterSupplier,\n this.env.discovery,\n this.env.httpAuth,\n );\n\n const serviceLocator = this.getServiceLocator();\n\n const objectsProvider = this.getObjectsProvider({\n logger,\n fetcher,\n config,\n serviceLocator,\n customResources,\n objectTypesToFetch: this.getObjectTypesToFetch(),\n });\n\n const router = this.buildRouter(\n objectsProvider,\n clusterSupplier,\n this.env.catalogApi,\n proxy,\n permissions,\n this.env.auth,\n this.env.httpAuth,\n );\n\n return {\n clusterSupplier,\n customResources,\n fetcher,\n proxy,\n objectsProvider,\n router,\n serviceLocator,\n authStrategyMap,\n };\n }\n\n public setClusterSupplier(clusterSupplier?: KubernetesClustersSupplier) {\n this.clusterSupplier = clusterSupplier;\n return this;\n }\n\n public setDefaultClusterRefreshInterval(refreshInterval: Duration) {\n this.defaultClusterRefreshInterval = refreshInterval;\n return this;\n }\n\n public setObjectsProvider(objectsProvider?: KubernetesObjectsProvider) {\n this.objectsProvider = objectsProvider;\n return this;\n }\n\n public setFetcher(fetcher?: KubernetesFetcher) {\n this.fetcher = fetcher;\n return this;\n }\n\n public setServiceLocator(serviceLocator?: KubernetesServiceLocator) {\n this.serviceLocator = serviceLocator;\n return this;\n }\n\n public setProxy(proxy?: KubernetesProxy) {\n this.proxy = proxy;\n return this;\n }\n\n public setAuthStrategyMap(authStrategyMap: {\n [key: string]: AuthenticationStrategy;\n }) {\n this.authStrategyMap = authStrategyMap;\n }\n\n public addAuthStrategy(key: string, strategy: AuthenticationStrategy) {\n if (key.includes('-')) {\n throw new Error('Strategy name can not include dashes');\n }\n this.getAuthStrategyMap()[key] = strategy;\n return this;\n }\n\n protected buildCustomResources() {\n const customResources: CustomResource[] = (\n this.env.config.getOptionalConfigArray('kubernetes.customResources') ?? []\n ).map(\n c =>\n ({\n group: c.getString('group'),\n apiVersion: c.getString('apiVersion'),\n plural: c.getString('plural'),\n objectType: 'customresources',\n } as CustomResource),\n );\n\n this.env.logger.info(\n `action=LoadingCustomResources numOfCustomResources=${customResources.length}`,\n );\n return customResources;\n }\n\n protected buildClusterSupplier(\n refreshInterval: Duration,\n ): KubernetesClustersSupplier {\n const config = this.env.config;\n this.clusterSupplier = getCombinedClusterSupplier(\n config,\n this.env.catalogApi,\n new DispatchStrategy({ authStrategyMap: this.getAuthStrategyMap() }),\n this.env.logger,\n refreshInterval,\n this.env.auth,\n );\n\n return this.clusterSupplier;\n }\n\n protected buildObjectsProvider(\n options: KubernetesObjectsProviderOptions,\n ): KubernetesObjectsProvider {\n const authStrategyMap = this.getAuthStrategyMap();\n this.objectsProvider = new KubernetesFanOutHandler({\n ...options,\n authStrategy: new DispatchStrategy({\n authStrategyMap,\n }),\n });\n\n return this.objectsProvider;\n }\n\n protected buildFetcher(): KubernetesFetcher {\n this.fetcher = new KubernetesClientBasedFetcher({\n logger: this.env.logger,\n });\n\n return this.fetcher;\n }\n\n protected buildServiceLocator(\n method: ServiceLocatorMethod,\n clusterSupplier: KubernetesClustersSupplier,\n ): KubernetesServiceLocator {\n switch (method) {\n case 'multiTenant':\n this.serviceLocator =\n this.buildMultiTenantServiceLocator(clusterSupplier);\n break;\n case 'singleTenant':\n this.serviceLocator =\n this.buildSingleTenantServiceLocator(clusterSupplier);\n break;\n case 'catalogRelation':\n this.serviceLocator =\n this.buildCatalogRelationServiceLocator(clusterSupplier);\n break;\n case 'http':\n this.serviceLocator = this.buildHttpServiceLocator(clusterSupplier);\n break;\n default:\n throw new Error(\n `Unsupported kubernetes.serviceLocatorMethod \"${method}\"`,\n );\n }\n\n return this.serviceLocator;\n }\n\n protected buildMultiTenantServiceLocator(\n clusterSupplier: KubernetesClustersSupplier,\n ): KubernetesServiceLocator {\n return new MultiTenantServiceLocator(clusterSupplier);\n }\n\n protected buildSingleTenantServiceLocator(\n clusterSupplier: KubernetesClustersSupplier,\n ): KubernetesServiceLocator {\n return new SingleTenantServiceLocator(clusterSupplier);\n }\n\n protected buildCatalogRelationServiceLocator(\n clusterSupplier: KubernetesClustersSupplier,\n ): KubernetesServiceLocator {\n return new CatalogRelationServiceLocator(clusterSupplier);\n }\n\n protected buildHttpServiceLocator(\n _clusterSupplier: KubernetesClustersSupplier,\n ): KubernetesServiceLocator {\n throw new Error('not implemented');\n }\n\n protected buildProxy(\n logger: LoggerService,\n clusterSupplier: KubernetesClustersSupplier,\n discovery: DiscoveryService,\n httpAuth: HttpAuthService,\n ): KubernetesProxy {\n const authStrategyMap = this.getAuthStrategyMap();\n const authStrategy = new DispatchStrategy({\n authStrategyMap,\n });\n this.proxy = new KubernetesProxy({\n logger,\n clusterSupplier,\n authStrategy,\n discovery,\n httpAuth,\n });\n return this.proxy;\n }\n\n protected buildRouter(\n objectsProvider: KubernetesObjectsProvider,\n clusterSupplier: KubernetesClustersSupplier,\n catalogApi: CatalogApi,\n proxy: KubernetesProxy,\n permissionApi: PermissionEvaluator,\n authService: AuthService,\n httpAuth: HttpAuthService,\n ): express.Router {\n const logger = this.env.logger;\n const router = Router();\n router.use('/proxy', proxy.createRequestHandler({ permissionApi }));\n router.use(express.json());\n router.use(\n createPermissionIntegrationRouter({\n permissions: kubernetesPermissions,\n }),\n );\n // @deprecated\n router.post('/services/:serviceId', async (req, res) => {\n await requirePermission(\n permissionApi,\n kubernetesResourcesReadPermission,\n httpAuth,\n req,\n );\n const serviceId = req.params.serviceId;\n const requestBody: ObjectsByEntityRequest = req.body;\n try {\n const response = await objectsProvider.getKubernetesObjectsByEntity(\n {\n entity: requestBody.entity,\n auth: requestBody.auth || {},\n },\n { credentials: await httpAuth.credentials(req) },\n );\n res.json(response);\n } catch (e) {\n logger.error(\n `action=retrieveObjectsByServiceId service=${serviceId}, error=${e}`,\n );\n res.status(500).json({ error: e.message });\n }\n });\n\n router.get('/clusters', async (req, res) => {\n await requirePermission(\n permissionApi,\n kubernetesClustersReadPermission,\n httpAuth,\n req,\n );\n const credentials = await httpAuth.credentials(req);\n const clusterDetails = await this.fetchClusterDetails(clusterSupplier, {\n credentials,\n });\n res.json({\n items: clusterDetails.map(cd => {\n const oidcTokenProvider =\n cd.authMetadata[ANNOTATION_KUBERNETES_OIDC_TOKEN_PROVIDER];\n const authProvider =\n cd.authMetadata[ANNOTATION_KUBERNETES_AUTH_PROVIDER];\n const strategy = this.getAuthStrategyMap()[authProvider];\n let auth: AuthMetadata = {};\n if (strategy) {\n auth = strategy.presentAuthMetadata(cd.authMetadata);\n }\n\n return {\n name: cd.name,\n title: cd.title,\n dashboardUrl: cd.dashboardUrl,\n authProvider,\n ...(oidcTokenProvider && { oidcTokenProvider }),\n ...(auth && Object.keys(auth).length !== 0 && { auth }),\n };\n }),\n });\n });\n\n addResourceRoutesToRouter(\n router,\n catalogApi,\n objectsProvider,\n authService,\n httpAuth,\n permissionApi,\n );\n\n return router;\n }\n\n protected buildAuthStrategyMap() {\n this.authStrategyMap = {\n aks: new AksStrategy(),\n aws: new AwsIamStrategy({ config: this.env.config }),\n azure: new AzureIdentityStrategy(this.env.logger),\n google: new GoogleStrategy(),\n googleServiceAccount: new GoogleServiceAccountStrategy(),\n localKubectlProxy: new AnonymousStrategy(),\n oidc: new OidcStrategy(),\n serviceAccount: new ServiceAccountStrategy(),\n };\n return this.authStrategyMap;\n }\n\n protected async fetchClusterDetails(\n clusterSupplier: KubernetesClustersSupplier,\n options: { credentials: BackstageCredentials },\n ) {\n const clusterDetails = await clusterSupplier.getClusters(options);\n\n this.env.logger.debug(\n `action=loadClusterDetails numOfClustersLoaded=${clusterDetails.length}`,\n );\n\n return clusterDetails;\n }\n\n protected getServiceLocatorMethod() {\n return this.env.config.getString(\n 'kubernetes.serviceLocatorMethod.type',\n ) as ServiceLocatorMethod;\n }\n\n protected getFetcher(): KubernetesFetcher {\n return this.fetcher ?? this.buildFetcher();\n }\n\n protected getClusterSupplier() {\n return (\n this.clusterSupplier ??\n this.buildClusterSupplier(this.defaultClusterRefreshInterval)\n );\n }\n\n protected getServiceLocator(): KubernetesServiceLocator {\n return (\n this.serviceLocator ??\n this.buildServiceLocator(\n this.getServiceLocatorMethod(),\n this.getClusterSupplier(),\n )\n );\n }\n\n protected getObjectsProvider(options: KubernetesObjectsProviderOptions) {\n return this.objectsProvider ?? this.buildObjectsProvider(options);\n }\n\n protected getObjectTypesToFetch() {\n const objectTypesToFetchStrings = this.env.config.getOptionalStringArray(\n 'kubernetes.objectTypes',\n ) as KubernetesObjectTypes[];\n\n const apiVersionOverrides = this.env.config.getOptionalConfig(\n 'kubernetes.apiVersionOverrides',\n );\n\n let objectTypesToFetch;\n\n if (objectTypesToFetchStrings) {\n objectTypesToFetch = ALL_OBJECTS.filter(obj =>\n objectTypesToFetchStrings.includes(obj.objectType),\n );\n }\n\n if (apiVersionOverrides) {\n objectTypesToFetch = objectTypesToFetch ?? DEFAULT_OBJECTS;\n\n for (const obj of objectTypesToFetch) {\n if (apiVersionOverrides.has(obj.objectType)) {\n obj.apiVersion = apiVersionOverrides.getString(obj.objectType);\n }\n }\n }\n\n return objectTypesToFetch;\n }\n\n protected getProxy(\n logger: LoggerService,\n clusterSupplier: KubernetesClustersSupplier,\n discovery: DiscoveryService,\n httpAuth: HttpAuthService,\n ) {\n return (\n this.proxy ??\n this.buildProxy(logger, clusterSupplier, discovery, httpAuth)\n );\n }\n\n protected getAuthStrategyMap() {\n return this.authStrategyMap ?? this.buildAuthStrategyMap();\n }\n}\n"],"names":["Duration","Router","getCombinedClusterSupplier","DispatchStrategy","KubernetesFanOutHandler","KubernetesClientBasedFetcher","MultiTenantServiceLocator","SingleTenantServiceLocator","CatalogRelationServiceLocator","KubernetesProxy","express","createPermissionIntegrationRouter","kubernetesPermissions","requirePermission","kubernetesResourcesReadPermission","kubernetesClustersReadPermission","ANNOTATION_KUBERNETES_OIDC_TOKEN_PROVIDER","ANNOTATION_KUBERNETES_AUTH_PROVIDER","addResourceRoutesToRouter","AksStrategy","AwsIamStrategy","AzureIdentityStrategy","GoogleStrategy","GoogleServiceAccountStrategy","AnonymousStrategy","OidcStrategy","ServiceAccountStrategy","ALL_OBJECTS","DEFAULT_OBJECTS"],"mappings":"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"}