@caelo-cms/provisioning 0.10.29 → 0.10.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin-domain.d.ts +54 -0
- package/dist/admin-domain.d.ts.map +1 -0
- package/dist/admin-domain.js +122 -0
- package/dist/admin-domain.js.map +1 -0
- package/dist/cli.js +65 -6
- package/dist/cli.js.map +1 -1
- package/dist/compose.d.ts +7 -9
- package/dist/compose.d.ts.map +1 -1
- package/dist/compose.js +17 -1
- package/dist/compose.js.map +1 -1
- package/dist/deployed-release.d.ts +67 -0
- package/dist/deployed-release.d.ts.map +1 -0
- package/dist/deployed-release.js +144 -0
- package/dist/deployed-release.js.map +1 -0
- package/dist/gcloud-retry.d.ts +16 -0
- package/dist/gcloud-retry.d.ts.map +1 -0
- package/dist/gcloud-retry.js +17 -0
- package/dist/gcloud-retry.js.map +1 -0
- package/dist/gcloud.d.ts.map +1 -1
- package/dist/gcloud.js +2 -0
- package/dist/gcloud.js.map +1 -1
- package/dist/gcp-names.d.ts +58 -0
- package/dist/gcp-names.d.ts.map +1 -0
- package/dist/gcp-names.js +88 -0
- package/dist/gcp-names.js.map +1 -0
- package/dist/install-state.d.ts +31 -0
- package/dist/install-state.d.ts.map +1 -1
- package/dist/install-state.js +38 -0
- package/dist/install-state.js.map +1 -1
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +314 -46
- package/dist/lifecycle.js.map +1 -1
- package/dist/mcp-iap.d.ts +5 -26
- package/dist/mcp-iap.d.ts.map +1 -1
- package/dist/mcp-iap.js +6 -18
- package/dist/mcp-iap.js.map +1 -1
- package/dist/migration-runner.d.ts +25 -0
- package/dist/migration-runner.d.ts.map +1 -1
- package/dist/migration-runner.js +60 -19
- package/dist/migration-runner.js.map +1 -1
- package/dist/operator-access.d.ts +83 -0
- package/dist/operator-access.d.ts.map +1 -0
- package/dist/operator-access.js +562 -0
- package/dist/operator-access.js.map +1 -0
- package/dist/runtime-secrets.d.ts +128 -0
- package/dist/runtime-secrets.d.ts.map +1 -0
- package/dist/runtime-secrets.js +444 -0
- package/dist/runtime-secrets.js.map +1 -0
- package/dist/stack-contract.d.ts +231 -0
- package/dist/stack-contract.d.ts.map +1 -0
- package/dist/stack-contract.js +455 -0
- package/dist/stack-contract.js.map +1 -0
- package/dist/stack-converge.d.ts +183 -0
- package/dist/stack-converge.d.ts.map +1 -0
- package/dist/stack-converge.js +513 -0
- package/dist/stack-converge.js.map +1 -0
- package/dist/wizard.d.ts.map +1 -1
- package/dist/wizard.js +8 -1
- package/dist/wizard.js.map +1 -1
- package/dist/wizards/gcp-cost.d.ts +6 -10
- package/dist/wizards/gcp-cost.d.ts.map +1 -1
- package/dist/wizards/gcp-cost.js +34 -2
- package/dist/wizards/gcp-cost.js.map +1 -1
- package/dist/wizards/gcp-pulumi.d.ts +32 -1
- package/dist/wizards/gcp-pulumi.d.ts.map +1 -1
- package/dist/wizards/gcp-pulumi.js +60 -5
- package/dist/wizards/gcp-pulumi.js.map +1 -1
- package/dist/wizards/gcp.d.ts.map +1 -1
- package/dist/wizards/gcp.js +79 -16
- package/dist/wizards/gcp.js.map +1 -1
- package/package.json +3 -3
- package/stacks/aws/Pulumi.yaml +4 -0
- package/stacks/aws/index.ts +11 -0
- package/stacks/azure/Pulumi.yaml +4 -0
- package/stacks/azure/index.ts +10 -1
- package/stacks/gcp/Pulumi.yaml +4 -3
- package/stacks/gcp/README.md +13 -2
- package/stacks/gcp/index.ts +200 -140
- package/stacks/gcp-firebase/Pulumi.yaml +4 -0
- package/stacks/gcp-firebase/index.ts +165 -75
- package/stacks/self-hosted/Pulumi.yaml +4 -0
- package/stacks/self-hosted/index.ts +3 -0
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Converge an existing GCP install to what its Pulumi stack would produce,
|
|
4
|
+
* through gcloud (`cms-provision upgrade` does not run Pulumi). The desired
|
|
5
|
+
* state comes from stack-contract.ts, which the stacks use too.
|
|
6
|
+
*
|
|
7
|
+
* - {@link planEnvUpdate}: the env-var flags for the `services update` that
|
|
8
|
+
* rolls the image, so env changes ride the same new revision — including
|
|
9
|
+
* moving a plain var to a Secret Manager reference.
|
|
10
|
+
* - {@link ensureStackInvariants}: IAM bindings + CDN settings. Each binding
|
|
11
|
+
* is checked against the resource's policy first and only added when
|
|
12
|
+
* missing, so an operator without IAM-admin rights can still upgrade an
|
|
13
|
+
* install that is already in shape.
|
|
14
|
+
*/
|
|
15
|
+
import { gcloud as defaultGcloud } from "./gcloud.js";
|
|
16
|
+
import { realSleep, runWithRetry } from "./gcloud-retry.js";
|
|
17
|
+
import { gcpBucketName, gcpSecretId } from "./gcp-names.js";
|
|
18
|
+
import { ADMIN_MEMORY_DEFAULT, adminEnvContract, databaseUrls, gatewayEnvContract, iamMember, memoryQuantityMiB, RETIRED_SERVICE_ENV, STATIC_CDN_POLICY, stackIamInvariants, staticBackendBucketPrefix, } from "./stack-contract.js";
|
|
19
|
+
/**
|
|
20
|
+
* Env vars of the first container in `gcloud run services describe
|
|
21
|
+
* --format=json` output (Knative `serving.knative.dev/v1` Service).
|
|
22
|
+
*/
|
|
23
|
+
export function liveContainerEnv(serviceJson) {
|
|
24
|
+
const svc = JSON.parse(serviceJson);
|
|
25
|
+
const env = svc.spec?.template?.spec?.containers?.[0]?.env ?? [];
|
|
26
|
+
const out = new Map();
|
|
27
|
+
for (const e of env) {
|
|
28
|
+
const ref = e.valueFrom?.secretKeyRef;
|
|
29
|
+
out.set(e.name, ref
|
|
30
|
+
? { kind: "secret", secret: secretIdOf(ref.name), version: ref.key }
|
|
31
|
+
: { kind: "value", value: e.value ?? "" });
|
|
32
|
+
}
|
|
33
|
+
return out;
|
|
34
|
+
}
|
|
35
|
+
/** `projects/<p>/secrets/<id>` → `<id>`; a bare id stays as it is. */
|
|
36
|
+
function secretIdOf(name) {
|
|
37
|
+
return name.slice(name.lastIndexOf("/") + 1);
|
|
38
|
+
}
|
|
39
|
+
/** The service account the service's revisions run as (`undefined`: the default compute SA). */
|
|
40
|
+
export function liveServiceAccount(serviceJson) {
|
|
41
|
+
const svc = JSON.parse(serviceJson);
|
|
42
|
+
return svc.spec?.template?.spec?.serviceAccountName || undefined;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* A live value as upgrade prints it. Passwords in URLs are masked: before
|
|
46
|
+
* the move to Secret Manager the database URLs carried them inline.
|
|
47
|
+
*/
|
|
48
|
+
function describeLive(v) {
|
|
49
|
+
return v.kind === "value" ? maskUrlPassword(v.value) : `secret:${v.secret}:${v.version}`;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Whether a service still carries a URL with an inline password in a plain
|
|
53
|
+
* var — the pre-Secret Manager shape. Such a password is in every revision
|
|
54
|
+
* Cloud Run keeps, so it should be rotated once the services moved off it.
|
|
55
|
+
*/
|
|
56
|
+
export function liveEnvHasInlinePassword(liveEnv) {
|
|
57
|
+
return [...liveEnv.values()].some((v) => v.kind === "value" && maskUrlPassword(v.value) !== v.value);
|
|
58
|
+
}
|
|
59
|
+
function maskUrlPassword(value) {
|
|
60
|
+
if (!value.includes("://"))
|
|
61
|
+
return value;
|
|
62
|
+
try {
|
|
63
|
+
const url = new URL(value);
|
|
64
|
+
if (!url.password)
|
|
65
|
+
return value;
|
|
66
|
+
url.password = "***";
|
|
67
|
+
return url.toString();
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return value;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* gcloud's list flags split on `,`; a value containing one needs the
|
|
75
|
+
* `^<delim>^` escape syntax (`gcloud topic escaping`).
|
|
76
|
+
*/
|
|
77
|
+
function listFlag(flag, pairs) {
|
|
78
|
+
const joined = pairs.join(",");
|
|
79
|
+
if (!pairs.some((p) => p.includes(",")))
|
|
80
|
+
return `${flag}=${joined}`;
|
|
81
|
+
const delim = ["@", "|", "#", "~", ";"].find((d) => !pairs.some((p) => p.includes(d)));
|
|
82
|
+
if (!delim)
|
|
83
|
+
throw new Error(`${flag}: no free delimiter for ${pairs.join(" ")}`);
|
|
84
|
+
return `${flag}=^${delim}^${pairs.join(delim)}`;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* The `gcloud run services update` flags that bring `live` to `desired`.
|
|
88
|
+
* Only vars that differ are touched; vars the contract does not own
|
|
89
|
+
* (operator additions) are left alone, and the `retired` ones are removed.
|
|
90
|
+
*
|
|
91
|
+
* A plain var that becomes a Secret Manager reference moves in the same
|
|
92
|
+
* update: `--remove-env-vars=X --update-secrets=X=…`. gcloud applies all
|
|
93
|
+
* literal env changes (removals included) before the secret changes of one
|
|
94
|
+
* `services update` (googlecloudsdk/command_lib/run/flags.py
|
|
95
|
+
* `_GetConfigurationChanges`), so the new revision has X as a secret and no
|
|
96
|
+
* revision is ever without X. The reverse — a secret becoming a plain value
|
|
97
|
+
* — cannot be expressed in one update (the literal is set while X is still
|
|
98
|
+
* a secret, which gcloud rejects), so it is refused rather than attempted.
|
|
99
|
+
*/
|
|
100
|
+
export function planEnvUpdate(live, desired, retired = []) {
|
|
101
|
+
const changes = [];
|
|
102
|
+
const plain = [];
|
|
103
|
+
const secrets = [];
|
|
104
|
+
const removePlain = [];
|
|
105
|
+
const removeSecrets = [];
|
|
106
|
+
for (const entry of desired) {
|
|
107
|
+
const current = live.get(entry.name);
|
|
108
|
+
if ("value" in entry) {
|
|
109
|
+
if (current?.kind === "secret") {
|
|
110
|
+
return {
|
|
111
|
+
ok: false,
|
|
112
|
+
error: `${entry.name} is a Secret Manager reference on the service but a plain value in the contract`,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
if (current?.value === entry.value)
|
|
116
|
+
continue;
|
|
117
|
+
plain.push(`${entry.name}=${entry.value}`);
|
|
118
|
+
changes.push({
|
|
119
|
+
name: entry.name,
|
|
120
|
+
from: current ? describeLive(current) : undefined,
|
|
121
|
+
to: entry.value,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
const { secret, version } = entry.valueSource.secretKeyRef;
|
|
126
|
+
if (current?.kind === "secret" && current.secret === secret && current.version === version) {
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
// Plain → secret: drop the literal in the same update (see above).
|
|
130
|
+
// The old literal may be a secret value, so it is never printed.
|
|
131
|
+
if (current?.kind === "value")
|
|
132
|
+
removePlain.push(entry.name);
|
|
133
|
+
secrets.push(`${entry.name}=${secret}:${version}`);
|
|
134
|
+
changes.push({
|
|
135
|
+
name: entry.name,
|
|
136
|
+
from: current === undefined
|
|
137
|
+
? undefined
|
|
138
|
+
: current.kind === "value"
|
|
139
|
+
? "(plain value)"
|
|
140
|
+
: describeLive(current),
|
|
141
|
+
to: `secret:${secret}:${version}`,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
for (const name of retired) {
|
|
146
|
+
if (desired.some((e) => e.name === name)) {
|
|
147
|
+
return { ok: false, error: `${name} is both in the contract and retired` };
|
|
148
|
+
}
|
|
149
|
+
const current = live.get(name);
|
|
150
|
+
if (!current)
|
|
151
|
+
continue;
|
|
152
|
+
(current.kind === "value" ? removePlain : removeSecrets).push(name);
|
|
153
|
+
// A retired var may hold a secret value (a plain KEK), so a literal is
|
|
154
|
+
// never printed.
|
|
155
|
+
changes.push({
|
|
156
|
+
name,
|
|
157
|
+
from: current.kind === "value" ? "(plain value)" : describeLive(current),
|
|
158
|
+
to: undefined,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
const flags = [
|
|
162
|
+
...(removePlain.length > 0 ? [listFlag("--remove-env-vars", removePlain)] : []),
|
|
163
|
+
...(plain.length > 0 ? [listFlag("--update-env-vars", plain)] : []),
|
|
164
|
+
...(removeSecrets.length > 0 ? [listFlag("--remove-secrets", removeSecrets)] : []),
|
|
165
|
+
...(secrets.length > 0 ? [listFlag("--update-secrets", secrets)] : []),
|
|
166
|
+
];
|
|
167
|
+
return { ok: true, changes, flags };
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* The Cloud SQL host the admin connects to, from its live `ADMIN_DATABASE_URL`
|
|
171
|
+
* (with or without an inline password — before and after the move to Secret
|
|
172
|
+
* Manager).
|
|
173
|
+
*/
|
|
174
|
+
export function liveDatabaseHost(liveEnv) {
|
|
175
|
+
const url = liveEnv.get("ADMIN_DATABASE_URL");
|
|
176
|
+
if (url?.kind !== "value" || !url.value) {
|
|
177
|
+
return { ok: false, error: "it has no plain ADMIN_DATABASE_URL" };
|
|
178
|
+
}
|
|
179
|
+
try {
|
|
180
|
+
const host = new URL(url.value).hostname;
|
|
181
|
+
if (host)
|
|
182
|
+
return { ok: true, host };
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// falls through to the error below
|
|
186
|
+
}
|
|
187
|
+
return { ok: false, error: "its ADMIN_DATABASE_URL is not a valid URL" };
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* The env changes that bring both deployed services to their env contract
|
|
191
|
+
* (stack-contract.ts — the contract the stacks deploy). Values Pulumi
|
|
192
|
+
* generated at install time (database host, Firebase site) are read from the
|
|
193
|
+
* live services. Fails instead of guessing when one can't be determined.
|
|
194
|
+
*/
|
|
195
|
+
export function planContractEnv(install, services, opts = {}) {
|
|
196
|
+
const host = liveDatabaseHost(services.admin.liveEnv);
|
|
197
|
+
if (!host.ok) {
|
|
198
|
+
return {
|
|
199
|
+
ok: false,
|
|
200
|
+
error: `the Cloud SQL host is unknown: the admin service (${services.admin.serviceName}) ${host.error}`,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
const runtime = { ...install, databaseUrls: databaseUrls(host.host) };
|
|
204
|
+
let inputs;
|
|
205
|
+
if (install.provider === "gcp-firebase") {
|
|
206
|
+
// The site id carries a random suffix Pulumi generated at install time.
|
|
207
|
+
const site = services.admin.liveEnv.get("CAELO_FIREBASE_SITE");
|
|
208
|
+
if (site?.kind !== "value" || !site.value) {
|
|
209
|
+
return {
|
|
210
|
+
ok: false,
|
|
211
|
+
error: `the admin service has no CAELO_FIREBASE_SITE, so the Firebase Hosting site is unknown. Set it (gcloud run services update ${services.admin.serviceName} --update-env-vars=CAELO_FIREBASE_SITE=<site-id>) and re-run.`,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
inputs = {
|
|
215
|
+
...runtime,
|
|
216
|
+
provider: "gcp-firebase",
|
|
217
|
+
firebaseSiteId: site.value,
|
|
218
|
+
gatewayService: services.gateway.serviceName,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
inputs = { ...runtime, provider: "gcp" };
|
|
223
|
+
}
|
|
224
|
+
const skip = new Set(opts.leaveUntouched ?? []);
|
|
225
|
+
const owned = (contract) => contract.filter((e) => !skip.has(e.name));
|
|
226
|
+
const admin = planEnvUpdate(services.admin.liveEnv, owned(adminEnvContract(inputs)), RETIRED_SERVICE_ENV.admin);
|
|
227
|
+
if (!admin.ok)
|
|
228
|
+
return { ok: false, error: `admin: ${admin.error}` };
|
|
229
|
+
const gateway = planEnvUpdate(services.gateway.liveEnv, owned(gatewayEnvContract(runtime)), RETIRED_SERVICE_ENV.gateway);
|
|
230
|
+
if (!gateway.ok)
|
|
231
|
+
return { ok: false, error: `gateway: ${gateway.error}` };
|
|
232
|
+
return {
|
|
233
|
+
ok: true,
|
|
234
|
+
services: {
|
|
235
|
+
admin: { flags: admin.flags, changes: admin.changes },
|
|
236
|
+
gateway: { flags: gateway.flags, changes: gateway.changes },
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
function targetLabel(target) {
|
|
241
|
+
switch (target.kind) {
|
|
242
|
+
case "project":
|
|
243
|
+
return "project";
|
|
244
|
+
case "secret":
|
|
245
|
+
return `secret ${target.name}`;
|
|
246
|
+
case "bucket":
|
|
247
|
+
return `bucket ${target.bucket}`;
|
|
248
|
+
case "run-service":
|
|
249
|
+
return `${target.service} service`;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/** gcloud argv (minus the trailing verb args) addressing an IAM target. */
|
|
253
|
+
function iamCommand(target, verb, install) {
|
|
254
|
+
const project = `--project=${install.projectId}`;
|
|
255
|
+
switch (target.kind) {
|
|
256
|
+
case "project":
|
|
257
|
+
return ["projects", verb, install.projectId];
|
|
258
|
+
case "secret":
|
|
259
|
+
return ["secrets", verb, gcpSecretId(install.env, target.name), project];
|
|
260
|
+
case "bucket":
|
|
261
|
+
return [
|
|
262
|
+
"storage",
|
|
263
|
+
"buckets",
|
|
264
|
+
verb,
|
|
265
|
+
`gs://${gcpBucketName(install.projectId, install.env, target.bucket)}`,
|
|
266
|
+
project,
|
|
267
|
+
];
|
|
268
|
+
case "run-service":
|
|
269
|
+
return [
|
|
270
|
+
"run",
|
|
271
|
+
"services",
|
|
272
|
+
verb,
|
|
273
|
+
install.services[target.service],
|
|
274
|
+
`--region=${install.region}`,
|
|
275
|
+
project,
|
|
276
|
+
];
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/** Whether an IAM policy (JSON) grants `role` to `member` unconditionally. */
|
|
280
|
+
export function policyGrants(policyJson, role, member) {
|
|
281
|
+
const policy = JSON.parse(policyJson);
|
|
282
|
+
return (policy.bindings ?? []).some((b) => b.role === role && !b.condition && (b.members ?? []).includes(member));
|
|
283
|
+
}
|
|
284
|
+
/** gcloud's error when the resource a binding targets does not exist. */
|
|
285
|
+
const RESOURCE_MISSING = /NOT_FOUND|not found|does not exist/i;
|
|
286
|
+
async function ensureIam(invariants, install, projectNumber, run, sleep) {
|
|
287
|
+
const outcomes = [];
|
|
288
|
+
// One policy read per resource; several invariants share a resource.
|
|
289
|
+
const policies = new Map();
|
|
290
|
+
const readPolicy = (target) => {
|
|
291
|
+
const args = [...iamCommand(target, "get-iam-policy", install), "--format=json"];
|
|
292
|
+
const key = args.join(" ");
|
|
293
|
+
let p = policies.get(key);
|
|
294
|
+
if (!p) {
|
|
295
|
+
p = run(args).then((r) => r.ok
|
|
296
|
+
? { ok: true, json: r.stdout }
|
|
297
|
+
: { ok: false, error: r.stderr.trim() });
|
|
298
|
+
policies.set(key, p);
|
|
299
|
+
}
|
|
300
|
+
return p;
|
|
301
|
+
};
|
|
302
|
+
for (const inv of invariants) {
|
|
303
|
+
const member = iamMember(inv.member, { ...install, projectNumber });
|
|
304
|
+
const id = `${inv.role} → ${member} on ${targetLabel(inv.target)}`;
|
|
305
|
+
const base = { id, onFailure: inv.onFailure, why: inv.why };
|
|
306
|
+
const policy = await readPolicy(inv.target);
|
|
307
|
+
if (policy.ok && policyGrants(policy.json, inv.role, member)) {
|
|
308
|
+
outcomes.push({ ...base, status: "present" });
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
// Policy unreadable or binding missing: add it. `--condition=None` only
|
|
312
|
+
// where gcloud prompts for it (project policies with conditional bindings).
|
|
313
|
+
const add = await runWithRetry(run, sleep, [
|
|
314
|
+
...iamCommand(inv.target, "add-iam-policy-binding", install),
|
|
315
|
+
`--member=${member}`,
|
|
316
|
+
`--role=${inv.role}`,
|
|
317
|
+
...(inv.target.kind === "project" ? ["--condition=None"] : []),
|
|
318
|
+
"--quiet",
|
|
319
|
+
"--format=none",
|
|
320
|
+
]);
|
|
321
|
+
if (add.ok) {
|
|
322
|
+
outcomes.push({ ...base, status: "applied" });
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
const error = policy.ok ? add.stderr.trim() : `${policy.error}; ${add.stderr.trim()}`;
|
|
326
|
+
outcomes.push({
|
|
327
|
+
...base,
|
|
328
|
+
status: "failed",
|
|
329
|
+
// upgrade only adds bindings; it never creates the resource itself.
|
|
330
|
+
error: RESOURCE_MISSING.test(error)
|
|
331
|
+
? `${error}\n The ${targetLabel(inv.target)} or the account it grants to does not exist on this install (the install predates it). Re-run the installer (bunx @caelo-cms/provisioning) to create it — it keeps the release this install runs — then re-run upgrade.`
|
|
332
|
+
: error,
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
return outcomes;
|
|
336
|
+
}
|
|
337
|
+
/** Bring the `gcp` stack's static backend bucket to {@link STATIC_CDN_POLICY}. */
|
|
338
|
+
async function ensureCdnPolicy(install, run) {
|
|
339
|
+
const base = {
|
|
340
|
+
id: `Cloud CDN policy of ${staticBackendBucketPrefix(install.env)}*`,
|
|
341
|
+
onFailure: "warn",
|
|
342
|
+
why: "immutable assets stay cached for a year instead of 1h (#555)",
|
|
343
|
+
};
|
|
344
|
+
const project = `--project=${install.projectId}`;
|
|
345
|
+
const list = await run([
|
|
346
|
+
"compute",
|
|
347
|
+
"backend-buckets",
|
|
348
|
+
"list",
|
|
349
|
+
project,
|
|
350
|
+
`--filter=name~^${staticBackendBucketPrefix(install.env)}`,
|
|
351
|
+
"--format=value(name)",
|
|
352
|
+
]);
|
|
353
|
+
const name = list.ok ? list.stdout.trim().split("\n")[0]?.trim() : "";
|
|
354
|
+
if (!name) {
|
|
355
|
+
return {
|
|
356
|
+
...base,
|
|
357
|
+
status: "failed",
|
|
358
|
+
error: list.ok ? "static backend bucket not found" : list.stderr.trim(),
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
const describe = await run([
|
|
362
|
+
"compute",
|
|
363
|
+
"backend-buckets",
|
|
364
|
+
"describe",
|
|
365
|
+
name,
|
|
366
|
+
project,
|
|
367
|
+
"--format=json",
|
|
368
|
+
]);
|
|
369
|
+
if (describe.ok) {
|
|
370
|
+
const cdn = JSON.parse(describe.stdout).cdnPolicy;
|
|
371
|
+
const inShape = cdn !== undefined &&
|
|
372
|
+
Object.keys(STATIC_CDN_POLICY).every((k) => String(cdn[k]) === String(STATIC_CDN_POLICY[k]));
|
|
373
|
+
if (inShape)
|
|
374
|
+
return { ...base, status: "present" };
|
|
375
|
+
}
|
|
376
|
+
const update = await run([
|
|
377
|
+
"compute",
|
|
378
|
+
"backend-buckets",
|
|
379
|
+
"update",
|
|
380
|
+
name,
|
|
381
|
+
project,
|
|
382
|
+
`--cache-mode=${STATIC_CDN_POLICY.cacheMode}`,
|
|
383
|
+
`--default-ttl=${STATIC_CDN_POLICY.defaultTtl}`,
|
|
384
|
+
`--max-ttl=${STATIC_CDN_POLICY.maxTtl}`,
|
|
385
|
+
`--client-ttl=${STATIC_CDN_POLICY.clientTtl}`,
|
|
386
|
+
"--quiet",
|
|
387
|
+
]);
|
|
388
|
+
return update.ok
|
|
389
|
+
? { ...base, status: "applied" }
|
|
390
|
+
: { ...base, status: "failed", error: update.stderr.trim() };
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Idempotently ensure every IAM binding and CDN setting the install's stack
|
|
394
|
+
* declares (stack-contract.ts). Additive only — nothing is removed. Never
|
|
395
|
+
* throws for a gcloud failure; the report says what failed and whether the
|
|
396
|
+
* upgrade must stop.
|
|
397
|
+
*/
|
|
398
|
+
export async function ensureStackInvariants(install, deps = {}) {
|
|
399
|
+
const run = deps.run ?? defaultGcloud;
|
|
400
|
+
const sleep = deps.sleep ?? realSleep;
|
|
401
|
+
const invariants = stackIamInvariants(install.provider);
|
|
402
|
+
const outcomes = [];
|
|
403
|
+
let projectNumber = "";
|
|
404
|
+
if (invariants.some((i) => i.member === "iap-service-agent")) {
|
|
405
|
+
const r = await run([
|
|
406
|
+
"projects",
|
|
407
|
+
"describe",
|
|
408
|
+
install.projectId,
|
|
409
|
+
"--format=value(projectNumber)",
|
|
410
|
+
]);
|
|
411
|
+
projectNumber = r.ok ? r.stdout.trim() : "";
|
|
412
|
+
if (!projectNumber) {
|
|
413
|
+
// Without the project number the IAP agent's binding can't be checked;
|
|
414
|
+
// report each of those invariants as failed instead of guessing.
|
|
415
|
+
for (const inv of invariants.filter((i) => i.member === "iap-service-agent")) {
|
|
416
|
+
outcomes.push({
|
|
417
|
+
id: `${inv.role} → IAP service agent on ${targetLabel(inv.target)}`,
|
|
418
|
+
status: "failed",
|
|
419
|
+
onFailure: inv.onFailure,
|
|
420
|
+
why: inv.why,
|
|
421
|
+
error: `read project number: ${r.stderr.trim() || "empty"}`,
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
const checkable = projectNumber
|
|
427
|
+
? invariants
|
|
428
|
+
: invariants.filter((i) => i.member !== "iap-service-agent");
|
|
429
|
+
outcomes.push(...(await ensureIam(checkable, install, projectNumber, run, sleep)));
|
|
430
|
+
if (install.provider === "gcp")
|
|
431
|
+
outcomes.push(await ensureCdnPolicy(install, run));
|
|
432
|
+
return {
|
|
433
|
+
outcomes,
|
|
434
|
+
mustAbort: outcomes.some((o) => o.status === "failed" && o.onFailure === "abort"),
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
/** The memory limit of the service's container (`512Mi`, `2Gi`), or null
|
|
438
|
+
* when the service declares none (Cloud Run then runs it with 512Mi). */
|
|
439
|
+
export function liveContainerMemory(serviceJson) {
|
|
440
|
+
const svc = JSON.parse(serviceJson);
|
|
441
|
+
return svc.spec?.template?.spec?.containers?.[0]?.resources?.limits?.memory ?? null;
|
|
442
|
+
}
|
|
443
|
+
/** Cloud Run's memory when a service declares no limit. */
|
|
444
|
+
const CLOUD_RUN_DEFAULT_MEMORY = "512Mi";
|
|
445
|
+
/**
|
|
446
|
+
* #553 — raise the admin's memory to the stack's default (it runs the
|
|
447
|
+
* Lighthouse quality audit). Upgrade only ever RAISES: an operator who set
|
|
448
|
+
* more keeps it, and a value this contract cannot parse is left alone and
|
|
449
|
+
* reported, never overwritten blindly.
|
|
450
|
+
*/
|
|
451
|
+
export function planAdminMemory(live, desired = ADMIN_MEMORY_DEFAULT) {
|
|
452
|
+
const desiredMiB = memoryQuantityMiB(desired);
|
|
453
|
+
if (desiredMiB === null)
|
|
454
|
+
return { ok: false, error: `invalid desired memory "${desired}"` };
|
|
455
|
+
const liveMiB = memoryQuantityMiB(live ?? CLOUD_RUN_DEFAULT_MEMORY);
|
|
456
|
+
if (liveMiB === null) {
|
|
457
|
+
return {
|
|
458
|
+
ok: false,
|
|
459
|
+
error: `the admin's memory "${live}" is not a quantity upgrade understands`,
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
if (liveMiB >= desiredMiB)
|
|
463
|
+
return { ok: true, flags: [], from: live };
|
|
464
|
+
return { ok: true, flags: [`--memory=${desired}`], from: live };
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* The single `gcloud run services update` that rolls a service to a new
|
|
468
|
+
* image, its run SA and its env changes, so all land in one new revision.
|
|
469
|
+
*/
|
|
470
|
+
export function serviceRollArgs(roll) {
|
|
471
|
+
return [
|
|
472
|
+
"run",
|
|
473
|
+
"services",
|
|
474
|
+
"update",
|
|
475
|
+
roll.serviceName,
|
|
476
|
+
"--region",
|
|
477
|
+
roll.region,
|
|
478
|
+
"--project",
|
|
479
|
+
roll.projectId,
|
|
480
|
+
"--image",
|
|
481
|
+
roll.imageRef,
|
|
482
|
+
`--service-account=${roll.serviceAccount}`,
|
|
483
|
+
...roll.envFlags,
|
|
484
|
+
...(roll.resourceFlags ?? []),
|
|
485
|
+
"--quiet",
|
|
486
|
+
];
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* Cloud Run checks at deploy time that the revision's SA can read every
|
|
490
|
+
* secret it references. A `secretAccessor` binding upgrade added seconds
|
|
491
|
+
* earlier (a new secret, the new gateway SA) can take a while to reach that
|
|
492
|
+
* check, so the deploy fails with a permission error that resolves itself.
|
|
493
|
+
*/
|
|
494
|
+
const SECRET_ACCESS_PROPAGATING = /Permission denied on secret|secretmanager\.versions\.access/i;
|
|
495
|
+
const ROLL_RETRY_DELAYS_MS = [10_000, 20_000, 30_000, 60_000];
|
|
496
|
+
/**
|
|
497
|
+
* Run a roll (`serviceRollArgs`), retrying while it fails only because a
|
|
498
|
+
* fresh secret binding has not propagated yet. Any other failure returns at
|
|
499
|
+
* once.
|
|
500
|
+
*/
|
|
501
|
+
export async function rollService(args, deps = {}) {
|
|
502
|
+
const run = deps.run ?? defaultGcloud;
|
|
503
|
+
const sleep = deps.sleep ?? realSleep;
|
|
504
|
+
let r = await run(args);
|
|
505
|
+
for (const delay of ROLL_RETRY_DELAYS_MS) {
|
|
506
|
+
if (r.ok || !SECRET_ACCESS_PROPAGATING.test(r.stderr))
|
|
507
|
+
break;
|
|
508
|
+
await sleep(delay);
|
|
509
|
+
r = await run(args);
|
|
510
|
+
}
|
|
511
|
+
return r;
|
|
512
|
+
}
|
|
513
|
+
//# sourceMappingURL=stack-converge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack-converge.js","sourceRoot":"","sources":["../src/stack-converge.ts"],"names":[],"mappings":"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"}
|
package/dist/wizard.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../src/wizard.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAmD,OAAO,EAAQ,MAAM,gBAAgB,CAAC;AAEhG,OAAO,EAKL,KAAK,QAAQ,
|
|
1
|
+
{"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../src/wizard.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAmD,OAAO,EAAQ,MAAM,gBAAgB,CAAC;AAEhG,OAAO,EAKL,KAAK,QAAQ,EAId,MAAM,oBAAoB,CAAC;AAI5B,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,SAAS,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiHvE;AA4ID,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
package/dist/wizard.js
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
*/
|
|
20
20
|
import { cancel, confirm, intro, isCancel, outro, select, spinner, text } from "@clack/prompts";
|
|
21
21
|
import { bold, cyan, dim } from "kleur/colors";
|
|
22
|
-
import { deriveInstallId, ensureInstallDir, listInstalls, readMetadata, writeMetadata, } from "./install-state.js";
|
|
22
|
+
import { deriveInstallId, ensureInstallDir, listInstalls, readMetadata, resumedMetadata, writeMetadata, } from "./install-state.js";
|
|
23
23
|
import { runGcpWizard } from "./wizards/gcp.js";
|
|
24
24
|
import { runGcpFirebaseWizard } from "./wizards/gcp-firebase.js";
|
|
25
25
|
export async function runWizard(opts = {}) {
|
|
@@ -74,6 +74,13 @@ export async function runWizard(opts = {}) {
|
|
|
74
74
|
process.exit(0);
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
|
+
else if (existingForId) {
|
|
78
|
+
// Non-interactive re-run of an existing install: resume it. Keep its
|
|
79
|
+
// metadata (createdAt, region, the recorded release in imageDigests)
|
|
80
|
+
// so the re-run converges infrastructure instead of looking like a
|
|
81
|
+
// new install that deploys `:latest`.
|
|
82
|
+
writeMetadata(installId, resumedMetadata(existingForId, { domain, ownerEmail, projectId: projectIdHint }));
|
|
83
|
+
}
|
|
77
84
|
else {
|
|
78
85
|
writeMetadata(installId, {
|
|
79
86
|
installId,
|
package/dist/wizard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../src/wizard.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../src/wizard.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Per-resource static price table for the GCP stack — used by the
|
|
3
|
-
* wizard's pre-flight cost estimate. Prices are EUR/USD per month at
|
|
4
|
-
* `europe-west1` list rates as of 2026-05; ship updates with each
|
|
5
|
-
* Caelo release.
|
|
6
|
-
*
|
|
7
|
-
* The estimate is intentionally OVER-conservative — it shows the
|
|
8
|
-
* floor cost (idle + scale-to-zero traffic). Real usage adds egress
|
|
9
|
-
* + AI calls + storage growth on top.
|
|
10
|
-
*/
|
|
11
1
|
export interface CostLine {
|
|
12
2
|
name: string;
|
|
13
3
|
monthlyUsd: number;
|
|
@@ -17,6 +7,12 @@ export interface CostEstimateInputs {
|
|
|
17
7
|
cloudSqlTier: string;
|
|
18
8
|
cloudSqlHa: boolean;
|
|
19
9
|
adminMinInstances: number;
|
|
10
|
+
/**
|
|
11
|
+
* #553 — admin memory (`2Gi`). Cloud Run bills memory only while an
|
|
12
|
+
* instance runs, so it costs nothing extra at scale-to-zero and
|
|
13
|
+
* ~$6.50/mo per GiB above 1 GiB for each always-on min instance.
|
|
14
|
+
*/
|
|
15
|
+
adminMemory?: string;
|
|
20
16
|
gatewayMinInstances: number;
|
|
21
17
|
wafAdaptiveProtection: boolean;
|
|
22
18
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gcp-cost.d.ts","sourceRoot":"","sources":["../../src/wizards/gcp-cost.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gcp-cost.d.ts","sourceRoot":"","sources":["../../src/wizards/gcp-cost.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,OAAO,CAAC;IAC/B;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,KAAK,GAAG,cAAc,CAAC;CACnC;AAgBD,wBAAgB,eAAe,CAAC,MAAM,EAAE,kBAAkB,GAAG;IAC3D,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB,CA6GA"}
|