diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index 64f308b74c..8a0a5cbefb 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -90,6 +90,8 @@ "@backstage/backend-app-api": "workspace:^", "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", + "@backstage/plugin-permission-backend": "workspace:^", + "@backstage/plugin-permission-backend-module-allow-all-policy": "workspace:^", "@types/aws4": "^1.5.1", "msw": "^1.0.0", "supertest": "^6.1.3", diff --git a/plugins/kubernetes-backend/src/plugin.ts b/plugins/kubernetes-backend/src/plugin.ts index e93e8c5700..8fdef794d1 100644 --- a/plugins/kubernetes-backend/src/plugin.ts +++ b/plugins/kubernetes-backend/src/plugin.ts @@ -32,6 +32,11 @@ import { KubernetesAuthStrategyExtensionPoint, AuthenticationStrategy, kubernetesAuthStrategyExtensionPoint, + KubernetesFetcher, +} from '@backstage/plugin-kubernetes-node'; +import { + KubernetesFetcherExtensionPoint, + kubernetesFetcherExtensionPoint, } from '@backstage/plugin-kubernetes-node'; class ObjectsProvider implements KubernetesObjectsProviderExtensionPoint { @@ -68,6 +73,23 @@ class ClusterSuplier implements KubernetesClusterSupplierExtensionPoint { } } +class Fetcher implements KubernetesFetcherExtensionPoint { + private fetcher: KubernetesFetcher | undefined; + + getFetcher() { + return this.fetcher; + } + + addFetcher(fetcher: KubernetesFetcher) { + if (this.fetcher) { + throw new Error( + 'Multiple Kubernetes Fetchers is not supported at this time', + ); + } + this.fetcher = fetcher; + } +} + class AuthStrategy implements KubernetesAuthStrategyExtensionPoint { private authStrategies: Array<{ key: string; @@ -108,6 +130,7 @@ export const kubernetesPlugin = createBackendPlugin({ const extPointObjectsProvider = new ObjectsProvider(); const extPointClusterSuplier = new ClusterSuplier(); const extPointAuthStrategy = new AuthStrategy(); + const extPointFetcher = new Fetcher(); env.registerExtensionPoint( kubernetesObjectsProviderExtensionPoint, extPointObjectsProvider, @@ -120,6 +143,10 @@ export const kubernetesPlugin = createBackendPlugin({ kubernetesAuthStrategyExtensionPoint, extPointAuthStrategy, ); + env.registerExtensionPoint( + kubernetesFetcherExtensionPoint, + extPointFetcher, + ); env.registerInit({ deps: { @@ -139,7 +166,8 @@ export const kubernetesPlugin = createBackendPlugin({ permissions, }) .setObjectsProvider(extPointObjectsProvider.getObjectsProvider()) - .setClusterSupplier(extPointClusterSuplier.getClusterSupplier()); + .setClusterSupplier(extPointClusterSuplier.getClusterSupplier()) + .setFetcher(extPointFetcher.getFetcher()); AuthStrategy.addAuthStrategiesFromArray( extPointAuthStrategy.getAuthenticationStrategies(), builder, diff --git a/plugins/kubernetes-backend/src/types/types.ts b/plugins/kubernetes-backend/src/types/types.ts index c64a2b7863..f980821c4d 100644 --- a/plugins/kubernetes-backend/src/types/types.ts +++ b/plugins/kubernetes-backend/src/types/types.ts @@ -18,75 +18,16 @@ import { Entity } from '@backstage/catalog-model'; import { Logger } from 'winston'; import type { CustomResourceMatcher, - FetchResponse, - KubernetesFetchError, KubernetesRequestBody, } from '@backstage/plugin-kubernetes-common'; import { Config } from '@backstage/config'; import { ClusterDetails, - KubernetesCredential, + CustomResource, + KubernetesFetcher, + ObjectToFetch, } from '@backstage/plugin-kubernetes-node'; -/** - * - * @public - */ -export interface ObjectFetchParams { - serviceId: string; - clusterDetails: ClusterDetails; - credential: KubernetesCredential; - objectTypesToFetch: Set; - labelSelector?: string; - customResources: CustomResource[]; - namespace?: string; -} - -/** - * Fetches information from a kubernetes cluster using the cluster details object to target a specific cluster - * - * @public - */ -export interface KubernetesFetcher { - fetchObjectsForService( - params: ObjectFetchParams, - ): Promise; - fetchPodMetricsByNamespaces( - clusterDetails: ClusterDetails, - credential: KubernetesCredential, - namespaces: Set, - labelSelector?: string, - ): Promise; -} - -/** - * - * @public - */ -export interface FetchResponseWrapper { - errors: KubernetesFetchError[]; - responses: FetchResponse[]; -} - -/** - * - * @public - */ -export interface ObjectToFetch { - objectType: KubernetesObjectTypes; - group: string; - apiVersion: string; - plural: string; -} - -/** - * - * @public - */ -export interface CustomResource extends ObjectToFetch { - objectType: 'customresources'; -} - /** * * @public @@ -157,4 +98,9 @@ export type { AuthMetadata, ClusterDetails, KubernetesClustersSupplier, + ObjectToFetch, + CustomResource, + ObjectFetchParams, + FetchResponseWrapper, + KubernetesFetcher, } from '@backstage/plugin-kubernetes-node'; diff --git a/plugins/kubernetes-node/package.json b/plugins/kubernetes-node/package.json index 56f4ba01c4..37922fc2e9 100644 --- a/plugins/kubernetes-node/package.json +++ b/plugins/kubernetes-node/package.json @@ -30,6 +30,7 @@ "dependencies": { "@backstage/backend-plugin-api": "workspace:^", "@backstage/catalog-model": "workspace:^", + "@backstage/plugin-kubernetes-backend": "workspace:^", "@backstage/plugin-kubernetes-common": "workspace:^", "@backstage/types": "workspace:^" } diff --git a/plugins/kubernetes-node/src/extensions.ts b/plugins/kubernetes-node/src/extensions.ts index 3c110be348..0c6107ee46 100644 --- a/plugins/kubernetes-node/src/extensions.ts +++ b/plugins/kubernetes-node/src/extensions.ts @@ -14,6 +14,7 @@ * limitations under the License. */ import { createExtensionPoint } from '@backstage/backend-plugin-api'; +import { KubernetesFetcher } from '@backstage/plugin-kubernetes-backend'; import { AuthenticationStrategy } from '@backstage/plugin-kubernetes-node'; import { KubernetesClustersSupplier } from '@backstage/plugin-kubernetes-node'; import { KubernetesObjectsProvider } from '@backstage/plugin-kubernetes-node'; @@ -74,3 +75,22 @@ export const kubernetesAuthStrategyExtensionPoint = createExtensionPoint({ id: 'kubernetes.auth-strategy', }); + +/** + * The interface for {@link kubernetesFetcherExtensionPoint}. + * + * @public + */ +export interface KubernetesFetcherExtensionPoint { + addFetcher(fetcher: KubernetesFetcher): void; +} + +/** + * An extension point the exposes the ability to configure a kubernetes fetcher. + * + * @public + */ +export const kubernetesFetcherExtensionPoint = + createExtensionPoint({ + id: 'kubernetes.fetcher', + }); diff --git a/plugins/kubernetes-node/src/index.ts b/plugins/kubernetes-node/src/index.ts index 63a478593c..162d5baf26 100644 --- a/plugins/kubernetes-node/src/index.ts +++ b/plugins/kubernetes-node/src/index.ts @@ -29,13 +29,5 @@ * @packageDocumentation */ -export { - kubernetesObjectsProviderExtensionPoint, - type KubernetesObjectsProviderExtensionPoint, - kubernetesClusterSupplierExtensionPoint, - type KubernetesClusterSupplierExtensionPoint, - kubernetesAuthStrategyExtensionPoint, - type KubernetesAuthStrategyExtensionPoint, -} from './extensions'; - +export * from './extensions'; export * from './types'; diff --git a/plugins/kubernetes-node/src/types/types.ts b/plugins/kubernetes-node/src/types/types.ts index dfc0395bc4..39fcd18ad0 100644 --- a/plugins/kubernetes-node/src/types/types.ts +++ b/plugins/kubernetes-node/src/types/types.ts @@ -14,8 +14,11 @@ * limitations under the License. */ import { Entity } from '@backstage/catalog-model'; +import { KubernetesObjectTypes } from '@backstage/plugin-kubernetes-backend'; import { CustomResourceMatcher, + FetchResponse, + KubernetesFetchError, KubernetesRequestAuth, ObjectsByEntityResponse, } from '@backstage/plugin-kubernetes-common'; @@ -150,3 +153,62 @@ export interface AuthenticationStrategy { ): Promise; validateCluster(authMetadata: AuthMetadata): Error[]; } + +/** + * + * @public + */ +export interface ObjectToFetch { + objectType: KubernetesObjectTypes; // TODO - Review + group: string; + apiVersion: string; + plural: string; +} + +/** + * + * @public + */ +export interface CustomResource extends ObjectToFetch { + objectType: 'customresources'; +} + +/** + * + * @public + */ +export interface ObjectFetchParams { + serviceId: string; + clusterDetails: ClusterDetails; + credential: KubernetesCredential; + objectTypesToFetch: Set; + labelSelector?: string; + customResources: CustomResource[]; + namespace?: string; +} + +/** + * + * @public + */ +export interface FetchResponseWrapper { + errors: KubernetesFetchError[]; + responses: FetchResponse[]; +} + +/** + * Fetches information from a kubernetes cluster using the cluster details object to target a specific cluster + * + * @public + */ +export interface KubernetesFetcher { + fetchObjectsForService( + params: ObjectFetchParams, + ): Promise; + fetchPodMetricsByNamespaces( + clusterDetails: ClusterDetails, + credential: KubernetesCredential, + namespaces: Set, + labelSelector?: string, + ): Promise; +}