@caelo-cms/provisioning 0.10.46 → 0.10.48

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 (342) hide show
  1. package/dist/adc-impersonation.d.ts.map +1 -1
  2. package/dist/adc-impersonation.js +23 -1
  3. package/dist/adc-impersonation.js.map +1 -1
  4. package/dist/agent/apply.d.ts +45 -0
  5. package/dist/agent/apply.d.ts.map +1 -0
  6. package/dist/agent/apply.js +83 -0
  7. package/dist/agent/apply.js.map +1 -0
  8. package/dist/agent/cli-provenance.d.ts +42 -0
  9. package/dist/agent/cli-provenance.d.ts.map +1 -0
  10. package/dist/agent/cli-provenance.js +138 -0
  11. package/dist/agent/cli-provenance.js.map +1 -0
  12. package/dist/agent/command.d.ts +79 -0
  13. package/dist/agent/command.d.ts.map +1 -0
  14. package/dist/agent/command.js +454 -0
  15. package/dist/agent/command.js.map +1 -0
  16. package/dist/agent/config.d.ts +30 -0
  17. package/dist/agent/config.d.ts.map +1 -0
  18. package/dist/agent/config.js +60 -0
  19. package/dist/agent/config.js.map +1 -0
  20. package/dist/agent/lock.d.ts +13 -0
  21. package/dist/agent/lock.d.ts.map +1 -0
  22. package/dist/agent/lock.js +100 -0
  23. package/dist/agent/lock.js.map +1 -0
  24. package/dist/agent/queue.d.ts +35 -0
  25. package/dist/agent/queue.d.ts.map +1 -0
  26. package/dist/agent/queue.js +50 -0
  27. package/dist/agent/queue.js.map +1 -0
  28. package/dist/agent/run.d.ts +97 -0
  29. package/dist/agent/run.d.ts.map +1 -0
  30. package/dist/agent/run.js +198 -0
  31. package/dist/agent/run.js.map +1 -0
  32. package/dist/agent/systemd.d.ts +55 -0
  33. package/dist/agent/systemd.d.ts.map +1 -0
  34. package/dist/agent/systemd.js +171 -0
  35. package/dist/agent/systemd.js.map +1 -0
  36. package/dist/agent/units.d.ts +44 -0
  37. package/dist/agent/units.d.ts.map +1 -0
  38. package/dist/agent/units.js +127 -0
  39. package/dist/agent/units.js.map +1 -0
  40. package/dist/agent-db.js +18362 -0
  41. package/dist/cli.js +122 -16
  42. package/dist/cli.js.map +1 -1
  43. package/dist/cloudsql-iam-user.d.ts +39 -0
  44. package/dist/cloudsql-iam-user.d.ts.map +1 -0
  45. package/dist/cloudsql-iam-user.js +119 -0
  46. package/dist/cloudsql-iam-user.js.map +1 -0
  47. package/dist/compose.d.ts +16 -0
  48. package/dist/compose.d.ts.map +1 -1
  49. package/dist/compose.js +26 -1
  50. package/dist/compose.js.map +1 -1
  51. package/dist/dns/index.d.ts +2 -0
  52. package/dist/dns/index.d.ts.map +1 -1
  53. package/dist/dns/index.js +3 -2
  54. package/dist/dns/index.js.map +1 -1
  55. package/dist/dns/manual.d.ts +5 -0
  56. package/dist/dns/manual.d.ts.map +1 -1
  57. package/dist/dns/manual.js +28 -12
  58. package/dist/dns/manual.js.map +1 -1
  59. package/dist/gcloud.d.ts +2 -0
  60. package/dist/gcloud.d.ts.map +1 -1
  61. package/dist/gcloud.js +1 -1
  62. package/dist/gcloud.js.map +1 -1
  63. package/dist/gcp-names.d.ts +15 -0
  64. package/dist/gcp-names.d.ts.map +1 -1
  65. package/dist/gcp-names.js +23 -0
  66. package/dist/gcp-names.js.map +1 -1
  67. package/dist/index.d.ts +6 -0
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +4 -0
  70. package/dist/index.js.map +1 -1
  71. package/dist/infra-contract.d.ts +1 -1
  72. package/dist/infra-contract.js +7 -1
  73. package/dist/infra-contract.js.map +1 -1
  74. package/dist/install-job-runner.d.ts +13 -0
  75. package/dist/install-job-runner.d.ts.map +1 -0
  76. package/dist/install-job-runner.js +155 -0
  77. package/dist/install-job-runner.js.map +1 -0
  78. package/dist/install-job.d.ts +210 -0
  79. package/dist/install-job.d.ts.map +1 -0
  80. package/dist/install-job.js +449 -0
  81. package/dist/install-job.js.map +1 -0
  82. package/dist/install-state.d.ts +19 -1
  83. package/dist/install-state.d.ts.map +1 -1
  84. package/dist/install-state.js +31 -3
  85. package/dist/install-state.js.map +1 -1
  86. package/dist/lifecycle.d.ts.map +1 -1
  87. package/dist/lifecycle.js +24 -5
  88. package/dist/lifecycle.js.map +1 -1
  89. package/dist/migration-runner.d.ts +5 -0
  90. package/dist/migration-runner.d.ts.map +1 -1
  91. package/dist/migration-runner.js +1 -1
  92. package/dist/migration-runner.js.map +1 -1
  93. package/dist/operator-access.d.ts +14 -8
  94. package/dist/operator-access.d.ts.map +1 -1
  95. package/dist/operator-access.js +16 -102
  96. package/dist/operator-access.js.map +1 -1
  97. package/dist/run-mode.d.ts +27 -0
  98. package/dist/run-mode.d.ts.map +1 -0
  99. package/dist/run-mode.js +22 -0
  100. package/dist/run-mode.js.map +1 -0
  101. package/dist/runtime-secrets.d.ts +19 -0
  102. package/dist/runtime-secrets.d.ts.map +1 -1
  103. package/dist/runtime-secrets.js +44 -0
  104. package/dist/runtime-secrets.js.map +1 -1
  105. package/dist/self-hosted-roles.d.ts +22 -1
  106. package/dist/self-hosted-roles.d.ts.map +1 -1
  107. package/dist/self-hosted-roles.js +81 -12
  108. package/dist/self-hosted-roles.js.map +1 -1
  109. package/dist/self-hosted-upgrade.d.ts +17 -0
  110. package/dist/self-hosted-upgrade.d.ts.map +1 -1
  111. package/dist/self-hosted-upgrade.js +16 -1
  112. package/dist/self-hosted-upgrade.js.map +1 -1
  113. package/dist/stack-contract.d.ts +6 -0
  114. package/dist/stack-contract.d.ts.map +1 -1
  115. package/dist/stack-contract.js +10 -1
  116. package/dist/stack-contract.js.map +1 -1
  117. package/dist/state-attach.d.ts +23 -0
  118. package/dist/state-attach.d.ts.map +1 -0
  119. package/dist/state-attach.js +112 -0
  120. package/dist/state-attach.js.map +1 -0
  121. package/dist/state-backend.d.ts +11 -0
  122. package/dist/state-backend.d.ts.map +1 -1
  123. package/dist/state-backend.js +20 -0
  124. package/dist/state-backend.js.map +1 -1
  125. package/dist/state-command.d.ts +20 -0
  126. package/dist/state-command.d.ts.map +1 -0
  127. package/dist/state-command.js +237 -0
  128. package/dist/state-command.js.map +1 -0
  129. package/dist/state-migrate.d.ts +121 -0
  130. package/dist/state-migrate.d.ts.map +1 -0
  131. package/dist/state-migrate.js +290 -0
  132. package/dist/state-migrate.js.map +1 -0
  133. package/dist/state-pulumi.d.ts +17 -0
  134. package/dist/state-pulumi.d.ts.map +1 -0
  135. package/dist/state-pulumi.js +218 -0
  136. package/dist/state-pulumi.js.map +1 -0
  137. package/dist/state-store.d.ts +27 -0
  138. package/dist/state-store.d.ts.map +1 -1
  139. package/dist/state-store.js +65 -0
  140. package/dist/state-store.js.map +1 -1
  141. package/dist/upgrade/converge.d.ts +6 -0
  142. package/dist/upgrade/converge.d.ts.map +1 -1
  143. package/dist/upgrade/converge.js +59 -2
  144. package/dist/upgrade/converge.js.map +1 -1
  145. package/dist/upgrade/gcp-lookup.d.ts +6 -0
  146. package/dist/upgrade/gcp-lookup.d.ts.map +1 -1
  147. package/dist/upgrade/gcp-lookup.js +25 -0
  148. package/dist/upgrade/gcp-lookup.js.map +1 -1
  149. package/dist/upgrade/release-images.d.ts +12 -0
  150. package/dist/upgrade/release-images.d.ts.map +1 -1
  151. package/dist/upgrade/release-images.js +31 -0
  152. package/dist/upgrade/release-images.js.map +1 -1
  153. package/dist/upgrade/upgrade.d.ts +5 -0
  154. package/dist/upgrade/upgrade.d.ts.map +1 -1
  155. package/dist/upgrade/upgrade.js +28 -1
  156. package/dist/upgrade/upgrade.js.map +1 -1
  157. package/dist/upgrader-assess.d.ts +82 -0
  158. package/dist/upgrader-assess.d.ts.map +1 -0
  159. package/dist/upgrader-assess.js +116 -0
  160. package/dist/upgrader-assess.js.map +1 -0
  161. package/dist/upgrader-gcp.d.ts +17 -0
  162. package/dist/upgrader-gcp.d.ts.map +1 -0
  163. package/dist/upgrader-gcp.js +87 -0
  164. package/dist/upgrader-gcp.js.map +1 -0
  165. package/dist/upgrader-job.d.ts +131 -0
  166. package/dist/upgrader-job.d.ts.map +1 -0
  167. package/dist/upgrader-job.js +259 -0
  168. package/dist/upgrader-job.js.map +1 -0
  169. package/dist/upgrader-reporter.d.ts +35 -0
  170. package/dist/upgrader-reporter.d.ts.map +1 -0
  171. package/dist/upgrader-reporter.js +79 -0
  172. package/dist/upgrader-reporter.js.map +1 -0
  173. package/dist/upgrader-setup.d.ts +59 -0
  174. package/dist/upgrader-setup.d.ts.map +1 -0
  175. package/dist/upgrader-setup.js +308 -0
  176. package/dist/upgrader-setup.js.map +1 -0
  177. package/dist/wizard.d.ts +6 -0
  178. package/dist/wizard.d.ts.map +1 -1
  179. package/dist/wizard.js +32 -4
  180. package/dist/wizard.js.map +1 -1
  181. package/dist/wizards/gcp-firebase.d.ts +3 -0
  182. package/dist/wizards/gcp-firebase.d.ts.map +1 -1
  183. package/dist/wizards/gcp-firebase.js +1 -0
  184. package/dist/wizards/gcp-firebase.js.map +1 -1
  185. package/dist/wizards/gcp-install-job.d.ts +74 -0
  186. package/dist/wizards/gcp-install-job.d.ts.map +1 -0
  187. package/dist/wizards/gcp-install-job.js +398 -0
  188. package/dist/wizards/gcp-install-job.js.map +1 -0
  189. package/dist/wizards/gcp-prompts.d.ts +3 -0
  190. package/dist/wizards/gcp-prompts.d.ts.map +1 -0
  191. package/dist/wizards/gcp-prompts.js +25 -0
  192. package/dist/wizards/gcp-prompts.js.map +1 -0
  193. package/dist/wizards/gcp-pulumi.d.ts +9 -2
  194. package/dist/wizards/gcp-pulumi.d.ts.map +1 -1
  195. package/dist/wizards/gcp-pulumi.js +8 -6
  196. package/dist/wizards/gcp-pulumi.js.map +1 -1
  197. package/dist/wizards/gcp.d.ts +40 -0
  198. package/dist/wizards/gcp.d.ts.map +1 -1
  199. package/dist/wizards/gcp.js +291 -83
  200. package/dist/wizards/gcp.js.map +1 -1
  201. package/package.json +6 -4
  202. package/src/adapter.ts +97 -0
  203. package/src/adc-impersonation.ts +176 -0
  204. package/src/admin-domain.test.ts +254 -0
  205. package/src/admin-domain.ts +245 -0
  206. package/src/admin-memory.test.ts +151 -0
  207. package/src/agent/apply.test.ts +185 -0
  208. package/src/agent/apply.ts +124 -0
  209. package/src/agent/cli-provenance.test.ts +159 -0
  210. package/src/agent/cli-provenance.ts +191 -0
  211. package/src/agent/command.test.ts +77 -0
  212. package/src/agent/command.ts +564 -0
  213. package/src/agent/config.ts +86 -0
  214. package/src/agent/lock-config.test.ts +97 -0
  215. package/src/agent/lock.ts +110 -0
  216. package/src/agent/queue.test.ts +10 -0
  217. package/src/agent/queue.ts +91 -0
  218. package/src/agent/run.test.ts +382 -0
  219. package/src/agent/run.ts +295 -0
  220. package/src/agent/systemd.ts +209 -0
  221. package/src/agent/units.test.ts +223 -0
  222. package/src/agent/units.ts +163 -0
  223. package/src/azure-front-door.test.ts +119 -0
  224. package/src/azure-front-door.ts +56 -0
  225. package/src/bootstrap-token.ts +20 -0
  226. package/src/caddy.ts +112 -0
  227. package/src/cdn-copy.ts +91 -0
  228. package/src/cert-wait.test.ts +194 -0
  229. package/src/cert-wait.ts +163 -0
  230. package/src/checkpoint-secrets.test.ts +380 -0
  231. package/src/checkpoint-secrets.ts +283 -0
  232. package/src/cli-routing.test.ts +45 -0
  233. package/src/cli-routing.ts +43 -0
  234. package/src/cli.ts +1491 -0
  235. package/src/cloudsql-iam-user.ts +147 -0
  236. package/src/compose.ts +334 -0
  237. package/src/default-firewall.test.ts +411 -0
  238. package/src/default-firewall.ts +342 -0
  239. package/src/deployed-release.test.ts +231 -0
  240. package/src/deployed-release.ts +220 -0
  241. package/src/dns/cloudflare.ts +182 -0
  242. package/src/dns/groups.test.ts +76 -0
  243. package/src/dns/groups.ts +86 -0
  244. package/src/dns/index.ts +56 -0
  245. package/src/dns/manual.ts +130 -0
  246. package/src/dns/types.ts +27 -0
  247. package/src/gateway-credentials.test.ts +180 -0
  248. package/src/gateway-credentials.ts +144 -0
  249. package/src/gcloud-components.test.ts +76 -0
  250. package/src/gcloud-components.ts +85 -0
  251. package/src/gcloud-retry.ts +41 -0
  252. package/src/gcloud-runner.test.ts +61 -0
  253. package/src/gcloud.test.ts +99 -0
  254. package/src/gcloud.ts +322 -0
  255. package/src/gcp-names.ts +135 -0
  256. package/src/index.test.ts +332 -0
  257. package/src/index.ts +114 -0
  258. package/src/infra-contract.ts +32 -0
  259. package/src/install-job-runner.ts +166 -0
  260. package/src/install-job.test.ts +566 -0
  261. package/src/install-job.ts +542 -0
  262. package/src/install-state.test.ts +239 -0
  263. package/src/install-state.ts +583 -0
  264. package/src/internal-token.ts +35 -0
  265. package/src/lifecycle.ts +900 -0
  266. package/src/mcp-iap-stacks.test.ts +58 -0
  267. package/src/mcp-iap.test.ts +149 -0
  268. package/src/mcp-iap.ts +131 -0
  269. package/src/media-volume.test.ts +296 -0
  270. package/src/migration-runner.ts +365 -0
  271. package/src/operator-access-stacks.test.ts +55 -0
  272. package/src/operator-access.test.ts +332 -0
  273. package/src/operator-access.ts +554 -0
  274. package/src/ops-backend.test.ts +320 -0
  275. package/src/ops-backend.ts +414 -0
  276. package/src/provisioner-identity.test.ts +482 -0
  277. package/src/provisioner-identity.ts +407 -0
  278. package/src/redirects-emit.ts +175 -0
  279. package/src/region-data.ts +428 -0
  280. package/src/regions.test.ts +277 -0
  281. package/src/regions.ts +370 -0
  282. package/src/release-contract.ts +57 -0
  283. package/src/release-manifest.test.ts +293 -0
  284. package/src/release-manifest.ts +430 -0
  285. package/src/run-mode.ts +40 -0
  286. package/src/runtime-secrets.test.ts +627 -0
  287. package/src/runtime-secrets.ts +754 -0
  288. package/src/self-command.test.ts +14 -0
  289. package/src/self-command.ts +21 -0
  290. package/src/self-hosted-compose.test.ts +177 -0
  291. package/src/self-hosted-release.ts +240 -0
  292. package/src/self-hosted-roles.integration.test.ts +161 -0
  293. package/src/self-hosted-roles.test.ts +124 -0
  294. package/src/self-hosted-roles.ts +203 -0
  295. package/src/self-hosted-upgrade.test.ts +394 -0
  296. package/src/self-hosted-upgrade.ts +548 -0
  297. package/src/stack-contract-parity.test.ts +199 -0
  298. package/src/stack-contract.test.ts +391 -0
  299. package/src/stack-contract.ts +888 -0
  300. package/src/stack-converge-secrets.test.ts +421 -0
  301. package/src/stack-converge.test.ts +833 -0
  302. package/src/stack-converge.ts +909 -0
  303. package/src/staging-admin.test.ts +246 -0
  304. package/src/staging-admin.ts +324 -0
  305. package/src/state-attach.test.ts +211 -0
  306. package/src/state-attach.ts +132 -0
  307. package/src/state-backend.test.ts +145 -0
  308. package/src/state-backend.ts +262 -0
  309. package/src/state-command.ts +293 -0
  310. package/src/state-migrate.test.ts +479 -0
  311. package/src/state-migrate.ts +434 -0
  312. package/src/state-pulumi.ts +289 -0
  313. package/src/state-store.test.ts +212 -0
  314. package/src/state-store.ts +243 -0
  315. package/src/upgrade/app-roll.ts +486 -0
  316. package/src/upgrade/backup.ts +109 -0
  317. package/src/upgrade/converge.ts +437 -0
  318. package/src/upgrade/gcp-lookup.ts +167 -0
  319. package/src/upgrade/health.test.ts +279 -0
  320. package/src/upgrade/health.ts +305 -0
  321. package/src/upgrade/release-images.test.ts +119 -0
  322. package/src/upgrade/release-images.ts +391 -0
  323. package/src/upgrade/reporter.ts +46 -0
  324. package/src/upgrade/upgrade.test.ts +626 -0
  325. package/src/upgrade/upgrade.ts +249 -0
  326. package/src/upgrader-assess.test.ts +265 -0
  327. package/src/upgrader-assess.ts +233 -0
  328. package/src/upgrader-gcp.ts +123 -0
  329. package/src/upgrader-job.test.ts +408 -0
  330. package/src/upgrader-job.ts +499 -0
  331. package/src/upgrader-reporter.test.ts +46 -0
  332. package/src/upgrader-reporter.ts +105 -0
  333. package/src/upgrader-setup.test.ts +169 -0
  334. package/src/upgrader-setup.ts +355 -0
  335. package/src/wizard.ts +425 -0
  336. package/src/wizards/gcp-cost.ts +188 -0
  337. package/src/wizards/gcp-firebase.ts +72 -0
  338. package/src/wizards/gcp-install-job.ts +506 -0
  339. package/src/wizards/gcp-prompts.ts +26 -0
  340. package/src/wizards/gcp-pulumi.test.ts +246 -0
  341. package/src/wizards/gcp-pulumi.ts +516 -0
  342. package/src/wizards/gcp.ts +1935 -0
@@ -0,0 +1,259 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+ import { gcpNamePrefix, upgraderJobName } from "./gcp-names.js";
3
+ import { executeAppRoll, planAppRoll, } from "./upgrade/app-roll.js";
4
+ import { restoreCommand, takeSqlBackup } from "./upgrade/backup.js";
5
+ import { findServingImageDigest, resolveGcpResourceName } from "./upgrade/gcp-lookup.js";
6
+ import { releaseImageRef } from "./upgrade/release-images.js";
7
+ import { assessUpgradeRequest } from "./upgrader-assess.js";
8
+ import { eventReporter } from "./upgrader-reporter.js";
9
+ const ROLLED_PHASES = new Set(["roll", "health"]);
10
+ /** Attempts at recording a request's end state before the run fails. */
11
+ const FINISH_ATTEMPTS = 3;
12
+ const defaultSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
13
+ /** Run the job once. Never throws; see the file comment for the sequence. */
14
+ export async function runUpgraderJob(deps) {
15
+ const { queue, log } = deps;
16
+ let claimed;
17
+ try {
18
+ claimed = await queue.claim(deps.execution);
19
+ }
20
+ catch (e) {
21
+ log({ severity: "ERROR", message: `could not read update requests: ${errorText(e)}` });
22
+ return { exitCode: 1, requestId: null, status: null };
23
+ }
24
+ if (!claimed) {
25
+ log({ severity: "INFO", message: "no pending update request; nothing to do" });
26
+ return { exitCode: 0, requestId: null, status: null };
27
+ }
28
+ const request = claimed;
29
+ const r = eventReporter((phase, level, message) => queue.event(request.id, phase, level, message), log, request.id);
30
+ let releaseLock = null;
31
+ const finish = async (end) => {
32
+ r.phase("finish");
33
+ if (end.status === "succeeded")
34
+ r.success(`Caelo ${request.targetVersion} is installed.`);
35
+ else
36
+ r.error(end.reason ?? end.status);
37
+ await r.flush();
38
+ if (releaseLock) {
39
+ try {
40
+ releaseLock();
41
+ }
42
+ catch (e) {
43
+ r.warn(errorText(e));
44
+ }
45
+ releaseLock = null;
46
+ }
47
+ const recorded = await recordUpdateEnd(queue, request.id, end, log, deps.sleep);
48
+ const failed = end.status === "failed" || end.status === "rolled_back" || !recorded;
49
+ return { exitCode: failed ? 1 : 0, requestId: request.id, status: end.status };
50
+ };
51
+ const stopWith = (status, codes, reason) => finish({
52
+ status,
53
+ reason,
54
+ codes,
55
+ pauseAutoUpdates: request.trigger === "auto" && (status === "failed" || status === "rolled_back"),
56
+ });
57
+ try {
58
+ r.phase("start");
59
+ r.info(`Upgrader started${deps.execution ? ` (run ${deps.execution})` : ""}: installing Caelo ${request.targetVersion}.`);
60
+ // Exclusive against the installer's own state writers for the whole run.
61
+ try {
62
+ releaseLock = deps.lockState();
63
+ }
64
+ catch (e) {
65
+ return stopWith("failed", ["state-locked"], `Nothing was changed: another install operation is running on this site (${errorText(e)}). Try again when it has finished.`);
66
+ }
67
+ // 2. What the install runs — from its own state, never from the admin.
68
+ r.phase("verify");
69
+ const meta = deps.readInstall();
70
+ if (!meta || meta.projectId !== deps.projectId) {
71
+ return stopWith("needs_cloud_shell", ["install-state"], "The install's records (install.json) are not in its own cloud project yet, so the upgrader cannot tell what it runs. Run the upgrade once with Cloud Shell; it moves them there.");
72
+ }
73
+ if (meta.provider !== "gcp" && meta.provider !== "gcp-firebase") {
74
+ return stopWith("refused", ["provider"], `The upgrader job only upgrades Google Cloud installs; this one is ${meta.provider}.`);
75
+ }
76
+ // install.json must describe what actually serves: if a previous run
77
+ // rolled but could not record it, the recorded version is stale and
78
+ // the downgrade / minFromVersion checks would judge against it.
79
+ const serving = await servingDigests(deps);
80
+ if (!serving.ok) {
81
+ return stopWith("failed", ["lookup"], `Nothing was changed: ${serving.error}.`);
82
+ }
83
+ const recorded = meta.imageDigests;
84
+ if (!recorded ||
85
+ recorded.admin !== serving.digests.admin ||
86
+ recorded.gateway !== serving.digests.gateway) {
87
+ return stopWith("needs_cloud_shell", ["install-state-drift"], "The release that serves now is not the one the install's records (install.json) name, so the upgrader cannot tell safely what it runs. Run the upgrade once with Cloud Shell; it records the serving release again.");
88
+ }
89
+ // 3 + 4. The signed manifest decides.
90
+ const manifest = await deps.fetchManifest(request.targetVersion);
91
+ const decision = assessUpgradeRequest({
92
+ request,
93
+ manifest,
94
+ installed: {
95
+ version: meta.releaseVersion ?? null,
96
+ infraContractVersion: meta.infraContractVersion ?? 0,
97
+ },
98
+ policy: request.policy,
99
+ now: deps.now(),
100
+ });
101
+ const verified = decision.manifest;
102
+ if (verified) {
103
+ r.success(`Release information of ${verified.version} verified: signed by Caelo's release workflow.`);
104
+ await recordFacts(queue, request.id, verified, meta);
105
+ }
106
+ if (decision.kind === "stop") {
107
+ r.phase("assess");
108
+ return stopWith(decision.status, decision.codes, decision.reason);
109
+ }
110
+ r.phase("assess");
111
+ for (const w of decision.warnings)
112
+ r.warn(w);
113
+ r.info(`${meta.releaseVersion} → ${decision.manifest.version}: no cloud-setup change needed; installing.`);
114
+ const m = decision.manifest;
115
+ const images = {
116
+ admin: { digest: m.digests.admin, imageRef: releaseImageRef("admin", m.digests.admin) },
117
+ gateway: {
118
+ digest: m.digests.gateway,
119
+ imageRef: releaseImageRef("gateway", m.digests.gateway),
120
+ },
121
+ };
122
+ const planned = await planAppRoll({
123
+ provider: meta.provider,
124
+ projectId: deps.projectId,
125
+ region: deps.region,
126
+ env: deps.env,
127
+ domain: meta.domain,
128
+ stagingHost: meta.stagingDomain ?? `staging.${meta.domain}`,
129
+ }, images, deps.run);
130
+ if (!planned.ok) {
131
+ return stopWith("failed", ["plan"], `Nothing was changed: ${planned.error}.`);
132
+ }
133
+ for (const w of planned.plan.warnings)
134
+ r.warn(w);
135
+ // 5. No backup, no change.
136
+ r.phase("backup");
137
+ const sBak = r.step("Backing up the database before anything changes...");
138
+ const backup = await takeSqlBackup(deps.run, { projectId: deps.projectId, env: deps.env }, `pre-upgrade to ${m.version}`, deps.now);
139
+ if (!backup.ok) {
140
+ sBak.failed(`Backup failed: ${backup.error}`);
141
+ return stopWith("failed", ["backup"], `The pre-upgrade database backup failed, so nothing was changed (${backup.error}). Try again later.`);
142
+ }
143
+ sBak.done(`Backup ${backup.backup.backupId} taken.`);
144
+ await queue.record(request.id, { backupId: backup.backup.backupId });
145
+ const probe = await deps.healthProbe(planned.plan);
146
+ if (!probe.ok) {
147
+ return stopWith("failed", ["health-check"], `The health check could not be prepared, so nothing was changed: ${probe.error}`);
148
+ }
149
+ // 6 + 7. The roll; it rolls back by itself on failure.
150
+ const rolled = await executeAppRoll({
151
+ plan: planned.plan,
152
+ backup: backup.backup,
153
+ targetVersion: m.version,
154
+ migrationsContract: m.migrations.contract,
155
+ }, {}, {
156
+ run: deps.run,
157
+ ...(deps.sleep ? { sleep: deps.sleep } : {}),
158
+ reporter: r,
159
+ migrate: deps.migrate,
160
+ health: probe.probe,
161
+ recordDigests: async (digests) => {
162
+ r.phase("record");
163
+ try {
164
+ const fresh = deps.readInstall() ?? meta;
165
+ deps.writeInstall({ ...fresh, imageDigests: digests, releaseVersion: m.version });
166
+ r.info(`Recorded ${m.version} as this install's release.`);
167
+ }
168
+ catch (e) {
169
+ r.warn(`The new release serves, but install.json could not be updated (${errorText(e)}). The next update will stop and ask for one upgrade with Cloud Shell, which records it.`);
170
+ }
171
+ },
172
+ });
173
+ if (!rolled.ok) {
174
+ const restore = rolled.migrated
175
+ ? ` The database backup ${backup.backup.backupId} is there if you need it (${restoreCommand(backup.backup)}).`
176
+ : "";
177
+ if (ROLLED_PHASES.has(rolled.phase)) {
178
+ return stopWith("rolled_back", [rolled.phase], `Caelo ${m.version} did not pass its checks, so the previous release serves again.${restore}`);
179
+ }
180
+ return stopWith("failed", [rolled.phase], `Stopped during ${rolled.phase === "migrations" ? "the database migrations" : "the pre-check"}; the previous release keeps serving.${restore}`);
181
+ }
182
+ // 8. Self-update, last: the next run uses this release's upgrader.
183
+ r.phase("self-update");
184
+ const job = upgraderJobName(deps.env);
185
+ const self = await deps.run([
186
+ "run",
187
+ "jobs",
188
+ "update",
189
+ job,
190
+ `--image=${releaseImageRef("ops", m.digests.ops)}`,
191
+ `--region=${deps.region}`,
192
+ `--project=${deps.projectId}`,
193
+ "--quiet",
194
+ ]);
195
+ if (self.ok)
196
+ r.info(`The upgrader itself now runs ${m.version}.`);
197
+ else {
198
+ r.warn(`The upgrader could not update itself (${self.stderr.trim().slice(0, 300)}); the next update still works, with this run's upgrader.`);
199
+ }
200
+ return finish({ status: "succeeded", reason: null, codes: [], pauseAutoUpdates: false });
201
+ }
202
+ catch (e) {
203
+ return stopWith("failed", ["internal"], `The upgrader stopped unexpectedly: ${errorText(e)}. If the site misbehaves, check Settings → Updates and the job's log.`);
204
+ }
205
+ }
206
+ /**
207
+ * End request `requestId` as `end`, retrying a failed write: the end state
208
+ * is what unblocks the next update, so a transient database error must not
209
+ * leave the request "running" while the run reports success.
210
+ *
211
+ * @returns whether the end was written (false after the last attempt failed)
212
+ */
213
+ export async function recordUpdateEnd(queue, requestId, end, log, sleep = defaultSleep) {
214
+ for (let attempt = 1; attempt <= FINISH_ATTEMPTS; attempt++) {
215
+ try {
216
+ await queue.finish(requestId, end);
217
+ return true;
218
+ }
219
+ catch (e) {
220
+ log({
221
+ severity: "ERROR",
222
+ message: `could not record the end of request ${requestId} (attempt ${attempt}/${FINISH_ATTEMPTS}): ${errorText(e)}`,
223
+ });
224
+ if (attempt < FINISH_ATTEMPTS)
225
+ await sleep(attempt * 5_000);
226
+ }
227
+ }
228
+ return false;
229
+ }
230
+ /** The digests the revisions serving traffic run, per service. */
231
+ async function servingDigests(deps) {
232
+ const digests = {};
233
+ for (const slug of ["admin", "gateway"]) {
234
+ const prefix = `${gcpNamePrefix(deps.env)}-${slug}`;
235
+ const service = await resolveGcpResourceName(deps.run, "run-service", prefix, deps.projectId, deps.region);
236
+ const digest = service
237
+ ? await findServingImageDigest(deps.run, deps.projectId, deps.region, service)
238
+ : null;
239
+ if (!digest)
240
+ return { ok: false, error: `could not read which image the ${slug} serves` };
241
+ digests[slug] = digest;
242
+ }
243
+ return { ok: true, digests: digests };
244
+ }
245
+ async function recordFacts(queue, requestId, m, meta) {
246
+ await queue.record(requestId, {
247
+ manifestSecurity: m.security,
248
+ contractMigrations: m.migrations.contract,
249
+ infraContractRequired: m.infraContractVersion,
250
+ infraContractInstalled: meta.infraContractVersion ?? 0,
251
+ adminDigest: m.digests.admin,
252
+ gatewayDigest: m.digests.gateway,
253
+ opsDigest: m.digests.ops,
254
+ });
255
+ }
256
+ function errorText(e) {
257
+ return e instanceof Error ? e.message : String(e);
258
+ }
259
+ //# sourceMappingURL=upgrader-job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrader-job.js","sourceRoot":"","sources":["../src/upgrader-job.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * The upgrader job's {@link UpgradeReporter}: every line the app-roll
3
+ * (upgrade/app-roll.ts) reports becomes a `platform_update_events` row the
4
+ * admin renders as a live timeline, and a structured Cloud Logging entry.
5
+ *
6
+ * The reporter interface is synchronous (the CLI's spinners are), but each
7
+ * event is a database write, so writes are chained in order and the job
8
+ * awaits {@link EventReporter.flush} before it finishes. A failed event
9
+ * write never fails the upgrade — the roll matters more than its narration —
10
+ * but it lands in the job log.
11
+ */
12
+ import { type PlatformUpdateEventLevel, type PlatformUpdatePhase } from "@caelo-cms/shared";
13
+ import type { UpgradeReporter } from "./upgrade/reporter.js";
14
+ /** Appends one timeline line (the job's database queue). */
15
+ export type EventSink = (phase: PlatformUpdatePhase, level: PlatformUpdateEventLevel, message: string) => Promise<void>;
16
+ /** One structured Cloud Logging line. */
17
+ export type JobLog = (entry: {
18
+ readonly severity: "INFO" | "WARNING" | "ERROR";
19
+ readonly message: string;
20
+ readonly [field: string]: unknown;
21
+ }) => void;
22
+ export interface EventReporter extends UpgradeReporter {
23
+ /** Set the phase following lines belong to (the job's own stages). */
24
+ phase(phase: PlatformUpdatePhase): void;
25
+ /** Wait until every event so far is written. */
26
+ flush(): Promise<void>;
27
+ }
28
+ /**
29
+ * The phase an app-roll step belongs to, from its label (app-roll.ts names
30
+ * its steps). Unknown labels keep the current phase.
31
+ */
32
+ export declare function phaseOfStep(label: string): PlatformUpdatePhase | null;
33
+ /** Build the reporter for one request. */
34
+ export declare function eventReporter(sink: EventSink, log: JobLog, requestId: string): EventReporter;
35
+ //# sourceMappingURL=upgrader-reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrader-reporter.d.ts","sourceRoot":"","sources":["../src/upgrader-reporter.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,OAAO,EAEL,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAc,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEzE,4DAA4D;AAC5D,MAAM,MAAM,SAAS,GAAG,CACtB,KAAK,EAAE,mBAAmB,EAC1B,KAAK,EAAE,wBAAwB,EAC/B,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,yCAAyC;AACzC,MAAM,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CACnC,KAAK,IAAI,CAAC;AAEX,MAAM,WAAW,aAAc,SAAQ,eAAe;IACpD,sEAAsE;IACtE,KAAK,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACxC,gDAAgD;IAChD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAMrE;AASD,0CAA0C;AAC1C,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa,CA0C5F"}
@@ -0,0 +1,79 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+ /**
3
+ * The upgrader job's {@link UpgradeReporter}: every line the app-roll
4
+ * (upgrade/app-roll.ts) reports becomes a `platform_update_events` row the
5
+ * admin renders as a live timeline, and a structured Cloud Logging entry.
6
+ *
7
+ * The reporter interface is synchronous (the CLI's spinners are), but each
8
+ * event is a database write, so writes are chained in order and the job
9
+ * awaits {@link EventReporter.flush} before it finishes. A failed event
10
+ * write never fails the upgrade — the roll matters more than its narration —
11
+ * but it lands in the job log.
12
+ */
13
+ import { PLATFORM_UPDATE_EVENT_MAX, } from "@caelo-cms/shared";
14
+ /**
15
+ * The phase an app-roll step belongs to, from its label (app-roll.ts names
16
+ * its steps). Unknown labels keep the current phase.
17
+ */
18
+ export function phaseOfStep(label) {
19
+ if (label.startsWith("Checking the health check"))
20
+ return "health-baseline";
21
+ if (label.startsWith("Applying DB migrations"))
22
+ return "migrations";
23
+ if (label.startsWith("Rolling "))
24
+ return "roll";
25
+ if (label.startsWith("Deep health check"))
26
+ return "health";
27
+ return null;
28
+ }
29
+ const SEVERITY = {
30
+ info: "INFO",
31
+ success: "INFO",
32
+ warn: "WARNING",
33
+ error: "ERROR",
34
+ };
35
+ /** Build the reporter for one request. */
36
+ export function eventReporter(sink, log, requestId) {
37
+ let current = "start";
38
+ let chain = Promise.resolve();
39
+ const emit = (level, message, phase = current) => {
40
+ const text = message.trim().slice(0, PLATFORM_UPDATE_EVENT_MAX) || "(no message)";
41
+ log({ severity: SEVERITY[level], message: text, requestId, phase });
42
+ chain = chain.then(() => sink(phase, level, text).catch((e) => {
43
+ log({
44
+ severity: "ERROR",
45
+ message: `could not record a timeline event: ${e instanceof Error ? e.message : String(e)}`,
46
+ requestId,
47
+ });
48
+ }));
49
+ };
50
+ return {
51
+ phase(p) {
52
+ current = p;
53
+ },
54
+ async flush() {
55
+ await chain;
56
+ },
57
+ step(label) {
58
+ const p = phaseOfStep(label);
59
+ if (p)
60
+ current = p;
61
+ emit("info", label);
62
+ return {
63
+ done: (m) => emit("success", m),
64
+ failed: (m) => emit("error", m),
65
+ warned: (m) => emit("warn", m),
66
+ };
67
+ },
68
+ info: (m) => emit("info", m),
69
+ warn: (m) => {
70
+ // app-roll announces a rollback with a warning before it starts.
71
+ if (m.startsWith("Rolling back"))
72
+ current = "rollback";
73
+ emit("warn", m);
74
+ },
75
+ error: (m) => emit("error", m),
76
+ success: (m) => emit("success", m),
77
+ };
78
+ }
79
+ //# sourceMappingURL=upgrader-reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrader-reporter.js","sourceRoot":"","sources":["../src/upgrader-reporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import { type GcloudRunner, type Sleep } from "./gcloud-retry.js";
2
+ import { type CustomRoleSpec } from "./operator-access.js";
3
+ /** Cloud SQL backups for the pre-upgrade backup — nothing else on the instance. */
4
+ export declare const UPGRADER_SQL_BACKUP_ROLE: CustomRoleSpec;
5
+ /** Project-level roles of the upgrader's service account. */
6
+ export declare const UPGRADER_PROJECT_ROLES: readonly ["roles/run.developer", "roles/cloudsql.instanceUser", "roles/logging.logWriter"];
7
+ /**
8
+ * Roles the upgrader must never hold anywhere — they would let it change
9
+ * IAM, manage service accounts or secrets, or touch compute/projects.
10
+ * Prefix matches (`roles/compute.` = every compute role).
11
+ */
12
+ export declare const UPGRADER_FORBIDDEN_ROLES: readonly ["roles/owner", "roles/editor", "roles/run.admin", "roles/iam.serviceAccountAdmin", "roles/iam.serviceAccountKeyAdmin", "roles/iam.securityAdmin", "roles/iam.roleAdmin", "roles/resourcemanager.", "roles/secretmanager.admin", "roles/secretmanager.secretVersionAdder", "roles/compute.", "roles/cloudsql.admin", "roles/cloudsql.editor", "roles/storage.admin", "roles/storage.objectAdmin"];
13
+ /** Database role migration 0267 creates for the job. */
14
+ export declare const UPGRADER_DB_ROLE = "platform_updater";
15
+ export interface UpgraderSetupTarget {
16
+ readonly projectId: string;
17
+ readonly region: string;
18
+ /** Pulumi stack name (`production`). */
19
+ readonly env: string;
20
+ /** The caelo-ops image to run, digest-pinned (`…/ops@sha256:…`). */
21
+ readonly opsImageRef: string;
22
+ /** VPC the admin uses to reach Cloud SQL's private IP. */
23
+ readonly network: string;
24
+ readonly subnet: string;
25
+ }
26
+ export type UpgraderSetupResult = {
27
+ readonly ok: true;
28
+ readonly done: string[];
29
+ } | {
30
+ readonly ok: false;
31
+ readonly done: string[];
32
+ readonly error: string;
33
+ };
34
+ /** The ops bucket condition: install.json and progress.json, not the Pulumi state. */
35
+ export declare function installStateCondition(bucket: string): string;
36
+ /** Ensure the upgrader job and everything it needs. Never throws for a gcloud failure. */
37
+ export declare function ensureUpgraderJob(target: UpgraderSetupTarget, deps?: {
38
+ run?: GcloudRunner;
39
+ sleep?: Sleep;
40
+ }): Promise<UpgraderSetupResult>;
41
+ /**
42
+ * {@link ensureUpgraderJob}'s target, with the VPC read from the deployed
43
+ * admin service (the job reaches Cloud SQL's private IP the same way).
44
+ */
45
+ export declare function resolveUpgraderTarget(opts: {
46
+ readonly projectId: string;
47
+ readonly region: string;
48
+ readonly env: string;
49
+ readonly opsImageRef: string;
50
+ }, deps?: {
51
+ run?: GcloudRunner;
52
+ }): Promise<{
53
+ ok: true;
54
+ target: UpgraderSetupTarget;
55
+ } | {
56
+ ok: false;
57
+ error: string;
58
+ }>;
59
+ //# sourceMappingURL=upgrader-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrader-setup.d.ts","sourceRoot":"","sources":["../src/upgrader-setup.ts"],"names":[],"mappings":"AA6CA,OAAO,EAAE,KAAK,YAAY,EAA2B,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAU3F,OAAO,EAAE,KAAK,cAAc,EAAoC,MAAM,sBAAsB,CAAC;AAG7F,mFAAmF;AACnF,eAAO,MAAM,wBAAwB,EAAE,cAYtC,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,sBAAsB,4FAIzB,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,4YAgB3B,CAAC;AAEX,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAKnD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,wCAAwC;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAC9C;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5E,sFAAsF;AACtF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,0FAA0F;AAC1F,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,mBAAmB,EAC3B,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,YAAY,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAO,GAC/C,OAAO,CAAC,mBAAmB,CAAC,CAoM9B;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE;IACJ,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,EACD,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,YAAY,CAAA;CAAO,GAChC,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAUnF"}