@caelo-cms/provisioning 0.10.44 → 0.10.47

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.
Files changed (146) hide show
  1. package/dist/adc-impersonation.d.ts +28 -0
  2. package/dist/adc-impersonation.d.ts.map +1 -0
  3. package/dist/adc-impersonation.js +148 -0
  4. package/dist/adc-impersonation.js.map +1 -0
  5. package/dist/checkpoint-secrets.d.ts.map +1 -1
  6. package/dist/checkpoint-secrets.js +2 -1
  7. package/dist/checkpoint-secrets.js.map +1 -1
  8. package/dist/cli.js +202 -33
  9. package/dist/cli.js.map +1 -1
  10. package/dist/compose.d.ts +45 -0
  11. package/dist/compose.d.ts.map +1 -1
  12. package/dist/compose.js +112 -29
  13. package/dist/compose.js.map +1 -1
  14. package/dist/gcloud-retry.d.ts +5 -1
  15. package/dist/gcloud-retry.d.ts.map +1 -1
  16. package/dist/gcloud-retry.js.map +1 -1
  17. package/dist/gcloud.d.ts +2 -1
  18. package/dist/gcloud.d.ts.map +1 -1
  19. package/dist/gcloud.js +11 -13
  20. package/dist/gcloud.js.map +1 -1
  21. package/dist/index.d.ts +3 -0
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +3 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/infra-contract.d.ts +24 -0
  26. package/dist/infra-contract.d.ts.map +1 -0
  27. package/dist/infra-contract.js +25 -0
  28. package/dist/infra-contract.js.map +1 -0
  29. package/dist/install-state.d.ts +66 -2
  30. package/dist/install-state.d.ts.map +1 -1
  31. package/dist/install-state.js +162 -22
  32. package/dist/install-state.js.map +1 -1
  33. package/dist/lifecycle.d.ts +6 -0
  34. package/dist/lifecycle.d.ts.map +1 -1
  35. package/dist/lifecycle.js +189 -819
  36. package/dist/lifecycle.js.map +1 -1
  37. package/dist/migration-runner.d.ts +3 -0
  38. package/dist/migration-runner.d.ts.map +1 -1
  39. package/dist/migration-runner.js +7 -5
  40. package/dist/migration-runner.js.map +1 -1
  41. package/dist/ops-backend.d.ts +46 -0
  42. package/dist/ops-backend.d.ts.map +1 -0
  43. package/dist/ops-backend.js +370 -0
  44. package/dist/ops-backend.js.map +1 -0
  45. package/dist/provisioner-identity.d.ts +103 -0
  46. package/dist/provisioner-identity.d.ts.map +1 -0
  47. package/dist/provisioner-identity.js +323 -0
  48. package/dist/provisioner-identity.js.map +1 -0
  49. package/dist/regions.d.ts.map +1 -1
  50. package/dist/regions.js +2 -1
  51. package/dist/regions.js.map +1 -1
  52. package/dist/release-contract.d.ts +37 -0
  53. package/dist/release-contract.d.ts.map +1 -0
  54. package/dist/release-contract.js +55 -0
  55. package/dist/release-contract.js.map +1 -0
  56. package/dist/release-manifest.d.ts +140 -0
  57. package/dist/release-manifest.d.ts.map +1 -0
  58. package/dist/release-manifest.js +319 -0
  59. package/dist/release-manifest.js.map +1 -0
  60. package/dist/self-command.d.ts +16 -0
  61. package/dist/self-command.d.ts.map +1 -0
  62. package/dist/self-command.js +20 -0
  63. package/dist/self-command.js.map +1 -0
  64. package/dist/self-hosted-release.d.ts +81 -0
  65. package/dist/self-hosted-release.d.ts.map +1 -0
  66. package/dist/self-hosted-release.js +148 -0
  67. package/dist/self-hosted-release.js.map +1 -0
  68. package/dist/self-hosted-upgrade.d.ts +91 -0
  69. package/dist/self-hosted-upgrade.d.ts.map +1 -0
  70. package/dist/self-hosted-upgrade.js +355 -0
  71. package/dist/self-hosted-upgrade.js.map +1 -0
  72. package/dist/stack-converge.d.ts.map +1 -1
  73. package/dist/stack-converge.js +2 -1
  74. package/dist/stack-converge.js.map +1 -1
  75. package/dist/state-attach.d.ts +23 -0
  76. package/dist/state-attach.d.ts.map +1 -0
  77. package/dist/state-attach.js +112 -0
  78. package/dist/state-attach.js.map +1 -0
  79. package/dist/state-backend.d.ts +114 -0
  80. package/dist/state-backend.d.ts.map +1 -0
  81. package/dist/state-backend.js +200 -0
  82. package/dist/state-backend.js.map +1 -0
  83. package/dist/state-command.d.ts +20 -0
  84. package/dist/state-command.d.ts.map +1 -0
  85. package/dist/state-command.js +237 -0
  86. package/dist/state-command.js.map +1 -0
  87. package/dist/state-migrate.d.ts +121 -0
  88. package/dist/state-migrate.d.ts.map +1 -0
  89. package/dist/state-migrate.js +290 -0
  90. package/dist/state-migrate.js.map +1 -0
  91. package/dist/state-pulumi.d.ts +17 -0
  92. package/dist/state-pulumi.d.ts.map +1 -0
  93. package/dist/state-pulumi.js +218 -0
  94. package/dist/state-pulumi.js.map +1 -0
  95. package/dist/state-store.d.ts +82 -0
  96. package/dist/state-store.d.ts.map +1 -0
  97. package/dist/state-store.js +205 -0
  98. package/dist/state-store.js.map +1 -0
  99. package/dist/upgrade/app-roll.d.ts +164 -0
  100. package/dist/upgrade/app-roll.d.ts.map +1 -0
  101. package/dist/upgrade/app-roll.js +270 -0
  102. package/dist/upgrade/app-roll.js.map +1 -0
  103. package/dist/upgrade/backup.d.ts +48 -0
  104. package/dist/upgrade/backup.d.ts.map +1 -0
  105. package/dist/upgrade/backup.js +71 -0
  106. package/dist/upgrade/backup.js.map +1 -0
  107. package/dist/upgrade/converge.d.ts +45 -0
  108. package/dist/upgrade/converge.d.ts.map +1 -0
  109. package/dist/upgrade/converge.js +287 -0
  110. package/dist/upgrade/converge.js.map +1 -0
  111. package/dist/upgrade/gcp-lookup.d.ts +23 -0
  112. package/dist/upgrade/gcp-lookup.d.ts.map +1 -0
  113. package/dist/upgrade/gcp-lookup.js +95 -0
  114. package/dist/upgrade/gcp-lookup.js.map +1 -0
  115. package/dist/upgrade/health.d.ts +99 -0
  116. package/dist/upgrade/health.d.ts.map +1 -0
  117. package/dist/upgrade/health.js +214 -0
  118. package/dist/upgrade/health.js.map +1 -0
  119. package/dist/upgrade/release-images.d.ts +125 -0
  120. package/dist/upgrade/release-images.d.ts.map +1 -0
  121. package/dist/upgrade/release-images.js +315 -0
  122. package/dist/upgrade/release-images.js.map +1 -0
  123. package/dist/upgrade/reporter.d.ts +17 -0
  124. package/dist/upgrade/reporter.d.ts.map +1 -0
  125. package/dist/upgrade/reporter.js +28 -0
  126. package/dist/upgrade/reporter.js.map +1 -0
  127. package/dist/upgrade/upgrade.d.ts +79 -0
  128. package/dist/upgrade/upgrade.d.ts.map +1 -0
  129. package/dist/upgrade/upgrade.js +105 -0
  130. package/dist/upgrade/upgrade.js.map +1 -0
  131. package/dist/wizard.d.ts.map +1 -1
  132. package/dist/wizard.js +7 -3
  133. package/dist/wizard.js.map +1 -1
  134. package/dist/wizards/gcp-cost.d.ts.map +1 -1
  135. package/dist/wizards/gcp-cost.js +7 -1
  136. package/dist/wizards/gcp-cost.js.map +1 -1
  137. package/dist/wizards/gcp-pulumi.d.ts +104 -8
  138. package/dist/wizards/gcp-pulumi.d.ts.map +1 -1
  139. package/dist/wizards/gcp-pulumi.js +159 -50
  140. package/dist/wizards/gcp-pulumi.js.map +1 -1
  141. package/dist/wizards/gcp.d.ts.map +1 -1
  142. package/dist/wizards/gcp.js +246 -78
  143. package/dist/wizards/gcp.js.map +1 -1
  144. package/package.json +4 -3
  145. package/stacks/self-hosted/README.md +4 -0
  146. package/stacks/self-hosted/index.ts +10 -2
@@ -0,0 +1,82 @@
1
+ import { type GcloudResult } from "./gcloud.js";
2
+ /** The two documents a store holds. */
3
+ export type StateFile = "install.json" | "progress.json";
4
+ /** Reads and writes an install's metadata documents. */
5
+ export interface StateStore {
6
+ readonly kind: "local" | "gcs";
7
+ /** The document's text, or null when it does not exist. */
8
+ read(file: StateFile): string | null;
9
+ /** Replace the document. Refuses secret material. */
10
+ write(file: StateFile, value: unknown): void;
11
+ }
12
+ /** A synchronous gcloud invocation; `input` is fed on stdin. Tests pass a fake. */
13
+ export type SyncGcloud = (args: string[], input?: string) => GcloudResult;
14
+ /** The real {@link SyncGcloud}: `gcloud` with prompts disabled. */
15
+ export declare const realSyncGcloud: SyncGcloud;
16
+ /**
17
+ * Serialize a document after the checkpoint-secrets guard. install.json is
18
+ * checked for any secret; progress.json with the checkpoint rules (step
19
+ * payloads, outputs).
20
+ */
21
+ export declare function serializeGuarded(file: StateFile, value: unknown): string;
22
+ /** install.json + progress.json in `~/.caelo-<id>/`. */
23
+ export declare class LocalStateStore implements StateStore {
24
+ private readonly root;
25
+ readonly kind: "local";
26
+ constructor(root: string);
27
+ read(file: StateFile): string | null;
28
+ write(file: StateFile, value: unknown): void;
29
+ }
30
+ /**
31
+ * install.json + progress.json in the ops bucket, mirrored to
32
+ * `~/.caelo-<id>/`. The first read of a document in a process fetches it
33
+ * from the bucket; later reads use the in-memory copy, which every write
34
+ * updates. A bucket error throws — the bucket is the source of truth, so
35
+ * silently using the local mirror could resume from a stale checkpoint.
36
+ */
37
+ export declare class GcsStateStore implements StateStore {
38
+ private readonly bucket;
39
+ private readonly root;
40
+ private readonly run;
41
+ readonly kind: "gcs";
42
+ private readonly cache;
43
+ constructor(bucket: string, root: string, run?: SyncGcloud);
44
+ /** `gs://<bucket>/install/<file>`. */
45
+ objectUrl(file: StateFile): string;
46
+ /**
47
+ * The document as the bucket holds it right now, without caching it or
48
+ * touching the local mirror — for looking at a bucket this machine may
49
+ * not own (the wizard's "is this project already an install?" check).
50
+ */
51
+ peek(file: StateFile): string | null;
52
+ read(file: StateFile): string | null;
53
+ write(file: StateFile, value: unknown): void;
54
+ }
55
+ /** `gs://<bucket>/install/state.lock` — see {@link acquireBucketStateLock}. */
56
+ export declare function bucketStateLockUrl(bucket: string): string;
57
+ /**
58
+ * The install's state lock in its ops bucket, created only if absent
59
+ * (`--if-generation-match=0`). Held by every writer of a bucket-backed
60
+ * install's state — an installer run's `pulumi up`, `state migrate` — so
61
+ * none writes a backend another is switching away from. A lock left by a
62
+ * crashed run is reported with the command to remove it, never broken
63
+ * automatically.
64
+ *
65
+ * @returns the release function
66
+ */
67
+ export declare function acquireBucketStateLock(bucket: string, purpose: string, run?: SyncGcloud): () => void;
68
+ /**
69
+ * The same lock for an install whose state is on this machine:
70
+ * `~/.caelo-<id>/state.lock`, created exclusively.
71
+ *
72
+ * @returns the release function
73
+ */
74
+ export declare function acquireLocalStateLock(root: string, purpose: string): () => void;
75
+ /** The state lock for whichever backend `bucket` (gcs) or `root` (local) names. */
76
+ export declare function acquireStateLock(backend: {
77
+ readonly kind: "local";
78
+ } | {
79
+ readonly kind: "gcs";
80
+ readonly bucket: string;
81
+ }, root: string, purpose: string, run?: SyncGcloud): () => void;
82
+ //# sourceMappingURL=state-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-store.d.ts","sourceRoot":"","sources":["../src/state-store.ts"],"names":[],"mappings":"AA4BA,OAAO,EAAE,KAAK,YAAY,EAAa,MAAM,aAAa,CAAC;AAG3D,uCAAuC;AACvC,MAAM,MAAM,SAAS,GAAG,cAAc,GAAG,eAAe,CAAC;AAEzD,wDAAwD;AACxD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC;IAC/B,2DAA2D;IAC3D,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC;IACrC,qDAAqD;IACrD,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9C;AAED,mFAAmF;AACnF,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,YAAY,CAAC;AAE1E,mEAAmE;AACnE,eAAO,MAAM,cAAc,EAAE,UAc5B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAIxE;AAcD,wDAAwD;AACxD,qBAAa,eAAgB,YAAW,UAAU;IAEpC,OAAO,CAAC,QAAQ,CAAC,IAAI;IADjC,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;gBACJ,IAAI,EAAE,MAAM;IAEzC,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI;IAKpC,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;CAG7C;AAKD;;;;;;GAMG;AACH,qBAAa,aAAc,YAAW,UAAU;IAK5C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,GAAG;IANtB,QAAQ,CAAC,IAAI,EAAG,KAAK,CAAU;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuC;gBAG1C,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,UAA2B;IAGnD,sCAAsC;IACtC,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAIlC;;;;OAIG;IACH,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI;IASpC,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI;IAQpC,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;CAc7C;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEzD;AAYD;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,GAAG,GAAE,UAA2B,GAC/B,MAAM,IAAI,CAgBZ;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,IAAI,CAa/E;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACvF,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,GAAG,GAAE,UAA2B,GAC/B,MAAM,IAAI,CAIZ"}
@@ -0,0 +1,205 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+ /**
3
+ * Where install.json and progress.json are read from and written to (#696).
4
+ *
5
+ * - {@link LocalStateStore}: `~/.caelo-<id>/` — every install before #696,
6
+ * and self-hosted always.
7
+ * - {@link GcsStateStore}: the install's ops bucket
8
+ * (`gs://<project>-caelo-ops/install/`), which is authoritative. A local
9
+ * copy is kept in `~/.caelo-<id>/` so `listInstalls` and the install
10
+ * picker work offline, but every read in a process starts from the
11
+ * bucket and every write goes to the bucket first.
12
+ *
13
+ * Both stores refuse to write secret material (checkpoint-secrets.ts, #656 /
14
+ * #659): install.json and progress.json are read by tooling, backups and
15
+ * agents, and a bucket copy is no place for a database password either. The
16
+ * guard sits inside each store's `write`, so no caller can skip it.
17
+ *
18
+ * The interface is synchronous on purpose: install-state.ts's callers (the
19
+ * wizard steps, `markStepDone`, the lifecycle commands) are synchronous, and
20
+ * the bucket store shells out to `gcloud storage` synchronously.
21
+ */
22
+ import { spawnSync } from "node:child_process";
23
+ import { existsSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
24
+ import { hostname } from "node:os";
25
+ import { join } from "node:path";
26
+ import { assertNoCheckpointSecrets, assertNoSecrets } from "./checkpoint-secrets.js";
27
+ import { gcloudEnv } from "./gcloud.js";
28
+ import { OPS_INSTALL_PREFIX } from "./state-backend.js";
29
+ /** The real {@link SyncGcloud}: `gcloud` with prompts disabled. */
30
+ export const realSyncGcloud = (args, input) => {
31
+ const r = spawnSync("gcloud", args, {
32
+ env: gcloudEnv(),
33
+ encoding: "utf8",
34
+ maxBuffer: 16 * 1024 * 1024,
35
+ ...(input !== undefined ? { input } : { stdio: ["ignore", "pipe", "pipe"] }),
36
+ });
37
+ if (r.error)
38
+ throw r.error;
39
+ return {
40
+ ok: r.status === 0,
41
+ stdout: r.stdout ?? "",
42
+ stderr: r.stderr ?? "",
43
+ exitCode: r.status ?? 1,
44
+ };
45
+ };
46
+ /**
47
+ * Serialize a document after the checkpoint-secrets guard. install.json is
48
+ * checked for any secret; progress.json with the checkpoint rules (step
49
+ * payloads, outputs).
50
+ */
51
+ export function serializeGuarded(file, value) {
52
+ if (file === "install.json")
53
+ assertNoSecrets(value, file);
54
+ else
55
+ assertNoCheckpointSecrets(value, file);
56
+ return `${JSON.stringify(value, null, 2)}\n`;
57
+ }
58
+ /** Atomic mode-0600 write (temp file + rename in the same directory). */
59
+ function writeTextAtomic(path, text) {
60
+ const tmp = `${path}.tmp-${process.pid}`;
61
+ try {
62
+ writeFileSync(tmp, text, { mode: 0o600 });
63
+ renameSync(tmp, path);
64
+ }
65
+ catch (e) {
66
+ rmSync(tmp, { force: true });
67
+ throw e;
68
+ }
69
+ }
70
+ /** install.json + progress.json in `~/.caelo-<id>/`. */
71
+ export class LocalStateStore {
72
+ root;
73
+ kind = "local";
74
+ constructor(root) {
75
+ this.root = root;
76
+ }
77
+ read(file) {
78
+ const path = join(this.root, file);
79
+ return existsSync(path) ? readFileSync(path, "utf8") : null;
80
+ }
81
+ write(file, value) {
82
+ writeTextAtomic(join(this.root, file), serializeGuarded(file, value));
83
+ }
84
+ }
85
+ /** gcloud's wording for an object that is not there. */
86
+ const NOT_FOUND = /matched no objects|No URLs matched|NotFound|404|does not exist/i;
87
+ /**
88
+ * install.json + progress.json in the ops bucket, mirrored to
89
+ * `~/.caelo-<id>/`. The first read of a document in a process fetches it
90
+ * from the bucket; later reads use the in-memory copy, which every write
91
+ * updates. A bucket error throws — the bucket is the source of truth, so
92
+ * silently using the local mirror could resume from a stale checkpoint.
93
+ */
94
+ export class GcsStateStore {
95
+ bucket;
96
+ root;
97
+ run;
98
+ kind = "gcs";
99
+ cache = new Map();
100
+ constructor(bucket, root, run = realSyncGcloud) {
101
+ this.bucket = bucket;
102
+ this.root = root;
103
+ this.run = run;
104
+ }
105
+ /** `gs://<bucket>/install/<file>`. */
106
+ objectUrl(file) {
107
+ return `gs://${this.bucket}/${OPS_INSTALL_PREFIX}/${file}`;
108
+ }
109
+ /**
110
+ * The document as the bucket holds it right now, without caching it or
111
+ * touching the local mirror — for looking at a bucket this machine may
112
+ * not own (the wizard's "is this project already an install?" check).
113
+ */
114
+ peek(file) {
115
+ const r = this.run(["storage", "cat", this.objectUrl(file)]);
116
+ if (r.ok)
117
+ return r.stdout;
118
+ if (NOT_FOUND.test(r.stderr))
119
+ return null;
120
+ throw new Error(`Could not read ${this.objectUrl(file)}: ${r.stderr.trim() || `gcloud exited ${r.exitCode}`}. Check that you are signed in (gcloud auth login) as an account with access to the install's ops bucket.`);
121
+ }
122
+ read(file) {
123
+ if (this.cache.has(file))
124
+ return this.cache.get(file) ?? null;
125
+ const text = this.peek(file);
126
+ this.cache.set(file, text);
127
+ if (text !== null)
128
+ writeTextAtomic(join(this.root, file), text);
129
+ return text;
130
+ }
131
+ write(file, value) {
132
+ const text = serializeGuarded(file, value);
133
+ const r = this.run(["storage", "cp", "-", this.objectUrl(file), "--content-type=application/json"], text);
134
+ if (!r.ok) {
135
+ throw new Error(`Could not write ${this.objectUrl(file)}: ${r.stderr.trim() || `gcloud exited ${r.exitCode}`}. Nothing was changed locally; fix access to the ops bucket and re-run.`);
136
+ }
137
+ this.cache.set(file, text);
138
+ writeTextAtomic(join(this.root, file), text);
139
+ }
140
+ }
141
+ /** `gs://<bucket>/install/state.lock` — see {@link acquireBucketStateLock}. */
142
+ export function bucketStateLockUrl(bucket) {
143
+ return `gs://${bucket}/${OPS_INSTALL_PREFIX}/state.lock`;
144
+ }
145
+ /** Who holds a lock, for the refusal message. */
146
+ function lockBody(purpose) {
147
+ return JSON.stringify({
148
+ purpose,
149
+ host: hostname(),
150
+ pid: process.pid,
151
+ startedAt: new Date().toISOString(),
152
+ });
153
+ }
154
+ /**
155
+ * The install's state lock in its ops bucket, created only if absent
156
+ * (`--if-generation-match=0`). Held by every writer of a bucket-backed
157
+ * install's state — an installer run's `pulumi up`, `state migrate` — so
158
+ * none writes a backend another is switching away from. A lock left by a
159
+ * crashed run is reported with the command to remove it, never broken
160
+ * automatically.
161
+ *
162
+ * @returns the release function
163
+ */
164
+ export function acquireBucketStateLock(bucket, purpose, run = realSyncGcloud) {
165
+ const url = bucketStateLockUrl(bucket);
166
+ const r = run(["storage", "cp", "-", url, "--if-generation-match=0"], lockBody(purpose));
167
+ if (!r.ok) {
168
+ if (/PreconditionFailed|412|At least one of the pre-conditions/i.test(r.stderr)) {
169
+ const held = run(["storage", "cat", url]);
170
+ throw new Error(`Another run is changing this install's state (${held.ok ? held.stdout.trim() : url}). Re-run once it has finished; if none is running, remove the stale lock: gcloud storage rm ${url}`);
171
+ }
172
+ throw new Error(`Could not take the state lock ${url}: ${r.stderr.trim()}`);
173
+ }
174
+ return () => {
175
+ const rm = run(["storage", "rm", url]);
176
+ if (!rm.ok)
177
+ throw new Error(`Could not release ${url}; remove it: gcloud storage rm ${url}`);
178
+ };
179
+ }
180
+ /**
181
+ * The same lock for an install whose state is on this machine:
182
+ * `~/.caelo-<id>/state.lock`, created exclusively.
183
+ *
184
+ * @returns the release function
185
+ */
186
+ export function acquireLocalStateLock(root, purpose) {
187
+ const path = join(root, "state.lock");
188
+ try {
189
+ writeFileSync(path, lockBody(purpose), { flag: "wx", mode: 0o600 });
190
+ }
191
+ catch (e) {
192
+ if (e.code === "EEXIST") {
193
+ throw new Error(`Another run is changing this install's state (${readFileSync(path, "utf8").trim()}). Re-run once it has finished; if none is running, remove the stale lock: rm ${path}`);
194
+ }
195
+ throw e;
196
+ }
197
+ return () => rmSync(path, { force: true });
198
+ }
199
+ /** The state lock for whichever backend `bucket` (gcs) or `root` (local) names. */
200
+ export function acquireStateLock(backend, root, purpose, run = realSyncGcloud) {
201
+ return backend.kind === "gcs"
202
+ ? acquireBucketStateLock(backend.bucket, purpose, run)
203
+ : acquireLocalStateLock(root, purpose);
204
+ }
205
+ //# sourceMappingURL=state-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-store.js","sourceRoot":"","sources":["../src/state-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * The app-roll half of an upgrade (epic #696): migrations with the new admin
3
+ * image, then admin and gateway onto their new images with the env contract
4
+ * riding the same revision, traffic onto the new revisions, a deep health
5
+ * check, and — on any failure — traffic back onto the revisions that served
6
+ * before.
7
+ *
8
+ * It never changes IAM, never creates a service account or secret and never
9
+ * touches other cloud resources: everything here works under an identity
10
+ * that may only deploy Cloud Run revisions, run the migration job and take a
11
+ * Cloud SQL backup. That is the identity the in-cloud upgrader job runs as.
12
+ * Whatever needs more lives in converge.ts; `cms-provision upgrade` runs
13
+ * both, and the upgrader job refuses to run while the install needs a
14
+ * converge (`needsConverge`).
15
+ *
16
+ * Converge steps that must sit between app-roll steps — a database role that
17
+ * a migration creates gets its password after migrations and before the
18
+ * gateway rolls — come in through {@link AppRollHooks}. The upgrader job
19
+ * passes none.
20
+ *
21
+ * All gcloud calls go through the injected runner, all output through the
22
+ * injected reporter, so the whole sequence runs against a fake in tests.
23
+ */
24
+ import type { GcloudRunner, Sleep } from "../gcloud-retry.js";
25
+ import type { ImageDigests } from "../install-state.js";
26
+ import { type EnvChange, type LiveEnvValue, type LiveVolumes } from "../stack-converge.js";
27
+ import { type SqlBackup } from "./backup.js";
28
+ import type { HealthProbe } from "./health.js";
29
+ import type { UpgradeReporter } from "./reporter.js";
30
+ export type RollSlug = "admin" | "gateway";
31
+ /** The roll order: the gateway follows the admin, never the other way round. */
32
+ export declare const ROLL_ORDER: readonly RollSlug[];
33
+ /** The install an app-roll acts on. */
34
+ export interface AppRollInstall {
35
+ readonly provider: "gcp" | "gcp-firebase";
36
+ readonly projectId: string;
37
+ readonly region: string;
38
+ /** Pulumi stack name (`production`). */
39
+ readonly env: string;
40
+ readonly domain: string;
41
+ /** The protected staging host the admin is told about (#650). */
42
+ readonly stagingHost: string;
43
+ }
44
+ /** The release image one service rolls to. */
45
+ export interface ReleaseImage {
46
+ /** Fully qualified, digest-pinned reference (`…/admin@sha256:…`). */
47
+ readonly imageRef: string;
48
+ readonly digest: string;
49
+ }
50
+ /** A service as it runs now, plus the image it rolls to. */
51
+ export interface ServicePlan {
52
+ readonly slug: RollSlug;
53
+ readonly serviceName: string;
54
+ readonly imageRef: string;
55
+ readonly digest: string;
56
+ readonly priorRevision: string;
57
+ readonly liveEnv: ReadonlyMap<string, LiveEnvValue>;
58
+ /** Container memory limit now (null = Cloud Run's default). */
59
+ readonly liveMemory: string | null;
60
+ readonly liveVolumes: LiveVolumes;
61
+ }
62
+ /** A service plan plus the changes its roll applies. */
63
+ export interface RollPlan extends ServicePlan {
64
+ readonly envFlags: readonly string[];
65
+ readonly envChanges: readonly EnvChange[];
66
+ /** #553 — e.g. `--memory=2Gi` when the admin runs below the stack default. */
67
+ readonly resourceFlags: readonly string[];
68
+ /** The admin's media bucket volume when it is (partly) missing; empty otherwise. */
69
+ readonly volumeFlags: readonly string[];
70
+ readonly volumeChanges: readonly string[];
71
+ }
72
+ /** Everything an app-roll will do, computed read-only before anything changes. */
73
+ export interface AppRollPlan {
74
+ readonly install: AppRollInstall;
75
+ /** In {@link ROLL_ORDER}. */
76
+ readonly services: readonly RollPlan[];
77
+ /** Notes for the operator (e.g. a memory limit left as is). */
78
+ readonly warnings: readonly string[];
79
+ }
80
+ export type PlanResult = {
81
+ readonly ok: true;
82
+ readonly plan: AppRollPlan;
83
+ } | {
84
+ readonly ok: false;
85
+ readonly error: string;
86
+ };
87
+ /**
88
+ * Read both services and plan their rolls: prior revisions (the rollback
89
+ * targets), env-contract changes, the admin's memory and media volume. Makes
90
+ * no change; fails when anything a roll needs is missing.
91
+ */
92
+ export declare function planAppRoll(install: AppRollInstall, images: Readonly<Record<RollSlug, ReleaseImage>>, run: GcloudRunner): Promise<PlanResult>;
93
+ /**
94
+ * The plan with `names` left exactly as the services have them — for env
95
+ * vars that point at something a converge step could not set up.
96
+ */
97
+ export declare function leavingEnvUntouched(plan: AppRollPlan, names: readonly string[]): AppRollPlan;
98
+ /** Print what the plan will change, one line per change. */
99
+ export declare function reportPlan(plan: AppRollPlan, reporter: UpgradeReporter): void;
100
+ /** Converge steps that must sit between app-roll steps (none for the upgrader job). */
101
+ export interface AppRollHooks {
102
+ /**
103
+ * After migrations, before any service rolls. Returns the contract env
104
+ * vars the rolls must leave untouched because what they point at could
105
+ * not be set up; `ok: false` aborts the upgrade (nothing rolled yet).
106
+ */
107
+ afterMigrations?(): Promise<{
108
+ readonly ok: true;
109
+ readonly leaveUntouched: readonly string[];
110
+ } | {
111
+ readonly ok: false;
112
+ }>;
113
+ /** Right before `slug` rolls; `ok: false` aborts and rolls back what rolled. */
114
+ beforeRoll?(slug: RollSlug): Promise<{
115
+ readonly ok: true;
116
+ } | {
117
+ readonly ok: false;
118
+ readonly error: string;
119
+ }>;
120
+ /** After `slug` went back to its prior revision (or its roll failed). */
121
+ afterRollback?(slug: RollSlug): Promise<void>;
122
+ }
123
+ export interface AppRollDeps {
124
+ readonly run: GcloudRunner;
125
+ readonly sleep?: Sleep;
126
+ readonly reporter: UpgradeReporter;
127
+ /** Runs both migration targets with `imageRef` (the NEW admin image). */
128
+ readonly migrate: (imageRef: string) => Promise<{
129
+ readonly ok: boolean;
130
+ readonly error?: string;
131
+ }>;
132
+ /** The deep health check, or null when the operator explicitly skipped it. */
133
+ readonly health: HealthProbe | null;
134
+ /** Persist the digests now serving (install.json, stack config, …). */
135
+ readonly recordDigests: (digests: ImageDigests) => Promise<void>;
136
+ }
137
+ export interface AppRollInput {
138
+ readonly plan: AppRollPlan;
139
+ /**
140
+ * The backup taken before this roll. Required: migrations never run
141
+ * without a backup to go back to.
142
+ */
143
+ readonly backup: SqlBackup;
144
+ /** The release version rolled to, when known (`0.11.0`; null for a channel tag). */
145
+ readonly targetVersion: string | null;
146
+ /**
147
+ * Whether the release's migrations are contract-type (destructive for the
148
+ * previous release; from the signed release manifest). null = unknown.
149
+ */
150
+ readonly migrationsContract: boolean | null;
151
+ }
152
+ export type AppRollPhase = "health-baseline" | "migrations" | "converge" | "roll" | "health";
153
+ export type AppRollResult = {
154
+ readonly ok: true;
155
+ readonly digests: ImageDigests;
156
+ } | {
157
+ readonly ok: false;
158
+ readonly phase: AppRollPhase;
159
+ /** Whether migrations ran before the failure (the backup matters then). */
160
+ readonly migrated: boolean;
161
+ };
162
+ /** Run the app-roll. See the file comment for the sequence. */
163
+ export declare function executeAppRoll(input: AppRollInput, hooks: AppRollHooks, deps: AppRollDeps): Promise<AppRollResult>;
164
+ //# sourceMappingURL=app-roll.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-roll.d.ts","sourceRoot":"","sources":["../../src/upgrade/app-roll.ts"],"names":[],"mappings":"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"}