@roadiehq/backstage-plugin-argo-cd
Version:
95 lines (92 loc) • 2.75 kB
JavaScript
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