Pool Plutonium keys by game for launches and autoscaling
This commit is contained in:
@@ -14,7 +14,7 @@ async function setup() {
|
||||
await prepareNativeHost();
|
||||
const { db } = await import('../../src/lib/server/db/index.js');
|
||||
const scaling = await import('../../src/lib/server/autoscaling/index.js');
|
||||
for (const map of maps) for (const n of [1, 2]) db().prepare('INSERT INTO server_keys(server_id,pluto_key) VALUES(?,?)').run(`t6_zombie_${map.slug}_${n}`, `key-${map.slug}-${n}`);
|
||||
db().prepare("INSERT INTO server_keys(id,game,pluto_key) VALUES('key-1','t6','game-key')").run();
|
||||
return { db, scaling };
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ it('applies targets and spare deficits independently to every map', () => {
|
||||
const members: ScalingMember[] = maps.flatMap(map => [1, 2].map(n => ({ name: `t6_zombie_${map.slug}_${n}`, mapSlug: map.slug,
|
||||
identity: `${map.slug}:${n}`, state: map.slug === 'town' ? 'occupied' : 'empty', players: map.slug === 'town' ? 1 : 0,
|
||||
observedAt: now, source: 'rcon', emptySince: 1, blocker: null, operationId: null })));
|
||||
const snapshot = { members, reservedNames: members.map(m => m.name), keyedNames: members.map(m => m.name), blockers: [] };
|
||||
const snapshot = { members, reservedNames: members.map(m => m.name), keyPool: { total: 15, available: 1 }, blockers: [] };
|
||||
// Other maps' empty lobbies cannot satisfy Town's spare target or maximum.
|
||||
expect(planScaling(policy, snapshot, now)).toMatchObject({ action: 'destroy', server: 't6_zombie_transit_1', desired: maps.length + 1, deficit: 1 });
|
||||
snapshot.members = members.filter(m => m.name !== 't6_zombie_town_2');
|
||||
@@ -37,9 +37,9 @@ 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(server_id,pluto_key) VALUES(?,?)').run('t5_zombie_theater_1', 'other-game');
|
||||
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.keyedNames).toHaveLength(maps.length * 2);
|
||||
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');
|
||||
@@ -64,10 +64,14 @@ it('persists a game rule, queues the selected map recipe, and protects every map
|
||||
expect(scaling.previewScaling(settings, saved.id, current.revision).blockers.join(' ')).toContain(mapPolicy.id);
|
||||
});
|
||||
|
||||
it('requires live key coverage on each map even when the game has enough keys in total', async () => {
|
||||
it('holds game-wide growth when its shared pool is exhausted by another map', async () => {
|
||||
const { db, scaling } = await setup();
|
||||
db().prepare("DELETE FROM server_keys WHERE server_id='t6_zombie_town_2'").run();
|
||||
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.blockers.join(' ')).toContain('Town Survival');
|
||||
expect(() => scaling.saveScaling(settings, undefined, undefined, preview.token)).toThrow('Town Survival');
|
||||
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);
|
||||
expect(await scaling.runAutoscaling()).toBe(false);
|
||||
expect(db().prepare('SELECT COUNT(*) AS n FROM server_creation_jobs').get()).toEqual({ n: 0 });
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user