From 1d6159e40db6f665fb8396b5a097fc33ed84776a Mon Sep 17 00:00:00 2001 From: Juan Lulkin Date: Wed, 14 Apr 2021 17:53:48 +0200 Subject: [PATCH] kubernetes-common: Adds initial shared types and files Signed-off-by: Juan Lulkin --- packages/kubernetes-common/.eslintrc.js | 0 packages/kubernetes-common/CHANGELOG.md | 7 + packages/kubernetes-common/README.md | 3 + packages/kubernetes-common/package.json | 48 ++++++ packages/kubernetes-common/src/index.ts | 17 ++ packages/kubernetes-common/src/types.ts | 208 ++++++++++++++++++++++++ 6 files changed, 283 insertions(+) create mode 100644 packages/kubernetes-common/.eslintrc.js create mode 100644 packages/kubernetes-common/CHANGELOG.md create mode 100644 packages/kubernetes-common/README.md create mode 100644 packages/kubernetes-common/package.json create mode 100644 packages/kubernetes-common/src/index.ts create mode 100644 packages/kubernetes-common/src/types.ts diff --git a/packages/kubernetes-common/.eslintrc.js b/packages/kubernetes-common/.eslintrc.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/kubernetes-common/CHANGELOG.md b/packages/kubernetes-common/CHANGELOG.md new file mode 100644 index 0000000000..4b73dbafad --- /dev/null +++ b/packages/kubernetes-common/CHANGELOG.md @@ -0,0 +1,7 @@ +# @backstage/techdocs-common + +## 0.1.0 + +### Minor Changes + +- Adds the following types to be shared by the backend and the front end: \ No newline at end of file diff --git a/packages/kubernetes-common/README.md b/packages/kubernetes-common/README.md new file mode 100644 index 0000000000..db3989cdcb --- /dev/null +++ b/packages/kubernetes-common/README.md @@ -0,0 +1,3 @@ +# @backstage/kubernetes-common + +Common types and functionalities for kubernetes, to be shared between kubernetes and kubernetes-backend. \ No newline at end of file diff --git a/packages/kubernetes-common/package.json b/packages/kubernetes-common/package.json new file mode 100644 index 0000000000..ff541911ba --- /dev/null +++ b/packages/kubernetes-common/package.json @@ -0,0 +1,48 @@ +{ + "name": "@backstage/kubernetes-common", + "description": "Common functionalities for kubernetes, to be shared between kubernetes and kubernetes-backend plugin", + "version": "0.1.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "packages/kubernetes-common" + }, + "keywords": [ + "techdocs", + "kubernetes" + ], + "files": [ + "dist" + ], + "scripts": { + "build": "backstage-cli build --outputs cjs,types", + "lint": "backstage-cli lint", + "test": "backstage-cli test", + "prepack": "backstage-cli prepack", + "postpack": "backstage-cli postpack", + "clean": "backstage-cli clean" + }, + "bugs": { + "url": "https://github.com/backstage/backstage/issues" + }, + "dependencies": { + "@kubernetes/client-node": "^0.14.0" + }, + "devDependencies": { + "@backstage/cli": "^0.6.5" + }, + "jest": { + "roots": [ + ".." + ] + } +} diff --git a/packages/kubernetes-common/src/index.ts b/packages/kubernetes-common/src/index.ts new file mode 100644 index 0000000000..50e9534751 --- /dev/null +++ b/packages/kubernetes-common/src/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './types'; diff --git a/packages/kubernetes-common/src/types.ts b/packages/kubernetes-common/src/types.ts new file mode 100644 index 0000000000..84ca08585b --- /dev/null +++ b/packages/kubernetes-common/src/types.ts @@ -0,0 +1,208 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + ExtensionsV1beta1Ingress, + V1ConfigMap, + V1Deployment, + V1HorizontalPodAutoscaler, + V1Pod, + V1ReplicaSet, + V1Service, +} from '@kubernetes/client-node'; +import { Entity } from '@backstage/catalog-model'; + +export interface ClusterDetails { + name: string; + url: string; + authProvider: string; + serviceAccountToken?: string | undefined; +} + +export interface KubernetesRequestBody { + auth?: { + google?: string; + }; + entity: Entity; +} + +export interface ClusterObjects { + cluster: { name: string }; + resources: FetchResponse[]; + errors: KubernetesFetchError[]; +} + +export interface ObjectsByEntityResponse { + items: ClusterObjects[]; +} + +export interface FetchResponseWrapper { + errors: KubernetesFetchError[]; + responses: FetchResponse[]; +} + +export type FetchResponse = + | PodFetchResponse + | ServiceFetchResponse + | ConfigMapFetchResponse + | DeploymentFetchResponse + | ReplicaSetsFetchResponse + | HorizontalPodAutoscalersFetchResponse + | IngressesFetchResponse + | CustomResourceFetchResponse; + +// TODO fairly sure there's a easier way to do this + +export type KubernetesObjectTypes = + | 'pods' + | 'services' + | 'configmaps' + | 'deployments' + | 'replicasets' + | 'horizontalpodautoscalers' + | 'ingresses' + | 'customresources'; + +export interface PodFetchResponse { + type: 'pods'; + resources: Array; +} + +export interface ServiceFetchResponse { + type: 'services'; + resources: Array; +} + +export interface ConfigMapFetchResponse { + type: 'configmaps'; + resources: Array; +} + +export interface DeploymentFetchResponse { + type: 'deployments'; + resources: Array; +} + +export interface ReplicaSetsFetchResponse { + type: 'replicasets'; + resources: Array; +} + +export interface HorizontalPodAutoscalersFetchResponse { + type: 'horizontalpodautoscalers'; + resources: Array; +} + +export interface IngressesFetchResponse { + type: 'ingresses'; + resources: Array; +} + +export interface CustomResourceFetchResponse { + type: 'customresources'; + resources: Array; +} + +export interface ObjectFetchParams { + serviceId: string; + clusterDetails: ClusterDetails; + objectTypesToFetch: Set; + labelSelector: string; + customResources: CustomResource[]; +} + +// Fetches information from a kubernetes cluster using the cluster details object +// to target a specific cluster +export interface KubernetesFetcher { + fetchObjectsForService( + params: ObjectFetchParams, + ): Promise; +} + +// Used to locate which cluster(s) a service is running on +export interface KubernetesServiceLocator { + getClustersByServiceId(serviceId: string): Promise; +} + +// Used to load cluster details from different sources +export interface KubernetesClustersSupplier { + getClusters(): Promise; +} + +export type KubernetesErrorTypes = + | 'BAD_REQUEST' + | 'UNAUTHORIZED_ERROR' + | 'SYSTEM_ERROR' + | 'UNKNOWN_ERROR'; + +export interface KubernetesFetchError { + errorType: KubernetesErrorTypes; + statusCode?: number; + resourcePath?: string; +} + +export interface ConfigClusterLocatorMethod { + /** + * @visibility frontend + */ + type: 'config'; + clusters: { + /** + * @visibility frontend + */ + url: string; + /** + * @visibility frontend + */ + name: string; + /** + * @visibility secret + */ + serviceAccountToken: string | undefined; + /** + * @visibility frontend + */ + authProvider: 'aws' | 'google' | 'serviceAccount'; + }[]; +} + +export interface GKEClusterLocatorMethod { + /** + * @visibility frontend + */ + type: 'gke'; + /** + * @visibility frontend + */ + projectId: string; + /** + * @visibility frontend + */ + region?: string; +} + +export type ClusterLocatorMethod = + | ConfigClusterLocatorMethod + | GKEClusterLocatorMethod; + +export type ServiceLocatorMethod = 'multiTenant' | 'http'; // TODO implement http +export type AuthProviderType = 'google' | 'serviceAccount' | 'aws'; + +export interface CustomResource { + group: string; + apiVersion: string; + plural: string; +}