From 28377a156dbbd20c68b9f3fcab7042509fe43d94 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Wed, 28 Sep 2022 11:45:02 +0200 Subject: [PATCH 1/9] feat: cleanup unconfigured applications --- apps/api/src/lib/common.ts | 2 +- .../routes/api/v1/applications/handlers.ts | 37 ++++++++++++++ .../src/routes/api/v1/applications/index.ts | 4 +- apps/api/src/routes/api/v1/handlers.ts | 10 +++- apps/ui/src/routes/_NewResource.svelte | 6 +-- apps/ui/src/routes/index.svelte | 48 +++++++++++++------ package.json | 2 +- 7 files changed, 88 insertions(+), 21 deletions(-) diff --git a/apps/api/src/lib/common.ts b/apps/api/src/lib/common.ts index d9cb80a58..e8d12c97e 100644 --- a/apps/api/src/lib/common.ts +++ b/apps/api/src/lib/common.ts @@ -21,7 +21,7 @@ import { scheduler } from './scheduler'; import { supportedServiceTypesAndVersions } from './services/supportedVersions'; import { includeServices } from './services/common'; -export const version = '3.10.11'; +export const version = '3.10.12'; export const isDev = process.env.NODE_ENV === 'development'; const algorithm = 'aes-256-ctr'; diff --git a/apps/api/src/routes/api/v1/applications/handlers.ts b/apps/api/src/routes/api/v1/applications/handlers.ts index 70c593728..895f69dc5 100644 --- a/apps/api/src/routes/api/v1/applications/handlers.ts +++ b/apps/api/src/routes/api/v1/applications/handlers.ts @@ -69,6 +69,43 @@ export async function getImages(request: FastifyRequest) { return errorHandler({ status, message }) } } +export async function cleanupUnconfigured(request: FastifyRequest) { + try { + let teamId = request.user.teamId + let applications = await prisma.application.findMany({ + where: { teams: { some: { id: teamId === "0" ? undefined : teamId } } }, + include: { settings: true, destinationDocker: true, teams: true }, + }); + for (const application of applications) { + if (!application.buildPack || !application.destinationDockerId || !application.branch || (!application.settings?.isBot && !application?.fqdn)) { + if (application?.destinationDockerId && application.destinationDocker?.network) { + const { stdout: containers } = await executeDockerCmd({ + dockerId: application.destinationDocker.id, + command: `docker ps -a --filter network=${application.destinationDocker.network} --filter name=${application.id} --format '{{json .}}'` + }) + if (containers) { + const containersArray = containers.trim().split('\n'); + for (const container of containersArray) { + const containerObj = JSON.parse(container); + const id = containerObj.ID; + await removeContainer({ id, dockerId: application.destinationDocker.id }); + } + } + } + await prisma.applicationSettings.deleteMany({ where: { applicationId: application.id } }); + await prisma.buildLog.deleteMany({ where: { applicationId: application.id } }); + await prisma.build.deleteMany({ where: { applicationId: application.id } }); + await prisma.secret.deleteMany({ where: { applicationId: application.id } }); + await prisma.applicationPersistentStorage.deleteMany({ where: { applicationId: application.id } }); + await prisma.applicationConnectedDatabase.deleteMany({ where: { applicationId: application.id } }); + await prisma.application.deleteMany({ where: { id: application.id } }); + } + } + return {} + } catch ({ status, message }) { + return errorHandler({ status, message }) + } +} export async function getApplicationStatus(request: FastifyRequest) { try { const { id } = request.params diff --git a/apps/api/src/routes/api/v1/applications/index.ts b/apps/api/src/routes/api/v1/applications/index.ts index af39e63ce..cece28f84 100644 --- a/apps/api/src/routes/api/v1/applications/index.ts +++ b/apps/api/src/routes/api/v1/applications/index.ts @@ -1,6 +1,6 @@ import { FastifyPluginAsync } from 'fastify'; import { OnlyId } from '../../../../types'; -import { cancelDeployment, checkDNS, checkDomain, checkRepository, deleteApplication, deleteSecret, deleteStorage, deployApplication, getApplication, getApplicationLogs, getApplicationStatus, getBuildIdLogs, getBuildPack, getBuilds, getGitHubToken, getGitLabSSHKey, getImages, getPreviews, getPreviewStatus, getSecrets, getStorages, getUsage, listApplications, loadPreviews, newApplication, restartApplication, restartPreview, saveApplication, saveApplicationSettings, saveApplicationSource, saveBuildPack, saveConnectedDatabase, saveDeployKey, saveDestination, saveGitLabSSHKey, saveRepository, saveSecret, saveStorage, stopApplication, stopPreviewApplication, updatePreviewSecret, updateSecret } from './handlers'; +import { cancelDeployment, checkDNS, checkDomain, checkRepository, cleanupUnconfigured, deleteApplication, deleteSecret, deleteStorage, deployApplication, getApplication, getApplicationLogs, getApplicationStatus, getBuildIdLogs, getBuildPack, getBuilds, getGitHubToken, getGitLabSSHKey, getImages, getPreviews, getPreviewStatus, getSecrets, getStorages, getUsage, listApplications, loadPreviews, newApplication, restartApplication, restartPreview, saveApplication, saveApplicationSettings, saveApplicationSource, saveBuildPack, saveConnectedDatabase, saveDeployKey, saveDestination, saveGitLabSSHKey, saveRepository, saveSecret, saveStorage, stopApplication, stopPreviewApplication, updatePreviewSecret, updateSecret } from './handlers'; import type { CancelDeployment, CheckDNS, CheckDomain, CheckRepository, DeleteApplication, DeleteSecret, DeleteStorage, DeployApplication, GetApplicationLogs, GetBuildIdLogs, GetBuilds, GetImages, RestartPreviewApplication, SaveApplication, SaveApplicationSettings, SaveApplicationSource, SaveDeployKey, SaveDestination, SaveSecret, SaveStorage, StopPreviewApplication } from './types'; @@ -11,6 +11,8 @@ const root: FastifyPluginAsync = async (fastify): Promise => { fastify.get('/', async (request) => await listApplications(request)); fastify.post('/images', async (request) => await getImages(request)); + fastify.post('/cleanup/unconfigured', async (request) => await cleanupUnconfigured(request)); + fastify.post('/new', async (request, reply) => await newApplication(request, reply)); fastify.get('/:id', async (request) => await getApplication(request)); diff --git a/apps/api/src/routes/api/v1/handlers.ts b/apps/api/src/routes/api/v1/handlers.ts index 117bb9d13..815ca3000 100644 --- a/apps/api/src/routes/api/v1/handlers.ts +++ b/apps/api/src/routes/api/v1/handlers.ts @@ -122,7 +122,7 @@ export async function showDashboard(request: FastifyRequest) { try { const userId = request.user.userId; const teamId = request.user.teamId; - const applications = await prisma.application.findMany({ + let applications = await prisma.application.findMany({ where: { teams: { some: { id: teamId === "0" ? undefined : teamId } } }, include: { settings: true, destinationDocker: true, teams: true }, }); @@ -143,7 +143,15 @@ export async function showDashboard(request: FastifyRequest) { include: { teams: true }, }); const settings = await listSettings(); + let foundUnconfiguredApplication = false; + for (const application of applications) { + if (!application.buildPack || !application.destinationDockerId || !application.branch || (!application.settings?.isBot && !application?.fqdn)) { + foundUnconfiguredApplication = true + } + } + return { + foundUnconfiguredApplication, applications, databases, services, diff --git a/apps/ui/src/routes/_NewResource.svelte b/apps/ui/src/routes/_NewResource.svelte index e3c494aa3..84e115c5c 100644 --- a/apps/ui/src/routes/_NewResource.svelte +++ b/apps/ui/src/routes/_NewResource.svelte @@ -19,7 +19,7 @@