@substrat-run/cli 0.44.0 → 0.45.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/cli.js +116 -40
- package/dist/cli.js.map +1 -1
- package/dist/data-loss-check.d.ts +70 -0
- package/dist/data-loss-check.d.ts.map +1 -0
- package/dist/data-loss-check.js +260 -0
- package/dist/data-loss-check.js.map +1 -0
- package/dist/data-loss-replay-child.d.ts +27 -0
- package/dist/data-loss-replay-child.d.ts.map +1 -0
- package/dist/data-loss-replay-child.js +71 -0
- package/dist/data-loss-replay-child.js.map +1 -0
- package/dist/promote.d.ts +16 -1
- package/dist/promote.d.ts.map +1 -1
- package/dist/promote.js +87 -11
- package/dist/promote.js.map +1 -1
- package/dist/push.d.ts +32 -6
- package/dist/push.d.ts.map +1 -1
- package/dist/push.js +94 -32
- package/dist/push.js.map +1 -1
- package/dist/scope.d.ts +23 -2
- package/dist/scope.d.ts.map +1 -1
- package/dist/scope.js +63 -7
- package/dist/scope.js.map +1 -1
- package/dist/store-driver.d.ts +59 -0
- package/dist/store-driver.d.ts.map +1 -0
- package/dist/{store-kind.js → store-driver.js} +58 -22
- package/dist/store-driver.js.map +1 -0
- package/package.json +4 -4
- package/dist/store-kind.d.ts +0 -46
- package/dist/store-kind.d.ts.map +0 -1
- package/dist/store-kind.js.map +0 -1
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `substrat store-
|
|
2
|
+
* `substrat store-driver upload | rollout | rollback | status --driver <driver>` (D-63, #2300). Staff
|
|
3
3
|
* only, and a write must be made from a person's sign-in (`substrat login`): the control plane
|
|
4
4
|
* refuses the service token.
|
|
5
5
|
*
|
|
6
|
-
* - `upload` packs the
|
|
6
|
+
* - `upload` packs the driver's package from `--dir` and stores it. The control plane names the
|
|
7
7
|
* release by its sha256 and says whether this repo pins it yet; bytes may go up first.
|
|
8
8
|
* - `rollout --sha256` moves every vertical to a stored, pinned release, after a canary. A big
|
|
9
9
|
* fleet takes more than one request: the command says so, and running it again continues.
|
|
10
|
-
* - `rollback` returns the
|
|
10
|
+
* - `rollback` returns the driver to the immediately previous good release.
|
|
11
11
|
*
|
|
12
|
-
* What is packed is the
|
|
12
|
+
* What is packed is the driver's own package only: every `driver_<name>/…/*.py` under `--dir`, by
|
|
13
13
|
* its path relative to it. `__pycache__` is skipped. Anything else is refused by name, vendored
|
|
14
|
-
* packages included: a release is one `
|
|
14
|
+
* packages included: a release is one `driver_` package (the platform's module rule), so a driver
|
|
15
15
|
* that needs a third-party package cannot be published yet.
|
|
16
16
|
*/
|
|
17
17
|
import { spawnSync } from 'node:child_process';
|
|
@@ -19,14 +19,14 @@ import { lstatSync, readdirSync, readFileSync } from 'node:fs';
|
|
|
19
19
|
import { join, relative, sep } from 'node:path';
|
|
20
20
|
import { STORE_RELEASE_MAX_BYTES } from '@substrat-run/contracts';
|
|
21
21
|
import { planeFor } from './plane.js';
|
|
22
|
-
const
|
|
22
|
+
const DRIVER_MODULE = /^driver_[a-z0-9_]+\/(?:[A-Za-z_][A-Za-z0-9_]*\/)*[A-Za-z_][A-Za-z0-9_]*\.py$/;
|
|
23
23
|
function base64(bytes) {
|
|
24
24
|
let text = '';
|
|
25
25
|
for (let i = 0; i < bytes.length; i += 0x8000)
|
|
26
26
|
text += String.fromCharCode(...bytes.subarray(i, i + 0x8000));
|
|
27
27
|
return btoa(text);
|
|
28
28
|
}
|
|
29
|
-
/** How deep, and how many files, a
|
|
29
|
+
/** How deep, and how many files, a driver's package may go: past either it is not one package. */
|
|
30
30
|
const MAX_DEPTH = 16;
|
|
31
31
|
const MAX_FILES = 2000;
|
|
32
32
|
/**
|
|
@@ -81,17 +81,17 @@ export function sourceCommitOf(dir, files) {
|
|
|
81
81
|
}
|
|
82
82
|
return head.stdout.trim();
|
|
83
83
|
}
|
|
84
|
-
/** The
|
|
85
|
-
export function
|
|
84
|
+
/** The driver's package under `dir`, as the upload body. `entry` is the module with the class. */
|
|
85
|
+
export function packStoreDriverDir(dir, entry, sourceCommit) {
|
|
86
86
|
const files = packedFilesOf(dir);
|
|
87
|
-
const refused = files.filter((path) => !
|
|
87
|
+
const refused = files.filter((path) => !DRIVER_MODULE.test(path));
|
|
88
88
|
if (refused.length > 0) {
|
|
89
|
-
throw new Error(`only the
|
|
90
|
-
'Vendored packages are not supported: a release is one
|
|
89
|
+
throw new Error(`only the driver's own package is published (driver_<name>/…/*.py); refused: ${refused.join(', ')}. ` +
|
|
90
|
+
'Vendored packages are not supported: a release is one driver_ package.');
|
|
91
91
|
}
|
|
92
92
|
const packages = new Set(files.map((path) => path.split('/')[0]));
|
|
93
93
|
if (packages.size !== 1)
|
|
94
|
-
throw new Error(`'${dir}' must hold exactly one
|
|
94
|
+
throw new Error(`'${dir}' must hold exactly one driver_ package, not ${[...packages].join(', ') || 'none'}`);
|
|
95
95
|
if (!files.includes(entry))
|
|
96
96
|
throw new Error(`'${dir}' has no ${entry}`);
|
|
97
97
|
let total = 0;
|
|
@@ -106,22 +106,58 @@ export function packStoreKindDir(dir, entry, sourceCommit) {
|
|
|
106
106
|
}
|
|
107
107
|
/** A release is named by its sha256 as `upload` printed it; anything else is refused before a request. */
|
|
108
108
|
export const isReleaseSha = (value) => value !== undefined && /^[0-9a-f]{64}$/.test(value);
|
|
109
|
-
export const
|
|
110
|
-
export const
|
|
111
|
-
export const
|
|
112
|
-
export const
|
|
109
|
+
export const uploadStoreDriverRelease = (input) => planeFor(input.controlPlaneUrl, input.header).uploadStoreDriverRelease(input.driver, input.body);
|
|
110
|
+
export const rollOutStoreDriver = (input) => planeFor(input.controlPlaneUrl, input.header).rollOutStoreDriver(input.driver, input.sha256);
|
|
111
|
+
export const rollBackStoreDriver = (input) => planeFor(input.controlPlaneUrl, input.header).rollBackStoreDriver(input.driver);
|
|
112
|
+
export const storeDriverStatus = (input) => planeFor(input.controlPlaneUrl, input.header).getStoreDriver(input.driver);
|
|
113
|
+
export const rebuildStoreDriver = (input) => planeFor(input.controlPlaneUrl, input.header).rebuildStoreDriver(input.driver, { deployFinished: input.deployFinished === true });
|
|
113
114
|
/**
|
|
114
|
-
*
|
|
115
|
+
* Whether every script of the driver is built from what the control plane builds from now (#2309).
|
|
116
|
+
* An old key is revoked only once this reads `current`: until then a script on the list below may
|
|
117
|
+
* still accept it.
|
|
118
|
+
*/
|
|
119
|
+
export function storeDriverRebuildLines(rebuild) {
|
|
120
|
+
const walk = rebuild.walk;
|
|
121
|
+
// Why it reads as it does: when these lists were first walked towards, and when the next automatic walk is.
|
|
122
|
+
const timing = walk && walk.fingerprint === rebuild.fingerprint
|
|
123
|
+
? [` first walked towards ${walk.fingerprintSince}${rebuild.nextWalk ? `; next automatic re-walk ${rebuild.nextWalk}` : ''}`]
|
|
124
|
+
: [];
|
|
125
|
+
if (rebuild.current && rebuild.reverifying) {
|
|
126
|
+
return [` scripts: current (re-verifying: a walk since ${walk?.startedAt} re-checks every script; last proved ${walk?.verifiedAt})`, ...timing];
|
|
127
|
+
}
|
|
128
|
+
if (rebuild.current) {
|
|
129
|
+
const by = walk?.attestedBy ? `, deploy attested finished by ${walk.attestedBy}` : '';
|
|
130
|
+
return [` scripts: current (every script is built from ${rebuild.fingerprint.slice(0, 12)}, walk finished ${walk?.finishedAt}${by})`, ...timing];
|
|
131
|
+
}
|
|
132
|
+
if (rebuild.settling) {
|
|
133
|
+
return [
|
|
134
|
+
` scripts: settling: every script was current when walked (${walk?.finishedAt ?? 'just now'}), but the control plane's deploy may still`,
|
|
135
|
+
` have been rolling out then. It is walked again from ${rebuild.settling}; once the deploy serves only the new version,`,
|
|
136
|
+
` \`substrat store-driver rebuild --driver <driver> --deploy-finished\` walks it at once and attests that.`,
|
|
137
|
+
...timing,
|
|
138
|
+
];
|
|
139
|
+
}
|
|
140
|
+
const shown = rebuild.pending.slice(0, 10);
|
|
141
|
+
return [
|
|
142
|
+
` scripts: NOT current: ${rebuild.pending.length} may still be built from older keys or code (target ${rebuild.fingerprint.slice(0, 12)})`,
|
|
143
|
+
...(shown.length ? [` pending: ${shown.join(', ')}${rebuild.pending.length > shown.length ? `, … ${rebuild.pending.length - shown.length} more` : ''}`] : []),
|
|
144
|
+
...(walk?.failures ?? []).slice(0, 10).map((f) => ` failed: ${f.vertical}: ${f.detail}`),
|
|
145
|
+
...timing,
|
|
146
|
+
];
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* What `store-driver status` prints. "Rolls back to" is the server's `rollbackTarget`, never the
|
|
115
150
|
* current release's previous good one: after a diverged or paused rollout it is the current
|
|
116
151
|
* release, and a rollback still under way continues to its own target.
|
|
117
152
|
*/
|
|
118
|
-
export function
|
|
153
|
+
export function storeDriverStatusLines(driver, view) {
|
|
119
154
|
return [
|
|
120
|
-
`${
|
|
155
|
+
`${driver}: current ${view.current?.sha256 ?? 'none'}, rolls back to ${view.rollbackTarget ?? 'nothing'}`,
|
|
121
156
|
...(view.unfinishedRollback
|
|
122
|
-
? [` a rollback to ${view.unfinishedRollback} stopped part way: run \`substrat store-
|
|
157
|
+
? [` a rollback to ${view.unfinishedRollback} stopped part way: run \`substrat store-driver rollback\` again to finish it`]
|
|
123
158
|
: []),
|
|
124
159
|
...view.rollouts.slice(-10).map((r) => ` #${r.seq} ${r.action} ${r.sha256} ${r.state}${r.detail ? ` — ${r.detail}` : ''}`),
|
|
160
|
+
...(view.rebuild ? storeDriverRebuildLines(view.rebuild) : []),
|
|
125
161
|
];
|
|
126
162
|
}
|
|
127
|
-
//# sourceMappingURL=store-
|
|
163
|
+
//# sourceMappingURL=store-driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store-driver.js","sourceRoot":"","sources":["../src/store-driver.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@substrat-run/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.45.0",
|
|
4
4
|
"description": "The substrat CLI — authenticated deploy tooling: push a vertical to the platform, manage its versions and channels",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -31,9 +31,9 @@
|
|
|
31
31
|
"@babel/parser": "^7.29.7",
|
|
32
32
|
"esbuild": "^0.28.2",
|
|
33
33
|
"@substrat-run/boundary-lint": "^0.8.0",
|
|
34
|
-
"@substrat-run/contracts": "^0.
|
|
35
|
-
"@substrat-run/
|
|
36
|
-
"@substrat-run/
|
|
34
|
+
"@substrat-run/contracts": "^0.149.0",
|
|
35
|
+
"@substrat-run/model-view": "^0.2.53",
|
|
36
|
+
"@substrat-run/control-plane-client": "^0.3.0"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@types/node": "^22.20.5",
|
package/dist/store-kind.d.ts
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { type StoreKindReleaseUpload } from '@substrat-run/contracts';
|
|
2
|
-
import type { StoreKindView } from '@substrat-run/control-plane-client';
|
|
3
|
-
/**
|
|
4
|
-
* Every file under `dir`, by its path relative to it, `__pycache__` and `.pyc` left out. A symbolic
|
|
5
|
-
* link is refused, not followed: it could pack a file from outside `dir`, or loop forever.
|
|
6
|
-
*/
|
|
7
|
-
export declare function packedFilesOf(dir: string): string[];
|
|
8
|
-
/**
|
|
9
|
-
* The commit `dir` is checked out at, for the files about to be packed. Refused unless every one
|
|
10
|
-
* of them is tracked and unchanged there: an untracked, ignored or edited file is not that
|
|
11
|
-
* commit, so the bundle would carry bytes the commit a reviewer reads does not.
|
|
12
|
-
*/
|
|
13
|
-
export declare function sourceCommitOf(dir: string, files: readonly string[]): string;
|
|
14
|
-
/** The kind's package under `dir`, as the upload body. `entry` is the module with the class. */
|
|
15
|
-
export declare function packStoreKindDir(dir: string, entry: string, sourceCommit: string): StoreKindReleaseUpload;
|
|
16
|
-
/** A release is named by its sha256 as `upload` printed it; anything else is refused before a request. */
|
|
17
|
-
export declare const isReleaseSha: (value: string | undefined) => value is string;
|
|
18
|
-
type Plane = {
|
|
19
|
-
controlPlaneUrl: string;
|
|
20
|
-
header: Record<string, string>;
|
|
21
|
-
};
|
|
22
|
-
export declare const uploadStoreKindRelease: (input: Plane & {
|
|
23
|
-
kind: string;
|
|
24
|
-
body: StoreKindReleaseUpload;
|
|
25
|
-
}) => Promise<{
|
|
26
|
-
release: import("@substrat-run/control-plane-client").StoreKindReleaseView;
|
|
27
|
-
pinned: boolean;
|
|
28
|
-
}>;
|
|
29
|
-
export declare const rollOutStoreKind: (input: Plane & {
|
|
30
|
-
kind: string;
|
|
31
|
-
sha256: string;
|
|
32
|
-
}) => Promise<import("@substrat-run/control-plane-client").StoreKindRolloutResultView>;
|
|
33
|
-
export declare const rollBackStoreKind: (input: Plane & {
|
|
34
|
-
kind: string;
|
|
35
|
-
}) => Promise<import("@substrat-run/control-plane-client").StoreKindRolloutResultView>;
|
|
36
|
-
export declare const storeKindStatus: (input: Plane & {
|
|
37
|
-
kind: string;
|
|
38
|
-
}) => Promise<StoreKindView>;
|
|
39
|
-
/**
|
|
40
|
-
* What `store-kind status` prints. "Rolls back to" is the server's `rollbackTarget`, never the
|
|
41
|
-
* current release's previous good one: after a diverged or paused rollout it is the current
|
|
42
|
-
* release, and a rollback still under way continues to its own target.
|
|
43
|
-
*/
|
|
44
|
-
export declare function storeKindStatusLines(kind: string, view: StoreKindView): string[];
|
|
45
|
-
export {};
|
|
46
|
-
//# sourceMappingURL=store-kind.d.ts.map
|
package/dist/store-kind.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"store-kind.d.ts","sourceRoot":"","sources":["../src/store-kind.ts"],"names":[],"mappings":"AAmBA,OAAO,EAA2B,KAAK,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAC/F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAexE;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBnD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAgB5E;AAED,gGAAgG;AAChG,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,sBAAsB,CAoBzG;AAED,0GAA0G;AAC1G,eAAO,MAAM,YAAY,UAAW,MAAM,GAAG,SAAS,KAAG,KAAK,IAAI,MAA6D,CAAC;AAEhI,KAAK,KAAK,GAAG;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC;AAEzE,eAAO,MAAM,sBAAsB,UAAW,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,sBAAsB,CAAA;CAAE;;;EACN,CAAC;AAE/F,eAAO,MAAM,gBAAgB,UAAW,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,qFACU,CAAC;AAE3F,eAAO,MAAM,iBAAiB,UAAW,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,qFACY,CAAC;AAE9E,eAAO,MAAM,eAAe,UAAW,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,2BACS,CAAC;AAEzE;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE,CAQhF"}
|
package/dist/store-kind.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"store-kind.js","sourceRoot":"","sources":["../src/store-kind.ts"],"names":[],"mappings":"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"}
|