UNPKG

@roadiehq/backstage-plugin-argo-cd-backend

Version:

382 lines (376 loc) 13 kB
'use strict'; var express = require('express'); var Router = require('express-promise-router'); var getArgoConfig = require('../utils/getArgoConfig.cjs.js'); function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; } var express__default = /*#__PURE__*/_interopDefaultCompat(express); var Router__default = /*#__PURE__*/_interopDefaultCompat(Router); function createRouter({ logger, argocdService }) { const router = Router__default.default(); router.use(express__default.default.json()); router.get("/allArgoApps/:argoInstanceName", async (request, response) => { const argoInstanceName = request.params.argoInstanceName; const matchedArgoInstance = getArgoConfig.getArgoConfigByInstanceName({ argoInstanceName, argoConfigs: argocdService.getArgoInstanceArray() }); if (matchedArgoInstance === void 0) { return response.status(500).send({ status: "failed", message: "cannot find an argo instance to match this cluster" }); } const token = await argocdService.getArgoToken(matchedArgoInstance); if (!token) { return response.status(500).send({ status: "failed", message: "could not generate token" }); } return response.send( await argocdService.getArgoAppData( matchedArgoInstance.url, matchedArgoInstance.name, token ) ); }); router.get( "/argoInstance/:argoInstance/repo/:repo/source/:source", async (request, response) => { const argoInstanceName = request.params.argoInstance; const matchedArgoInstance = getArgoConfig.getArgoConfigByInstanceName({ argoInstanceName, argoConfigs: argocdService.getArgoInstanceArray() }); if (matchedArgoInstance === void 0) { return response.status(500).send({ status: "failed", message: "cannot find an argo instance to match this cluster" }); } const token = await argocdService.getArgoToken( matchedArgoInstance ); if (!token) { return response.status(500).send({ status: "failed", message: "could not generate token" }); } const argoData = await argocdService.getArgoAppData( matchedArgoInstance.url, matchedArgoInstance.name, token ); const repoAndSource = argoData.items.map( (argoApp) => `${argoApp?.spec?.source?.repoURL}/${argoApp?.spec?.source?.path}` ); return response.send( repoAndSource.includes( `${request.params.repo}/${decodeURIComponent(request.params.source)}` ) ); } ); router.get("/find/name/:argoAppName", async (request, response) => { const argoAppName = request.params.argoAppName; const argoAppNamespace = request.query?.appNamespace; response.send( await argocdService.findArgoApp({ name: argoAppName, namespace: argoAppNamespace }) ); }); router.get( "/argoInstance/:argoInstanceName/applications/name/:argoAppName/revisions/:revisionID/metadata", async (request, response) => { const revisionID = request.params.revisionID; const argoInstanceName = request.params.argoInstanceName; const argoAppName = request.params.argoAppName; const argoAppNamespace = request.query?.appNamespace; const sourceIndex = request.query?.sourceIndex; logger.info(`Getting info on ${argoAppName}`); logger.info(`Getting app ${argoAppName} on ${argoInstanceName}`); const matchedArgoInstance = getArgoConfig.getArgoConfigByInstanceName({ argoInstanceName, argoConfigs: argocdService.getArgoInstanceArray() }); if (matchedArgoInstance === void 0) { return response.status(500).send({ status: "failed", message: "cannot find an argo instance to match this cluster" }); } const token = await argocdService.getArgoToken( matchedArgoInstance ); const resp = await argocdService.getRevisionData( matchedArgoInstance.url, { name: argoAppName, namespace: argoAppNamespace, sourceIndex }, token, revisionID ); return response.send(resp); } ); router.get( "/argoInstance/:argoInstanceName/applications/name/:argoAppName", async (request, response) => { const argoInstanceName = request.params.argoInstanceName; const argoAppName = request.params.argoAppName; const argoAppNamespace = request.query?.appNamespace; logger.info(`Getting info on ${argoAppName}`); logger.info(`Getting app ${argoAppName} on ${argoInstanceName}`); const matchedArgoInstance = getArgoConfig.getArgoConfigByInstanceName({ argoInstanceName, argoConfigs: argocdService.getArgoInstanceArray() }); if (matchedArgoInstance === void 0) { return response.status(500).send({ status: "failed", message: "cannot find an argo instance to match this cluster" }); } const token = await argocdService.getArgoToken( matchedArgoInstance ); const resp = await argocdService.getArgoAppData( matchedArgoInstance.url, matchedArgoInstance.name, token, { name: argoAppName, namespace: argoAppNamespace } ); return response.send(resp); } ); router.get("/find/selector/:argoAppSelector", async (request, response) => { const argoAppSelector = request.params.argoAppSelector; const argoAppNamespace = request.query?.appNamespace; logger.info(`Getting apps for selector ${argoAppSelector}`); response.send( await argocdService.findArgoApp({ selector: argoAppSelector, namespace: argoAppNamespace }) ); }); router.get( "/argoInstance/:argoInstanceName/applications/selector/:argoAppSelector", async (request, response) => { const argoInstanceName = request.params.argoInstanceName; const argoAppSelector = request.params.argoAppSelector; const argoAppNamespace = request.query?.appNamespace; logger.info( `Getting apps for selector ${argoAppSelector} on ${argoInstanceName}` ); const matchedArgoInstance = getArgoConfig.getArgoConfigByInstanceName({ argoInstanceName, argoConfigs: argocdService.getArgoInstanceArray() }); if (matchedArgoInstance === void 0) { return response.status(500).send({ status: "failed", message: "cannot find an argo instance to match this cluster" }); } const token = await argocdService.getArgoToken( matchedArgoInstance ); const resp = await argocdService.getArgoAppData( matchedArgoInstance.url, matchedArgoInstance.name, token, { selector: argoAppSelector, namespace: argoAppNamespace } ); return response.send(resp); } ); router.post("/createArgo", async (request, response) => { const argoInstanceName = request.body.clusterName; const namespace = request.body.namespace; const projectName = request.body.projectName; const appName = request.body.appName; const labelValue = request.body.labelValue; const sourceRepo = request.body.sourceRepo; const sourcePath = request.body.sourcePath; const matchedArgoInstance = getArgoConfig.getArgoConfigByInstanceName({ argoInstanceName, argoConfigs: argocdService.getArgoInstanceArray() }); if (matchedArgoInstance === void 0) { return response.status(500).send({ status: "failed", message: "cannot find an argo instance to match this cluster" }); } let token; try { token = await argocdService.getArgoToken(matchedArgoInstance); } catch (e) { return response.status(e.status || 500).send({ status: e.status, message: e.message }); } try { await argocdService.createArgoProject({ baseUrl: matchedArgoInstance.url, argoToken: token, projectName, namespace, sourceRepo }); } catch (e) { logger.error(e); return response.status(e.status || 500).send({ status: e.status, message: e.message || "Failed to create argo project" }); } try { await argocdService.createArgoApplication({ baseUrl: matchedArgoInstance.url, argoToken: token, projectName, appName, namespace, sourceRepo, sourcePath, labelValue }); return response.send({ argoProjectName: projectName, argoAppName: appName, kubernetesNamespace: namespace }); } catch (e) { return response.status(500).send({ status: 500, message: e.message || "Failed to create argo app" }); } }); router.put("/updateArgo/:argoAppName", async (request, response) => { const argoInstanceName = request.body.clusterName; const namespace = request.body.namespace; const projectName = request.body.projectName; const appName = request.body.appName; const labelValue = request.body.labelValue; const sourceRepo = request.body.sourceRepo; const sourcePath = request.body.sourcePath; const matchedArgoInstance = getArgoConfig.getArgoConfigByInstanceName({ argoInstanceName, argoConfigs: argocdService.getArgoInstanceArray() }); if (matchedArgoInstance === void 0) { return response.status(500).send({ status: "failed", message: "cannot find an argo instance to match this cluster" }); } let token; try { token = await argocdService.getArgoToken(matchedArgoInstance); } catch (e) { return response.status(e.status || 500).send({ status: e.status, message: e.message }); } try { await argocdService.updateArgoProjectAndApp({ instanceConfig: matchedArgoInstance, argoToken: token, projectName, appName, namespace, sourceRepo, sourcePath, labelValue }); return response.send({ argoProjectName: projectName, argoAppName: appName, kubernetesNamespace: namespace }); } catch (e) { logger.error(e); return response.status(e.status || 500).send({ status: e.status, message: e.message || "Failed to create argo project" }); } }); router.post("/sync", async (request, response) => { const appSelector = request.body.appSelector; const terminateOperation = Boolean(request.body.terminateOperation) ?? false; try { const argoSyncResp = await argocdService.resyncAppOnAllArgos({ appSelector, terminateOperation }); return response.send(argoSyncResp); } catch (e) { return response.status(e.status || 500).send({ status: e.status || 500, message: e.message || `Failed to sync your app, ${appSelector}.` }); } }); router.delete( "/argoInstance/:argoInstanceName/applications/:argoAppName", async (request, response) => { const argoInstanceName = request.params.argoInstanceName; const argoAppName = request.params.argoAppName; const terminateOperation = Boolean(request.query.terminateOperation) ?? false; logger.info(`Getting info on ${argoInstanceName} and ${argoAppName}`); const argoDeleteAppandProjectResp = await argocdService.deleteAppandProject({ argoAppName, argoInstanceName, terminateOperation }); return response.send(argoDeleteAppandProjectResp); } ); router.get( "/argoInstance/:argoInstanceName/applications/:argoAppName", async (request, response) => { const argoInstanceName = request.params.argoInstanceName; const argoApplicationName = request.params.argoAppName; const applicationInformation = await argocdService.getArgoApplicationInfo( { argoApplicationName, argoInstanceName } ); return response.status(applicationInformation.statusCode).send(applicationInformation); } ); router.delete( "/argoInstance/:argoInstanceName/applications/:argoAppName/operation", async (request, response) => { const argoInstanceName = request.params.argoInstanceName; const argoAppName = request.params.argoAppName; const terminateArgoAppOperationResp = await argocdService.terminateArgoAppOperation({ argoAppName, argoInstanceName }); return response.status(terminateArgoAppOperationResp.statusCode).send(terminateArgoAppOperationResp); } ); return Promise.resolve(router); } exports.createRouter = createRouter; //# sourceMappingURL=router.cjs.js.map