Save autoscaling policies without a preview step
This commit is contained in:
@@ -49,11 +49,11 @@ it('applies targets and spare deficits independently to every map', () => {
|
||||
it('persists a game rule, queues the selected map recipe, and protects every map', async () => {
|
||||
const { db, scaling } = await setup();
|
||||
db().prepare("INSERT INTO server_keys(id,game,pluto_key) VALUES('other-key','t5','other-game')").run();
|
||||
const preview = scaling.previewScaling(settings);
|
||||
expect(preview.snapshot.keyPool).toEqual({ total: 1, available: 1 });
|
||||
const saved = scaling.saveScaling(settings, undefined, undefined, preview.token);
|
||||
expect(() => scaling.saveScaling(settings, undefined, undefined, scaling.previewScaling(settings).token)).toThrow();
|
||||
expect(() => scaling.previewScaling({ ...settings, mapSlug: 'town' }, saved.id, saved.revision)).toThrow('cannot change');
|
||||
const evaluation = scaling.evaluateScaling(settings);
|
||||
expect(evaluation.snapshot.keyPool).toEqual({ total: 1, available: 1 });
|
||||
const saved = scaling.saveScaling(settings);
|
||||
expect(() => scaling.saveScaling(settings)).toThrow();
|
||||
expect(() => scaling.evaluateScaling({ ...settings, mapSlug: 'town' }, saved.id, saved.revision)).toThrow('cannot change');
|
||||
expect(await scaling.runAutoscaling()).toBe(true);
|
||||
const job = db().prepare('SELECT deployment_id,map_slug,server FROM server_creation_jobs').get() as { deployment_id: string; map_slug: string; server: string };
|
||||
expect(job).toMatchObject({ map_slug: 'transit', server: 't6_zombie_transit_1' });
|
||||
@@ -65,24 +65,24 @@ it('persists a game rule, queues the selected map recipe, and protects every map
|
||||
for (const map of maps) expect(scalingOwner('t6', map.slug)).toBe(saved.id);
|
||||
expect(scalingOwner('t5', 'theater')).toBeNull();
|
||||
expect(scalingOwnershipBlocker('t6_zombie_farm_1')).toContain(saved.id);
|
||||
expect(scaling.previewScaling({ ...settings, mapSlug: 'town' }).blockers.join(' ')).toContain('overlapping');
|
||||
expect(scaling.evaluateScaling({ ...settings, mapSlug: 'town' }).blockers.join(' ')).toContain('overlapping');
|
||||
const off = { ...settings, mode: 'off' };
|
||||
scaling.saveScaling(off, saved.id, saved.revision, scaling.previewScaling(off, saved.id, saved.revision).token);
|
||||
scaling.saveScaling(off, saved.id, saved.revision);
|
||||
expect(scalingOwner('t6', 'town')).toBeNull();
|
||||
const mapSettings = { ...settings, mapSlug: 'town' };
|
||||
const mapPolicy = scaling.saveScaling(mapSettings, undefined, undefined, scaling.previewScaling(mapSettings).token);
|
||||
const mapPolicy = scaling.saveScaling(mapSettings);
|
||||
const current = scaling.getScalingPolicy(saved.id)!;
|
||||
expect(scaling.previewScaling(settings, saved.id, current.revision).blockers.join(' ')).toContain(mapPolicy.id);
|
||||
expect(scaling.evaluateScaling(settings, saved.id, current.revision).blockers.join(' ')).toContain(mapPolicy.id);
|
||||
});
|
||||
|
||||
it('holds game-wide growth when its shared pool is exhausted by another map', async () => {
|
||||
const { db, scaling } = await setup();
|
||||
db().prepare("INSERT INTO server_key_leases(server_id,key_id) VALUES('t6_zombie_town_2','key-1')").run();
|
||||
const preview = scaling.previewScaling(settings);
|
||||
expect(preview.snapshot.keyPool).toEqual({ total: 1, available: 0 });
|
||||
expect(preview.blockers).toEqual([]);
|
||||
expect(preview.decision).toMatchObject({ action: 'wait', reason: expect.stringContaining('keys are in use') });
|
||||
scaling.saveScaling(settings, undefined, undefined, preview.token);
|
||||
const evaluation = scaling.evaluateScaling(settings);
|
||||
expect(evaluation.snapshot.keyPool).toEqual({ total: 1, available: 0 });
|
||||
expect(evaluation.blockers).toEqual([]);
|
||||
expect(evaluation.decision).toMatchObject({ action: 'wait', reason: expect.stringContaining('keys are in use') });
|
||||
scaling.saveScaling(settings);
|
||||
expect(await scaling.runAutoscaling()).toBe(false);
|
||||
expect(db().prepare('SELECT COUNT(*) AS n FROM server_creation_jobs').get()).toEqual({ n: 0 });
|
||||
});
|
||||
@@ -96,7 +96,7 @@ it('moves to the next map as soon as the prior creation settles, without waiting
|
||||
vi.useFakeTimers({ toFake: ['Date'] });
|
||||
try {
|
||||
const at = new Date().toISOString();
|
||||
scaling.saveScaling(settings, undefined, undefined, scaling.previewScaling(settings).token);
|
||||
scaling.saveScaling(settings);
|
||||
expect(await scaling.runAutoscaling()).toBe(true);
|
||||
const job = db().prepare('SELECT deployment_id,server FROM server_creation_jobs').get() as { deployment_id: string; server: string };
|
||||
expect(job.server).toBe('t6_zombie_transit_1');
|
||||
|
||||
Reference in New Issue
Block a user