@substrat-run/contract-tests 0.148.0 → 0.150.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/counter-runner.d.ts +3 -3
- package/dist/counter-runner.js +4 -4
- package/dist/counter-runner.js.map +1 -1
- package/dist/directory-restore-suite.d.ts.map +1 -1
- package/dist/directory-restore-suite.js +66 -2
- package/dist/directory-restore-suite.js.map +1 -1
- package/dist/directory-shapes.d.ts +6 -0
- package/dist/directory-shapes.d.ts.map +1 -1
- package/dist/directory-shapes.js +42 -0
- package/dist/directory-shapes.js.map +1 -1
- package/dist/entity-state-module.d.ts.map +1 -1
- package/dist/entity-state-module.js +3 -0
- package/dist/entity-state-module.js.map +1 -1
- package/dist/entity-trash-suite.d.ts.map +1 -1
- package/dist/entity-trash-suite.js +20 -0
- package/dist/entity-trash-suite.js.map +1 -1
- package/dist/held-migrations.d.ts +27 -0
- package/dist/held-migrations.d.ts.map +1 -0
- package/dist/held-migrations.js +39 -0
- package/dist/held-migrations.js.map +1 -0
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/migration-fence-suite.d.ts +3 -0
- package/dist/migration-fence-suite.d.ts.map +1 -0
- package/dist/migration-fence-suite.js +173 -0
- package/dist/migration-fence-suite.js.map +1 -0
- package/dist/migration-fence.d.ts +42 -0
- package/dist/migration-fence.d.ts.map +1 -0
- package/dist/migration-fence.js +66 -0
- package/dist/migration-fence.js.map +1 -0
- package/dist/modules.d.ts +2 -0
- package/dist/modules.d.ts.map +1 -1
- package/dist/modules.js +19 -0
- package/dist/modules.js.map +1 -1
- package/dist/orphan-sweep-suite.d.ts +28 -0
- package/dist/orphan-sweep-suite.d.ts.map +1 -0
- package/dist/orphan-sweep-suite.js +547 -0
- package/dist/orphan-sweep-suite.js.map +1 -0
- package/dist/scope-host-suite.d.ts.map +1 -1
- package/dist/scope-host-suite.js +357 -20
- package/dist/scope-host-suite.js.map +1 -1
- package/dist/scope-store-runner-suite.d.ts +7 -7
- package/dist/scope-store-runner-suite.d.ts.map +1 -1
- package/dist/scope-store-runner-suite.js +7 -7
- package/dist/scope-store-runner-suite.js.map +1 -1
- package/dist/scope-store-suite.js +11 -11
- package/dist/scope-store-suite.js.map +1 -1
- package/dist/store-driver-release-suite.d.ts +12 -0
- package/dist/store-driver-release-suite.d.ts.map +1 -0
- package/dist/store-driver-release-suite.js +561 -0
- package/dist/store-driver-release-suite.js.map +1 -0
- package/dist/upload-link-module.d.ts +4 -0
- package/dist/upload-link-module.d.ts.map +1 -1
- package/dist/upload-link-module.js +66 -4
- package/dist/upload-link-module.js.map +1 -1
- package/dist/upload-link-replay-suite.d.ts +3 -0
- package/dist/upload-link-replay-suite.d.ts.map +1 -0
- package/dist/upload-link-replay-suite.js +293 -0
- package/dist/upload-link-replay-suite.js.map +1 -0
- package/dist/upload-link-suite.d.ts.map +1 -1
- package/dist/upload-link-suite.js +161 -4
- package/dist/upload-link-suite.js.map +1 -1
- package/dist/vertical-events-suite.d.ts.map +1 -1
- package/dist/vertical-events-suite.js +46 -4
- package/dist/vertical-events-suite.js.map +1 -1
- package/package.json +3 -3
- package/dist/store-kind-release-suite.d.ts +0 -12
- package/dist/store-kind-release-suite.d.ts.map +0 -1
- package/dist/store-kind-release-suite.js +0 -353
- package/dist/store-kind-release-suite.js.map +0 -1
|
@@ -1,353 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Contract suites for a store kind's releases, rollouts and holds (D-63, #2300).
|
|
3
|
-
*
|
|
4
|
-
* `storeKindReleaseContractSuite` runs on both adapters: a stored release is insert-only, a
|
|
5
|
-
* rollback returns to the immediately previous good release (recorded, never derived from an
|
|
6
|
-
* ordering), a hold excludes what it must, and a rollout whose holder stopped reads as
|
|
7
|
-
* `diverged` to the next one.
|
|
8
|
-
*
|
|
9
|
-
* `storeKindHoldExpiryContractSuite` is the transition the wall clock cannot show without
|
|
10
|
-
* waiting: a hold lapses when the HOST's clock passes it. It is mounted on the pure host, which
|
|
11
|
-
* takes a clock. The Durable Object host reads `Date.now()` inside the control-plane object and
|
|
12
|
-
* no option reaches it (#956), the same parity gap `grantExpiryContractSuite` writes down.
|
|
13
|
-
*/
|
|
14
|
-
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
|
15
|
-
import { platformActorId } from '@substrat-run/contracts';
|
|
16
|
-
import { ulid } from '@substrat-run/kernel';
|
|
17
|
-
import { expectRefusal } from './scope-host-suite.js';
|
|
18
|
-
const sha = (c) => c.repeat(64);
|
|
19
|
-
const commit = (c) => c.repeat(40);
|
|
20
|
-
/** A kind id of its own per test, so tests sharing one directory never meet. */
|
|
21
|
-
const freshKind = () => `k${ulid().toLowerCase().slice(-10)}`;
|
|
22
|
-
export function storeKindReleaseContractSuite(adapterName, makeFixture) {
|
|
23
|
-
describe(`store-kind releases (D-63, #2300): ${adapterName}`, () => {
|
|
24
|
-
let fixture;
|
|
25
|
-
let host;
|
|
26
|
-
const staff = platformActorId.parse(ulid());
|
|
27
|
-
beforeAll(async () => {
|
|
28
|
-
fixture = await makeFixture();
|
|
29
|
-
host = fixture.host;
|
|
30
|
-
});
|
|
31
|
-
afterAll(async () => fixture.cleanup());
|
|
32
|
-
/** Store `shas` and roll each out to good, in order, as one holder. */
|
|
33
|
-
const rollOut = async (kind, holder, ...shas) => {
|
|
34
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder, mode: 'exclusive', ttlMs: 60_000 })).toBe(true);
|
|
35
|
-
const rows = [];
|
|
36
|
-
for (const s of shas) {
|
|
37
|
-
await host.admin.recordStoreKindRelease(staff, { kind, sha256: s, sourceCommit: commit('c') });
|
|
38
|
-
const row = await host.admin.beginStoreKindRollout(staff, { kind, sha256: s, action: 'rollout', holder });
|
|
39
|
-
rows.push(await host.admin.finishStoreKindRollout(staff, { kind, seq: row.seq, holder, state: 'good', detail: null }));
|
|
40
|
-
}
|
|
41
|
-
return rows;
|
|
42
|
-
};
|
|
43
|
-
it('stores a release once, keeps who uploaded it, and refuses the same bytes from another commit', async () => {
|
|
44
|
-
const kind = freshKind();
|
|
45
|
-
const first = await host.admin.recordStoreKindRelease(staff, { kind, sha256: sha('a'), sourceCommit: commit('1') });
|
|
46
|
-
expect(first).toMatchObject({ kind, sha256: sha('a'), sourceCommit: commit('1'), uploadedBy: staff });
|
|
47
|
-
const other = platformActorId.parse(ulid());
|
|
48
|
-
// The same release again is the row as it stands: the uploader is not rewritten.
|
|
49
|
-
expect(await host.admin.recordStoreKindRelease(other, { kind, sha256: sha('a'), sourceCommit: commit('1') })).toEqual(first);
|
|
50
|
-
await expectRefusal(host.admin.recordStoreKindRelease(staff, { kind, sha256: sha('a'), sourceCommit: commit('2') }), 'conflict');
|
|
51
|
-
expect(await host.admin.getStoreKindRelease(staff, kind, sha('a'))).toEqual(first);
|
|
52
|
-
expect(await host.admin.getStoreKindRelease(staff, kind, sha('b'))).toBeUndefined();
|
|
53
|
-
// The audit names the kind and the sha256 in the row, not in the vertical column.
|
|
54
|
-
const rows = (await host.admin.auditLog(staff, { action: 'uploadStoreKindRelease' })).filter((r) => r.after?.kind === kind);
|
|
55
|
-
// Once: the second, identical upload wrote nothing.
|
|
56
|
-
expect(rows).toHaveLength(1);
|
|
57
|
-
expect(rows[0]).toMatchObject({ actor: staff, vertical: null, after: { sha256: sha('a'), sourceCommit: commit('1') } });
|
|
58
|
-
});
|
|
59
|
-
it('rolls back to the immediately previous good release, then the one before it', async () => {
|
|
60
|
-
const kind = freshKind();
|
|
61
|
-
const holder = ulid();
|
|
62
|
-
await rollOut(kind, holder, sha('1'), sha('2'), sha('3'));
|
|
63
|
-
expect((await host.admin.storeKindState(staff, kind)).current).toMatchObject({ sha256: sha('3'), previousGoodSha256: sha('2') });
|
|
64
|
-
// A rollback to anything but the previous good release is refused.
|
|
65
|
-
await expectRefusal(host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('1'), action: 'rollback', holder }), 'conflict');
|
|
66
|
-
const back = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('2'), action: 'rollback', holder });
|
|
67
|
-
expect(back).toMatchObject({ fromSha256: sha('3'), previousGoodSha256: sha('1'), state: 'rolling' });
|
|
68
|
-
await host.admin.finishStoreKindRollout(staff, { kind, seq: back.seq, holder, state: 'good', detail: null });
|
|
69
|
-
expect((await host.admin.storeKindState(staff, kind)).current).toMatchObject({ sha256: sha('2'), previousGoodSha256: sha('1') });
|
|
70
|
-
const again = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('1'), action: 'rollback', holder });
|
|
71
|
-
await host.admin.finishStoreKindRollout(staff, { kind, seq: again.seq, holder, state: 'good', detail: null });
|
|
72
|
-
const state = await host.admin.storeKindState(staff, kind);
|
|
73
|
-
expect(state.current).toMatchObject({ sha256: sha('1'), previousGoodSha256: null });
|
|
74
|
-
// Nowhere further back: refused, not a guess.
|
|
75
|
-
await expectRefusal(host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('1'), action: 'rollback', holder }), 'conflict');
|
|
76
|
-
expect(state.rollouts.map((r) => [r.action, r.sha256.slice(0, 1), r.state])).toEqual([
|
|
77
|
-
['rollout', '1', 'good'],
|
|
78
|
-
['rollout', '2', 'good'],
|
|
79
|
-
['rollout', '3', 'good'],
|
|
80
|
-
['rollback', '2', 'good'],
|
|
81
|
-
['rollback', '1', 'good'],
|
|
82
|
-
]);
|
|
83
|
-
});
|
|
84
|
-
it('rolls back after a diverged rollout onto the current release, never past it', async () => {
|
|
85
|
-
const kind = freshKind();
|
|
86
|
-
const holder = ulid();
|
|
87
|
-
await rollOut(kind, holder, sha('1'), sha('2'));
|
|
88
|
-
await host.admin.recordStoreKindRelease(staff, { kind, sha256: sha('3'), sourceCommit: commit('c') });
|
|
89
|
-
const bad = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('3'), action: 'rollout', holder });
|
|
90
|
-
await host.admin.finishStoreKindRollout(staff, { kind, seq: bad.seq, holder, state: 'diverged', detail: 'vb on 2, va on 3' });
|
|
91
|
-
// The fleet may be mixed: undoing the bad rollout is converging back on 2.
|
|
92
|
-
expect(await host.admin.storeKindState(staff, kind)).toMatchObject({
|
|
93
|
-
current: { sha256: sha('2'), previousGoodSha256: sha('1') },
|
|
94
|
-
rollbackTarget: sha('2'),
|
|
95
|
-
});
|
|
96
|
-
await expectRefusal(host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('1'), action: 'rollback', holder }), 'conflict');
|
|
97
|
-
const back = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('2'), action: 'rollback', holder });
|
|
98
|
-
// The diverged attempt did not change what 2's previous good release is.
|
|
99
|
-
expect(back).toMatchObject({ fromSha256: sha('2'), previousGoodSha256: sha('1') });
|
|
100
|
-
await host.admin.finishStoreKindRollout(staff, { kind, seq: back.seq, holder, state: 'good', detail: null });
|
|
101
|
-
expect(await host.admin.storeKindState(staff, kind)).toMatchObject({ current: { sha256: sha('2') }, rollbackTarget: sha('1') });
|
|
102
|
-
// A failed rollout returned every script, so a rollback after it goes back as usual.
|
|
103
|
-
const failed = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('3'), action: 'rollout', holder });
|
|
104
|
-
await host.admin.finishStoreKindRollout(staff, { kind, seq: failed.seq, holder, state: 'failed', detail: null });
|
|
105
|
-
expect((await host.admin.storeKindState(staff, kind)).rollbackTarget).toBe(sha('1'));
|
|
106
|
-
});
|
|
107
|
-
it('continues a paused rollback onto its target, and undoes a paused rollout onto the current release', async () => {
|
|
108
|
-
const kind = freshKind();
|
|
109
|
-
const holder = ulid();
|
|
110
|
-
await rollOut(kind, holder, sha('1'), sha('2'));
|
|
111
|
-
const first = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('1'), action: 'rollback', holder });
|
|
112
|
-
await host.admin.finishStoreKindRollout(staff, { kind, seq: first.seq, holder, state: 'paused', detail: '2 of 5' });
|
|
113
|
-
// Part way back to 1: the rollback continues to 1, it does not turn around onto 2.
|
|
114
|
-
expect((await host.admin.storeKindState(staff, kind)).rollbackTarget).toBe(sha('1'));
|
|
115
|
-
await expectRefusal(host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('2'), action: 'rollback', holder }), 'conflict');
|
|
116
|
-
const next = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('1'), action: 'rollback', holder });
|
|
117
|
-
expect(next).toMatchObject({ fromSha256: sha('2'), previousGoodSha256: null });
|
|
118
|
-
await host.admin.finishStoreKindRollout(staff, { kind, seq: next.seq, holder, state: 'good', detail: null });
|
|
119
|
-
expect(await host.admin.storeKindState(staff, kind)).toMatchObject({ current: { sha256: sha('1') }, rollbackTarget: null });
|
|
120
|
-
// A rollback that ended diverged (a failure part way) continues to its target too.
|
|
121
|
-
await host.admin.recordStoreKindRelease(staff, { kind, sha256: sha('3'), sourceCommit: commit('c') });
|
|
122
|
-
const three = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('3'), action: 'rollout', holder });
|
|
123
|
-
await host.admin.finishStoreKindRollout(staff, { kind, seq: three.seq, holder, state: 'good', detail: null });
|
|
124
|
-
const broken = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('1'), action: 'rollback', holder });
|
|
125
|
-
await host.admin.finishStoreKindRollout(staff, { kind, seq: broken.seq, holder, state: 'diverged', detail: 'vb failed' });
|
|
126
|
-
expect((await host.admin.storeKindState(staff, kind)).rollbackTarget).toBe(sha('1'));
|
|
127
|
-
const again = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('1'), action: 'rollback', holder });
|
|
128
|
-
await host.admin.finishStoreKindRollout(staff, { kind, seq: again.seq, holder, state: 'good', detail: null });
|
|
129
|
-
expect((await host.admin.storeKindState(staff, kind)).current?.sha256).toBe(sha('1'));
|
|
130
|
-
// A rollout that paused part way is undone onto the release the fleet was on.
|
|
131
|
-
const paused = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('2'), action: 'rollout', holder });
|
|
132
|
-
await host.admin.finishStoreKindRollout(staff, { kind, seq: paused.seq, holder, state: 'paused', detail: null });
|
|
133
|
-
expect((await host.admin.storeKindState(staff, kind)).rollbackTarget).toBe(sha('1'));
|
|
134
|
-
});
|
|
135
|
-
it('lets no rollout begin while a rollback is unfinished, and a failed attempt does not turn the rollback around', async () => {
|
|
136
|
-
const kind = freshKind();
|
|
137
|
-
const holder = ulid();
|
|
138
|
-
await rollOut(kind, holder, sha('1'), sha('2'));
|
|
139
|
-
await host.admin.recordStoreKindRelease(staff, { kind, sha256: sha('3'), sourceCommit: commit('c') });
|
|
140
|
-
const paused = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('1'), action: 'rollback', holder });
|
|
141
|
-
await host.admin.finishStoreKindRollout(staff, { kind, seq: paused.seq, holder, state: 'paused', detail: null });
|
|
142
|
-
expect(await host.admin.storeKindState(staff, kind)).toMatchObject({ rollbackTarget: sha('1'), unfinishedRollback: sha('1') });
|
|
143
|
-
// No rollout, of a new release or of the current one, until the rollback is done.
|
|
144
|
-
for (const s of ['3', '2', '1']) {
|
|
145
|
-
await expectRefusal(host.admin.beginStoreKindRollout(staff, { kind, sha256: sha(s), action: 'rollout', holder }), 'conflict');
|
|
146
|
-
}
|
|
147
|
-
// A rollback post that fails (its moves returned) changes nothing about where the rollback goes.
|
|
148
|
-
const failed = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('1'), action: 'rollback', holder });
|
|
149
|
-
await host.admin.finishStoreKindRollout(staff, { kind, seq: failed.seq, holder, state: 'failed', detail: 'vc failed' });
|
|
150
|
-
expect(await host.admin.storeKindState(staff, kind)).toMatchObject({ rollbackTarget: sha('1'), unfinishedRollback: sha('1') });
|
|
151
|
-
await expectRefusal(host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('3'), action: 'rollout', holder }), 'conflict');
|
|
152
|
-
// Diverged part way (an upload failed, or the request lost its hold): still unfinished, still
|
|
153
|
-
// continued by a rollback, and still blocking every rollout.
|
|
154
|
-
const diverged = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('1'), action: 'rollback', holder });
|
|
155
|
-
await host.admin.finishStoreKindRollout(staff, { kind, seq: diverged.seq, holder, state: 'diverged', detail: null });
|
|
156
|
-
expect((await host.admin.storeKindState(staff, kind)).rollbackTarget).toBe(sha('1'));
|
|
157
|
-
await expectRefusal(host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('3'), action: 'rollout', holder }), 'conflict');
|
|
158
|
-
const done = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('1'), action: 'rollback', holder });
|
|
159
|
-
await host.admin.finishStoreKindRollout(staff, { kind, seq: done.seq, holder, state: 'good', detail: null });
|
|
160
|
-
expect(await host.admin.storeKindState(staff, kind)).toMatchObject({ current: { sha256: sha('1') }, unfinishedRollback: null });
|
|
161
|
-
// Finished: a rollout may begin again.
|
|
162
|
-
const next = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('3'), action: 'rollout', holder });
|
|
163
|
-
// It diverges. Undoing it is a rollback onto the current release, 1; if that diverges too (a
|
|
164
|
-
// script on 3 refuses to go below its schema), going forward stays open: it is the way out.
|
|
165
|
-
await host.admin.finishStoreKindRollout(staff, { kind, seq: next.seq, holder, state: 'diverged', detail: null });
|
|
166
|
-
expect((await host.admin.storeKindState(staff, kind)).rollbackTarget).toBe(sha('1'));
|
|
167
|
-
const onto = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('1'), action: 'rollback', holder });
|
|
168
|
-
await host.admin.finishStoreKindRollout(staff, { kind, seq: onto.seq, holder, state: 'diverged', detail: 'below its schema' });
|
|
169
|
-
expect(await host.admin.storeKindState(staff, kind)).toMatchObject({ unfinishedRollback: sha('1'), current: { sha256: sha('1') } });
|
|
170
|
-
const forward = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('3'), action: 'rollout', holder });
|
|
171
|
-
expect(forward.state).toBe('rolling');
|
|
172
|
-
});
|
|
173
|
-
it('renews only a hold still held, and only for a rollout still rolling', async () => {
|
|
174
|
-
const kind = freshKind();
|
|
175
|
-
const [a, b] = [ulid(), ulid()];
|
|
176
|
-
await host.admin.recordStoreKindRelease(staff, { kind, sha256: sha('1'), sourceCommit: commit('c') });
|
|
177
|
-
// Nothing held: a renewal is not an acquisition.
|
|
178
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: a, mode: 'exclusive', ttlMs: 60_000, renew: true })).toBe(false);
|
|
179
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: a, mode: 'shared', ttlMs: 60_000, renew: true })).toBe(false);
|
|
180
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: a, mode: 'exclusive', ttlMs: 60_000 })).toBe(true);
|
|
181
|
-
const row = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('1'), action: 'rollout', holder: a });
|
|
182
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: a, mode: 'exclusive', ttlMs: 60_000, renew: true, rolloutSeq: row.seq })).toBe(true);
|
|
183
|
-
// A gives the kind up; B takes it and ends A's rollout by beginning its own.
|
|
184
|
-
await host.admin.releaseStoreKindHold(staff, { kind, holder: a });
|
|
185
|
-
expect((await host.admin.storeKindState(staff, kind)).rollouts.at(-1)?.state).toBe('diverged');
|
|
186
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: b, mode: 'exclusive', ttlMs: 60_000 })).toBe(true);
|
|
187
|
-
const next = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('1'), action: 'rollout', holder: b });
|
|
188
|
-
await host.admin.finishStoreKindRollout(staff, { kind, seq: next.seq, holder: b, state: 'good', detail: null });
|
|
189
|
-
await host.admin.releaseStoreKindHold(staff, { kind, holder: b });
|
|
190
|
-
// A asks again: its row ended, and it holds nothing, so it gets nothing back.
|
|
191
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: a, mode: 'exclusive', ttlMs: 60_000, renew: true, rolloutSeq: row.seq })).toBe(false);
|
|
192
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: a, mode: 'exclusive', ttlMs: 60_000, renew: true })).toBe(false);
|
|
193
|
-
// Even holding the kind again, a renewal names a rollout that is over.
|
|
194
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: a, mode: 'exclusive', ttlMs: 60_000 })).toBe(true);
|
|
195
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: a, mode: 'exclusive', ttlMs: 60_000, renew: true, rolloutSeq: row.seq })).toBe(false);
|
|
196
|
-
await host.admin.releaseStoreKindHold(staff, { kind, holder: a });
|
|
197
|
-
});
|
|
198
|
-
it('leaves the current release where it was when a rollout fails, and a resume keeps the rollback target', async () => {
|
|
199
|
-
const kind = freshKind();
|
|
200
|
-
const holder = ulid();
|
|
201
|
-
await rollOut(kind, holder, sha('1'), sha('2'));
|
|
202
|
-
await host.admin.recordStoreKindRelease(staff, { kind, sha256: sha('3'), sourceCommit: commit('c') });
|
|
203
|
-
const failed = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('3'), action: 'rollout', holder });
|
|
204
|
-
await host.admin.finishStoreKindRollout(staff, { kind, seq: failed.seq, holder, state: 'failed', detail: 'canary refused' });
|
|
205
|
-
expect((await host.admin.storeKindState(staff, kind)).current).toMatchObject({ sha256: sha('2'), previousGoodSha256: sha('1') });
|
|
206
|
-
// Rolling the current release out again converges it, and a rollback from it still goes to 1.
|
|
207
|
-
const resume = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('2'), action: 'rollout', holder });
|
|
208
|
-
expect(resume.previousGoodSha256).toBe(sha('1'));
|
|
209
|
-
await host.admin.finishStoreKindRollout(staff, { kind, seq: resume.seq, holder, state: 'good', detail: null });
|
|
210
|
-
expect((await host.admin.storeKindState(staff, kind)).current).toMatchObject({ sha256: sha('2'), previousGoodSha256: sha('1') });
|
|
211
|
-
// A finished rollout cannot be finished again, and an unstored release cannot begin.
|
|
212
|
-
await expectRefusal(host.admin.finishStoreKindRollout(staff, { kind, seq: resume.seq, holder, state: 'good', detail: null }), 'conflict');
|
|
213
|
-
await expectRefusal(host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('9'), action: 'rollout', holder }), 'not_found');
|
|
214
|
-
});
|
|
215
|
-
it('excludes a shared hold during an exclusive one, and an exclusive one while any hold lives', async () => {
|
|
216
|
-
const kind = freshKind();
|
|
217
|
-
const [push, rollout, push2] = [ulid(), ulid(), ulid()];
|
|
218
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: push, mode: 'shared', ttlMs: 60_000 })).toBe(true);
|
|
219
|
-
// Two pushes share a kind; a rollout waits for both.
|
|
220
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: push2, mode: 'shared', ttlMs: 60_000 })).toBe(true);
|
|
221
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: rollout, mode: 'exclusive', ttlMs: 60_000 })).toBe(false);
|
|
222
|
-
await host.admin.releaseStoreKindHold(staff, { kind, holder: push });
|
|
223
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: rollout, mode: 'exclusive', ttlMs: 60_000 })).toBe(false);
|
|
224
|
-
await host.admin.releaseStoreKindHold(staff, { kind, holder: push2 });
|
|
225
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: rollout, mode: 'exclusive', ttlMs: 60_000 })).toBe(true);
|
|
226
|
-
// During the rollout, no push holds the kind, and no second rollout either.
|
|
227
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: push, mode: 'shared', ttlMs: 60_000 })).toBe(false);
|
|
228
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: ulid(), mode: 'exclusive', ttlMs: 60_000 })).toBe(false);
|
|
229
|
-
// The holder renews in its own mode, and may not switch mode.
|
|
230
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: rollout, mode: 'exclusive', ttlMs: 60_000 })).toBe(true);
|
|
231
|
-
await expectRefusal(host.admin.holdStoreKind(staff, { kind, holder: rollout, mode: 'shared', ttlMs: 60_000 }), 'conflict');
|
|
232
|
-
// Another kind is not held.
|
|
233
|
-
expect(await host.admin.holdStoreKind(staff, { kind: freshKind(), holder: push, mode: 'shared', ttlMs: 60_000 })).toBe(true);
|
|
234
|
-
await host.admin.releaseStoreKindHold(staff, { kind, holder: rollout });
|
|
235
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: push, mode: 'shared', ttlMs: 60_000 })).toBe(true);
|
|
236
|
-
});
|
|
237
|
-
it('refuses a rollout write by anyone not holding the kind exclusively, and a stopped rollout reads as diverged', async () => {
|
|
238
|
-
const kind = freshKind();
|
|
239
|
-
const [a, b] = [ulid(), ulid()];
|
|
240
|
-
await host.admin.recordStoreKindRelease(staff, { kind, sha256: sha('1'), sourceCommit: commit('c') });
|
|
241
|
-
// No hold: no rollout.
|
|
242
|
-
await expectRefusal(host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('1'), action: 'rollout', holder: a }), 'conflict');
|
|
243
|
-
// A shared hold is not enough either.
|
|
244
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: a, mode: 'shared', ttlMs: 60_000 })).toBe(true);
|
|
245
|
-
await expectRefusal(host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('1'), action: 'rollout', holder: a }), 'conflict');
|
|
246
|
-
await host.admin.releaseStoreKindHold(staff, { kind, holder: a });
|
|
247
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: a, mode: 'exclusive', ttlMs: 60_000 })).toBe(true);
|
|
248
|
-
const stopped = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('1'), action: 'rollout', holder: a });
|
|
249
|
-
// A stops holding the kind mid-rollout (here released; a crash lets the lease lapse instead).
|
|
250
|
-
await host.admin.releaseStoreKindHold(staff, { kind, holder: a });
|
|
251
|
-
await expectRefusal(host.admin.finishStoreKindRollout(staff, { kind, seq: stopped.seq, holder: a, state: 'good', detail: null }), 'conflict');
|
|
252
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: b, mode: 'exclusive', ttlMs: 60_000 })).toBe(true);
|
|
253
|
-
const next = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('1'), action: 'rollout', holder: b });
|
|
254
|
-
const state = await host.admin.storeKindState(staff, kind);
|
|
255
|
-
expect(state.rollouts.find((r) => r.seq === stopped.seq)?.state).toBe('diverged');
|
|
256
|
-
expect(state.current).toBeNull();
|
|
257
|
-
await host.admin.finishStoreKindRollout(staff, { kind, seq: next.seq, holder: b, state: 'good', detail: null });
|
|
258
|
-
expect((await host.admin.storeKindState(staff, kind)).current?.sha256).toBe(sha('1'));
|
|
259
|
-
});
|
|
260
|
-
it('names every vertical any version of which declared the kind, with its bindings', async () => {
|
|
261
|
-
const kind = freshKind();
|
|
262
|
-
const slugA = `ska-${ulid().toLowerCase().slice(-8)}`;
|
|
263
|
-
const slugB = `skb-${ulid().toLowerCase().slice(-8)}`;
|
|
264
|
-
const publish = async (slug, scopeStores) => {
|
|
265
|
-
const id = ulid();
|
|
266
|
-
await host.admin.publishVersion(staff, {
|
|
267
|
-
id,
|
|
268
|
-
verticalSlug: slug,
|
|
269
|
-
version: `1.0.${id.slice(-6).toLowerCase()}`,
|
|
270
|
-
manifestDigest: `m-${id}`,
|
|
271
|
-
permissionDigest: 'p',
|
|
272
|
-
migrationDigest: 'g',
|
|
273
|
-
deploymentRef: null,
|
|
274
|
-
manifestJson: JSON.stringify({
|
|
275
|
-
version: '1.0.0', entry: 'index.js', compatibilityDate: '2026-07-01',
|
|
276
|
-
registry: { permissions: [], roles: [], entityGrants: [] },
|
|
277
|
-
digests: { manifest: 'm', permission: 'p', migration: 'g' },
|
|
278
|
-
scopeStores,
|
|
279
|
-
}),
|
|
280
|
-
});
|
|
281
|
-
};
|
|
282
|
-
for (const slug of [slugA, slugB])
|
|
283
|
-
await host.admin.registerVertical(staff, { slug, name: slug, source: 'cli' });
|
|
284
|
-
await publish(slugA, [{ binding: 'GRAPH', kind }]);
|
|
285
|
-
// B's later version drops the store: a scope still running the older one keeps its script.
|
|
286
|
-
await publish(slugB, [{ binding: 'G', kind }, { binding: 'OTHER', kind: freshKind() }]);
|
|
287
|
-
await publish(slugB, []);
|
|
288
|
-
const declared = await host.admin.storeKindDeclarations(staff, kind);
|
|
289
|
-
expect(declared.verticals).toEqual([
|
|
290
|
-
{ vertical: slugA, stores: [{ binding: 'GRAPH', kind }] },
|
|
291
|
-
{ vertical: slugB, stores: [{ binding: 'G', kind }] },
|
|
292
|
-
]);
|
|
293
|
-
expect(declared.unreadable).not.toContain(slugA);
|
|
294
|
-
expect((await host.admin.storeKindDeclarations(staff, freshKind())).verticals).toEqual([]);
|
|
295
|
-
// A version that cannot say what it declares names its vertical as unreadable: it may hold
|
|
296
|
-
// the kind, and a rollout that skipped it would not know.
|
|
297
|
-
const slugC = `skc-${ulid().toLowerCase().slice(-8)}`;
|
|
298
|
-
await host.admin.registerVertical(staff, { slug: slugC, name: slugC, source: 'cli' });
|
|
299
|
-
const id = ulid();
|
|
300
|
-
await host.admin.publishVersion(staff, {
|
|
301
|
-
id,
|
|
302
|
-
verticalSlug: slugC,
|
|
303
|
-
version: `1.0.${id.slice(-6).toLowerCase()}`,
|
|
304
|
-
manifestDigest: `m-${id}`,
|
|
305
|
-
permissionDigest: 'p',
|
|
306
|
-
migrationDigest: 'g',
|
|
307
|
-
deploymentRef: null,
|
|
308
|
-
manifestJson: '{nope',
|
|
309
|
-
});
|
|
310
|
-
const after = await host.admin.storeKindDeclarations(staff, kind);
|
|
311
|
-
expect(after.unreadable).toContain(slugC);
|
|
312
|
-
expect(after.verticals).toEqual(declared.verticals);
|
|
313
|
-
});
|
|
314
|
-
});
|
|
315
|
-
}
|
|
316
|
-
export function storeKindHoldExpiryContractSuite(adapterName, makeFixture) {
|
|
317
|
-
describe(`store-kind hold expiry (#2300): ${adapterName}`, () => {
|
|
318
|
-
let fixture;
|
|
319
|
-
const staff = platformActorId.parse(ulid());
|
|
320
|
-
beforeAll(async () => {
|
|
321
|
-
fixture = await makeFixture();
|
|
322
|
-
});
|
|
323
|
-
afterAll(async () => fixture.cleanup());
|
|
324
|
-
it("lapses a hold on the host's clock, and a crashed rollout then reads as diverged", async () => {
|
|
325
|
-
const { host, clock } = fixture;
|
|
326
|
-
const kind = freshKind();
|
|
327
|
-
const [crashed, next, push] = [ulid(), ulid(), ulid()];
|
|
328
|
-
await host.admin.recordStoreKindRelease(staff, { kind, sha256: sha('1'), sourceCommit: commit('c') });
|
|
329
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: crashed, mode: 'exclusive', ttlMs: 60_000 })).toBe(true);
|
|
330
|
-
const stopped = await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('1'), action: 'rollout', holder: crashed });
|
|
331
|
-
// The holder never comes back. Just before the lease ends the kind is still held.
|
|
332
|
-
clock.advance(59_999);
|
|
333
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: push, mode: 'shared', ttlMs: 1_000 })).toBe(false);
|
|
334
|
-
clock.advance(1);
|
|
335
|
-
// At its end it lapses. Read now, the rollout reads as stopped, though nothing wrote that.
|
|
336
|
-
expect((await host.admin.storeKindState(staff, kind)).rollouts.at(-1)).toMatchObject({ seq: stopped.seq, state: 'diverged' });
|
|
337
|
-
// Its holder cannot renew it back, even with nobody else holding the kind.
|
|
338
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: crashed, mode: 'exclusive', ttlMs: 60_000, renew: true, rolloutSeq: stopped.seq })).toBe(false);
|
|
339
|
-
// The crashed holder can write nothing, and a push holds again.
|
|
340
|
-
await expectRefusal(host.admin.finishStoreKindRollout(staff, { kind, seq: stopped.seq, holder: crashed, state: 'good', detail: null }), 'conflict');
|
|
341
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: push, mode: 'shared', ttlMs: 1_000 })).toBe(true);
|
|
342
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: next, mode: 'exclusive', ttlMs: 60_000 })).toBe(false);
|
|
343
|
-
clock.advance(1_000);
|
|
344
|
-
expect(await host.admin.holdStoreKind(staff, { kind, holder: next, mode: 'exclusive', ttlMs: 60_000 })).toBe(true);
|
|
345
|
-
await host.admin.beginStoreKindRollout(staff, { kind, sha256: sha('1'), action: 'rollout', holder: next });
|
|
346
|
-
const state = await host.admin.storeKindState(staff, kind);
|
|
347
|
-
expect(state.rollouts.map((r) => r.state)).toEqual(['diverged', 'rolling']);
|
|
348
|
-
// A lifetime that is not positive is no hold.
|
|
349
|
-
await expectRefusal(host.admin.holdStoreKind(staff, { kind: freshKind(), holder: push, mode: 'shared', ttlMs: 0 }), 'validation_failed');
|
|
350
|
-
});
|
|
351
|
-
});
|
|
352
|
-
}
|
|
353
|
-
//# sourceMappingURL=store-kind-release-suite.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"store-kind-release-suite.js","sourceRoot":"","sources":["../src/store-kind-release-suite.ts"],"names":[],"mappings":"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"}
|