@backstage/plugin-kubernetes-backend 0.18.6 → 0.18.7-next.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 +39 -0
- package/alpha/package.json +1 -1
- package/dist/alpha.cjs.js +3 -150
- package/dist/alpha.cjs.js.map +1 -1
- package/dist/auth/AksStrategy.cjs.js +17 -0
- package/dist/auth/AksStrategy.cjs.js.map +1 -0
- package/dist/auth/AnonymousStrategy.cjs.js +16 -0
- package/dist/auth/AnonymousStrategy.cjs.js.map +1 -0
- package/dist/auth/AwsIamStrategy.cjs.js +80 -0
- package/dist/auth/AwsIamStrategy.cjs.js.map +1 -0
- package/dist/auth/AzureIdentityStrategy.cjs.js +58 -0
- package/dist/auth/AzureIdentityStrategy.cjs.js.map +1 -0
- package/dist/auth/DispatchStrategy.cjs.js +37 -0
- package/dist/auth/DispatchStrategy.cjs.js.map +1 -0
- package/dist/auth/GoogleServiceAccountStrategy.cjs.js +45 -0
- package/dist/auth/GoogleServiceAccountStrategy.cjs.js.map +1 -0
- package/dist/auth/GoogleStrategy.cjs.js +22 -0
- package/dist/auth/GoogleStrategy.cjs.js.map +1 -0
- package/dist/auth/OidcStrategy.cjs.js +34 -0
- package/dist/auth/OidcStrategy.cjs.js.map +1 -0
- package/dist/auth/ServiceAccountStrategy.cjs.js +33 -0
- package/dist/auth/ServiceAccountStrategy.cjs.js.map +1 -0
- package/dist/cluster-locator/CatalogClusterLocator.cjs.js +73 -0
- package/dist/cluster-locator/CatalogClusterLocator.cjs.js.map +1 -0
- package/dist/cluster-locator/ConfigClusterLocator.cjs.js +100 -0
- package/dist/cluster-locator/ConfigClusterLocator.cjs.js.map +1 -0
- package/dist/cluster-locator/GkeClusterLocator.cjs.js +126 -0
- package/dist/cluster-locator/GkeClusterLocator.cjs.js.map +1 -0
- package/dist/cluster-locator/LocalKubectlProxyLocator.cjs.js +35 -0
- package/dist/cluster-locator/LocalKubectlProxyLocator.cjs.js.map +1 -0
- package/dist/cluster-locator/index.cjs.js +67 -0
- package/dist/cluster-locator/index.cjs.js.map +1 -0
- package/dist/index.cjs.js +31 -1904
- package/dist/index.cjs.js.map +1 -1
- package/dist/package.json.cjs.js +156 -0
- package/dist/package.json.cjs.js.map +1 -0
- package/dist/plugin.cjs.js +155 -0
- package/dist/plugin.cjs.js.map +1 -0
- package/dist/routes/resourcesRoutes.cjs.js +65 -0
- package/dist/routes/resourcesRoutes.cjs.js.map +1 -0
- package/dist/service/KubernetesBuilder.cjs.js +367 -0
- package/dist/service/KubernetesBuilder.cjs.js.map +1 -0
- package/dist/service/KubernetesFanOutHandler.cjs.js +254 -0
- package/dist/service/KubernetesFanOutHandler.cjs.js.map +1 -0
- package/dist/service/KubernetesFetcher.cjs.js +231 -0
- package/dist/service/KubernetesFetcher.cjs.js.map +1 -0
- package/dist/service/KubernetesProxy.cjs.js +195 -0
- package/dist/service/KubernetesProxy.cjs.js.map +1 -0
- package/dist/service/router.cjs.js +11 -0
- package/dist/service/router.cjs.js.map +1 -0
- package/dist/service/runPeriodically.cjs.js +29 -0
- package/dist/service/runPeriodically.cjs.js.map +1 -0
- package/dist/service-locator/CatalogRelationServiceLocator.cjs.js +31 -0
- package/dist/service-locator/CatalogRelationServiceLocator.cjs.js.map +1 -0
- package/dist/service-locator/MultiTenantServiceLocator.cjs.js +15 -0
- package/dist/service-locator/MultiTenantServiceLocator.cjs.js.map +1 -0
- package/dist/service-locator/SingleTenantServiceLocator.cjs.js +24 -0
- package/dist/service-locator/SingleTenantServiceLocator.cjs.js.map +1 -0
- package/package.json +21 -20
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
4
|
+
var alpha = require('@backstage/plugin-catalog-node/alpha');
|
|
5
|
+
var pluginKubernetesBackend = require('@backstage/plugin-kubernetes-backend');
|
|
6
|
+
var pluginKubernetesNode = require('@backstage/plugin-kubernetes-node');
|
|
7
|
+
|
|
8
|
+
class ObjectsProvider {
|
|
9
|
+
objectsProvider;
|
|
10
|
+
getObjectsProvider() {
|
|
11
|
+
return this.objectsProvider;
|
|
12
|
+
}
|
|
13
|
+
addObjectsProvider(provider) {
|
|
14
|
+
if (this.objectsProvider) {
|
|
15
|
+
throw new Error(
|
|
16
|
+
"Multiple Kubernetes objects provider is not supported at this time"
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
this.objectsProvider = provider;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
class ClusterSuplier {
|
|
23
|
+
clusterSupplier;
|
|
24
|
+
getClusterSupplier() {
|
|
25
|
+
return this.clusterSupplier;
|
|
26
|
+
}
|
|
27
|
+
addClusterSupplier(clusterSupplier) {
|
|
28
|
+
if (this.clusterSupplier) {
|
|
29
|
+
throw new Error(
|
|
30
|
+
"Multiple Kubernetes Cluster Suppliers is not supported at this time"
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
this.clusterSupplier = clusterSupplier;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
class Fetcher {
|
|
37
|
+
fetcher;
|
|
38
|
+
getFetcher() {
|
|
39
|
+
return this.fetcher;
|
|
40
|
+
}
|
|
41
|
+
addFetcher(fetcher) {
|
|
42
|
+
if (this.fetcher) {
|
|
43
|
+
throw new Error(
|
|
44
|
+
"Multiple Kubernetes Fetchers is not supported at this time"
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
this.fetcher = fetcher;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
class ServiceLocator {
|
|
51
|
+
serviceLocator;
|
|
52
|
+
getServiceLocator() {
|
|
53
|
+
return this.serviceLocator;
|
|
54
|
+
}
|
|
55
|
+
addServiceLocator(serviceLocator) {
|
|
56
|
+
if (this.serviceLocator) {
|
|
57
|
+
throw new Error(
|
|
58
|
+
"Multiple Kubernetes Service Locators is not supported at this time"
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
this.serviceLocator = serviceLocator;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
class AuthStrategy {
|
|
65
|
+
authStrategies;
|
|
66
|
+
constructor() {
|
|
67
|
+
this.authStrategies = new Array();
|
|
68
|
+
}
|
|
69
|
+
static addAuthStrategiesFromArray(authStrategies, builder) {
|
|
70
|
+
authStrategies.forEach((st) => builder.addAuthStrategy(st.key, st.strategy));
|
|
71
|
+
}
|
|
72
|
+
getAuthenticationStrategies() {
|
|
73
|
+
return this.authStrategies;
|
|
74
|
+
}
|
|
75
|
+
addAuthStrategy(key, authStrategy) {
|
|
76
|
+
this.authStrategies.push({ key, strategy: authStrategy });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const kubernetesPlugin = backendPluginApi.createBackendPlugin({
|
|
80
|
+
pluginId: "kubernetes",
|
|
81
|
+
register(env) {
|
|
82
|
+
const extPointObjectsProvider = new ObjectsProvider();
|
|
83
|
+
const extPointClusterSuplier = new ClusterSuplier();
|
|
84
|
+
const extPointAuthStrategy = new AuthStrategy();
|
|
85
|
+
const extPointFetcher = new Fetcher();
|
|
86
|
+
const extPointServiceLocator = new ServiceLocator();
|
|
87
|
+
env.registerExtensionPoint(
|
|
88
|
+
pluginKubernetesNode.kubernetesObjectsProviderExtensionPoint,
|
|
89
|
+
extPointObjectsProvider
|
|
90
|
+
);
|
|
91
|
+
env.registerExtensionPoint(
|
|
92
|
+
pluginKubernetesNode.kubernetesClusterSupplierExtensionPoint,
|
|
93
|
+
extPointClusterSuplier
|
|
94
|
+
);
|
|
95
|
+
env.registerExtensionPoint(
|
|
96
|
+
pluginKubernetesNode.kubernetesAuthStrategyExtensionPoint,
|
|
97
|
+
extPointAuthStrategy
|
|
98
|
+
);
|
|
99
|
+
env.registerExtensionPoint(
|
|
100
|
+
pluginKubernetesNode.kubernetesFetcherExtensionPoint,
|
|
101
|
+
extPointFetcher
|
|
102
|
+
);
|
|
103
|
+
env.registerExtensionPoint(
|
|
104
|
+
pluginKubernetesNode.kubernetesServiceLocatorExtensionPoint,
|
|
105
|
+
extPointServiceLocator
|
|
106
|
+
);
|
|
107
|
+
env.registerInit({
|
|
108
|
+
deps: {
|
|
109
|
+
http: backendPluginApi.coreServices.httpRouter,
|
|
110
|
+
logger: backendPluginApi.coreServices.logger,
|
|
111
|
+
config: backendPluginApi.coreServices.rootConfig,
|
|
112
|
+
discovery: backendPluginApi.coreServices.discovery,
|
|
113
|
+
catalogApi: alpha.catalogServiceRef,
|
|
114
|
+
permissions: backendPluginApi.coreServices.permissions,
|
|
115
|
+
auth: backendPluginApi.coreServices.auth,
|
|
116
|
+
httpAuth: backendPluginApi.coreServices.httpAuth
|
|
117
|
+
},
|
|
118
|
+
async init({
|
|
119
|
+
http,
|
|
120
|
+
logger,
|
|
121
|
+
config,
|
|
122
|
+
discovery,
|
|
123
|
+
catalogApi,
|
|
124
|
+
permissions,
|
|
125
|
+
auth,
|
|
126
|
+
httpAuth
|
|
127
|
+
}) {
|
|
128
|
+
if (config.has("kubernetes")) {
|
|
129
|
+
const builder = pluginKubernetesBackend.KubernetesBuilder.createBuilder({
|
|
130
|
+
logger,
|
|
131
|
+
config,
|
|
132
|
+
catalogApi,
|
|
133
|
+
permissions,
|
|
134
|
+
discovery,
|
|
135
|
+
auth,
|
|
136
|
+
httpAuth
|
|
137
|
+
}).setObjectsProvider(extPointObjectsProvider.getObjectsProvider()).setClusterSupplier(extPointClusterSuplier.getClusterSupplier()).setFetcher(extPointFetcher.getFetcher()).setServiceLocator(extPointServiceLocator.getServiceLocator());
|
|
138
|
+
AuthStrategy.addAuthStrategiesFromArray(
|
|
139
|
+
extPointAuthStrategy.getAuthenticationStrategies(),
|
|
140
|
+
builder
|
|
141
|
+
);
|
|
142
|
+
const { router } = await builder.build();
|
|
143
|
+
http.use(router);
|
|
144
|
+
} else {
|
|
145
|
+
logger.warn(
|
|
146
|
+
"Failed to initialize kubernetes backend: valid kubernetes config is missing"
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
exports.kubernetesPlugin = kubernetesPlugin;
|
|
155
|
+
//# sourceMappingURL=plugin.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.cjs.js","sources":["../src/plugin.ts"],"sourcesContent":["/*\n * Copyright 2023 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 createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { catalogServiceRef } from '@backstage/plugin-catalog-node/alpha';\n\nimport { KubernetesBuilder } from '@backstage/plugin-kubernetes-backend';\n\nimport {\n type AuthenticationStrategy,\n kubernetesAuthStrategyExtensionPoint,\n type KubernetesAuthStrategyExtensionPoint,\n type KubernetesClustersSupplier,\n kubernetesClusterSupplierExtensionPoint,\n type KubernetesClusterSupplierExtensionPoint,\n type KubernetesFetcher,\n kubernetesFetcherExtensionPoint,\n type KubernetesFetcherExtensionPoint,\n type KubernetesObjectsProvider,\n kubernetesObjectsProviderExtensionPoint,\n type KubernetesObjectsProviderExtensionPoint,\n type KubernetesServiceLocator,\n kubernetesServiceLocatorExtensionPoint,\n type KubernetesServiceLocatorExtensionPoint,\n} from '@backstage/plugin-kubernetes-node';\n\nclass ObjectsProvider implements KubernetesObjectsProviderExtensionPoint {\n private objectsProvider: KubernetesObjectsProvider | undefined;\n\n getObjectsProvider() {\n return this.objectsProvider;\n }\n\n addObjectsProvider(provider: KubernetesObjectsProvider) {\n if (this.objectsProvider) {\n throw new Error(\n 'Multiple Kubernetes objects provider is not supported at this time',\n );\n }\n this.objectsProvider = provider;\n }\n}\n\nclass ClusterSuplier implements KubernetesClusterSupplierExtensionPoint {\n private clusterSupplier: KubernetesClustersSupplier | undefined;\n\n getClusterSupplier() {\n return this.clusterSupplier;\n }\n\n addClusterSupplier(clusterSupplier: KubernetesClustersSupplier) {\n if (this.clusterSupplier) {\n throw new Error(\n 'Multiple Kubernetes Cluster Suppliers is not supported at this time',\n );\n }\n this.clusterSupplier = clusterSupplier;\n }\n}\n\nclass Fetcher implements KubernetesFetcherExtensionPoint {\n private fetcher: KubernetesFetcher | undefined;\n\n getFetcher() {\n return this.fetcher;\n }\n\n addFetcher(fetcher: KubernetesFetcher) {\n if (this.fetcher) {\n throw new Error(\n 'Multiple Kubernetes Fetchers is not supported at this time',\n );\n }\n this.fetcher = fetcher;\n }\n}\n\nclass ServiceLocator implements KubernetesServiceLocatorExtensionPoint {\n private serviceLocator: KubernetesServiceLocator | undefined;\n\n getServiceLocator() {\n return this.serviceLocator;\n }\n\n addServiceLocator(serviceLocator: KubernetesServiceLocator) {\n if (this.serviceLocator) {\n throw new Error(\n 'Multiple Kubernetes Service Locators is not supported at this time',\n );\n }\n this.serviceLocator = serviceLocator;\n }\n}\n\nclass AuthStrategy implements KubernetesAuthStrategyExtensionPoint {\n private authStrategies: Array<{\n key: string;\n strategy: AuthenticationStrategy;\n }>;\n\n constructor() {\n this.authStrategies = new Array<{\n key: string;\n strategy: AuthenticationStrategy;\n }>();\n }\n\n static addAuthStrategiesFromArray(\n authStrategies: Array<{ key: string; strategy: AuthenticationStrategy }>,\n builder: KubernetesBuilder,\n ) {\n authStrategies.forEach(st => builder.addAuthStrategy(st.key, st.strategy));\n }\n\n getAuthenticationStrategies() {\n return this.authStrategies;\n }\n\n addAuthStrategy(key: string, authStrategy: AuthenticationStrategy) {\n this.authStrategies.push({ key, strategy: authStrategy });\n }\n}\n\n/**\n * This is the backend plugin that provides the Kubernetes integration.\n * @alpha\n */\n\nexport const kubernetesPlugin = createBackendPlugin({\n pluginId: 'kubernetes',\n register(env) {\n const extPointObjectsProvider = new ObjectsProvider();\n const extPointClusterSuplier = new ClusterSuplier();\n const extPointAuthStrategy = new AuthStrategy();\n const extPointFetcher = new Fetcher();\n const extPointServiceLocator = new ServiceLocator();\n\n env.registerExtensionPoint(\n kubernetesObjectsProviderExtensionPoint,\n extPointObjectsProvider,\n );\n env.registerExtensionPoint(\n kubernetesClusterSupplierExtensionPoint,\n extPointClusterSuplier,\n );\n env.registerExtensionPoint(\n kubernetesAuthStrategyExtensionPoint,\n extPointAuthStrategy,\n );\n env.registerExtensionPoint(\n kubernetesFetcherExtensionPoint,\n extPointFetcher,\n );\n env.registerExtensionPoint(\n kubernetesServiceLocatorExtensionPoint,\n extPointServiceLocator,\n );\n\n env.registerInit({\n deps: {\n http: coreServices.httpRouter,\n logger: coreServices.logger,\n config: coreServices.rootConfig,\n discovery: coreServices.discovery,\n catalogApi: catalogServiceRef,\n permissions: coreServices.permissions,\n auth: coreServices.auth,\n httpAuth: coreServices.httpAuth,\n },\n async init({\n http,\n logger,\n config,\n discovery,\n catalogApi,\n permissions,\n auth,\n httpAuth,\n }) {\n if (config.has('kubernetes')) {\n // TODO: expose all of the customization & extension points of the builder here\n const builder: KubernetesBuilder = KubernetesBuilder.createBuilder({\n logger,\n config,\n catalogApi,\n permissions,\n discovery,\n auth,\n httpAuth,\n })\n .setObjectsProvider(extPointObjectsProvider.getObjectsProvider())\n .setClusterSupplier(extPointClusterSuplier.getClusterSupplier())\n .setFetcher(extPointFetcher.getFetcher())\n .setServiceLocator(extPointServiceLocator.getServiceLocator());\n\n AuthStrategy.addAuthStrategiesFromArray(\n extPointAuthStrategy.getAuthenticationStrategies(),\n builder,\n );\n const { router } = await builder.build();\n http.use(router);\n } else {\n logger.warn(\n 'Failed to initialize kubernetes backend: valid kubernetes config is missing',\n );\n }\n },\n });\n },\n});\n"],"names":["createBackendPlugin","kubernetesObjectsProviderExtensionPoint","kubernetesClusterSupplierExtensionPoint","kubernetesAuthStrategyExtensionPoint","kubernetesFetcherExtensionPoint","kubernetesServiceLocatorExtensionPoint","coreServices","catalogServiceRef","KubernetesBuilder"],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var catalogModel = require('@backstage/catalog-model');
|
|
4
|
+
var errors = require('@backstage/errors');
|
|
5
|
+
|
|
6
|
+
const addResourceRoutesToRouter = (router, catalogApi, objectsProvider, auth, httpAuth) => {
|
|
7
|
+
const getEntityByReq = async (req) => {
|
|
8
|
+
const rawEntityRef = req.body.entityRef;
|
|
9
|
+
if (rawEntityRef && typeof rawEntityRef !== "string") {
|
|
10
|
+
throw new errors.InputError(`entity query must be a string`);
|
|
11
|
+
} else if (!rawEntityRef) {
|
|
12
|
+
throw new errors.InputError("entity is a required field");
|
|
13
|
+
}
|
|
14
|
+
let entityRef = void 0;
|
|
15
|
+
try {
|
|
16
|
+
entityRef = catalogModel.parseEntityRef(rawEntityRef);
|
|
17
|
+
} catch (error) {
|
|
18
|
+
throw new errors.InputError(`Invalid entity ref, ${error}`);
|
|
19
|
+
}
|
|
20
|
+
const { token } = await auth.getPluginRequestToken({
|
|
21
|
+
onBehalfOf: await httpAuth.credentials(req),
|
|
22
|
+
targetPluginId: "catalog"
|
|
23
|
+
});
|
|
24
|
+
const entity = await catalogApi.getEntityByRef(entityRef, { token });
|
|
25
|
+
if (!entity) {
|
|
26
|
+
throw new errors.InputError(
|
|
27
|
+
`Entity ref missing, ${catalogModel.stringifyEntityRef(entityRef)}`
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
return entity;
|
|
31
|
+
};
|
|
32
|
+
router.post("/resources/workloads/query", async (req, res) => {
|
|
33
|
+
const entity = await getEntityByReq(req);
|
|
34
|
+
const response = await objectsProvider.getKubernetesObjectsByEntity(
|
|
35
|
+
{
|
|
36
|
+
entity,
|
|
37
|
+
auth: req.body.auth
|
|
38
|
+
},
|
|
39
|
+
{ credentials: await httpAuth.credentials(req) }
|
|
40
|
+
);
|
|
41
|
+
res.json(response);
|
|
42
|
+
});
|
|
43
|
+
router.post("/resources/custom/query", async (req, res) => {
|
|
44
|
+
const entity = await getEntityByReq(req);
|
|
45
|
+
if (!req.body.customResources) {
|
|
46
|
+
throw new errors.InputError("customResources is a required field");
|
|
47
|
+
} else if (!Array.isArray(req.body.customResources)) {
|
|
48
|
+
throw new errors.InputError("customResources must be an array");
|
|
49
|
+
} else if (req.body.customResources.length === 0) {
|
|
50
|
+
throw new errors.InputError("at least 1 customResource is required");
|
|
51
|
+
}
|
|
52
|
+
const response = await objectsProvider.getCustomResourcesByEntity(
|
|
53
|
+
{
|
|
54
|
+
entity,
|
|
55
|
+
customResources: req.body.customResources,
|
|
56
|
+
auth: req.body.auth
|
|
57
|
+
},
|
|
58
|
+
{ credentials: await httpAuth.credentials(req) }
|
|
59
|
+
);
|
|
60
|
+
res.json(response);
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
exports.addResourceRoutesToRouter = addResourceRoutesToRouter;
|
|
65
|
+
//# sourceMappingURL=resourcesRoutes.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resourcesRoutes.cjs.js","sources":["../../src/routes/resourcesRoutes.ts"],"sourcesContent":["/*\n * Copyright 2022 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 {\n CompoundEntityRef,\n parseEntityRef,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport { InputError } from '@backstage/errors';\nimport express, { Request } from 'express';\nimport { KubernetesObjectsProvider } from '@backstage/plugin-kubernetes-node';\nimport { AuthService, HttpAuthService } from '@backstage/backend-plugin-api';\n\nexport const addResourceRoutesToRouter = (\n router: express.Router,\n catalogApi: CatalogApi,\n objectsProvider: KubernetesObjectsProvider,\n auth: AuthService,\n httpAuth: HttpAuthService,\n) => {\n const getEntityByReq = async (req: Request<any>) => {\n const rawEntityRef = req.body.entityRef;\n if (rawEntityRef && typeof rawEntityRef !== 'string') {\n throw new InputError(`entity query must be a string`);\n } else if (!rawEntityRef) {\n throw new InputError('entity is a required field');\n }\n let entityRef: CompoundEntityRef | undefined = undefined;\n\n try {\n entityRef = parseEntityRef(rawEntityRef);\n } catch (error) {\n throw new InputError(`Invalid entity ref, ${error}`);\n }\n\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await httpAuth.credentials(req),\n targetPluginId: 'catalog',\n });\n\n const entity = await catalogApi.getEntityByRef(entityRef, { token });\n if (!entity) {\n throw new InputError(\n `Entity ref missing, ${stringifyEntityRef(entityRef)}`,\n );\n }\n\n return entity;\n };\n\n router.post('/resources/workloads/query', async (req, res) => {\n const entity = await getEntityByReq(req);\n const response = await objectsProvider.getKubernetesObjectsByEntity(\n {\n entity,\n auth: req.body.auth,\n },\n { credentials: await httpAuth.credentials(req) },\n );\n res.json(response);\n });\n\n router.post('/resources/custom/query', async (req, res) => {\n const entity = await getEntityByReq(req);\n\n if (!req.body.customResources) {\n throw new InputError('customResources is a required field');\n } else if (!Array.isArray(req.body.customResources)) {\n throw new InputError('customResources must be an array');\n } else if (req.body.customResources.length === 0) {\n throw new InputError('at least 1 customResource is required');\n }\n\n const response = await objectsProvider.getCustomResourcesByEntity(\n {\n entity,\n customResources: req.body.customResources,\n auth: req.body.auth,\n },\n { credentials: await httpAuth.credentials(req) },\n );\n res.json(response);\n });\n};\n"],"names":["InputError","parseEntityRef","stringifyEntityRef"],"mappings":"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"}
|
|
@@ -0,0 +1,367 @@
|
|
|
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 backendCommon = require('@backstage/backend-common');
|
|
19
|
+
var resourcesRoutes = require('../routes/resourcesRoutes.cjs.js');
|
|
20
|
+
var CatalogRelationServiceLocator = require('../service-locator/CatalogRelationServiceLocator.cjs.js');
|
|
21
|
+
var MultiTenantServiceLocator = require('../service-locator/MultiTenantServiceLocator.cjs.js');
|
|
22
|
+
var SingleTenantServiceLocator = require('../service-locator/SingleTenantServiceLocator.cjs.js');
|
|
23
|
+
var KubernetesFanOutHandler = require('./KubernetesFanOutHandler.cjs.js');
|
|
24
|
+
var KubernetesFetcher = require('./KubernetesFetcher.cjs.js');
|
|
25
|
+
var KubernetesProxy = require('./KubernetesProxy.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 { auth, httpAuth } = backendCommon.createLegacyAuthAdapters({
|
|
65
|
+
auth: this.env.auth,
|
|
66
|
+
httpAuth: this.env.httpAuth,
|
|
67
|
+
discovery: this.env.discovery
|
|
68
|
+
});
|
|
69
|
+
const customResources = this.buildCustomResources();
|
|
70
|
+
const fetcher = this.getFetcher();
|
|
71
|
+
const clusterSupplier = this.getClusterSupplier();
|
|
72
|
+
const authStrategyMap = this.getAuthStrategyMap();
|
|
73
|
+
const proxy = this.getProxy(
|
|
74
|
+
logger,
|
|
75
|
+
clusterSupplier,
|
|
76
|
+
this.env.discovery,
|
|
77
|
+
httpAuth
|
|
78
|
+
);
|
|
79
|
+
const serviceLocator = this.getServiceLocator();
|
|
80
|
+
const objectsProvider = this.getObjectsProvider({
|
|
81
|
+
logger,
|
|
82
|
+
fetcher,
|
|
83
|
+
config,
|
|
84
|
+
serviceLocator,
|
|
85
|
+
customResources,
|
|
86
|
+
objectTypesToFetch: this.getObjectTypesToFetch()
|
|
87
|
+
});
|
|
88
|
+
const router = this.buildRouter(
|
|
89
|
+
objectsProvider,
|
|
90
|
+
clusterSupplier,
|
|
91
|
+
this.env.catalogApi,
|
|
92
|
+
proxy,
|
|
93
|
+
permissions,
|
|
94
|
+
auth,
|
|
95
|
+
httpAuth
|
|
96
|
+
);
|
|
97
|
+
return {
|
|
98
|
+
clusterSupplier,
|
|
99
|
+
customResources,
|
|
100
|
+
fetcher,
|
|
101
|
+
proxy,
|
|
102
|
+
objectsProvider,
|
|
103
|
+
router,
|
|
104
|
+
serviceLocator,
|
|
105
|
+
authStrategyMap
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
setClusterSupplier(clusterSupplier) {
|
|
109
|
+
this.clusterSupplier = clusterSupplier;
|
|
110
|
+
return this;
|
|
111
|
+
}
|
|
112
|
+
setDefaultClusterRefreshInterval(refreshInterval) {
|
|
113
|
+
this.defaultClusterRefreshInterval = refreshInterval;
|
|
114
|
+
return this;
|
|
115
|
+
}
|
|
116
|
+
setObjectsProvider(objectsProvider) {
|
|
117
|
+
this.objectsProvider = objectsProvider;
|
|
118
|
+
return this;
|
|
119
|
+
}
|
|
120
|
+
setFetcher(fetcher) {
|
|
121
|
+
this.fetcher = fetcher;
|
|
122
|
+
return this;
|
|
123
|
+
}
|
|
124
|
+
setServiceLocator(serviceLocator) {
|
|
125
|
+
this.serviceLocator = serviceLocator;
|
|
126
|
+
return this;
|
|
127
|
+
}
|
|
128
|
+
setProxy(proxy) {
|
|
129
|
+
this.proxy = proxy;
|
|
130
|
+
return this;
|
|
131
|
+
}
|
|
132
|
+
setAuthStrategyMap(authStrategyMap) {
|
|
133
|
+
this.authStrategyMap = authStrategyMap;
|
|
134
|
+
}
|
|
135
|
+
addAuthStrategy(key, strategy) {
|
|
136
|
+
if (key.includes("-")) {
|
|
137
|
+
throw new Error("Strategy name can not include dashes");
|
|
138
|
+
}
|
|
139
|
+
this.getAuthStrategyMap()[key] = strategy;
|
|
140
|
+
return this;
|
|
141
|
+
}
|
|
142
|
+
buildCustomResources() {
|
|
143
|
+
const customResources = (this.env.config.getOptionalConfigArray("kubernetes.customResources") ?? []).map(
|
|
144
|
+
(c) => ({
|
|
145
|
+
group: c.getString("group"),
|
|
146
|
+
apiVersion: c.getString("apiVersion"),
|
|
147
|
+
plural: c.getString("plural"),
|
|
148
|
+
objectType: "customresources"
|
|
149
|
+
})
|
|
150
|
+
);
|
|
151
|
+
this.env.logger.info(
|
|
152
|
+
`action=LoadingCustomResources numOfCustomResources=${customResources.length}`
|
|
153
|
+
);
|
|
154
|
+
return customResources;
|
|
155
|
+
}
|
|
156
|
+
buildClusterSupplier(refreshInterval) {
|
|
157
|
+
const config = this.env.config;
|
|
158
|
+
const { auth } = backendCommon.createLegacyAuthAdapters(this.env);
|
|
159
|
+
this.clusterSupplier = index.getCombinedClusterSupplier(
|
|
160
|
+
config,
|
|
161
|
+
this.env.catalogApi,
|
|
162
|
+
new DispatchStrategy.DispatchStrategy({ authStrategyMap: this.getAuthStrategyMap() }),
|
|
163
|
+
this.env.logger,
|
|
164
|
+
refreshInterval,
|
|
165
|
+
auth
|
|
166
|
+
);
|
|
167
|
+
return this.clusterSupplier;
|
|
168
|
+
}
|
|
169
|
+
buildObjectsProvider(options) {
|
|
170
|
+
const authStrategyMap = this.getAuthStrategyMap();
|
|
171
|
+
this.objectsProvider = new KubernetesFanOutHandler.KubernetesFanOutHandler({
|
|
172
|
+
...options,
|
|
173
|
+
authStrategy: new DispatchStrategy.DispatchStrategy({
|
|
174
|
+
authStrategyMap
|
|
175
|
+
})
|
|
176
|
+
});
|
|
177
|
+
return this.objectsProvider;
|
|
178
|
+
}
|
|
179
|
+
buildFetcher() {
|
|
180
|
+
this.fetcher = new KubernetesFetcher.KubernetesClientBasedFetcher({
|
|
181
|
+
logger: this.env.logger
|
|
182
|
+
});
|
|
183
|
+
return this.fetcher;
|
|
184
|
+
}
|
|
185
|
+
buildServiceLocator(method, clusterSupplier) {
|
|
186
|
+
switch (method) {
|
|
187
|
+
case "multiTenant":
|
|
188
|
+
this.serviceLocator = this.buildMultiTenantServiceLocator(clusterSupplier);
|
|
189
|
+
break;
|
|
190
|
+
case "singleTenant":
|
|
191
|
+
this.serviceLocator = this.buildSingleTenantServiceLocator(clusterSupplier);
|
|
192
|
+
break;
|
|
193
|
+
case "catalogRelation":
|
|
194
|
+
this.serviceLocator = this.buildCatalogRelationServiceLocator(clusterSupplier);
|
|
195
|
+
break;
|
|
196
|
+
case "http":
|
|
197
|
+
this.serviceLocator = this.buildHttpServiceLocator(clusterSupplier);
|
|
198
|
+
break;
|
|
199
|
+
default:
|
|
200
|
+
throw new Error(
|
|
201
|
+
`Unsupported kubernetes.serviceLocatorMethod "${method}"`
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
return this.serviceLocator;
|
|
205
|
+
}
|
|
206
|
+
buildMultiTenantServiceLocator(clusterSupplier) {
|
|
207
|
+
return new MultiTenantServiceLocator.MultiTenantServiceLocator(clusterSupplier);
|
|
208
|
+
}
|
|
209
|
+
buildSingleTenantServiceLocator(clusterSupplier) {
|
|
210
|
+
return new SingleTenantServiceLocator.SingleTenantServiceLocator(clusterSupplier);
|
|
211
|
+
}
|
|
212
|
+
buildCatalogRelationServiceLocator(clusterSupplier) {
|
|
213
|
+
return new CatalogRelationServiceLocator.CatalogRelationServiceLocator(clusterSupplier);
|
|
214
|
+
}
|
|
215
|
+
buildHttpServiceLocator(_clusterSupplier) {
|
|
216
|
+
throw new Error("not implemented");
|
|
217
|
+
}
|
|
218
|
+
buildProxy(logger, clusterSupplier, discovery, httpAuth) {
|
|
219
|
+
const authStrategyMap = this.getAuthStrategyMap();
|
|
220
|
+
const authStrategy = new DispatchStrategy.DispatchStrategy({
|
|
221
|
+
authStrategyMap
|
|
222
|
+
});
|
|
223
|
+
this.proxy = new KubernetesProxy.KubernetesProxy({
|
|
224
|
+
logger,
|
|
225
|
+
clusterSupplier,
|
|
226
|
+
authStrategy,
|
|
227
|
+
discovery,
|
|
228
|
+
httpAuth
|
|
229
|
+
});
|
|
230
|
+
return this.proxy;
|
|
231
|
+
}
|
|
232
|
+
buildRouter(objectsProvider, clusterSupplier, catalogApi, proxy, permissionApi, authService, httpAuth) {
|
|
233
|
+
const logger = this.env.logger;
|
|
234
|
+
const router = Router__default.default();
|
|
235
|
+
router.use("/proxy", proxy.createRequestHandler({ permissionApi }));
|
|
236
|
+
router.use(express__default.default.json());
|
|
237
|
+
router.use(
|
|
238
|
+
pluginPermissionNode.createPermissionIntegrationRouter({
|
|
239
|
+
permissions: pluginKubernetesCommon.kubernetesPermissions
|
|
240
|
+
})
|
|
241
|
+
);
|
|
242
|
+
router.post("/services/:serviceId", async (req, res) => {
|
|
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
|
+
const credentials = await httpAuth.credentials(req);
|
|
263
|
+
const clusterDetails = await this.fetchClusterDetails(clusterSupplier, {
|
|
264
|
+
credentials
|
|
265
|
+
});
|
|
266
|
+
res.json({
|
|
267
|
+
items: clusterDetails.map((cd) => {
|
|
268
|
+
const oidcTokenProvider = cd.authMetadata[pluginKubernetesCommon.ANNOTATION_KUBERNETES_OIDC_TOKEN_PROVIDER];
|
|
269
|
+
const authProvider = cd.authMetadata[pluginKubernetesCommon.ANNOTATION_KUBERNETES_AUTH_PROVIDER];
|
|
270
|
+
const strategy = this.getAuthStrategyMap()[authProvider];
|
|
271
|
+
let auth = {};
|
|
272
|
+
if (strategy) {
|
|
273
|
+
auth = strategy.presentAuthMetadata(cd.authMetadata);
|
|
274
|
+
}
|
|
275
|
+
return {
|
|
276
|
+
name: cd.name,
|
|
277
|
+
title: cd.title,
|
|
278
|
+
dashboardUrl: cd.dashboardUrl,
|
|
279
|
+
authProvider,
|
|
280
|
+
...oidcTokenProvider && { oidcTokenProvider },
|
|
281
|
+
...auth && Object.keys(auth).length !== 0 && { auth }
|
|
282
|
+
};
|
|
283
|
+
})
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
resourcesRoutes.addResourceRoutesToRouter(
|
|
287
|
+
router,
|
|
288
|
+
catalogApi,
|
|
289
|
+
objectsProvider,
|
|
290
|
+
authService,
|
|
291
|
+
httpAuth
|
|
292
|
+
);
|
|
293
|
+
return router;
|
|
294
|
+
}
|
|
295
|
+
buildAuthStrategyMap() {
|
|
296
|
+
this.authStrategyMap = {
|
|
297
|
+
aks: new AksStrategy.AksStrategy(),
|
|
298
|
+
aws: new AwsIamStrategy.AwsIamStrategy({ config: this.env.config }),
|
|
299
|
+
azure: new AzureIdentityStrategy.AzureIdentityStrategy(this.env.logger),
|
|
300
|
+
google: new GoogleStrategy.GoogleStrategy(),
|
|
301
|
+
googleServiceAccount: new GoogleServiceAccountStrategy.GoogleServiceAccountStrategy(),
|
|
302
|
+
localKubectlProxy: new AnonymousStrategy.AnonymousStrategy(),
|
|
303
|
+
oidc: new OidcStrategy.OidcStrategy(),
|
|
304
|
+
serviceAccount: new ServiceAccountStrategy.ServiceAccountStrategy()
|
|
305
|
+
};
|
|
306
|
+
return this.authStrategyMap;
|
|
307
|
+
}
|
|
308
|
+
async fetchClusterDetails(clusterSupplier, options) {
|
|
309
|
+
const clusterDetails = await clusterSupplier.getClusters(options);
|
|
310
|
+
this.env.logger.info(
|
|
311
|
+
`action=loadClusterDetails numOfClustersLoaded=${clusterDetails.length}`
|
|
312
|
+
);
|
|
313
|
+
return clusterDetails;
|
|
314
|
+
}
|
|
315
|
+
getServiceLocatorMethod() {
|
|
316
|
+
return this.env.config.getString(
|
|
317
|
+
"kubernetes.serviceLocatorMethod.type"
|
|
318
|
+
);
|
|
319
|
+
}
|
|
320
|
+
getFetcher() {
|
|
321
|
+
return this.fetcher ?? this.buildFetcher();
|
|
322
|
+
}
|
|
323
|
+
getClusterSupplier() {
|
|
324
|
+
return this.clusterSupplier ?? this.buildClusterSupplier(this.defaultClusterRefreshInterval);
|
|
325
|
+
}
|
|
326
|
+
getServiceLocator() {
|
|
327
|
+
return this.serviceLocator ?? this.buildServiceLocator(
|
|
328
|
+
this.getServiceLocatorMethod(),
|
|
329
|
+
this.getClusterSupplier()
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
getObjectsProvider(options) {
|
|
333
|
+
return this.objectsProvider ?? this.buildObjectsProvider(options);
|
|
334
|
+
}
|
|
335
|
+
getObjectTypesToFetch() {
|
|
336
|
+
const objectTypesToFetchStrings = this.env.config.getOptionalStringArray(
|
|
337
|
+
"kubernetes.objectTypes"
|
|
338
|
+
);
|
|
339
|
+
const apiVersionOverrides = this.env.config.getOptionalConfig(
|
|
340
|
+
"kubernetes.apiVersionOverrides"
|
|
341
|
+
);
|
|
342
|
+
let objectTypesToFetch;
|
|
343
|
+
if (objectTypesToFetchStrings) {
|
|
344
|
+
objectTypesToFetch = KubernetesFanOutHandler.DEFAULT_OBJECTS.filter(
|
|
345
|
+
(obj) => objectTypesToFetchStrings.includes(obj.objectType)
|
|
346
|
+
);
|
|
347
|
+
}
|
|
348
|
+
if (apiVersionOverrides) {
|
|
349
|
+
objectTypesToFetch = objectTypesToFetch ?? KubernetesFanOutHandler.DEFAULT_OBJECTS;
|
|
350
|
+
for (const obj of objectTypesToFetch) {
|
|
351
|
+
if (apiVersionOverrides.has(obj.objectType)) {
|
|
352
|
+
obj.apiVersion = apiVersionOverrides.getString(obj.objectType);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return objectTypesToFetch;
|
|
357
|
+
}
|
|
358
|
+
getProxy(logger, clusterSupplier, discovery, httpAuth) {
|
|
359
|
+
return this.proxy ?? this.buildProxy(logger, clusterSupplier, discovery, httpAuth);
|
|
360
|
+
}
|
|
361
|
+
getAuthStrategyMap() {
|
|
362
|
+
return this.authStrategyMap ?? this.buildAuthStrategyMap();
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
exports.KubernetesBuilder = KubernetesBuilder;
|
|
367
|
+
//# sourceMappingURL=KubernetesBuilder.cjs.js.map
|