@caelo-cms/provisioning 0.10.55 → 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.
Files changed (209) hide show
  1. package/dist/agent-db.js +76 -19
  2. package/dist/cli-routing.js +1 -1
  3. package/dist/cli-routing.js.map +1 -1
  4. package/dist/cli.js +4 -1
  5. package/dist/cli.js.map +1 -1
  6. package/dist/compose.js +5 -0
  7. package/dist/compose.js.map +1 -1
  8. package/dist/converge-checkpoint.d.ts +66 -0
  9. package/dist/converge-checkpoint.d.ts.map +1 -0
  10. package/dist/converge-checkpoint.js +61 -0
  11. package/dist/converge-checkpoint.js.map +1 -0
  12. package/dist/converge-job-gcp.d.ts +46 -0
  13. package/dist/converge-job-gcp.d.ts.map +1 -0
  14. package/dist/converge-job-gcp.js +368 -0
  15. package/dist/converge-job-gcp.js.map +1 -0
  16. package/dist/converge-job-setup.d.ts +62 -0
  17. package/dist/converge-job-setup.d.ts.map +1 -0
  18. package/dist/converge-job-setup.js +228 -0
  19. package/dist/converge-job-setup.js.map +1 -0
  20. package/dist/converge-job.d.ts +141 -0
  21. package/dist/converge-job.d.ts.map +1 -0
  22. package/dist/converge-job.js +325 -0
  23. package/dist/converge-job.js.map +1 -0
  24. package/dist/gcp-names.d.ts +9 -0
  25. package/dist/gcp-names.d.ts.map +1 -1
  26. package/dist/gcp-names.js +13 -0
  27. package/dist/gcp-names.js.map +1 -1
  28. package/dist/index.d.ts +2 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +2 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/infra-contract.d.ts +1 -1
  33. package/dist/infra-contract.d.ts.map +1 -1
  34. package/dist/infra-contract.js +22 -1
  35. package/dist/infra-contract.js.map +1 -1
  36. package/dist/install-job.d.ts +11 -3
  37. package/dist/install-job.d.ts.map +1 -1
  38. package/dist/install-job.js +22 -12
  39. package/dist/install-job.js.map +1 -1
  40. package/dist/lifecycle.d.ts +13 -1
  41. package/dist/lifecycle.d.ts.map +1 -1
  42. package/dist/lifecycle.js +115 -58
  43. package/dist/lifecycle.js.map +1 -1
  44. package/dist/operator-access.d.ts.map +1 -1
  45. package/dist/operator-access.js +13 -3
  46. package/dist/operator-access.js.map +1 -1
  47. package/dist/release-contract.d.ts +3 -2
  48. package/dist/release-contract.d.ts.map +1 -1
  49. package/dist/release-contract.js +5 -2
  50. package/dist/release-contract.js.map +1 -1
  51. package/dist/release-manifest.d.ts +2 -0
  52. package/dist/release-manifest.d.ts.map +1 -1
  53. package/dist/release-manifest.js.map +1 -1
  54. package/dist/remote-mcp-edge.d.ts +114 -0
  55. package/dist/remote-mcp-edge.d.ts.map +1 -0
  56. package/dist/remote-mcp-edge.js +116 -0
  57. package/dist/remote-mcp-edge.js.map +1 -0
  58. package/dist/remote-mcp.d.ts +117 -0
  59. package/dist/remote-mcp.d.ts.map +1 -0
  60. package/dist/remote-mcp.js +379 -0
  61. package/dist/remote-mcp.js.map +1 -0
  62. package/dist/runtime-secrets.d.ts +12 -0
  63. package/dist/runtime-secrets.d.ts.map +1 -1
  64. package/dist/runtime-secrets.js +32 -4
  65. package/dist/runtime-secrets.js.map +1 -1
  66. package/dist/seal-key-rotation.d.ts +38 -0
  67. package/dist/seal-key-rotation.d.ts.map +1 -0
  68. package/dist/seal-key-rotation.js +206 -0
  69. package/dist/seal-key-rotation.js.map +1 -0
  70. package/dist/stack-contract.d.ts +167 -3
  71. package/dist/stack-contract.d.ts.map +1 -1
  72. package/dist/stack-contract.js +171 -3
  73. package/dist/stack-contract.js.map +1 -1
  74. package/dist/stack-converge.d.ts +38 -1
  75. package/dist/stack-converge.d.ts.map +1 -1
  76. package/dist/stack-converge.js +74 -4
  77. package/dist/stack-converge.js.map +1 -1
  78. package/dist/state-lock-lease.d.ts +142 -0
  79. package/dist/state-lock-lease.d.ts.map +1 -0
  80. package/dist/state-lock-lease.js +347 -0
  81. package/dist/state-lock-lease.js.map +1 -0
  82. package/dist/state-store.d.ts +66 -9
  83. package/dist/state-store.d.ts.map +1 -1
  84. package/dist/state-store.js +249 -30
  85. package/dist/state-store.js.map +1 -1
  86. package/dist/upgrade/app-roll.d.ts +36 -7
  87. package/dist/upgrade/app-roll.d.ts.map +1 -1
  88. package/dist/upgrade/app-roll.js +53 -19
  89. package/dist/upgrade/app-roll.js.map +1 -1
  90. package/dist/upgrade/converge.d.ts.map +1 -1
  91. package/dist/upgrade/converge.js +111 -9
  92. package/dist/upgrade/converge.js.map +1 -1
  93. package/dist/upgrade/gcp-lookup.d.ts +27 -10
  94. package/dist/upgrade/gcp-lookup.d.ts.map +1 -1
  95. package/dist/upgrade/gcp-lookup.js +46 -7
  96. package/dist/upgrade/gcp-lookup.js.map +1 -1
  97. package/dist/upgrade/record-rolled.d.ts +40 -0
  98. package/dist/upgrade/record-rolled.d.ts.map +1 -0
  99. package/dist/upgrade/record-rolled.js +46 -0
  100. package/dist/upgrade/record-rolled.js.map +1 -0
  101. package/dist/upgrade/upgrade.d.ts +45 -1
  102. package/dist/upgrade/upgrade.d.ts.map +1 -1
  103. package/dist/upgrade/upgrade.js +60 -17
  104. package/dist/upgrade/upgrade.js.map +1 -1
  105. package/dist/upgrader-assess.d.ts +15 -1
  106. package/dist/upgrader-assess.d.ts.map +1 -1
  107. package/dist/upgrader-assess.js +36 -6
  108. package/dist/upgrader-assess.js.map +1 -1
  109. package/dist/upgrader-gcp.d.ts +15 -0
  110. package/dist/upgrader-gcp.d.ts.map +1 -1
  111. package/dist/upgrader-gcp.js +42 -7
  112. package/dist/upgrader-gcp.js.map +1 -1
  113. package/dist/upgrader-iam-preflight.d.ts +123 -0
  114. package/dist/upgrader-iam-preflight.d.ts.map +1 -0
  115. package/dist/upgrader-iam-preflight.js +414 -0
  116. package/dist/upgrader-iam-preflight.js.map +1 -0
  117. package/dist/upgrader-job.d.ts +33 -9
  118. package/dist/upgrader-job.d.ts.map +1 -1
  119. package/dist/upgrader-job.js +169 -27
  120. package/dist/upgrader-job.js.map +1 -1
  121. package/dist/upgrader-records.d.ts +58 -0
  122. package/dist/upgrader-records.d.ts.map +1 -0
  123. package/dist/upgrader-records.js +87 -0
  124. package/dist/upgrader-records.js.map +1 -0
  125. package/dist/upgrader-reporter.d.ts +3 -2
  126. package/dist/upgrader-reporter.d.ts.map +1 -1
  127. package/dist/upgrader-reporter.js +10 -2
  128. package/dist/upgrader-reporter.js.map +1 -1
  129. package/dist/upgrader-setup.d.ts +25 -3
  130. package/dist/upgrader-setup.d.ts.map +1 -1
  131. package/dist/upgrader-setup.js +123 -11
  132. package/dist/upgrader-setup.js.map +1 -1
  133. package/dist/wizards/gcp-cost.d.ts.map +1 -1
  134. package/dist/wizards/gcp-cost.js +11 -3
  135. package/dist/wizards/gcp-cost.js.map +1 -1
  136. package/dist/wizards/gcp.d.ts.map +1 -1
  137. package/dist/wizards/gcp.js +99 -4
  138. package/dist/wizards/gcp.js.map +1 -1
  139. package/package.json +2 -2
  140. package/src/agent/run.test.ts +14 -1
  141. package/src/cli-routing.ts +1 -1
  142. package/src/cli.ts +4 -1
  143. package/src/compose.ts +5 -0
  144. package/src/converge-checkpoint.ts +75 -0
  145. package/src/converge-entrypoint.test.ts +213 -0
  146. package/src/converge-job-gcp.test.ts +222 -0
  147. package/src/converge-job-gcp.ts +443 -0
  148. package/src/converge-job-setup.test.ts +152 -0
  149. package/src/converge-job-setup.ts +268 -0
  150. package/src/converge-job.test.ts +486 -0
  151. package/src/converge-job.ts +542 -0
  152. package/src/gateway-env-isolation.test.ts +8 -1
  153. package/src/gcp-names.ts +15 -0
  154. package/src/gcp-url-map.test.ts +9 -1
  155. package/src/index.ts +8 -0
  156. package/src/infra-contract.test.ts +7 -4
  157. package/src/infra-contract.ts +22 -1
  158. package/src/install-job.test.ts +3 -1
  159. package/src/install-job.ts +31 -14
  160. package/src/lifecycle.ts +137 -71
  161. package/src/operator-access.test.ts +14 -0
  162. package/src/operator-access.ts +13 -3
  163. package/src/release-contract.ts +5 -2
  164. package/src/release-manifest.test.ts +42 -0
  165. package/src/release-manifest.ts +2 -0
  166. package/src/remote-mcp-edge.ts +137 -0
  167. package/src/remote-mcp.test.ts +517 -0
  168. package/src/remote-mcp.ts +460 -0
  169. package/src/runtime-secrets.test.ts +31 -6
  170. package/src/runtime-secrets.ts +41 -3
  171. package/src/seal-key-rotation.test.ts +131 -0
  172. package/src/seal-key-rotation.ts +258 -0
  173. package/src/stack-contract-parity.test.ts +20 -3
  174. package/src/stack-contract.test.ts +30 -2
  175. package/src/stack-contract.ts +291 -3
  176. package/src/stack-converge-secrets.test.ts +3 -0
  177. package/src/stack-converge.test.ts +21 -5
  178. package/src/stack-converge.ts +101 -7
  179. package/src/state-attach.test.ts +7 -1
  180. package/src/state-lock-lease.test.ts +302 -0
  181. package/src/state-lock-lease.ts +423 -0
  182. package/src/state-lock.test.ts +568 -0
  183. package/src/state-store.ts +347 -27
  184. package/src/upgrade/app-roll.ts +96 -21
  185. package/src/upgrade/converge.ts +130 -8
  186. package/src/upgrade/gcp-lookup.test.ts +80 -0
  187. package/src/upgrade/gcp-lookup.ts +65 -8
  188. package/src/upgrade/record-rolled.test.ts +105 -0
  189. package/src/upgrade/record-rolled.ts +91 -0
  190. package/src/upgrade/upgrade.test.ts +203 -3
  191. package/src/upgrade/upgrade.ts +120 -24
  192. package/src/upgrader-assess.test.ts +92 -3
  193. package/src/upgrader-assess.ts +58 -9
  194. package/src/upgrader-gcp.ts +47 -8
  195. package/src/upgrader-iam-preflight.test.ts +393 -0
  196. package/src/upgrader-iam-preflight.ts +510 -0
  197. package/src/upgrader-job.test.ts +586 -15
  198. package/src/upgrader-job.ts +237 -53
  199. package/src/upgrader-records.ts +151 -0
  200. package/src/upgrader-reporter.test.ts +6 -0
  201. package/src/upgrader-reporter.ts +7 -2
  202. package/src/upgrader-setup.test.ts +3 -3
  203. package/src/upgrader-setup.ts +128 -11
  204. package/src/wizards/gcp-cost.ts +12 -3
  205. package/src/wizards/gcp.ts +125 -4
  206. package/stacks/aws/index.ts +10 -0
  207. package/stacks/azure/index.ts +9 -0
  208. package/stacks/gcp/index.ts +46 -7
  209. package/stacks/gcp-firebase/index.ts +37 -6
@@ -15,12 +15,20 @@
15
15
  * install's infrastructure contract version
16
16
  *
17
17
  * Every side effect goes through {@link GcpUpgradeDeps}, so the sequence runs
18
- * against a fake gcloud in tests. lifecycle.ts wires the real ones.
18
+ * against a fake gcloud in tests. lifecycle.ts wires the real ones for the
19
+ * terminal; converge-job-gcp.ts wires them for the converge job (#819),
20
+ * which runs this same sequence from inside the install's project. The job
21
+ * may be killed mid-way and started again, so the sequence reports its two
22
+ * facts a resumed run must not recompute — the pre-upgrade backup and the
23
+ * revisions that served before ({@link UpgradeCheckpoint}) — and accepts
24
+ * them back: a resumed run neither backs up the half-migrated database
25
+ * again nor rolls back onto a revision the interrupted run created.
19
26
  */
20
27
  import type { GcloudRunner, Sleep } from "../gcloud-retry.js";
21
28
  import type { ImageDigests } from "../install-state.js";
22
29
  import type { HttpFetch } from "../runtime-secrets.js";
23
30
  import { type AppRollPlan, type ReleaseImage, type RollSlug } from "./app-roll.js";
31
+ import { type SqlBackup } from "./backup.js";
24
32
  import type { HealthProbe } from "./health.js";
25
33
  import type { UpgradeReporter } from "./reporter.js";
26
34
  export interface GcpUpgradeTarget {
@@ -38,6 +46,20 @@ export interface GcpUpgradeTarget {
38
46
  readonly infraContractVersion: number;
39
47
  readonly skipVerify: boolean;
40
48
  readonly skipHealthCheck: boolean;
49
+ /**
50
+ * Whether the release's migrations are contract-type, from the signed
51
+ * release manifest (the converge job knows it; the terminal does not).
52
+ */
53
+ readonly migrationsContract?: boolean | null;
54
+ }
55
+ /**
56
+ * What an upgrade run has fixed that a resumed run must reuse (#819): the
57
+ * backup taken before anything changed, and the revisions that served
58
+ * before — the rollback targets.
59
+ */
60
+ export interface UpgradeCheckpoint {
61
+ readonly backup?: SqlBackup;
62
+ readonly priorRevisions?: Readonly<Record<RollSlug, string>>;
41
63
  }
42
64
  export interface GcpUpgradeDeps {
43
65
  readonly run: GcloudRunner;
@@ -78,7 +100,29 @@ export interface GcpUpgradeDeps {
78
100
  readonly provisionerIdentity?: () => Promise<boolean>;
79
101
  /** Today, for the backup's description. */
80
102
  readonly now?: () => Date;
103
+ /** #819 — what an interrupted run of this same upgrade already fixed. */
104
+ readonly resume?: UpgradeCheckpoint;
105
+ /** #819 — called once each checkpoint fact is known (before it is relied on). */
106
+ readonly onCheckpoint?: (checkpoint: UpgradeCheckpoint) => void;
81
107
  }
108
+ /** How {@link upgradeGcpInstallOutcome} ended. */
109
+ export type GcpUpgradeOutcome = {
110
+ readonly ok: true;
111
+ } | {
112
+ readonly ok: false;
113
+ /**
114
+ * The roll failed AND every rolled service was pinned back to the
115
+ * revision that served before (app-roll.ts AppRollResult): the
116
+ * previous release serves again. Structural, never read from text.
117
+ */
118
+ readonly rolledBack: boolean;
119
+ };
82
120
  /** Upgrade one install; true on success. See the file comment for the order. */
83
121
  export declare function upgradeGcpInstall(target: GcpUpgradeTarget, deps: GcpUpgradeDeps): Promise<boolean>;
122
+ /**
123
+ * {@link upgradeGcpInstall} with how a failure ended: whether the previous
124
+ * release serves again after a rollback (the converge job reports
125
+ * rolled_back only then, #819 review).
126
+ */
127
+ export declare function upgradeGcpInstallOutcome(target: GcpUpgradeTarget, deps: GcpUpgradeDeps): Promise<GcpUpgradeOutcome>;
84
128
  //# sourceMappingURL=upgrade.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/upgrade/upgrade.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/upgrade/upgrade.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EACL,KAAK,WAAW,EAGhB,KAAK,YAAY,EACjB,KAAK,QAAQ,EAEd,MAAM,eAAe,CAAC;AACvB,OAAO,EAAqC,KAAK,SAAS,EAAiB,MAAM,aAAa,CAAC;AAE/F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,KAAK,GAAG,cAAc,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,wCAAwC;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,iFAAiF;IACjF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,qFAAqF;IACrF,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9C;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,CACtB,GAAG,EAAE,MAAM,KACR,OAAO,CACR;QAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;KAAE,GACtE;QAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CACjD,CAAC;IACF,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACjG,QAAQ,CAAC,OAAO,EAAE,CAChB,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC;QAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE,QAAQ,CAAC,WAAW,EAAE,CACpB,IAAI,EAAE,WAAW,KACd,OAAO,CACR;QAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;KAAE,GAClD;QAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CACjD,CAAC;IACF,QAAQ,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE;;;OAGG;IACH,QAAQ,CAAC,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAClE,QAAQ,CAAC,0BAA0B,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/D,mFAAmF;IACnF,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACtD,2CAA2C;IAC3C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,yEAAyE;IACzE,QAAQ,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC;IACpC,iFAAiF;IACjF,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,UAAU,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACjE;AAED,kDAAkD;AAClD,MAAM,MAAM,iBAAiB,GACzB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GACrB;IACE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEN,gFAAgF;AAChF,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,OAAO,CAAC,CAElB;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,iBAAiB,CAAC,CAsI5B"}
@@ -4,6 +4,15 @@ import { backupFailureHelp, restoreCommand, takeSqlBackup } from "./backup.js";
4
4
  import { startConverge } from "./converge.js";
5
5
  /** Upgrade one install; true on success. See the file comment for the order. */
6
6
  export async function upgradeGcpInstall(target, deps) {
7
+ return (await upgradeGcpInstallOutcome(target, deps)).ok;
8
+ }
9
+ /**
10
+ * {@link upgradeGcpInstall} with how a failure ended: whether the previous
11
+ * release serves again after a rollback (the converge job reports
12
+ * rolled_back only then, #819 review).
13
+ */
14
+ export async function upgradeGcpInstallOutcome(target, deps) {
15
+ const failed = { ok: false, rolledBack: false };
7
16
  const { reporter: r, run } = deps;
8
17
  const { projectId } = target;
9
18
  // 1. Plan. Nothing changes until every lookup succeeded.
@@ -12,7 +21,7 @@ export async function upgradeGcpInstall(target, deps) {
12
21
  if (!images.ok) {
13
22
  sPre.failed("Couldn't resolve the release images");
14
23
  r.error(images.error);
15
- return false;
24
+ return failed;
16
25
  }
17
26
  const planned = await planAppRoll({
18
27
  provider: target.provider,
@@ -25,29 +34,40 @@ export async function upgradeGcpInstall(target, deps) {
25
34
  if (!planned.ok) {
26
35
  sPre.failed("Pre-flight failed");
27
36
  r.error(planned.error);
28
- return false;
37
+ return failed;
29
38
  }
30
- const plan = planned.plan;
39
+ const plan = withPriorRevisions(planned.plan, deps, r);
31
40
  sPre.done(`Pre-flight ok — ${plan.services.length} services planned`);
32
41
  reportPlan(plan, r);
33
42
  // 2. P21 ship 4 — signatures against the Caelo release workflow's
34
43
  // identity: refuses a compromised registry, a typosquat or a fork's image.
35
44
  if (!target.skipVerify) {
36
45
  if (!(await deps.verifyImages(plan.services)))
37
- return false;
46
+ return failed;
38
47
  }
39
48
  else {
40
49
  r.warn("--skip-verify set — image signatures NOT verified.");
41
50
  }
42
51
  // 3. The first change: a failure leaves the install exactly as it was.
43
- const sBak = r.step("Taking a pre-upgrade Cloud SQL backup...");
44
- const backup = await takeSqlBackup(run, { projectId, env: target.env }, `pre-upgrade to ${target.targetTag}`, deps.now);
45
- if (!backup.ok) {
46
- sBak.failed(`Pre-upgrade backup failed: ${backup.error}`);
47
- r.warn(backupFailureHelp({ projectId }));
48
- return false;
52
+ // A resumed run keeps the interrupted run's backup: a new one could
53
+ // already hold the half-migrated schema.
54
+ let backup;
55
+ if (deps.resume?.backup) {
56
+ backup = { ok: true, backup: deps.resume.backup };
57
+ r.info(`Continuing an interrupted update: keeping its pre-upgrade backup ${backup.backup.backupId}.`);
58
+ }
59
+ else {
60
+ const sBak = r.step("Taking a pre-upgrade Cloud SQL backup...");
61
+ const taken = await takeSqlBackup(run, { projectId, env: target.env }, `pre-upgrade to ${target.targetTag}`, deps.now);
62
+ if (!taken.ok) {
63
+ sBak.failed(`Pre-upgrade backup failed: ${taken.error}`);
64
+ r.warn(backupFailureHelp({ projectId }));
65
+ return failed;
66
+ }
67
+ sBak.done(`Pre-upgrade backup ${taken.backup.backupId} of ${taken.backup.instance} taken`);
68
+ backup = taken;
69
+ deps.onCheckpoint?.({ backup: taken.backup });
49
70
  }
50
- sBak.done(`Pre-upgrade backup ${backup.backup.backupId} of ${backup.backup.instance} taken`);
51
71
  // 4. Converge, the part before the roll. The upgrader job runs the ops
52
72
  // image with rights over the whole app, so it is deployed only when its
53
73
  // signature checks out (an unverified image is never set up).
@@ -61,7 +81,7 @@ export async function upgradeGcpInstall(target, deps) {
61
81
  ...(deps.provisionerIdentity ? { provisionerIdentity: deps.provisionerIdentity } : {}),
62
82
  });
63
83
  if (!(await converge.beforeAppRoll()))
64
- return false;
84
+ return failed;
65
85
  // 5. App-roll, with the converge steps that sit between its own.
66
86
  let health = null;
67
87
  if (!target.skipHealthCheck) {
@@ -69,7 +89,7 @@ export async function upgradeGcpInstall(target, deps) {
69
89
  if (!probe.ok) {
70
90
  r.error(probe.error);
71
91
  r.warn("No migrations ran and no traffic moved.");
72
- return false;
92
+ return failed;
73
93
  }
74
94
  health = probe.probe;
75
95
  }
@@ -77,8 +97,8 @@ export async function upgradeGcpInstall(target, deps) {
77
97
  plan,
78
98
  backup: backup.backup,
79
99
  targetVersion: /^\d+\.\d+\.\d+/.test(target.targetTag) ? target.targetTag : null,
80
- // Unknown until the signed release manifest names it (epic #696).
81
- migrationsContract: null,
100
+ // Unknown on the terminal path until the signed release manifest names it.
101
+ migrationsContract: target.migrationsContract ?? null,
82
102
  }, converge.hooks, {
83
103
  run,
84
104
  reporter: r,
@@ -88,7 +108,7 @@ export async function upgradeGcpInstall(target, deps) {
88
108
  recordDigests: deps.recordDigests,
89
109
  });
90
110
  if (!rolled.ok)
91
- return false;
111
+ return { ok: false, rolledBack: rolled.rolledBack };
92
112
  r.success(`Upgrade to ${target.targetTag} complete (admin + gateway revisions serving).`);
93
113
  r.info(`Pre-upgrade backup: ${backup.backup.backupId} (restore: ${restoreCommand(backup.backup)})`);
94
114
  // 6. Converge, the part after the roll.
@@ -104,7 +124,30 @@ export async function upgradeGcpInstall(target, deps) {
104
124
  else {
105
125
  r.warn("Some converge steps did not succeed (see above); the install is not marked as converged, so in-product updates stay unavailable until a re-run of upgrade completes them.");
106
126
  }
107
- return true;
127
+ return { ok: true };
128
+ }
129
+ /**
130
+ * The plan with the rollback targets an interrupted run recorded (#819): it
131
+ * may have rolled a service already, so the revision serving NOW would be
132
+ * the new release's. A fresh run records the planned ones instead.
133
+ */
134
+ function withPriorRevisions(plan, deps, r) {
135
+ const recorded = deps.resume?.priorRevisions;
136
+ if (!recorded) {
137
+ const prior = Object.fromEntries(plan.services.map((s) => [s.slug, s.priorRevision]));
138
+ deps.onCheckpoint?.({ priorRevisions: prior });
139
+ return plan;
140
+ }
141
+ return {
142
+ ...plan,
143
+ services: plan.services.map((s) => {
144
+ const before = recorded[s.slug];
145
+ if (before === s.priorRevision)
146
+ return s;
147
+ r.info(`Continuing an interrupted update: ${s.slug} goes back to ${before} (what served before it started) if the new release fails its checks.`);
148
+ return { ...s, priorRevision: before };
149
+ }),
150
+ };
108
151
  }
109
152
  /**
110
153
  * The release's caelo-ops image for the upgrader job, signature-verified
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/upgrade/upgrade.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAyBnC,OAAO,EAEL,cAAc,EACd,WAAW,EAGX,UAAU,GACX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAwD9C,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAwB,EACxB,IAAoB;IAEpB,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAClC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IAE7B,yDAAyD;IACzD,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IAC7F,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC1D,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,IAAI,CAAC,MAAM,CAAC,qCAAqC,CAAC,CAAC;QACnD,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,WAAW,CAC/B;QACE,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,SAAS;QACT,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,EACD,MAAM,CAAC,MAAM,EACb,GAAG,CACJ,CAAC;IACF,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACjC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,QAAQ,CAAC,MAAM,mBAAmB,CAAC,CAAC;IACtE,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAEpB,kEAAkE;IAClE,2EAA2E;IAC3E,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,CAAC,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;IAC/D,CAAC;IAED,uEAAuE;IACvE,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,MAAM,aAAa,CAChC,GAAG,EACH,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,EAC9B,kBAAkB,MAAM,CAAC,SAAS,EAAE,EACpC,IAAI,CAAC,GAAG,CACT,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,IAAI,CAAC,MAAM,CAAC,8BAA8B,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1D,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QACzC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,MAAM,CAAC,QAAQ,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,QAAQ,CAAC,CAAC;IAE7F,uEAAuE;IACvE,2EAA2E;IAC3E,iEAAiE;IACjE,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE;QACtD,WAAW;QACX,GAAG;QACH,QAAQ,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvF,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,MAAM,QAAQ,CAAC,aAAa,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IAEpD,iEAAiE;IACjE,IAAI,MAAM,GAAuB,IAAI,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;YACd,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;YAClD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC;IACvB,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC;QACE,IAAI;QACJ,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,aAAa,EAAE,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;QAChF,kEAAkE;QAClE,kBAAkB,EAAE,IAAI;KACzB,EACD,QAAQ,CAAC,KAAK,EACd;QACE,GAAG;QACH,QAAQ,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM;QACN,aAAa,EAAE,IAAI,CAAC,aAAa;KAClC,CACF,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IAC7B,CAAC,CAAC,OAAO,CAAC,cAAc,MAAM,CAAC,SAAS,gDAAgD,CAAC,CAAC;IAC1F,CAAC,CAAC,IAAI,CACJ,uBAAuB,MAAM,CAAC,MAAM,CAAC,QAAQ,cAAc,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAC5F,CAAC;IAEF,wCAAwC;IACxC,MAAM,QAAQ,CAAC,YAAY,EAAE,CAAC;IAC9B,IAAI,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,CAAC,CAAC,IAAI,CACJ,yDAAyD,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,sCAAsC,CAC1I,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,CAAC,CAAC,IAAI,CACJ,2KAA2K,CAC5K,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,gBAAgB,CAC7B,MAAwB,EACxB,IAAoB;IAEpB,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;IACxB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,yBAAyB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1E,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,CAAC,CAAC,IAAI,CACJ,eAAe,MAAM,CAAC,SAAS,+GAA+G,CAC/I,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,CAAC,CAAC,IAAI,CACJ,yFAAyF,CAC1F,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,CAAC,CAAC,IAAI,CACJ,+FAA+F,CAChG,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/upgrade/upgrade.ts"],"names":[],"mappings":"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"}
@@ -25,6 +25,8 @@
25
25
  * | target not newer than installed (downgrade/same) | refused |
26
26
  * | installed below the release's minFromVersion | refused |
27
27
  * | release raises the infrastructure contract | needs_cloud_shell |
28
+ * | … on the converge route (#819, the converge job) | proceed |
29
+ * | … converge route, automatic, autoConverge off | refused |
28
30
  * | contract (destructive) migrations, automatic run | refused |
29
31
  * | contract migrations, Owner's click | proceed + warning |
30
32
  * | automatic run the update policy does not allow | refused |
@@ -36,11 +38,18 @@
36
38
  * that rolls the images. So for them `installed.infraContractVersion` is
37
39
  * null and the infra-contract row never applies; every "needs_cloud_shell"
38
40
  * stop names the upgrade command on the server instead of Cloud Shell.
41
+ *
42
+ * The converge job (#819, converge-job.ts) asks with `route: "converge"`:
43
+ * it runs as the install's provisioner, so an infrastructure change is what
44
+ * it is for — every other row still applies. An automatic run on the
45
+ * converge route needs the Owner's `autoConverge` (#864) on top of
46
+ * everything an automatic install needs; the scheduler queues one only
47
+ * then, and the job re-checks it here against the policy it claimed.
39
48
  */
40
49
  import { type AutoUpdateBasis, type PlatformUpdateTrigger, type StoredUpdatePolicy } from "@caelo-cms/shared";
41
50
  import { type ReleaseManifest, type ReleaseManifestResult } from "./release-manifest.js";
42
51
  /** Machine-readable reason codes (`platform_update_requests.refusal_codes`). */
43
- export type RefusalCode = "registry" | "signature" | "manifest-unreadable" | "install-version-unknown" | "not-newer" | "min-from-version" | "infra-contract" | "contract-migrations" | "policy";
52
+ export type RefusalCode = "registry" | "manifest-missing" | "signature" | "manifest-unreadable" | "install-version-unknown" | "not-newer" | "min-from-version" | "infra-contract" | "contract-migrations" | "policy";
44
53
  export type RequestDecision = {
45
54
  readonly kind: "proceed";
46
55
  readonly manifest: ReleaseManifest;
@@ -81,5 +90,10 @@ export declare function assessUpgradeRequest(input: {
81
90
  readonly now: Date;
82
91
  /** Default `cloud-shell` (the GCP upgrader job). */
83
92
  readonly manualPath?: ManualUpgradePath;
93
+ /**
94
+ * Which job asks (#819). `converge` = the converge job: an infrastructure
95
+ * contract bump is installed, not handed to Cloud Shell. Default `app_roll`.
96
+ */
97
+ readonly route?: "app_roll" | "converge";
84
98
  }): RequestDecision;
85
99
  //# sourceMappingURL=upgrader-assess.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"upgrader-assess.d.ts","sourceRoot":"","sources":["../src/upgrader-assess.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;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,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;CACzC,GAAG,eAAe,CAkHlB"}
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"}
@@ -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
- return stop("failed", "registry", `Could not reach the Caelo release registry to verify v${target} (${e.message}). Nothing was changed; try again later.`);
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
- if (compareSemver(target, installed.version) <= 0) {
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
- if (installed.infraContractVersion !== null &&
87
- needsConverge({ infraContractVersion }, manifest.infraContractVersion)) {
88
- 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 admin may not change cloud permissions, so this release is installed once with your own Google account in Cloud Shell.`, manifest);
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":"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"}
1
+ {"version":3,"file":"upgrader-assess.js","sourceRoot":"","sources":["../src/upgrader-assess.ts"],"names":[],"mappings":"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"}
@@ -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;AAWjE,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAErD,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;AA4BD,kFAAkF;AAClF,wBAAgB,eAAe,CAC7B,SAAS,EAAE,iBAAiB,EAC5B,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,MAAM,GACV,eAAe,CAkCjB"}
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"}
@@ -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 and the IAP
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
- /** The IAP-backed deep health probe for `plan`'s install. */
38
- async function healthProbeFor(run, http, plan) {
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
- lockState: () => acquireBucketStateLock(opsBucketName(placement.projectId), "caelo upgrader job"),
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.read("install.json");
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),
@@ -1 +1 @@
1
- {"version":3,"file":"upgrader-gcp.js","sourceRoot":"","sources":["../src/upgrader-gcp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"upgrader-gcp.js","sourceRoot":"","sources":["../src/upgrader-gcp.ts"],"names":[],"mappings":"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"}