Separate campaigns from server deployment lifecycle tracking
This commit is contained in:
@@ -53,6 +53,42 @@ async function promotedConfig() {
|
||||
}
|
||||
|
||||
describe('server creation map selection', () => {
|
||||
it('records in-flight creation and retains both operations after destruction', async () => {
|
||||
const { createServer, destroyServer } = await import('../../src/lib/server/fleet/create.js');
|
||||
const { listDeployments } = await import('../../src/lib/server/fleet/deployments.js');
|
||||
const { komodoDeploy, komodoInspectHealthy, komodoDestroyDeployment } = await import('../../src/lib/server/integrations/komodo.js');
|
||||
vi.mocked(komodoDeploy).mockImplementationOnce(async () => {
|
||||
expect(listDeployments()).toContainEqual(expect.objectContaining({ server: serverName, action: 'create', state: 'running', stage: 'Starting container' }));
|
||||
return { ok: true };
|
||||
});
|
||||
expect((await createServer(input)).ok).toBe(true);
|
||||
vi.mocked(komodoInspectHealthy).mockResolvedValueOnce({ ok: false, reason: 'gone' });
|
||||
vi.mocked(komodoDestroyDeployment).mockImplementationOnce(async () => {
|
||||
expect(listDeployments()).toContainEqual(expect.objectContaining({ action: 'destroy', state: 'running' }));
|
||||
return { ok: true };
|
||||
});
|
||||
expect((await destroyServer(serverName)).ok).toBe(true);
|
||||
expect(listDeployments()).toEqual(expect.arrayContaining([
|
||||
expect.objectContaining({ server: serverName, action: 'create', state: 'done', server_exists: 0 }),
|
||||
expect.objectContaining({ server: serverName, action: 'destroy', state: 'done', server_exists: 0 })
|
||||
]));
|
||||
});
|
||||
|
||||
it('records failed and unexpectedly interrupted creation attempts', async () => {
|
||||
const { createServer } = await import('../../src/lib/server/fleet/create.js');
|
||||
const { listDeployments, beginDeployment, interruptDeployments } = await import('../../src/lib/server/fleet/deployments.js');
|
||||
const { komodoDeploy } = await import('../../src/lib/server/integrations/komodo.js');
|
||||
vi.mocked(komodoDeploy).mockResolvedValueOnce({ ok: false, kind: 'http-error', message: 'test failure' });
|
||||
expect((await createServer(input)).ok).toBe(false);
|
||||
expect(listDeployments()).toContainEqual(expect.objectContaining({ state: 'failed', error: 'Deploy: test failure' }));
|
||||
vi.mocked(komodoDeploy).mockRejectedValueOnce(new Error('connection lost'));
|
||||
await expect(createServer(input)).rejects.toThrow('connection lost');
|
||||
expect(listDeployments()).toContainEqual(expect.objectContaining({ state: 'failed', error: 'connection lost' }));
|
||||
const id = beginDeployment('interrupted-server', 'destroy');
|
||||
interruptDeployments();
|
||||
expect(listDeployments()).toContainEqual(expect.objectContaining({ id, state: 'interrupted', finished_at: expect.any(String) }));
|
||||
});
|
||||
|
||||
it('installs only promoted scope-matching scripts and plugins before first boot', async () => {
|
||||
const { createScript } = await import('../../src/lib/server/fleet/scripts.js');
|
||||
const { db } = await import('../../src/lib/server/db/index.js');
|
||||
|
||||
Reference in New Issue
Block a user