feat(caprover): display application logs for apps with pending updates

This commit is contained in:
Pierre Martin
2024-03-10 11:30:34 +01:00
parent 043051cb1c
commit 5c599842f6
4 changed files with 113 additions and 41 deletions

View File

@@ -134,5 +134,19 @@ describe("Caprover", () => {
expect(events).toBeArrayOfSize(0);
});
});
describe("getLogs", () => {
it("should return the logs of the application when it exists", async () => {
const logs = await caprover.getLogs("mysql");
expect(logs).toBe("mysql logs");
});
it("should throw an error when the application does not exist", async () => {
await expect(
caprover.getLogs("unknown")
// @ts-ignore toThrowError exists¯\_(ツ)_/¯
).rejects.toThrowError(/Failed to fetch logs for application unknown/);
});
});
});
});

View File

@@ -79,21 +79,23 @@ class Caprover {
async updateApplication(appName: string, version: string): Promise<void> {
console.debug("Caprover: Updating application", appName, "to", version);
const response = await this.fetch(`/user/apps/appData/${appName}`, {
method: "POST",
body: JSON.stringify({
captainDefinitionContent: JSON.stringify({
schemaVersion: 2,
imageName: version,
try {
const response = await this.fetch(`/user/apps/appData/${appName}`, {
method: "POST",
body: JSON.stringify({
captainDefinitionContent: JSON.stringify({
schemaVersion: 2,
imageName: version,
}),
gitHash: "",
}),
gitHash: "",
}),
});
console.debug("update application response", response);
if (response.status !== 100) {
});
if (response.status !== 100) {
throw new Error(response.description);
}
} catch (error) {
throw new Error(
`Failed to update application ${appName} to ${version}: ${response.description}.`
`Failed to update application ${appName} to ${version}: ${error ?? ""}.`
);
}
@@ -105,6 +107,18 @@ class Caprover {
);
}
async getLogs(appName: string): Promise<string> {
console.debug("Caprover: Fetching logs for", appName);
const response = await this.fetch(`/user/apps/appData/${appName}/logs`);
if (response.status !== 100) {
throw new Error(
`Failed to fetch logs for application ${appName}: ${response.description}`
);
}
return response.data.logs;
}
private async authenticate() {
if (this.authToken) {
return;

View File

@@ -1,9 +1,4 @@
import {
http,
HttpResponse,
HttpResponseResolver,
PathParams
} from "msw";
import { http, HttpResponse, HttpResponseResolver, PathParams } from "msw";
import { setupServer } from "msw/node";
import appsFixtures from "./apps.fixtures.json";
@@ -97,6 +92,27 @@ const handlers = [
data: {},
});
}),
http.get(
`${BASE_URI}/user/apps/appData/:name/logs`,
withAuth(({ params }) => {
const app = appsFixtures.find((app) => app.appName === params.name);
if (!app) {
return HttpResponse.json({
status: 1000,
description: `App (${params.name}) could not be found. Make sure that you have created the app.`,
data: {},
});
}
return HttpResponse.json({
status: 100,
description: "App runtime logs are retrieved",
data: {
logs: `${params.name} logs`,
},
});
})
),
];
const server = setupServer(...handlers);