diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index 850f3c67f4..e052fb4f58 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -42,6 +42,8 @@ "@backstage/errors": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", "@backstage/plugin-kubernetes-common": "workspace:^", + "@backstage/plugin-permission-common": "workspace:^", + "@backstage/plugin-permission-node": "workspace:^", "@google-cloud/container": "^4.0.0", "@jest-mock/express": "^2.0.1", "@kubernetes/client-node": "0.18.1", diff --git a/plugins/kubernetes-backend/src/service/KubernetesBuilder.test.ts b/plugins/kubernetes-backend/src/service/KubernetesBuilder.test.ts index 695649b9f3..8eb7a066df 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesBuilder.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesBuilder.test.ts @@ -286,7 +286,6 @@ describe('KubernetesBuilder', () => { expect(response.status).toEqual(200); }); }); - describe('post /proxy', () => { const worker = setupServer(); setupRequestMockHandlers(worker); @@ -340,11 +339,11 @@ describe('KubernetesBuilder', () => { it('supports yaml content type with permission set to allow', async () => { const requestBody = `--- - kind: Namespace - apiVersion: v1 - metadata: - name: new-ns - `; +kind: Namespace +apiVersion: v1 +metadata: + name: new-ns +`; permissions.authorize.mockReturnValue( Promise.resolve([{ result: AuthorizeResult.ALLOW }]), @@ -389,4 +388,23 @@ describe('KubernetesBuilder', () => { expect(response.status).toEqual(403); }); }); + describe('get /.well-known/backstage/permissions/metadata', () => { + it('lists permissions supported by the kubernetes plugin', async () => { + const response = await request(app).get( + '/.well-known/backstage/permissions/metadata', + ); + + expect(response.status).toEqual(200); + expect(response.body).toMatchObject({ + permissions: [ + { + type: 'basic', + name: 'kubernetes.proxy', + attributes: {}, + }, + ], + rules: [], + }); + }); + }); }); diff --git a/plugins/kubernetes-backend/src/service/KubernetesBuilder.ts b/plugins/kubernetes-backend/src/service/KubernetesBuilder.ts index ea098ab596..c84f87b36f 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesBuilder.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesBuilder.ts @@ -15,7 +15,12 @@ */ import { CatalogApi } from '@backstage/catalog-client'; import { Config } from '@backstage/config'; +import { + kubernetesPermissions, + RESOURCE_TYPE_KUBERNETES_RESOURCE, +} from '@backstage/plugin-kubernetes-common'; import { PermissionEvaluator } from '@backstage/plugin-permission-common'; +import { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node'; import express from 'express'; import Router from 'express-promise-router'; import { Duration } from 'luxon'; @@ -272,7 +277,13 @@ export class KubernetesBuilder { const router = Router(); router.use('/proxy', proxy.createRequestHandler(permissionApi)); router.use(express.json()); - + router.use( + createPermissionIntegrationRouter({ + resourceType: RESOURCE_TYPE_KUBERNETES_RESOURCE, + permissions: kubernetesPermissions, + rules: [], + }), + ); // @deprecated router.post('/services/:serviceId', async (req, res) => { const serviceId = req.params.serviceId; diff --git a/plugins/kubernetes-common/api-report.md b/plugins/kubernetes-common/api-report.md index a06780a61a..5fdd40d152 100644 --- a/plugins/kubernetes-common/api-report.md +++ b/plugins/kubernetes-common/api-report.md @@ -207,9 +207,6 @@ export interface JobsFetchResponse { type: 'jobs'; } -// @alpha -export const kubernetesClusterPermissions: BasicPermission[]; - // @public (undocumented) export type KubernetesErrorTypes = | 'BAD_REQUEST' @@ -222,10 +219,10 @@ export type KubernetesErrorTypes = export type KubernetesFetchError = StatusError | RawFetchError; // @alpha -export const kubernetesProxyCreatePermission: BasicPermission; +export const kubernetesPermissions: BasicPermission[]; // @alpha -export const kubernetesProxyReadPermission: BasicPermission; +export const kubernetesProxyPermission: BasicPermission; // @public (undocumented) export interface KubernetesRequestAuth { @@ -291,6 +288,9 @@ export interface ReplicaSetsFetchResponse { type: 'replicasets'; } +// @alpha +export const RESOURCE_TYPE_KUBERNETES_RESOURCE = 'kubernetes-resource'; + // @public (undocumented) export interface ServiceFetchResponse { // (undocumented) diff --git a/plugins/kubernetes-common/src/index.ts b/plugins/kubernetes-common/src/index.ts index 88b600f17b..e9fb2b35d3 100644 --- a/plugins/kubernetes-common/src/index.ts +++ b/plugins/kubernetes-common/src/index.ts @@ -23,6 +23,7 @@ export * from './types'; export * from './catalog-entity-constants'; export { + RESOURCE_TYPE_KUBERNETES_RESOURCE, kubernetesProxyPermission, - kubernetesClusterPermissions, + kubernetesPermissions, } from './permissions'; diff --git a/plugins/kubernetes-common/src/permissions.ts b/plugins/kubernetes-common/src/permissions.ts index 58eb47fbf3..3123796aa3 100644 --- a/plugins/kubernetes-common/src/permissions.ts +++ b/plugins/kubernetes-common/src/permissions.ts @@ -16,6 +16,12 @@ import { createPermission } from '@backstage/plugin-permission-common'; +/** + * Permission resource type which corresponds to cluster entities. + * @alpha + */ +export const RESOURCE_TYPE_KUBERNETES_RESOURCE = 'kubernetes-resource'; + /** This permission is used to check access to the proxy endpoint * @alpha */ @@ -25,7 +31,7 @@ export const kubernetesProxyPermission = createPermission({ }); /** - * List of all cluster permissions. + * List of all Kubernetes permissions. * @alpha */ -export const kubernetesClusterPermissions = [kubernetesProxyPermission]; +export const kubernetesPermissions = [kubernetesProxyPermission]; diff --git a/yarn.lock b/yarn.lock index 075384ae64..71b43756fa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6807,6 +6807,8 @@ __metadata: "@backstage/errors": "workspace:^" "@backstage/plugin-auth-node": "workspace:^" "@backstage/plugin-kubernetes-common": "workspace:^" + "@backstage/plugin-permission-common": "workspace:^" + "@backstage/plugin-permission-node": "workspace:^" "@google-cloud/container": ^4.0.0 "@jest-mock/express": ^2.0.1 "@kubernetes/client-node": 0.18.1