From 591c3041a0f99fcc57cf2b352a9671139be848ed Mon Sep 17 00:00:00 2001 From: Manabu Mccloskey Date: Mon, 26 Jun 2023 16:50:22 -0700 Subject: [PATCH] add links --- plugins/argo-workflows/package.json | 6 +- plugins/argo-workflows/src/api/indext.ts | 4 +- .../WorkflowOverview/WorkflowOverview.tsx | 73 ++++++++++++------- 3 files changed, 51 insertions(+), 32 deletions(-) diff --git a/plugins/argo-workflows/package.json b/plugins/argo-workflows/package.json index 6383de5..411fe12 100644 --- a/plugins/argo-workflows/package.json +++ b/plugins/argo-workflows/package.json @@ -49,6 +49,8 @@ "msw": "^1.0.0" }, "files": [ - "dist" - ] + "dist", + "config.d.ts" + ], + "configSchema": "config.d.ts" } diff --git a/plugins/argo-workflows/src/api/indext.ts b/plugins/argo-workflows/src/api/indext.ts index 8273ca6..7706cd2 100644 --- a/plugins/argo-workflows/src/api/indext.ts +++ b/plugins/argo-workflows/src/api/indext.ts @@ -96,7 +96,7 @@ export class ArgoWorkflows implements ArgoWorkflowsApi { const proxyUrl = await this.discoveryApi.getBaseUrl('proxy') const ns = namespace !== undefined ? namespace : 'default' - const url = `${proxyUrl}/${DEFAULT_WORKFLOW_PROXY}/api/v1/workflows/${ns}` + const url = `${proxyUrl}${DEFAULT_WORKFLOW_PROXY}/api/v1/workflows/${ns}` const query = new URLSearchParams( {[API_TIMEOUT]: "30"} @@ -114,7 +114,7 @@ export class ArgoWorkflows implements ArgoWorkflowsApi { } ) - const resp = await fetch(`${url}/${query.toString()}`, { + const resp = await fetch(`${url}?${query.toString()}`, { headers: headers }) diff --git a/plugins/argo-workflows/src/components/WorkflowOverview/WorkflowOverview.tsx b/plugins/argo-workflows/src/components/WorkflowOverview/WorkflowOverview.tsx index 4d9c0a9..f67b998 100644 --- a/plugins/argo-workflows/src/components/WorkflowOverview/WorkflowOverview.tsx +++ b/plugins/argo-workflows/src/components/WorkflowOverview/WorkflowOverview.tsx @@ -1,7 +1,7 @@ -import {useApi} from "@backstage/core-plugin-api"; +import {configApiRef, useApi} from "@backstage/core-plugin-api"; import {argoWorkflowsApiRef} from "../../api/indext"; import useAsync from "react-use/lib/useAsync"; -import {Progress, Table, TableColumn} from '@backstage/core-components' +import {Link, Progress, Table, TableColumn} from '@backstage/core-components' import React from "react"; import Alert from "@material-ui/lab/Alert"; import { useEntity } from '@backstage/plugin-catalog-react'; @@ -10,43 +10,54 @@ import {IoArgoprojWorkflowV1alpha1WorkflowList} from "../../api/generated"; type TableData = { name: string + namespace: string phase?: string progress?: string startedAt?: string finishedAt?: string } - -const columns: TableColumn[] = [ - {title: "Name", field: "name"}, - {title: "Phase", field: "phase", cellStyle: (data, _) => { - if (data === "Succeeded") { - return { - color: '#6CD75F', - } - } - if (data === "Error" || data === "Failed") { - return { - color: '#DC3D5A' - } - } - return {} - }}, - {title: "Progress", field: "progress"}, - {title: "StartTime", field: "startedAt", type: "datetime"}, - {title: "EndTime", field: "finishedAt", type: "datetime"} -] - export const WorkflowOverviewComponent = () => { const {entity} = useEntity() const apiClient = useApi(argoWorkflowsApiRef) + const configApi = useApi(configApiRef) + let argoWorkflowsBaseUrl = configApi.getOptionalString("argoWorkflows.baseUrl") + if (argoWorkflowsBaseUrl && argoWorkflowsBaseUrl.endsWith("/")) { + argoWorkflowsBaseUrl = argoWorkflowsBaseUrl.substring(0, argoWorkflowsBaseUrl.length - 1) + } + const ln = entity.metadata.annotations?.['backstage.io/kubernetes-namespace'] const ns = ln !== undefined ? ln : 'default' const clusterName = entity.metadata.annotations?.['argo-workflows/cluster-name'] - const k8sLabelSelector = entity.metadata.annotations?.['backstage.io/kubernetes-label-selector'] + const columns: TableColumn[] = [ + {title: "Name", field: "name", render: (data: any | TableData, _): any => { + if (data && argoWorkflowsBaseUrl) { + return ({data.name}) + } + return data.name + }}, + {title: "Phase", field: "phase", cellStyle: (data, _) => { + if (data === "Succeeded") { + return { + color: '#6CD75F', + } + } + if (data === "Error" || data === "Failed") { + return { + color: '#DC3D5A' + } + } + return {} + }}, + {title: "Progress", field: "progress"}, + {title: "StartTime", field: "startedAt", type: "datetime", defaultSort: 'desc'}, + {title: "EndTime", field: "finishedAt", type: "datetime"}, + {title: "Namespace", field: "namespace", type: "string"} + ] + const {value, loading, error} = useAsync( async (): Promise => { return await apiClient.getWorkflows(clusterName, ns, k8sLabelSelector) @@ -59,9 +70,10 @@ export const WorkflowOverviewComponent = () => { return {error.message}; } - const data = value?.items.map( val => { + const data = value?.items?.map( val => { return { name: val.metadata.name, + namespace: val.metadata.namespace, phase: val.status?.phase, progress: val.status?.progress, startedAt: val.status?.startedAt, @@ -71,12 +83,17 @@ export const WorkflowOverviewComponent = () => { if (data) { return ( - ) } - return Oh no + + return No Workflows found with given filter. Check your entity's annotations. }