@caelo-cms/provisioning 0.10.53 → 0.10.57
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/agent-db.js +272 -128
- package/dist/audit-job-setup.d.ts +69 -0
- package/dist/audit-job-setup.d.ts.map +1 -0
- package/dist/audit-job-setup.js +317 -0
- package/dist/audit-job-setup.js.map +1 -0
- package/dist/caddy.d.ts +9 -0
- package/dist/caddy.d.ts.map +1 -1
- package/dist/caddy.js +38 -0
- package/dist/caddy.js.map +1 -1
- package/dist/cli-routing.js +1 -1
- package/dist/cli-routing.js.map +1 -1
- package/dist/cli.js +36 -9
- package/dist/cli.js.map +1 -1
- package/dist/compose.js +5 -0
- package/dist/compose.js.map +1 -1
- package/dist/converge-checkpoint.d.ts +66 -0
- package/dist/converge-checkpoint.d.ts.map +1 -0
- package/dist/converge-checkpoint.js +61 -0
- package/dist/converge-checkpoint.js.map +1 -0
- package/dist/converge-job-gcp.d.ts +46 -0
- package/dist/converge-job-gcp.d.ts.map +1 -0
- package/dist/converge-job-gcp.js +368 -0
- package/dist/converge-job-gcp.js.map +1 -0
- package/dist/converge-job-setup.d.ts +62 -0
- package/dist/converge-job-setup.d.ts.map +1 -0
- package/dist/converge-job-setup.js +228 -0
- package/dist/converge-job-setup.js.map +1 -0
- package/dist/converge-job.d.ts +141 -0
- package/dist/converge-job.d.ts.map +1 -0
- package/dist/converge-job.js +325 -0
- package/dist/converge-job.js.map +1 -0
- package/dist/gcp-names.d.ts +25 -1
- package/dist/gcp-names.d.ts.map +1 -1
- package/dist/gcp-names.js +36 -0
- package/dist/gcp-names.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/infra-contract.d.ts +1 -1
- package/dist/infra-contract.d.ts.map +1 -1
- package/dist/infra-contract.js +28 -1
- package/dist/infra-contract.js.map +1 -1
- package/dist/install-job.d.ts +11 -3
- package/dist/install-job.d.ts.map +1 -1
- package/dist/install-job.js +22 -12
- package/dist/install-job.js.map +1 -1
- package/dist/lifecycle.d.ts +13 -1
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +115 -58
- package/dist/lifecycle.js.map +1 -1
- package/dist/operator-access.d.ts.map +1 -1
- package/dist/operator-access.js +13 -3
- package/dist/operator-access.js.map +1 -1
- package/dist/private-file.d.ts +26 -0
- package/dist/private-file.d.ts.map +1 -0
- package/dist/private-file.js +49 -0
- package/dist/private-file.js.map +1 -0
- package/dist/release-contract.d.ts +3 -2
- package/dist/release-contract.d.ts.map +1 -1
- package/dist/release-contract.js +8 -2
- package/dist/release-contract.js.map +1 -1
- package/dist/release-manifest.d.ts +2 -0
- package/dist/release-manifest.d.ts.map +1 -1
- package/dist/release-manifest.js.map +1 -1
- package/dist/remote-mcp-edge.d.ts +114 -0
- package/dist/remote-mcp-edge.d.ts.map +1 -0
- package/dist/remote-mcp-edge.js +116 -0
- package/dist/remote-mcp-edge.js.map +1 -0
- package/dist/remote-mcp.d.ts +117 -0
- package/dist/remote-mcp.d.ts.map +1 -0
- package/dist/remote-mcp.js +379 -0
- package/dist/remote-mcp.js.map +1 -0
- package/dist/runtime-secrets.d.ts +12 -0
- package/dist/runtime-secrets.d.ts.map +1 -1
- package/dist/runtime-secrets.js +32 -4
- package/dist/runtime-secrets.js.map +1 -1
- package/dist/seal-key-rotation.d.ts +38 -0
- package/dist/seal-key-rotation.d.ts.map +1 -0
- package/dist/seal-key-rotation.js +206 -0
- package/dist/seal-key-rotation.js.map +1 -0
- package/dist/stack-contract.d.ts +175 -3
- package/dist/stack-contract.d.ts.map +1 -1
- package/dist/stack-contract.js +183 -3
- package/dist/stack-contract.js.map +1 -1
- package/dist/stack-converge.d.ts +38 -1
- package/dist/stack-converge.d.ts.map +1 -1
- package/dist/stack-converge.js +74 -4
- package/dist/stack-converge.js.map +1 -1
- package/dist/state-lock-lease.d.ts +142 -0
- package/dist/state-lock-lease.d.ts.map +1 -0
- package/dist/state-lock-lease.js +347 -0
- package/dist/state-lock-lease.js.map +1 -0
- package/dist/state-store.d.ts +66 -9
- package/dist/state-store.d.ts.map +1 -1
- package/dist/state-store.js +249 -30
- package/dist/state-store.js.map +1 -1
- package/dist/tar-entries.d.ts.map +1 -1
- package/dist/tar-entries.js +84 -9
- package/dist/tar-entries.js.map +1 -1
- package/dist/upgrade/app-roll.d.ts +36 -7
- package/dist/upgrade/app-roll.d.ts.map +1 -1
- package/dist/upgrade/app-roll.js +88 -19
- package/dist/upgrade/app-roll.js.map +1 -1
- package/dist/upgrade/audit-job-roll.d.ts +38 -0
- package/dist/upgrade/audit-job-roll.d.ts.map +1 -0
- package/dist/upgrade/audit-job-roll.js +43 -0
- package/dist/upgrade/audit-job-roll.js.map +1 -0
- package/dist/upgrade/converge.d.ts.map +1 -1
- package/dist/upgrade/converge.js +141 -8
- package/dist/upgrade/converge.js.map +1 -1
- package/dist/upgrade/gcp-lookup.d.ts +27 -10
- package/dist/upgrade/gcp-lookup.d.ts.map +1 -1
- package/dist/upgrade/gcp-lookup.js +46 -7
- package/dist/upgrade/gcp-lookup.js.map +1 -1
- package/dist/upgrade/record-rolled.d.ts +40 -0
- package/dist/upgrade/record-rolled.d.ts.map +1 -0
- package/dist/upgrade/record-rolled.js +46 -0
- package/dist/upgrade/record-rolled.js.map +1 -0
- package/dist/upgrade/upgrade.d.ts +45 -1
- package/dist/upgrade/upgrade.d.ts.map +1 -1
- package/dist/upgrade/upgrade.js +60 -17
- package/dist/upgrade/upgrade.js.map +1 -1
- package/dist/upgrader-assess.d.ts +15 -1
- package/dist/upgrader-assess.d.ts.map +1 -1
- package/dist/upgrader-assess.js +36 -6
- package/dist/upgrader-assess.js.map +1 -1
- package/dist/upgrader-gcp.d.ts +15 -0
- package/dist/upgrader-gcp.d.ts.map +1 -1
- package/dist/upgrader-gcp.js +42 -7
- package/dist/upgrader-gcp.js.map +1 -1
- package/dist/upgrader-iam-preflight.d.ts +123 -0
- package/dist/upgrader-iam-preflight.d.ts.map +1 -0
- package/dist/upgrader-iam-preflight.js +414 -0
- package/dist/upgrader-iam-preflight.js.map +1 -0
- package/dist/upgrader-job.d.ts +33 -9
- package/dist/upgrader-job.d.ts.map +1 -1
- package/dist/upgrader-job.js +169 -27
- package/dist/upgrader-job.js.map +1 -1
- package/dist/upgrader-records.d.ts +58 -0
- package/dist/upgrader-records.d.ts.map +1 -0
- package/dist/upgrader-records.js +87 -0
- package/dist/upgrader-records.js.map +1 -0
- package/dist/upgrader-reporter.d.ts +3 -2
- package/dist/upgrader-reporter.d.ts.map +1 -1
- package/dist/upgrader-reporter.js +10 -2
- package/dist/upgrader-reporter.js.map +1 -1
- package/dist/upgrader-setup.d.ts +25 -3
- package/dist/upgrader-setup.d.ts.map +1 -1
- package/dist/upgrader-setup.js +132 -14
- package/dist/upgrader-setup.js.map +1 -1
- package/dist/wizards/gcp-cost.d.ts.map +1 -1
- package/dist/wizards/gcp-cost.js +14 -6
- package/dist/wizards/gcp-cost.js.map +1 -1
- package/dist/wizards/gcp-pulumi.d.ts +6 -0
- package/dist/wizards/gcp-pulumi.d.ts.map +1 -1
- package/dist/wizards/gcp-pulumi.js +7 -0
- package/dist/wizards/gcp-pulumi.js.map +1 -1
- package/dist/wizards/gcp.d.ts.map +1 -1
- package/dist/wizards/gcp.js +130 -4
- package/dist/wizards/gcp.js.map +1 -1
- package/package.json +4 -4
- package/src/agent/run.test.ts +15 -1
- package/src/audit-job-setup.test.ts +234 -0
- package/src/audit-job-setup.ts +360 -0
- package/src/caddy-redirects.docker.test.ts +19 -6
- package/src/caddy.test.ts +30 -0
- package/src/caddy.ts +43 -0
- package/src/cli-init-validation.test.ts +44 -0
- package/src/cli-routing.ts +1 -1
- package/src/cli.ts +40 -8
- package/src/compose.ts +5 -0
- package/src/converge-checkpoint.ts +75 -0
- package/src/converge-entrypoint.test.ts +213 -0
- package/src/converge-job-gcp.test.ts +222 -0
- package/src/converge-job-gcp.ts +443 -0
- package/src/converge-job-setup.test.ts +152 -0
- package/src/converge-job-setup.ts +268 -0
- package/src/converge-job.test.ts +486 -0
- package/src/converge-job.ts +542 -0
- package/src/gateway-env-isolation.test.ts +8 -1
- package/src/gcp-names.ts +43 -1
- package/src/gcp-url-map.test.ts +9 -1
- package/src/index.ts +8 -0
- package/src/infra-contract.test.ts +7 -4
- package/src/infra-contract.ts +28 -1
- package/src/install-job.test.ts +3 -1
- package/src/install-job.ts +31 -14
- package/src/lifecycle.ts +137 -71
- package/src/operator-access.test.ts +14 -0
- package/src/operator-access.ts +13 -3
- package/src/private-file.test.ts +80 -0
- package/src/private-file.ts +50 -0
- package/src/release-contract.ts +8 -2
- package/src/release-manifest.test.ts +42 -0
- package/src/release-manifest.ts +2 -0
- package/src/remote-mcp-edge.ts +137 -0
- package/src/remote-mcp.test.ts +517 -0
- package/src/remote-mcp.ts +460 -0
- package/src/runtime-secrets.test.ts +31 -6
- package/src/runtime-secrets.ts +41 -3
- package/src/seal-key-rotation.test.ts +131 -0
- package/src/seal-key-rotation.ts +258 -0
- package/src/stack-contract-parity.test.ts +20 -3
- package/src/stack-contract.test.ts +34 -2
- package/src/stack-contract.ts +305 -3
- package/src/stack-converge-secrets.test.ts +3 -0
- package/src/stack-converge.test.ts +21 -5
- package/src/stack-converge.ts +101 -7
- package/src/state-attach.test.ts +7 -1
- package/src/state-lock-lease.test.ts +302 -0
- package/src/state-lock-lease.ts +423 -0
- package/src/state-lock.test.ts +568 -0
- package/src/state-store.ts +347 -27
- package/src/tar-entries.test.ts +149 -7
- package/src/tar-entries.ts +90 -9
- package/src/upgrade/app-roll.ts +135 -21
- package/src/upgrade/audit-job-roll.ts +68 -0
- package/src/upgrade/converge.ts +170 -7
- package/src/upgrade/gcp-lookup.test.ts +80 -0
- package/src/upgrade/gcp-lookup.ts +65 -8
- package/src/upgrade/record-rolled.test.ts +105 -0
- package/src/upgrade/record-rolled.ts +91 -0
- package/src/upgrade/upgrade.test.ts +279 -5
- package/src/upgrade/upgrade.ts +120 -24
- package/src/upgrader-assess.test.ts +93 -3
- package/src/upgrader-assess.ts +58 -9
- package/src/upgrader-gcp.ts +47 -8
- package/src/upgrader-iam-preflight.test.ts +393 -0
- package/src/upgrader-iam-preflight.ts +510 -0
- package/src/upgrader-job.test.ts +587 -15
- package/src/upgrader-job.ts +237 -53
- package/src/upgrader-records.ts +151 -0
- package/src/upgrader-reporter.test.ts +6 -0
- package/src/upgrader-reporter.ts +7 -2
- package/src/upgrader-setup.test.ts +4 -3
- package/src/upgrader-setup.ts +137 -13
- package/src/wizards/gcp-cost.ts +15 -6
- package/src/wizards/gcp-pulumi.ts +7 -0
- package/src/wizards/gcp.ts +162 -4
- package/stacks/aws/index.ts +18 -0
- package/stacks/azure/index.ts +18 -0
- package/stacks/gcp/index.ts +59 -7
- package/stacks/gcp-firebase/index.ts +50 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrader-assess.d.ts","sourceRoot":"","sources":["../src/upgrader-assess.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"upgrader-assess.d.ts","sourceRoot":"","sources":["../src/upgrader-assess.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,OAAO,EACL,KAAK,eAAe,EAEpB,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EAExB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC3B,MAAM,uBAAuB,CAAC;AAG/B,gFAAgF;AAChF,MAAM,MAAM,WAAW,GACnB,UAAU,GACV,kBAAkB,GAClB,WAAW,GACX,qBAAqB,GACrB,yBAAyB,GACzB,WAAW,GACX,kBAAkB,GAClB,gBAAgB,GAChB,qBAAqB,GACrB,QAAQ,CAAC;AAEb,MAAM,MAAM,eAAe,GACvB;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,+EAA+E;IAC/E,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,mBAAmB,GAAG,QAAQ,CAAC;IAC5D,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,iCAAiC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC;CACrC,CAAC;AAEN,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC;;;OAGG;IACH,QAAQ,CAAC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9C;AAED,8EAA8E;AAC9E,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,QAAQ,CAAC;AAsBzD,oFAAoF;AACpF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;QACxC,uEAAuE;QACvE,QAAQ,CAAC,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;KAC7C,CAAC;IACF,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IACpC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IACnB,oDAAoD;IACpD,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC;IACxC;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;CAC1C,GAAG,eAAe,CAoJlB"}
|
package/dist/upgrader-assess.js
CHANGED
|
@@ -26,6 +26,8 @@
|
|
|
26
26
|
* | target not newer than installed (downgrade/same) | refused |
|
|
27
27
|
* | installed below the release's minFromVersion | refused |
|
|
28
28
|
* | release raises the infrastructure contract | needs_cloud_shell |
|
|
29
|
+
* | … on the converge route (#819, the converge job) | proceed |
|
|
30
|
+
* | … converge route, automatic, autoConverge off | refused |
|
|
29
31
|
* | contract (destructive) migrations, automatic run | refused |
|
|
30
32
|
* | contract migrations, Owner's click | proceed + warning |
|
|
31
33
|
* | automatic run the update policy does not allow | refused |
|
|
@@ -37,6 +39,13 @@
|
|
|
37
39
|
* that rolls the images. So for them `installed.infraContractVersion` is
|
|
38
40
|
* null and the infra-contract row never applies; every "needs_cloud_shell"
|
|
39
41
|
* stop names the upgrade command on the server instead of Cloud Shell.
|
|
42
|
+
*
|
|
43
|
+
* The converge job (#819, converge-job.ts) asks with `route: "converge"`:
|
|
44
|
+
* it runs as the install's provisioner, so an infrastructure change is what
|
|
45
|
+
* it is for — every other row still applies. An automatic run on the
|
|
46
|
+
* converge route needs the Owner's `autoConverge` (#864) on top of
|
|
47
|
+
* everything an automatic install needs; the scheduler queues one only
|
|
48
|
+
* then, and the job re-checks it here against the policy it claimed.
|
|
40
49
|
*/
|
|
41
50
|
import { autoInstallRefusal, updateKind, } from "@caelo-cms/shared";
|
|
42
51
|
import { infraStepsText } from "./infra-contract.js";
|
|
@@ -64,7 +73,13 @@ export function assessUpgradeRequest(input) {
|
|
|
64
73
|
const e = input.manifest.error;
|
|
65
74
|
switch (e.code) {
|
|
66
75
|
case "registry":
|
|
67
|
-
|
|
76
|
+
// Only an outage is worth retrying: a manifest the registry says
|
|
77
|
+
// does not exist (404 / other 4xx) never appears, so retrying would
|
|
78
|
+
// loop on "try again later" forever.
|
|
79
|
+
if (e.transient) {
|
|
80
|
+
return stop("failed", "registry", `Could not reach the Caelo release registry to verify v${target} (${e.message}). Nothing was changed; try again later.`);
|
|
81
|
+
}
|
|
82
|
+
return stop("refused", "manifest-missing", `v${target} has no signed release manifest in the Caelo release registry, so it cannot be verified and will not be installed. Nothing was changed; retrying will not help. (${e.message})`);
|
|
68
83
|
case "schema":
|
|
69
84
|
return stop("needs_cloud_shell", "manifest-unreadable", `This upgrader is too old to read the release information of v${target}. Install it once ${by}; afterwards the admin can install updates again. (${e.message})`);
|
|
70
85
|
default:
|
|
@@ -75,7 +90,13 @@ export function assessUpgradeRequest(input) {
|
|
|
75
90
|
if (installed.version === null) {
|
|
76
91
|
return stop("needs_cloud_shell", "install-version-unknown", `This install has not recorded which Caelo release it runs yet. Upgrade it once ${by}; that records it, and the admin can install updates from then on.`, manifest);
|
|
77
92
|
}
|
|
78
|
-
|
|
93
|
+
const order = compareSemver(target, installed.version);
|
|
94
|
+
if (order === 0) {
|
|
95
|
+
// Reached after a run that rolled but could not record it (#860): the
|
|
96
|
+
// next run re-records the serving release, which then is the target.
|
|
97
|
+
return stop("refused", "not-newer", `v${target} already serves on this install, so there is nothing to install. Nothing was changed.`, manifest);
|
|
98
|
+
}
|
|
99
|
+
if (order < 0) {
|
|
79
100
|
return stop("refused", "not-newer", `v${target} is not newer than the installed v${installed.version}; Caelo never installs an older release over a newer one.`, manifest);
|
|
80
101
|
}
|
|
81
102
|
if (compareSemver(installed.version, manifest.minFromVersion) < 0) {
|
|
@@ -83,13 +104,22 @@ export function assessUpgradeRequest(input) {
|
|
|
83
104
|
}
|
|
84
105
|
// Self-hosted: the target's own CLI renders the host setup in this run.
|
|
85
106
|
const infraContractVersion = installed.infraContractVersion ?? manifest.infraContractVersion;
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
107
|
+
const converge = input.route === "converge";
|
|
108
|
+
const infraChange = installed.infraContractVersion !== null &&
|
|
109
|
+
needsConverge({ infraContractVersion }, manifest.infraContractVersion);
|
|
110
|
+
if (infraChange && !converge) {
|
|
111
|
+
return stop("needs_cloud_shell", "infra-contract", `v${target} changes this install's cloud setup (infrastructure contract ${infraContractVersion} → ${manifest.infraContractVersion}: ${infraStepsText(infraContractVersion, manifest.infraContractVersion)}). The upgrader may not change cloud permissions, so Caelo installs this release with its converge job: start it again from Settings → Updates. On an install without the converge job, install it once with your own Google account in Cloud Shell.`, manifest);
|
|
112
|
+
}
|
|
113
|
+
if (converge && request.trigger === "auto" && !input.policy.autoConverge) {
|
|
114
|
+
return stop("refused", "policy", `Not installed automatically: v${target} changes this install's cloud setup, and the update policy does not install those automatically. Install it from Settings → Updates.`, manifest);
|
|
89
115
|
}
|
|
116
|
+
// On the converge route the contract bump is the job's work, not a
|
|
117
|
+
// reason for a manual install: only the migrations decide below.
|
|
90
118
|
const assessment = assessAutoInstall(manifest, {
|
|
91
119
|
version: installed.version,
|
|
92
|
-
infraContractVersion
|
|
120
|
+
infraContractVersion: converge
|
|
121
|
+
? Math.max(infraContractVersion, manifest.infraContractVersion)
|
|
122
|
+
: infraContractVersion,
|
|
93
123
|
});
|
|
94
124
|
const destructive = assessment.mode === "manual";
|
|
95
125
|
const warnings = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrader-assess.js","sourceRoot":"","sources":["../src/upgrader-assess.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC
|
|
1
|
+
{"version":3,"file":"upgrader-assess.js","sourceRoot":"","sources":["../src/upgrader-assess.ts"],"names":[],"mappings":"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"}
|
package/dist/upgrader-gcp.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { type GcloudRunner } from "./gcloud-retry.js";
|
|
2
|
+
import type { HttpFetch } from "./runtime-secrets.js";
|
|
3
|
+
import type { AppRollPlan } from "./upgrade/app-roll.js";
|
|
2
4
|
import type { UpdateQueue, UpgraderJobDeps } from "./upgrader-job.js";
|
|
3
5
|
import type { JobLog } from "./upgrader-reporter.js";
|
|
4
6
|
/** Where the job runs, from the metadata server. */
|
|
@@ -12,6 +14,19 @@ export interface UpgraderPlacement {
|
|
|
12
14
|
* too (as its own IAM database user). Read from the deployed admin service.
|
|
13
15
|
*/
|
|
14
16
|
export declare function upgraderDatabaseHost(placement: Pick<UpgraderPlacement, "projectId" | "region">, run?: GcloudRunner): Promise<string>;
|
|
17
|
+
/**
|
|
18
|
+
* The IAP-backed deep health probe for `plan`'s install (the upgrader job;
|
|
19
|
+
* the converge job, #819, too).
|
|
20
|
+
*/
|
|
21
|
+
export declare function healthProbeFor(run: GcloudRunner, http: HttpFetch, plan: AppRollPlan): Promise<{
|
|
22
|
+
ok: false;
|
|
23
|
+
error: string;
|
|
24
|
+
probe?: undefined;
|
|
25
|
+
} | {
|
|
26
|
+
ok: true;
|
|
27
|
+
probe: import("./upgrade/health.js").HealthProbe;
|
|
28
|
+
error?: undefined;
|
|
29
|
+
}>;
|
|
15
30
|
/** Every dependency of {@link runUpgraderJob} except the database and the log. */
|
|
16
31
|
export declare function gcpUpgraderDeps(placement: UpgraderPlacement, queue: UpdateQueue, log: JobLog): UpgraderJobDeps;
|
|
17
32
|
//# sourceMappingURL=upgrader-gcp.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrader-gcp.d.ts","sourceRoot":"","sources":["../src/upgrader-gcp.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,KAAK,YAAY,EAAa,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"upgrader-gcp.d.ts","sourceRoot":"","sources":["../src/upgrader-gcp.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,KAAK,YAAY,EAAa,MAAM,mBAAmB,CAAC;AAKjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAIzD,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAGrD,oDAAoD;AACpD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,IAAI,CAAC,iBAAiB,EAAE,WAAW,GAAG,QAAQ,CAAC,EAC1D,GAAG,GAAE,YAAqB,GACzB,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW;;;;;;;;GAuBzF;AAED,kFAAkF;AAClF,wBAAgB,eAAe,CAC7B,SAAS,EAAE,iBAAiB,EAC5B,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,MAAM,GACV,eAAe,CAoEjB"}
|
package/dist/upgrader-gcp.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* The real side effects of the upgrader job on Google Cloud (epic #696):
|
|
4
4
|
* gcloud as the job's own service account, the install's ops bucket for
|
|
5
|
-
* install.json, the fixed release registry, the migration job
|
|
6
|
-
* health probe. upgrader-job.ts takes them as {@link UpgraderJobDeps}; the
|
|
5
|
+
* install.json, the fixed release registry, the migration job, the IAP
|
|
6
|
+
* health probe and the IAM self-check (#818). upgrader-job.ts takes them as {@link UpgraderJobDeps}; the
|
|
7
7
|
* database queue and the job log come from `@caelo-cms/platform-updater`,
|
|
8
8
|
* which owns the Query API connection.
|
|
9
9
|
*
|
|
@@ -20,9 +20,11 @@ import { GCP_STACK_ENV } from "./gcp-names.js";
|
|
|
20
20
|
import { readAdminConfig, runMigrationsViaCloudRunJob } from "./migration-runner.js";
|
|
21
21
|
import { fetchVerifiedReleaseManifest } from "./release-manifest.js";
|
|
22
22
|
import { opsBucketName } from "./state-backend.js";
|
|
23
|
-
import { acquireBucketStateLock, GcsStateStore } from "./state-store.js";
|
|
23
|
+
import { acquireBucketStateLock, GcsStateStore, realSyncGcloud } from "./state-store.js";
|
|
24
24
|
import { findServiceUrl } from "./upgrade/gcp-lookup.js";
|
|
25
25
|
import { createIapHealthProbe } from "./upgrade/health.js";
|
|
26
|
+
import { restIamTester } from "./upgrader-iam-preflight.js";
|
|
27
|
+
import { UPGRADER_TASK_TIMEOUT_MINUTES } from "./upgrader-setup.js";
|
|
26
28
|
/**
|
|
27
29
|
* The Cloud SQL private IP the admin connects to — the job connects there
|
|
28
30
|
* too (as its own IAM database user). Read from the deployed admin service.
|
|
@@ -34,8 +36,11 @@ export async function upgraderDatabaseHost(placement, run = gcloud) {
|
|
|
34
36
|
}
|
|
35
37
|
return cfg.databaseHost;
|
|
36
38
|
}
|
|
37
|
-
/**
|
|
38
|
-
|
|
39
|
+
/**
|
|
40
|
+
* The IAP-backed deep health probe for `plan`'s install (the upgrader job;
|
|
41
|
+
* the converge job, #819, too).
|
|
42
|
+
*/
|
|
43
|
+
export async function healthProbeFor(run, http, plan) {
|
|
39
44
|
const { install } = plan;
|
|
40
45
|
const urls = {};
|
|
41
46
|
for (const s of plan.services) {
|
|
@@ -70,11 +75,41 @@ export function gcpUpgraderDeps(placement, queue, log) {
|
|
|
70
75
|
region: placement.region,
|
|
71
76
|
env: GCP_STACK_ENV,
|
|
72
77
|
execution: placement.execution,
|
|
78
|
+
// #818 — the IAM self-check asks as the job's own account (gcloud's
|
|
79
|
+
// token from the metadata server), so it sees exactly the job's grants.
|
|
80
|
+
iam: restIamTester({
|
|
81
|
+
http,
|
|
82
|
+
token: async () => {
|
|
83
|
+
const t = await run(["auth", "print-access-token"]);
|
|
84
|
+
if (!t.ok)
|
|
85
|
+
throw new Error(`gcloud auth print-access-token: ${t.stderr.trim()}`);
|
|
86
|
+
return t.stdout.trim();
|
|
87
|
+
},
|
|
88
|
+
}),
|
|
73
89
|
// The default deps: the fixed registry and signer, never overridden.
|
|
74
90
|
fetchManifest: (version) => fetchVerifiedReleaseManifest(version),
|
|
75
|
-
|
|
91
|
+
// #815 — the lock names this execution, so a later run can break it
|
|
92
|
+
// once Cloud Run says this one has ended (killed at its task timeout,
|
|
93
|
+
// OOM). Outside Cloud Run there is no execution to vouch for it.
|
|
94
|
+
lockState: (onBreak) => acquireBucketStateLock(opsBucketName(placement.projectId), "caelo upgrader job", realSyncGcloud, {
|
|
95
|
+
onBreak,
|
|
96
|
+
...(placement.execution
|
|
97
|
+
? {
|
|
98
|
+
holder: {
|
|
99
|
+
execution: {
|
|
100
|
+
projectId: placement.projectId,
|
|
101
|
+
region: placement.region,
|
|
102
|
+
name: placement.execution,
|
|
103
|
+
},
|
|
104
|
+
maxRuntimeMs: UPGRADER_TASK_TIMEOUT_MINUTES * 60_000,
|
|
105
|
+
},
|
|
106
|
+
}
|
|
107
|
+
: {}),
|
|
108
|
+
}),
|
|
109
|
+
// Uncached on purpose: the job re-reads install.json once it holds the
|
|
110
|
+
// lock to see whether another writer changed it meanwhile (#815).
|
|
76
111
|
readInstall: () => {
|
|
77
|
-
const text = store.
|
|
112
|
+
const text = store.peek("install.json");
|
|
78
113
|
return text === null ? null : JSON.parse(text);
|
|
79
114
|
},
|
|
80
115
|
writeInstall: (meta) => store.write("install.json", meta),
|
package/dist/upgrader-gcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrader-gcp.js","sourceRoot":"","sources":["../src/upgrader-gcp.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAqB,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"upgrader-gcp.js","sourceRoot":"","sources":["../src/upgrader-gcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import type { HttpFetch } from "./runtime-secrets.js";
|
|
2
|
+
/** A resource IAM can be asked about. */
|
|
3
|
+
export type IamResource = {
|
|
4
|
+
readonly kind: "project";
|
|
5
|
+
readonly projectId: string;
|
|
6
|
+
} | {
|
|
7
|
+
readonly kind: "service-account";
|
|
8
|
+
readonly projectId: string;
|
|
9
|
+
readonly email: string;
|
|
10
|
+
} | {
|
|
11
|
+
readonly kind: "run-job";
|
|
12
|
+
readonly projectId: string;
|
|
13
|
+
readonly region: string;
|
|
14
|
+
readonly name: string;
|
|
15
|
+
} | {
|
|
16
|
+
readonly kind: "bucket";
|
|
17
|
+
readonly bucket: string;
|
|
18
|
+
}
|
|
19
|
+
/** Objects under `prefix/` in `bucket`, behind a name-conditioned grant (probed). */
|
|
20
|
+
| {
|
|
21
|
+
readonly kind: "bucket-objects";
|
|
22
|
+
readonly bucket: string;
|
|
23
|
+
readonly prefix: string;
|
|
24
|
+
} | {
|
|
25
|
+
readonly kind: "artifact-repository";
|
|
26
|
+
readonly projectId: string;
|
|
27
|
+
readonly location: string;
|
|
28
|
+
readonly repository: string;
|
|
29
|
+
};
|
|
30
|
+
/** One thing the run will do, the permissions it takes, and where. */
|
|
31
|
+
export interface AccessCheck {
|
|
32
|
+
/** What the upgrader could not do without them, in plain words. */
|
|
33
|
+
readonly need: string;
|
|
34
|
+
readonly resource: IamResource;
|
|
35
|
+
readonly permissions: readonly string[];
|
|
36
|
+
}
|
|
37
|
+
/** A check with the permissions it lacks. */
|
|
38
|
+
export interface MissingAccess {
|
|
39
|
+
readonly check: AccessCheck;
|
|
40
|
+
readonly missing: readonly string[];
|
|
41
|
+
/**
|
|
42
|
+
* Permissions that could not be judged because another one is missing
|
|
43
|
+
* first (storage.objects.get needs storage.objects.list to be testable).
|
|
44
|
+
*/
|
|
45
|
+
readonly unchecked?: readonly string[];
|
|
46
|
+
}
|
|
47
|
+
/** The permissions IAM confirmed on one resource, or why it could not be asked. */
|
|
48
|
+
export type GrantedResult = {
|
|
49
|
+
readonly ok: true;
|
|
50
|
+
readonly granted: readonly string[];
|
|
51
|
+
} | {
|
|
52
|
+
readonly ok: false;
|
|
53
|
+
readonly error: string;
|
|
54
|
+
};
|
|
55
|
+
/** Asks IAM which of `permissions` the job's identity holds on `resource`. */
|
|
56
|
+
export interface IamTester {
|
|
57
|
+
granted(resource: IamResource, permissions: readonly string[]): Promise<GrantedResult>;
|
|
58
|
+
}
|
|
59
|
+
/** How the self-check came out. */
|
|
60
|
+
export type PreflightOutcome = {
|
|
61
|
+
readonly kind: "ok";
|
|
62
|
+
} | {
|
|
63
|
+
readonly kind: "missing";
|
|
64
|
+
readonly missing: readonly MissingAccess[];
|
|
65
|
+
}
|
|
66
|
+
/** IAM could not be asked about at least one resource; nothing was judged missing. */
|
|
67
|
+
| {
|
|
68
|
+
readonly kind: "error";
|
|
69
|
+
readonly errors: readonly string[];
|
|
70
|
+
};
|
|
71
|
+
/** The object the `install/` probes name. It is never written: every probe fails its precondition. */
|
|
72
|
+
export declare const PREFLIGHT_PROBE_OBJECT = ".caelo-iam-preflight";
|
|
73
|
+
/**
|
|
74
|
+
* Every permission an upgrader run needs after its decision, grouped by
|
|
75
|
+
* what it is for (upgrade/app-roll.ts, migration-runner.ts, backup.ts,
|
|
76
|
+
* health.ts, state-store.ts, the self-update in upgrader-job.ts). Keep in
|
|
77
|
+
* step with the grants in upgrader-setup.ts: a permission listed here that
|
|
78
|
+
* setup does not grant stops every update.
|
|
79
|
+
*/
|
|
80
|
+
export declare function upgraderAccessChecks(target: {
|
|
81
|
+
readonly projectId: string;
|
|
82
|
+
readonly region: string;
|
|
83
|
+
readonly env: string;
|
|
84
|
+
}): AccessCheck[];
|
|
85
|
+
/** Ask IAM about every check (one call per resource); never throws. */
|
|
86
|
+
export declare function runIamPreflight(checks: readonly AccessCheck[], tester: IamTester): Promise<PreflightOutcome>;
|
|
87
|
+
/**
|
|
88
|
+
* The request's end reason for missing permissions: every one of them, each
|
|
89
|
+
* with what it is for, then the one next step.
|
|
90
|
+
*/
|
|
91
|
+
export declare function preflightMissingReason(missing: readonly MissingAccess[]): string;
|
|
92
|
+
/** The request's end reason when IAM could not be asked. */
|
|
93
|
+
export declare function preflightErrorReason(errors: readonly string[]): string;
|
|
94
|
+
/** A resource's full name, as IAM and the messages name it. */
|
|
95
|
+
export declare function resourceName(r: IamResource): string;
|
|
96
|
+
/**
|
|
97
|
+
* The real {@link IamTester}: Google's REST APIs with the job's own access
|
|
98
|
+
* token. `token` is asked once per call (gcloud caches it).
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* const tester = restIamTester({ http: fetch, token: async () => "<access token>" });
|
|
102
|
+
* await tester.granted({ kind: "project", projectId: "acme" }, ["run.services.get"]);
|
|
103
|
+
*/
|
|
104
|
+
export declare function restIamTester(deps: {
|
|
105
|
+
readonly http: HttpFetch;
|
|
106
|
+
readonly token: () => Promise<string>;
|
|
107
|
+
}): IamTester;
|
|
108
|
+
/** The testIamPermissions request for a resource that has one. */
|
|
109
|
+
export declare function testIamCall(resource: Exclude<IamResource, {
|
|
110
|
+
kind: "bucket-objects";
|
|
111
|
+
}>, permissions: readonly string[]): {
|
|
112
|
+
url: string;
|
|
113
|
+
method: "GET" | "POST";
|
|
114
|
+
body?: string;
|
|
115
|
+
};
|
|
116
|
+
/** The precondition-guarded request that tests one object permission (see the file comment). */
|
|
117
|
+
export declare function objectProbeCall(resource: Extract<IamResource, {
|
|
118
|
+
kind: "bucket-objects";
|
|
119
|
+
}>, permission: string): {
|
|
120
|
+
url: string;
|
|
121
|
+
method: "GET" | "POST" | "DELETE";
|
|
122
|
+
} | null;
|
|
123
|
+
//# sourceMappingURL=upgrader-iam-preflight.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrader-iam-preflight.d.ts","sourceRoot":"","sources":["../src/upgrader-iam-preflight.ts"],"names":[],"mappings":"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"}
|