UNPKG

@roadiehq/backstage-plugin-argo-cd

Version:
95 lines (92 loc) 2.75 kB
import { useApi, errorApiRef, configApiRef } from '@backstage/core-plugin-api'; import { useAsyncRetry } from 'react-use'; import { argoCDApiRef } from '../api/index.esm.js'; const useAppDetails = ({ appName, appSelector, appNamespace, projectName, url }) => { const api = useApi(argoCDApiRef); const errorApi = useApi(errorApiRef); const configApi = useApi(configApiRef); const { loading, value, error, retry } = useAsyncRetry(async () => { const argoSearchMethod = Boolean( configApi.getOptionalConfigArray("argocd.appLocatorMethods")?.length ); try { if (!argoSearchMethod && appName) { return api.getAppDetails({ url, appName, appNamespace }); } if (argoSearchMethod && appName) { const kubeInfo = await api.serviceLocatorUrl({ appName, appNamespace }); if (kubeInfo instanceof Error) return kubeInfo; const promises = kubeInfo.map(async (instance) => { const apiOut = await api.getAppDetails({ url, appName, appNamespace, instance: instance.name }); if (!apiOut.metadata) { return { status: { history: [], sync: { status: "Missing" }, health: { status: "Missing" }, operationState: {} }, metadata: { name: appName, instance: instance.name } }; } apiOut.metadata.instance = instance; return apiOut; }); return Promise.all(promises); } if (argoSearchMethod && appSelector) { const kubeInfo = await api.serviceLocatorUrl({ appSelector, appNamespace }); if (kubeInfo instanceof Error) return kubeInfo; const promises = kubeInfo.map(async (instance) => { return api.getAppListDetails({ url, appSelector, appNamespace, instance: instance.name }); }); const output = await Promise.all(promises); return { items: output.flatMap((argoCdAppList) => argoCdAppList.items).filter((item) => item !== null) }; } if (appSelector || projectName) { return api.listApps({ url, appSelector, appNamespace, projectName }); } return Promise.reject("Neither appName nor appSelector provided"); } catch (e) { errorApi.post(new Error("Something went wrong")); return Promise.reject(e); } }); return { loading, value, error, retry }; }; export { useAppDetails }; //# sourceMappingURL=useAppDetails.esm.js.map