From 231c785f18e497fd03f534d88ac801ab91c1eadc Mon Sep 17 00:00:00 2001 From: Manabu Mccloskey Date: Mon, 26 Jun 2023 17:24:11 -0700 Subject: [PATCH] clean up --- .../argo-workflows/src/api/ArgoWorkflows.ts | 97 ++++++++++++ plugins/argo-workflows/src/api/indext.ts | 145 +----------------- 2 files changed, 101 insertions(+), 141 deletions(-) create mode 100644 plugins/argo-workflows/src/api/ArgoWorkflows.ts diff --git a/plugins/argo-workflows/src/api/ArgoWorkflows.ts b/plugins/argo-workflows/src/api/ArgoWorkflows.ts new file mode 100644 index 0000000..709d4d1 --- /dev/null +++ b/plugins/argo-workflows/src/api/ArgoWorkflows.ts @@ -0,0 +1,97 @@ +import {ConfigApi, DiscoveryApi, IdentityApi} from "@backstage/core-plugin-api"; +import {KubernetesApi} from "@backstage/plugin-kubernetes"; +import {IoArgoprojWorkflowV1alpha1WorkflowList} from "./generated"; +import {ArgoWorkflowsApi} from "./indext"; + +const API_VERSION = 'argoproj.io/v1alpha1' +const WORKFLOW_PLURAL = 'workflows' +const DEFAULT_WORKFLOW_PROXY = '/argo-workflows/api' +const API_LABEL_SELECTOR = 'listOptions.labelSelector' +const API_TIMEOUT = "listOptions.timeoutSeconds" +const K8s_API_TIMEOUT = "timeoutSeconds" + +export class ArgoWorkflows implements ArgoWorkflowsApi { + discoveryApi: DiscoveryApi + kubernetesApi: KubernetesApi + configApi: ConfigApi + identityApi: IdentityApi + + constructor(discoveryApi: DiscoveryApi, kubernetesApi: KubernetesApi, configApi: ConfigApi, identityApi: IdentityApi) { + this.discoveryApi = discoveryApi + this.kubernetesApi = kubernetesApi + this.configApi = configApi + this.identityApi = identityApi + } + + async getWorkflowsFromK8s(clusterName: string | undefined, namespace: string | undefined, labels: string | undefined): Promise { + const ns = namespace !== undefined ? namespace : 'default' + const path = `/apis/${API_VERSION}/namespaces/${ns}/${WORKFLOW_PLURAL}` + const query = new URLSearchParams({ + [K8s_API_TIMEOUT]: "30" + }) + if (labels) { + query.set('labelSelector', labels) + } + // need limits and pagination + const resp = await this.kubernetesApi.proxy({ + clusterName: clusterName !== undefined ? clusterName: await this.getCluster(), + path: `${path}?${query.toString()}` + }) + + if (!resp.ok) { + return Promise.reject(`failed to fetch resources: ${resp.status}, ${resp.statusText}, ${await resp.json()}`) + } + // need validation + return JSON.parse(await resp.text()) as IoArgoprojWorkflowV1alpha1WorkflowList + } + + getWorkflows(clusterName: string | undefined, namespace: string, labels: string | undefined): Promise { + if (clusterName) { + return this.getWorkflowsFromK8s(clusterName, namespace, labels) + } + return this.getWorkflowsFromProxy(namespace, labels); + } + + async getWorkflowsFromProxy(namespace: string | undefined, labels: string | undefined): Promise { + const proxyUrl = await this.discoveryApi.getBaseUrl('proxy') + + const ns = namespace !== undefined ? namespace : 'default' + const url = `${proxyUrl}${DEFAULT_WORKFLOW_PROXY}/api/v1/workflows/${ns}` + + const query = new URLSearchParams( + {[API_TIMEOUT]: "30"} + ) + if (labels) { + query.set(API_LABEL_SELECTOR, labels) + } + + const { token } = await this.identityApi.getCredentials() + + const headers = new Headers( + { + 'Content-Type': 'application/json', + Authorization: `Bearer ${token}`, + } + ) + + const resp = await fetch(`${url}?${query.toString()}`, { + headers: headers + }) + + if (!resp.ok) { + return Promise.reject(`failed to fetch resources: ${resp.status}, ${resp.statusText}, ${await resp.json()}`) + } + + // need validation + return Promise.resolve(JSON.parse(await resp.text()) as IoArgoprojWorkflowV1alpha1WorkflowList); + } + + + async getCluster(): Promise { + const clusters = await this.kubernetesApi.getClusters() + if (clusters.length > 0) { + return Promise.resolve(clusters[0].name) + } + return Promise.reject("no clusters found in configuration") + } +} diff --git a/plugins/argo-workflows/src/api/indext.ts b/plugins/argo-workflows/src/api/indext.ts index 7706cd2..f7110ae 100644 --- a/plugins/argo-workflows/src/api/indext.ts +++ b/plugins/argo-workflows/src/api/indext.ts @@ -1,21 +1,13 @@ import { - ConfigApi, createApiRef, - DiscoveryApi, IdentityApi + DiscoveryApi, } from '@backstage/core-plugin-api'; -import {KubernetesApi } from "@backstage/plugin-kubernetes"; -import { - IoArgoprojWorkflowV1alpha1WorkflowList, -} from "./generated/"; +import { KubernetesApi } from "@backstage/plugin-kubernetes"; +import { IoArgoprojWorkflowV1alpha1WorkflowList } from "./generated/"; +export {ArgoWorkflows} from "./ArgoWorkflows"; -const API_VERSION = 'argoproj.io/v1alpha1' -const WORKFLOW_PLURAL = 'workflows' -const DEFAULT_WORKFLOW_PROXY = '/argo-workflows/api' -const API_LABEL_SELECTOR = 'listOptions.labelSelector' -const API_TIMEOUT = "listOptions.timeoutSeconds" -const K8s_API_TIMEOUT = "timeoutSeconds" export const argoWorkflowsApiRef = createApiRef({ id: 'plugin.argoworkflows', }) @@ -27,133 +19,4 @@ export interface ArgoWorkflowsApi { getWorkflowsFromProxy(namespace: string, labels: string | undefined): Promise } -// type Metadata = { -// annotations: Record -// labels: Record -// name: string -// namespace: string -// } -// -// export type Workflow = { -// metadata: Metadata -// status?: WorkflowStatus -// } -// -// type WorkflowStatus = { -// finishedAt: string -// startedAt: string -// phase: string -// progress: string -// } -// -// type workflowResponse = { -// items: Workflow[] -// } -export class ArgoWorkflows implements ArgoWorkflowsApi { - discoveryApi: DiscoveryApi - kubernetesApi: KubernetesApi - configApi: ConfigApi - identityApi: IdentityApi - - constructor(discoveryApi: DiscoveryApi, kubernetesApi: KubernetesApi, configApi: ConfigApi, identityApi: IdentityApi) { - this.discoveryApi = discoveryApi - this.kubernetesApi = kubernetesApi - this.configApi = configApi - this.identityApi = identityApi - } - - async getWorkflowsFromK8s(clusterName: string | undefined, namespace: string | undefined, labels: string | undefined): Promise { - const ns = namespace !== undefined ? namespace : 'default' - const path = `/apis/${API_VERSION}/namespaces/${ns}/${WORKFLOW_PLURAL}` - const query = new URLSearchParams({ - [K8s_API_TIMEOUT]: "30" - }) - if (labels) { - query.set('labelSelector', labels) - } - // need limits and pagination - const resp = await this.kubernetesApi.proxy({ - clusterName: clusterName !== undefined ? clusterName: await this.getCluster(), - path: `${path}?${query.toString()}` - }) - - if (!resp.ok) { - return Promise.reject(`failed to fetch resources: ${resp.status}, ${resp.statusText}, ${await resp.json()}`) - } - // need validation - return JSON.parse(await resp.text()) as IoArgoprojWorkflowV1alpha1WorkflowList - } - - getWorkflows(clusterName: string | undefined, namespace: string, labels: string | undefined): Promise { - if (clusterName) { - return this.getWorkflowsFromK8s(clusterName, namespace, labels) - } - return this.getWorkflowsFromProxy(namespace, labels); - } - - async getWorkflowsFromProxy(namespace: string | undefined, labels: string | undefined): Promise { - const proxyUrl = await this.discoveryApi.getBaseUrl('proxy') - - const ns = namespace !== undefined ? namespace : 'default' - const url = `${proxyUrl}${DEFAULT_WORKFLOW_PROXY}/api/v1/workflows/${ns}` - - const query = new URLSearchParams( - {[API_TIMEOUT]: "30"} - ) - if (labels) { - query.set(API_LABEL_SELECTOR, labels) - } - - const { token } = await this.identityApi.getCredentials() - - const headers = new Headers( - { - 'Content-Type': 'application/json', - Authorization: `Bearer ${token}`, - } - ) - - const resp = await fetch(`${url}?${query.toString()}`, { - headers: headers - }) - - if (!resp.ok) { - return Promise.reject(`failed to fetch resources: ${resp.status}, ${resp.statusText}, ${await resp.json()}`) - } - - // need validation - return Promise.resolve(JSON.parse(await resp.text()) as IoArgoprojWorkflowV1alpha1WorkflowList); - } - - - async getCluster(): Promise { - const clusters = await this.kubernetesApi.getClusters() - if (clusters.length > 0) { - return Promise.resolve(clusters[0].name) - } - return Promise.reject("no clusters found in configuration") - } - - // async getToken(clusterName: string): Promise { - // const clusters = await this.kubernetesApi.getClusters() - // const cluster = clusters.find(c => { - // return c.name === clusterName - // }) - // if (!cluster) { - // return Promise.reject(`cluster ${clusterName} not found`) - // } - // const oidc = OAuth2.create({ - // discoveryApi: this.discoveryApi, - // oauthRequestApi: this.oauthRequestApi, - // provider: { - // id: cluster.oidcTokenProvider!, - // title: 'OIDC', - // icon: () => null, - // }, - // environment: this.configApi.getOptionalString('auth.environment'), - // defaultScopes: ['openid', 'profile', 'email', 'groups'], - // }) - // return oidc.getIdToken() - // } -}