@microagi/alchemy-gcp 0.3.0 → 0.5.0

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 (71) hide show
  1. package/CHANGELOG.md +100 -0
  2. package/lib/ArtifactRegistry/Operations.d.ts +47 -0
  3. package/lib/ArtifactRegistry/Operations.d.ts.map +1 -0
  4. package/lib/ArtifactRegistry/Operations.js +47 -0
  5. package/lib/ArtifactRegistry/Operations.js.map +1 -0
  6. package/lib/ArtifactRegistry/Repository.d.ts +263 -0
  7. package/lib/ArtifactRegistry/Repository.d.ts.map +1 -0
  8. package/lib/ArtifactRegistry/Repository.js +257 -0
  9. package/lib/ArtifactRegistry/Repository.js.map +1 -0
  10. package/lib/ArtifactRegistry/Types.d.ts +32 -0
  11. package/lib/ArtifactRegistry/Types.d.ts.map +1 -0
  12. package/lib/ArtifactRegistry/Types.js +12 -0
  13. package/lib/ArtifactRegistry/Types.js.map +1 -0
  14. package/lib/ArtifactRegistry/Validation.d.ts +43 -0
  15. package/lib/ArtifactRegistry/Validation.d.ts.map +1 -0
  16. package/lib/ArtifactRegistry/Validation.js +95 -0
  17. package/lib/ArtifactRegistry/Validation.js.map +1 -0
  18. package/lib/ArtifactRegistry/index.d.ts +4 -0
  19. package/lib/ArtifactRegistry/index.d.ts.map +1 -0
  20. package/lib/ArtifactRegistry/index.js +2 -0
  21. package/lib/ArtifactRegistry/index.js.map +1 -0
  22. package/lib/Providers.d.ts.map +1 -1
  23. package/lib/Providers.js +9 -1
  24. package/lib/Providers.js.map +1 -1
  25. package/lib/Sqladmin/Database.d.ts +82 -0
  26. package/lib/Sqladmin/Database.d.ts.map +1 -0
  27. package/lib/Sqladmin/Database.js +87 -0
  28. package/lib/Sqladmin/Database.js.map +1 -0
  29. package/lib/Sqladmin/Instance.d.ts +234 -0
  30. package/lib/Sqladmin/Instance.d.ts.map +1 -0
  31. package/lib/Sqladmin/Instance.js +251 -0
  32. package/lib/Sqladmin/Instance.js.map +1 -0
  33. package/lib/Sqladmin/Operations.d.ts +41 -0
  34. package/lib/Sqladmin/Operations.d.ts.map +1 -0
  35. package/lib/Sqladmin/Operations.js +42 -0
  36. package/lib/Sqladmin/Operations.js.map +1 -0
  37. package/lib/Sqladmin/Types.d.ts +82 -0
  38. package/lib/Sqladmin/Types.d.ts.map +1 -0
  39. package/lib/Sqladmin/Types.js +28 -0
  40. package/lib/Sqladmin/Types.js.map +1 -0
  41. package/lib/Sqladmin/User.d.ts +110 -0
  42. package/lib/Sqladmin/User.d.ts.map +1 -0
  43. package/lib/Sqladmin/User.js +156 -0
  44. package/lib/Sqladmin/User.js.map +1 -0
  45. package/lib/Sqladmin/Validation.d.ts +60 -0
  46. package/lib/Sqladmin/Validation.d.ts.map +1 -0
  47. package/lib/Sqladmin/Validation.js +125 -0
  48. package/lib/Sqladmin/Validation.js.map +1 -0
  49. package/lib/Sqladmin/index.d.ts +9 -0
  50. package/lib/Sqladmin/index.d.ts.map +1 -0
  51. package/lib/Sqladmin/index.js +5 -0
  52. package/lib/Sqladmin/index.js.map +1 -0
  53. package/lib/index.d.ts +2 -0
  54. package/lib/index.d.ts.map +1 -1
  55. package/lib/index.js +2 -0
  56. package/lib/index.js.map +1 -1
  57. package/package.json +2 -2
  58. package/src/ArtifactRegistry/Operations.ts +79 -0
  59. package/src/ArtifactRegistry/Repository.ts +624 -0
  60. package/src/ArtifactRegistry/Types.ts +49 -0
  61. package/src/ArtifactRegistry/Validation.ts +112 -0
  62. package/src/ArtifactRegistry/index.ts +10 -0
  63. package/src/Providers.ts +15 -0
  64. package/src/Sqladmin/Database.ts +209 -0
  65. package/src/Sqladmin/Instance.ts +620 -0
  66. package/src/Sqladmin/Operations.ts +73 -0
  67. package/src/Sqladmin/Types.ts +101 -0
  68. package/src/Sqladmin/User.ts +333 -0
  69. package/src/Sqladmin/Validation.ts +148 -0
  70. package/src/Sqladmin/index.ts +19 -0
  71. package/src/index.ts +2 -0
@@ -0,0 +1,87 @@
1
+ import * as sql from "@distilled.cloud/gcp/sqladmin-v1";
2
+ import { Resource } from "alchemy";
3
+ import { isResolved, somePropsAreDifferent } from "alchemy/Diff";
4
+ import * as Provider from "alchemy/Provider";
5
+ import * as Effect from "effect/Effect";
6
+ import { makeAwaitOperation } from "./Operations.js";
7
+ import { reshapeBadRequest, validateDatabaseName } from "./Validation.js";
8
+ export const SqlDatabase = Resource("GCP.SqlDatabase");
9
+ const toAttributes = (d, parent) => ({
10
+ name: parent.name,
11
+ instance: parent.instance,
12
+ project: parent.project,
13
+ selfLink: d.selfLink ?? "",
14
+ charset: d.charset,
15
+ collation: d.collation,
16
+ });
17
+ export const SqlDatabaseProvider = () => Provider.effect(SqlDatabase, Effect.gen(function* () {
18
+ const getDatabases = yield* sql.getDatabases;
19
+ const insertDatabases = yield* sql.insertDatabases;
20
+ const deleteDatabases = yield* sql.deleteDatabases;
21
+ const getOperations = yield* sql.getOperations;
22
+ const awaitOperation = makeAwaitOperation(getOperations);
23
+ const observe = (project, instance, database) => getDatabases({ project, instance, database }).pipe(Effect.catchTag("NotFound", () => Effect.succeed(undefined)), Effect.catchTag("Forbidden", () => Effect.succeed(undefined)));
24
+ return {
25
+ stables: ["name", "instance", "project", "selfLink"],
26
+ diff: Effect.fn(function* ({ news, olds = {} }) {
27
+ if (!isResolved(news))
28
+ return undefined;
29
+ if (somePropsAreDifferent(olds, news, [
30
+ "project",
31
+ "instance",
32
+ "name",
33
+ ])) {
34
+ return { action: "replace" };
35
+ }
36
+ return undefined;
37
+ }),
38
+ reconcile: Effect.fn(function* ({ news, session }) {
39
+ yield* validateDatabaseName(news.name);
40
+ let observed = yield* observe(news.project, news.instance, news.name);
41
+ if (!observed) {
42
+ const op = yield* insertDatabases({
43
+ project: news.project,
44
+ instance: news.instance,
45
+ body: {
46
+ name: news.name,
47
+ ...(news.charset ? { charset: news.charset } : {}),
48
+ ...(news.collation ? { collation: news.collation } : {}),
49
+ },
50
+ }).pipe(Effect.catchTag("Conflict", () => Effect.succeed(undefined)), Effect.catchTag("BadRequest", reshapeBadRequest("Database", "insert")));
51
+ if (op?.name)
52
+ yield* awaitOperation(news.project, op.name, session);
53
+ observed = yield* getDatabases({
54
+ project: news.project,
55
+ instance: news.instance,
56
+ database: news.name,
57
+ });
58
+ }
59
+ return toAttributes(observed, {
60
+ project: news.project,
61
+ instance: news.instance,
62
+ name: news.name,
63
+ });
64
+ }),
65
+ delete: Effect.fn(function* ({ output, session }) {
66
+ yield* deleteDatabases({
67
+ project: output.project,
68
+ instance: output.instance,
69
+ database: output.name,
70
+ }).pipe(Effect.flatMap((op) => op.name
71
+ ? awaitOperation(output.project, op.name, session)
72
+ : Effect.succeed(op)), Effect.catchTag("NotFound", () => Effect.void), Effect.catchTag("BadRequest", reshapeBadRequest("Database", "delete")));
73
+ }),
74
+ read: Effect.fn(function* ({ output, olds }) {
75
+ const project = output?.project ?? olds?.project;
76
+ const instance = output?.instance ?? olds?.instance;
77
+ const name = output?.name ?? olds?.name;
78
+ if (!project || !instance || !name)
79
+ return undefined;
80
+ const observed = yield* observe(project, instance, name);
81
+ if (!observed)
82
+ return undefined;
83
+ return toAttributes(observed, { project, instance, name });
84
+ }),
85
+ };
86
+ }));
87
+ //# sourceMappingURL=Database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Database.js","sourceRoot":"","sources":["../../src/Sqladmin/Database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,234 @@
1
+ import { Resource } from "alchemy";
2
+ import * as Provider from "alchemy/Provider";
3
+ import * as Redacted from "effect/Redacted";
4
+ import type * as GCP from "../Providers.ts";
5
+ import type { PostgresVersion, SqlActivationPolicy, SqlAvailabilityType, SqlDataDiskType, SqlEdition } from "./Types.ts";
6
+ /**
7
+ * A Cloud SQL for Postgres instance.
8
+ *
9
+ * **Resource model.** A Cloud SQL instance bundles the storage volume,
10
+ * compute tier, networking (public IP / VPC private IP via PSA), and
11
+ * managed backups. Databases (`GCP.SqlDatabase`) and users
12
+ * (`GCP.SqlUser`) hang off it and are modelled as separate resources.
13
+ *
14
+ * **Lifecycle.** observe → ensure (insert; retry on the "API not yet
15
+ * enabled" 403 propagation race) → sync (patch top-level fields, with
16
+ * `settingsVersion` round-trip for optimistic concurrency) → return.
17
+ *
18
+ * **Replace triggers.** `project`, `region`, `name`, `databaseVersion`.
19
+ * Everything else — tier, disk size, IP config, backup config — is
20
+ * in-place via `patch`.
21
+ *
22
+ * **Optimistic concurrency.** Cloud SQL uses `settings.settingsVersion`
23
+ * (NOT `etag` — etag is deprecated). Every patch reads the live
24
+ * instance and threads the observed `settingsVersion` through the
25
+ * body. Concurrent edits surface as `Conflict`.
26
+ *
27
+ * **Adoption.** Label-gated: an instance whose `settings.userLabels`
28
+ * lack our `alchemy_*` keys is wrapped in `Unowned(attrs)` from
29
+ * `read`, forcing `--adopt` before takeover.
30
+ *
31
+ * **Deletion protection.** When `settings.deletionProtectionEnabled`
32
+ * is `true`, alchemy `destroy` will fail with a `BadRequest`. Set the
33
+ * flag to `false` in a separate deploy (which patches the instance),
34
+ * then re-run destroy.
35
+ *
36
+ * @example Minimal private-IP Postgres 17 instance on a Shared VPC
37
+ * ```typescript
38
+ * const db = yield* GCP.SqlInstance("Primary", {
39
+ * project: project.projectId,
40
+ * region: "europe-west4",
41
+ * databaseVersion: "POSTGRES_17",
42
+ * settings: {
43
+ * tier: "db-custom-2-7680",
44
+ * edition: "ENTERPRISE",
45
+ * dataDiskSizeGb: 50,
46
+ * ipConfiguration: {
47
+ * ipv4Enabled: false,
48
+ * privateNetwork: hostVpc.selfLink,
49
+ * },
50
+ * backupConfiguration: { enabled: true, pointInTimeRecoveryEnabled: true },
51
+ * },
52
+ * });
53
+ * ```
54
+ *
55
+ * @see https://cloud.google.com/sql/docs/postgres/admin-api/rest/v1/instances
56
+ */
57
+ export type SqlInstanceProps = {
58
+ /**
59
+ * GCP project ID hosting the instance. Immutable — replace if changed.
60
+ * @see https://cloud.google.com/sql/docs/postgres/admin-api/rest/v1/instances#SqlInstance
61
+ */
62
+ project: string;
63
+ /**
64
+ * Cloud SQL region (e.g. `europe-west4`). Cloud SQL is regional;
65
+ * zonality is configured inside `settings.availabilityType`.
66
+ * Immutable — replace if changed.
67
+ * @see https://cloud.google.com/sql/docs/postgres/locations
68
+ */
69
+ region: string;
70
+ /**
71
+ * Instance name. Defaults to `createPhysicalName({ id, lowercase:
72
+ * true, maxLength: 98 })`. Lowercase letters/digits/hyphens; begin
73
+ * with a letter, no trailing hyphen; 1–98 chars. Immutable — replace.
74
+ * @see https://cloud.google.com/sql/docs/postgres/admin-api/rest/v1/instances#SqlInstance
75
+ */
76
+ name?: string;
77
+ /**
78
+ * Postgres engine version. Immutable — Cloud SQL exposes major
79
+ * version *upgrades* via a separate `upgrade` operation, not via
80
+ * `patch`. Surfacing it as immutable here forces an explicit replace
81
+ * (or out-of-band upgrade) for clarity.
82
+ * @see https://cloud.google.com/sql/docs/postgres/db-versions
83
+ */
84
+ databaseVersion: PostgresVersion;
85
+ /**
86
+ * Initial Postgres `postgres` superuser password. Only set on
87
+ * insert; ignored on subsequent patches (Cloud SQL silently drops
88
+ * `rootPassword` on patch). Typically omitted on IAM-only stacks
89
+ * since the `postgres` role is unused.
90
+ * @see https://cloud.google.com/sql/docs/postgres/create-manage-users#user-root
91
+ */
92
+ rootPassword?: Redacted.Redacted<string>;
93
+ /**
94
+ * Resource labels. Alchemy internal labels (`alchemy_app`,
95
+ * `alchemy_stage`, `alchemy_id`) are merged on top automatically.
96
+ * Cloud SQL stores user labels under `settings.userLabels`; we
97
+ * surface them at the top level for symmetry with other GCP
98
+ * resources. Mutable via `patch`.
99
+ * @see https://cloud.google.com/sql/docs/postgres/label-instance
100
+ */
101
+ labels?: Record<string, string>;
102
+ /** Instance settings (tier, disk, IP, backups, …). Mostly mutable via `patch`. */
103
+ settings: {
104
+ /**
105
+ * Machine tier (`db-custom-{vCPU}-{memMiB}`, `db-f1-micro`,
106
+ * `db-perf-optimized-*`). Mutable via `patch` (causes a restart).
107
+ * @see https://cloud.google.com/sql/docs/postgres/instance-settings
108
+ */
109
+ tier: string;
110
+ /**
111
+ * Cloud SQL edition. `ENTERPRISE_PLUS` is required for
112
+ * Data Cache + the `db-perf-optimized-*` tiers. Mutable via
113
+ * `patch` (some transitions require a restart).
114
+ * @see https://cloud.google.com/sql/docs/postgres/editions-intro
115
+ */
116
+ edition?: SqlEdition;
117
+ /**
118
+ * Storage size in GB. Mutable via `patch`; can only grow, not
119
+ * shrink (shrink requires a side-channel operation).
120
+ * @see https://cloud.google.com/sql/docs/postgres/instance-settings#storage-capacity-2ndgen
121
+ */
122
+ dataDiskSizeGb?: number;
123
+ /**
124
+ * Disk type. `PD_SSD` is the default; `PD_HDD` is legacy.
125
+ * Immutable in practice — Cloud SQL rejects type changes on patch.
126
+ * @see https://cloud.google.com/sql/docs/postgres/instance-settings#storage-type-2ndgen
127
+ */
128
+ dataDiskType?: SqlDataDiskType;
129
+ /** Auto-grow the data disk when nearing full. Mutable via `patch`. */
130
+ diskAutoresize?: boolean;
131
+ /** Cap on auto-grown size, in GB. Mutable via `patch`. */
132
+ diskAutoresizeLimit?: number;
133
+ /** Networking — public IP, private IP via PSA, or both. Mutable via `patch`. */
134
+ ipConfiguration?: {
135
+ /**
136
+ * VPC selfLink (`https://www.googleapis.com/compute/v1/projects/{p}/global/networks/{n}`)
137
+ * to attach the private IP to. The VPC must already have a PSA
138
+ * peering with `servicenetworking.googleapis.com`. Immutable
139
+ * after first set (Cloud SQL refuses to change the private network).
140
+ * @see https://cloud.google.com/sql/docs/postgres/private-ip
141
+ */
142
+ privateNetwork?: string;
143
+ /** Enable a public IPv4 endpoint. Mutable via `patch`. */
144
+ ipv4Enabled?: boolean;
145
+ /**
146
+ * Allow Google-managed services (BigQuery, Vertex AI, etc.) to
147
+ * reach the private IP over Google's backbone. Mutable via `patch`.
148
+ */
149
+ enablePrivatePathForGoogleCloudServices?: boolean;
150
+ /** Require SSL/TLS on all connections. Mutable via `patch`. */
151
+ requireSsl?: boolean;
152
+ };
153
+ /** Backup window + retention settings. Mutable via `patch`. */
154
+ backupConfiguration?: {
155
+ /** Enable automated daily backups. Mutable via `patch`. */
156
+ enabled?: boolean;
157
+ /** Enable PITR (write-ahead log archiving). Mutable via `patch`. */
158
+ pointInTimeRecoveryEnabled?: boolean;
159
+ /** Backup start time in UTC, `HH:MM` 24-hour. Mutable via `patch`. */
160
+ startTime?: string;
161
+ /** WAL retention window (1–7 days). Mutable via `patch`. */
162
+ transactionLogRetentionDays?: number;
163
+ };
164
+ /**
165
+ * Postgres flags (e.g. `shared_buffers`, `max_connections`).
166
+ * Mutable via `patch`; some flags trigger a restart.
167
+ * @see https://cloud.google.com/sql/docs/postgres/flags
168
+ */
169
+ databaseFlags?: ReadonlyArray<{
170
+ name: string;
171
+ value: string;
172
+ }>;
173
+ /**
174
+ * Block alchemy from deleting the instance via the API. Disable
175
+ * before running destroy.
176
+ * @see https://cloud.google.com/sql/docs/postgres/deletion-protection
177
+ */
178
+ deletionProtectionEnabled?: boolean;
179
+ /** Park (`NEVER`) or run (`ALWAYS`) the instance. Mutable via `patch`. */
180
+ activationPolicy?: SqlActivationPolicy;
181
+ /**
182
+ * `ZONAL` = single zone; `REGIONAL` = HA standby in a second zone.
183
+ * Mutable via `patch` (transitions to/from `REGIONAL` take ~10 min).
184
+ * @see https://cloud.google.com/sql/docs/postgres/high-availability
185
+ */
186
+ availabilityType?: SqlAvailabilityType;
187
+ };
188
+ };
189
+ export type SqlInstanceIpAddress = {
190
+ /** Address class — `PRIMARY` (public), `PRIVATE`, or `OUTGOING`. */
191
+ type: string | undefined;
192
+ /** The IP itself. */
193
+ ipAddress: string | undefined;
194
+ };
195
+ export type SqlInstanceAttributes = {
196
+ /** Bare instance name (no `projects/.../instances/` prefix). */
197
+ name: string;
198
+ /** Server-defined URL for the instance. */
199
+ selfLink: string;
200
+ /** GCP project ID. */
201
+ project: string;
202
+ /** Region. */
203
+ region: string;
204
+ /**
205
+ * `project:region:name` — the canonical identifier the Cloud SQL
206
+ * Auth Proxy and the IAM authn token exchange both consume.
207
+ */
208
+ connectionName: string;
209
+ /** Echoed Postgres version (e.g. `POSTGRES_17`). */
210
+ databaseVersion: string;
211
+ /** Lifecycle state — `RUNNABLE` once ready. */
212
+ state: string;
213
+ /** All IPs Cloud SQL has assigned. */
214
+ ipAddresses: ReadonlyArray<SqlInstanceIpAddress>;
215
+ /** Convenience: first `PRIVATE` IP, if any. */
216
+ privateIpAddress: string | undefined;
217
+ /** Convenience: first `PRIMARY` (public) IP, if any. */
218
+ publicIpAddress: string | undefined;
219
+ /** Server CA cert; useful for pinning TLS roots from a client. */
220
+ serverCaCert: {
221
+ cert: string | undefined;
222
+ commonName: string | undefined;
223
+ expirationTime: string | undefined;
224
+ sha1Fingerprint: string | undefined;
225
+ } | undefined;
226
+ /** Monotonic optimistic-concurrency token — round-tripped on patch. */
227
+ settingsVersion: string | undefined;
228
+ /** Labels currently set, including alchemy internals. */
229
+ labels: Record<string, string>;
230
+ };
231
+ export type SqlInstance = Resource<"GCP.SqlInstance", SqlInstanceProps, SqlInstanceAttributes, never, GCP.Providers>;
232
+ export declare const SqlInstance: import("alchemy").ResourceClass<SqlInstance>;
233
+ export declare const SqlInstanceProvider: () => import("effect/Layer").Layer<Provider.Provider<SqlInstance>, never, import("effect/unstable/http/HttpClient").HttpClient | import("alchemy").Stage | import("alchemy").Stack | import("@distilled.cloud/gcp").Credentials>;
234
+ //# sourceMappingURL=Instance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Instance.d.ts","sourceRoot":"","sources":["../../src/Sqladmin/Instance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,251 @@
1
+ import * as sql from "@distilled.cloud/gcp/sqladmin-v1";
2
+ import { Resource } from "alchemy";
3
+ import { Unowned } from "alchemy/AdoptPolicy";
4
+ import { deepEqual, isResolved, somePropsAreDifferent } from "alchemy/Diff";
5
+ import { createPhysicalName } from "alchemy/PhysicalName";
6
+ import * as Provider from "alchemy/Provider";
7
+ import { diffTags } from "alchemy/Tags";
8
+ import * as Duration from "effect/Duration";
9
+ import * as Effect from "effect/Effect";
10
+ import * as Redacted from "effect/Redacted";
11
+ import * as Schedule from "effect/Schedule";
12
+ import { gcpInternalLabels, hasAlchemyLabels } from "../Tags.js";
13
+ import { makeAwaitOperation } from "./Operations.js";
14
+ import { reshapeBadRequest, validateInstanceName } from "./Validation.js";
15
+ export const SqlInstance = Resource("GCP.SqlInstance");
16
+ const toAddress = (m) => ({
17
+ type: m.type,
18
+ ipAddress: m.ipAddress,
19
+ });
20
+ const toAttributes = (i, parent) => {
21
+ const ipAddresses = (i.ipAddresses ?? []).map(toAddress);
22
+ return {
23
+ name: parent.name,
24
+ selfLink: i.selfLink ?? "",
25
+ project: parent.project,
26
+ region: parent.region,
27
+ connectionName: i.connectionName ?? `${parent.project}:${parent.region}:${parent.name}`,
28
+ databaseVersion: i.databaseVersion ?? "",
29
+ state: i.state ?? "",
30
+ ipAddresses,
31
+ privateIpAddress: ipAddresses.find((a) => a.type === "PRIVATE")?.ipAddress,
32
+ publicIpAddress: ipAddresses.find((a) => a.type === "PRIMARY")?.ipAddress,
33
+ serverCaCert: i.serverCaCert
34
+ ? {
35
+ cert: i.serverCaCert.cert,
36
+ commonName: i.serverCaCert.commonName,
37
+ expirationTime: i.serverCaCert.expirationTime,
38
+ sha1Fingerprint: i.serverCaCert.sha1Fingerprint,
39
+ }
40
+ : undefined,
41
+ settingsVersion: i.settings?.settingsVersion,
42
+ labels: { ...(i.settings?.userLabels ?? {}) },
43
+ };
44
+ };
45
+ /**
46
+ * Build the `Settings` body sent to the API.
47
+ *
48
+ * Only sets fields the user has populated, so distinct from a settings
49
+ * stanza diff: server-injected defaults aren't overwritten by an
50
+ * `undefined` from us.
51
+ */
52
+ const toSettingsBody = (s, userLabels, settingsVersion) => ({
53
+ tier: s.tier,
54
+ userLabels,
55
+ ...(s.edition ? { edition: s.edition } : {}),
56
+ ...(s.dataDiskSizeGb !== undefined
57
+ ? { dataDiskSizeGb: String(s.dataDiskSizeGb) }
58
+ : {}),
59
+ ...(s.dataDiskType ? { dataDiskType: s.dataDiskType } : {}),
60
+ ...(s.diskAutoresize !== undefined
61
+ ? { storageAutoResize: s.diskAutoresize }
62
+ : {}),
63
+ ...(s.diskAutoresizeLimit !== undefined
64
+ ? { storageAutoResizeLimit: String(s.diskAutoresizeLimit) }
65
+ : {}),
66
+ ...(s.ipConfiguration
67
+ ? {
68
+ ipConfiguration: {
69
+ ...(s.ipConfiguration.ipv4Enabled !== undefined
70
+ ? { ipv4Enabled: s.ipConfiguration.ipv4Enabled }
71
+ : {}),
72
+ ...(s.ipConfiguration.privateNetwork
73
+ ? { privateNetwork: s.ipConfiguration.privateNetwork }
74
+ : {}),
75
+ ...(s.ipConfiguration.enablePrivatePathForGoogleCloudServices !==
76
+ undefined
77
+ ? {
78
+ enablePrivatePathForGoogleCloudServices: s.ipConfiguration.enablePrivatePathForGoogleCloudServices,
79
+ }
80
+ : {}),
81
+ ...(s.ipConfiguration.requireSsl !== undefined
82
+ ? { requireSsl: s.ipConfiguration.requireSsl }
83
+ : {}),
84
+ },
85
+ }
86
+ : {}),
87
+ ...(s.backupConfiguration ? { backupConfiguration: s.backupConfiguration } : {}),
88
+ ...(s.databaseFlags ? { databaseFlags: s.databaseFlags } : {}),
89
+ ...(s.deletionProtectionEnabled !== undefined
90
+ ? { deletionProtectionEnabled: s.deletionProtectionEnabled }
91
+ : {}),
92
+ ...(s.activationPolicy ? { activationPolicy: s.activationPolicy } : {}),
93
+ ...(s.availabilityType ? { availabilityType: s.availabilityType } : {}),
94
+ ...(settingsVersion !== undefined ? { settingsVersion } : {}),
95
+ });
96
+ export const SqlInstanceProvider = () => Provider.effect(SqlInstance, Effect.gen(function* () {
97
+ const getInstances = yield* sql.getInstances;
98
+ const insertInstances = yield* sql.insertInstances;
99
+ const patchInstances = yield* sql.patchInstances;
100
+ const deleteInstances = yield* sql.deleteInstances;
101
+ const getOperations = yield* sql.getOperations;
102
+ const awaitOperation = makeAwaitOperation(getOperations);
103
+ const observe = (project, name) => getInstances({ project, instance: name }).pipe(Effect.catchTag("NotFound", () => Effect.succeed(undefined)), Effect.catchTag("Forbidden", () => Effect.succeed(undefined)));
104
+ const syncMutable = Effect.fn(function* (args) {
105
+ const obsSettings = args.observed.settings ?? {};
106
+ const desiredSettingsForCompare = toSettingsBody(args.news.settings, args.desiredLabels);
107
+ // Per-field diff — settingsVersion is added below only if we
108
+ // actually need to patch, so it's not part of the no-op check.
109
+ let needPatch = false;
110
+ const reasons = [];
111
+ const compare = (key, a, b) => {
112
+ if (!deepEqual(a, b)) {
113
+ needPatch = true;
114
+ reasons.push(key);
115
+ }
116
+ };
117
+ compare("tier", obsSettings.tier, desiredSettingsForCompare.tier);
118
+ compare("edition", obsSettings.edition, desiredSettingsForCompare.edition);
119
+ compare("dataDiskSizeGb", obsSettings.dataDiskSizeGb, desiredSettingsForCompare.dataDiskSizeGb);
120
+ compare("dataDiskType", obsSettings.dataDiskType, desiredSettingsForCompare.dataDiskType);
121
+ compare("storageAutoResize", obsSettings.storageAutoResize, desiredSettingsForCompare.storageAutoResize);
122
+ compare("storageAutoResizeLimit", obsSettings.storageAutoResizeLimit, desiredSettingsForCompare.storageAutoResizeLimit);
123
+ compare("ipConfiguration", obsSettings.ipConfiguration, desiredSettingsForCompare.ipConfiguration);
124
+ compare("backupConfiguration", obsSettings.backupConfiguration, desiredSettingsForCompare.backupConfiguration);
125
+ compare("databaseFlags", obsSettings.databaseFlags ?? [], desiredSettingsForCompare.databaseFlags ?? []);
126
+ compare("deletionProtectionEnabled", obsSettings.deletionProtectionEnabled, desiredSettingsForCompare.deletionProtectionEnabled);
127
+ compare("activationPolicy", obsSettings.activationPolicy, desiredSettingsForCompare.activationPolicy);
128
+ compare("availabilityType", obsSettings.availabilityType, desiredSettingsForCompare.availabilityType);
129
+ const labelDiff = diffTags({ ...(obsSettings.userLabels ?? {}) }, args.desiredLabels);
130
+ if (labelDiff.removed.length > 0 || labelDiff.upsert.length > 0) {
131
+ needPatch = true;
132
+ reasons.push("userLabels");
133
+ }
134
+ if (!needPatch)
135
+ return;
136
+ // Thread the observed settingsVersion through the patch body
137
+ // — Cloud SQL uses it as the optimistic-concurrency token
138
+ // (etag is deprecated on this resource).
139
+ const body = {
140
+ settings: toSettingsBody(args.news.settings, args.desiredLabels, obsSettings.settingsVersion),
141
+ };
142
+ const op = yield* patchInstances({
143
+ project: args.project,
144
+ instance: args.name,
145
+ body,
146
+ }).pipe(Effect.catchTag("BadRequest", reshapeBadRequest("Instance", "patch")));
147
+ if (op.name)
148
+ yield* awaitOperation(args.project, op.name, args.session);
149
+ });
150
+ return {
151
+ stables: ["name", "selfLink", "project", "region", "connectionName"],
152
+ diff: Effect.fn(function* ({ news, olds = {} }) {
153
+ if (!isResolved(news))
154
+ return undefined;
155
+ if (somePropsAreDifferent(olds, news, [
156
+ "project",
157
+ "region",
158
+ "name",
159
+ "databaseVersion",
160
+ ])) {
161
+ return { action: "replace" };
162
+ }
163
+ return undefined;
164
+ }),
165
+ reconcile: Effect.fn(function* ({ id, news, session }) {
166
+ const internalLabels = yield* gcpInternalLabels(id);
167
+ const desiredName = news.name ??
168
+ (yield* createPhysicalName({ id, maxLength: 98 })).toLowerCase();
169
+ yield* validateInstanceName(desiredName);
170
+ const desiredLabels = {
171
+ ...(news.labels ?? {}),
172
+ ...internalLabels,
173
+ };
174
+ // 1. Observe — collapse 403 to "missing" alongside 404.
175
+ let observed = yield* observe(news.project, desiredName);
176
+ // 2. Ensure — insert. Like Cloud Run / GKE, sqladmin can 403
177
+ // with "Cloud SQL Admin API has not been used in project
178
+ // ... If you enabled this API recently, wait …" for ~1–2
179
+ // minutes after ApiEnable lands. Retry the insert on that
180
+ // specific 403; other Forbidden cases propagate.
181
+ if (!observed) {
182
+ const op = yield* insertInstances({
183
+ project: news.project,
184
+ body: {
185
+ name: desiredName,
186
+ region: news.region,
187
+ databaseVersion: news.databaseVersion,
188
+ ...(news.rootPassword
189
+ ? { rootPassword: Redacted.value(news.rootPassword) }
190
+ : {}),
191
+ settings: toSettingsBody(news.settings, desiredLabels),
192
+ },
193
+ }).pipe(Effect.retry({
194
+ while: (e) => e?._tag === "Forbidden" &&
195
+ /enabled this API recently|has not been used/i.test(e.message ?? ""),
196
+ schedule: Schedule.spaced(Duration.seconds(15)).pipe(Schedule.both(Schedule.recurs(20)), Schedule.tapOutput(() => session.note("Waiting for Cloud SQL Admin API enablement to propagate…"))),
197
+ }), Effect.catchTag("Conflict", () => Effect.succeed(undefined)), Effect.catchTag("BadRequest", reshapeBadRequest("Instance", "insert")));
198
+ if (op?.name)
199
+ yield* awaitOperation(news.project, op.name, session);
200
+ observed = yield* getInstances({
201
+ project: news.project,
202
+ instance: desiredName,
203
+ });
204
+ }
205
+ // 3. Sync — single patch with the full settings body when any
206
+ // field drifts. settingsVersion threaded through for OCC.
207
+ yield* syncMutable({
208
+ project: news.project,
209
+ name: desiredName,
210
+ observed,
211
+ news,
212
+ desiredLabels,
213
+ session,
214
+ });
215
+ const final = yield* getInstances({
216
+ project: news.project,
217
+ instance: desiredName,
218
+ });
219
+ return toAttributes(final, {
220
+ project: news.project,
221
+ region: news.region,
222
+ name: desiredName,
223
+ });
224
+ }),
225
+ delete: Effect.fn(function* ({ output, session }) {
226
+ yield* deleteInstances({
227
+ project: output.project,
228
+ instance: output.name,
229
+ }).pipe(Effect.flatMap((op) => op.name
230
+ ? awaitOperation(output.project, op.name, session)
231
+ : Effect.succeed(op)), Effect.catchTag("NotFound", () => Effect.void), Effect.catchTag("BadRequest", reshapeBadRequest("Instance", "delete")));
232
+ }),
233
+ read: Effect.fn(function* ({ id, output, olds }) {
234
+ const project = output?.project ?? olds?.project;
235
+ const region = output?.region ?? olds?.region;
236
+ if (!project || !region)
237
+ return undefined;
238
+ const name = output?.name ??
239
+ olds?.name ??
240
+ (yield* createPhysicalName({ id, maxLength: 98 })).toLowerCase();
241
+ const observed = yield* observe(project, name);
242
+ if (!observed)
243
+ return undefined;
244
+ const attrs = toAttributes(observed, { project, region, name });
245
+ return (yield* hasAlchemyLabels(id, observed.settings?.userLabels))
246
+ ? attrs
247
+ : Unowned(attrs);
248
+ }),
249
+ };
250
+ }));
251
+ //# sourceMappingURL=Instance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Instance.js","sourceRoot":"","sources":["../../src/Sqladmin/Instance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { ConfigError } from "@distilled.cloud/gcp";
2
+ import * as sql from "@distilled.cloud/gcp/sqladmin-v1";
3
+ import type { ScopedPlanStatusSession } from "alchemy/Cli/Cli";
4
+ import * as Effect from "effect/Effect";
5
+ /**
6
+ * Resolved callable signature of `sql.getOperations`.
7
+ *
8
+ * `sql.getOperations` is itself an `Effect<callable, never, Credentials |
9
+ * HttpClient>`, so `Effect.Success` extracts the callable. Using a
10
+ * derived alias keeps the helper aligned with the SDK without us
11
+ * hand-writing the input/output/error union, which would drift if the
12
+ * patch set changes.
13
+ */
14
+ type GetOperations = Effect.Success<typeof sql.getOperations>;
15
+ /**
16
+ * Build the Cloud SQL Admin long-running-operation polling helper.
17
+ *
18
+ * Sqladmin `Operation`s carry `.status: "PENDING" | "RUNNING" | "DONE"`
19
+ * (NOT `.done: boolean` like Cloud Resource Manager / Cloud Run, and
20
+ * NOT `.status === "DONE"` against a different enum). Verified at
21
+ * `vendor/distilled/packages/gcp/src/services/sqladmin-v1.ts:606–612`.
22
+ *
23
+ * Unlike Cloud Run, Sqladmin operations are NOT fully-qualified path
24
+ * names — the API returns a bare operation id (e.g. `e9e88dca-...`),
25
+ * and `getOperations` takes `{ project, operation }`. Callers therefore
26
+ * pass the bare id alongside the parent project context.
27
+ *
28
+ * Schedule: exponential 1s → 1.5× growth, capped via the count cap of
29
+ * 60 retries → roughly a few minutes wall ceiling. Most Cloud SQL
30
+ * operations (CREATE_USER, CREATE_DATABASE, UPDATE settings) finish
31
+ * in 1–30 s; instance CREATE / patch involving a restart are the long
32
+ * pole at 4–10 min, so callers running those should be aware that
33
+ * recurs(60) may bottom out and surface as a retry budget exhaustion.
34
+ *
35
+ * @see https://cloud.google.com/sql/docs/postgres/admin-api/rest/v1/operations
36
+ */
37
+ export declare const makeAwaitOperation: (getOperations: GetOperations) => (project: string, operationName: string, session: ScopedPlanStatusSession) => Effect.Effect<sql.Operation, ConfigError | sql.GetOperationsError | {
38
+ _tag: "OperationPending";
39
+ }, never>;
40
+ export {};
41
+ //# sourceMappingURL=Operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Operations.d.ts","sourceRoot":"","sources":["../../src/Sqladmin/Operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,GAAG,MAAM,kCAAkC,CAAC;AACxD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE/D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC;;;;;;;;GAQG;AACH,KAAK,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,aAAa,CAAC,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,kBAAkB,GAAI,eAAe,aAAa;;SAgC3D,CAAC"}