@microagi/alchemy-gcp 0.1.2

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 (123) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +88 -0
  3. package/lib/Auth/AuthProvider.d.ts +48 -0
  4. package/lib/Auth/AuthProvider.d.ts.map +1 -0
  5. package/lib/Auth/AuthProvider.js +84 -0
  6. package/lib/Auth/AuthProvider.js.map +1 -0
  7. package/lib/Auth/Credentials.d.ts +28 -0
  8. package/lib/Auth/Credentials.d.ts.map +1 -0
  9. package/lib/Auth/Credentials.js +41 -0
  10. package/lib/Auth/Credentials.js.map +1 -0
  11. package/lib/CloudResourceManager/Project.d.ts +143 -0
  12. package/lib/CloudResourceManager/Project.d.ts.map +1 -0
  13. package/lib/CloudResourceManager/Project.js +272 -0
  14. package/lib/CloudResourceManager/Project.js.map +1 -0
  15. package/lib/CloudResourceManager/index.d.ts +3 -0
  16. package/lib/CloudResourceManager/index.d.ts.map +1 -0
  17. package/lib/CloudResourceManager/index.js +2 -0
  18. package/lib/CloudResourceManager/index.js.map +1 -0
  19. package/lib/Compute/GlobalAddress.d.ts +101 -0
  20. package/lib/Compute/GlobalAddress.d.ts.map +1 -0
  21. package/lib/Compute/GlobalAddress.js +134 -0
  22. package/lib/Compute/GlobalAddress.js.map +1 -0
  23. package/lib/Compute/Network.d.ts +114 -0
  24. package/lib/Compute/Network.d.ts.map +1 -0
  25. package/lib/Compute/Network.js +145 -0
  26. package/lib/Compute/Network.js.map +1 -0
  27. package/lib/Compute/Operations.d.ts +34 -0
  28. package/lib/Compute/Operations.d.ts.map +1 -0
  29. package/lib/Compute/Operations.js +62 -0
  30. package/lib/Compute/Operations.js.map +1 -0
  31. package/lib/Compute/SharedVpcHost.d.ts +44 -0
  32. package/lib/Compute/SharedVpcHost.d.ts.map +1 -0
  33. package/lib/Compute/SharedVpcHost.js +71 -0
  34. package/lib/Compute/SharedVpcHost.js.map +1 -0
  35. package/lib/Compute/SharedVpcServiceProject.d.ts +46 -0
  36. package/lib/Compute/SharedVpcServiceProject.d.ts.map +1 -0
  37. package/lib/Compute/SharedVpcServiceProject.js +96 -0
  38. package/lib/Compute/SharedVpcServiceProject.js.map +1 -0
  39. package/lib/Compute/Subnetwork.d.ts +108 -0
  40. package/lib/Compute/Subnetwork.d.ts.map +1 -0
  41. package/lib/Compute/Subnetwork.js +201 -0
  42. package/lib/Compute/Subnetwork.js.map +1 -0
  43. package/lib/Compute/index.d.ts +6 -0
  44. package/lib/Compute/index.d.ts.map +1 -0
  45. package/lib/Compute/index.js +6 -0
  46. package/lib/Compute/index.js.map +1 -0
  47. package/lib/Container/Cluster.d.ts +216 -0
  48. package/lib/Container/Cluster.d.ts.map +1 -0
  49. package/lib/Container/Cluster.js +326 -0
  50. package/lib/Container/Cluster.js.map +1 -0
  51. package/lib/Container/NodePool.d.ts +214 -0
  52. package/lib/Container/NodePool.d.ts.map +1 -0
  53. package/lib/Container/NodePool.js +344 -0
  54. package/lib/Container/NodePool.js.map +1 -0
  55. package/lib/Container/Operations.d.ts +50 -0
  56. package/lib/Container/Operations.d.ts.map +1 -0
  57. package/lib/Container/Operations.js +51 -0
  58. package/lib/Container/Operations.js.map +1 -0
  59. package/lib/Container/index.d.ts +5 -0
  60. package/lib/Container/index.d.ts.map +1 -0
  61. package/lib/Container/index.js +3 -0
  62. package/lib/Container/index.js.map +1 -0
  63. package/lib/Parallelstore/Instance.d.ts +119 -0
  64. package/lib/Parallelstore/Instance.d.ts.map +1 -0
  65. package/lib/Parallelstore/Instance.js +180 -0
  66. package/lib/Parallelstore/Instance.js.map +1 -0
  67. package/lib/Parallelstore/index.d.ts +2 -0
  68. package/lib/Parallelstore/index.d.ts.map +1 -0
  69. package/lib/Parallelstore/index.js +2 -0
  70. package/lib/Parallelstore/index.js.map +1 -0
  71. package/lib/Providers.d.ts +24 -0
  72. package/lib/Providers.d.ts.map +1 -0
  73. package/lib/Providers.js +51 -0
  74. package/lib/Providers.js.map +1 -0
  75. package/lib/ServiceNetworking/PsaConnection.d.ts +84 -0
  76. package/lib/ServiceNetworking/PsaConnection.d.ts.map +1 -0
  77. package/lib/ServiceNetworking/PsaConnection.js +130 -0
  78. package/lib/ServiceNetworking/PsaConnection.js.map +1 -0
  79. package/lib/ServiceNetworking/index.d.ts +2 -0
  80. package/lib/ServiceNetworking/index.d.ts.map +1 -0
  81. package/lib/ServiceNetworking/index.js +2 -0
  82. package/lib/ServiceNetworking/index.js.map +1 -0
  83. package/lib/ServiceUsage/ApiEnable.d.ts +78 -0
  84. package/lib/ServiceUsage/ApiEnable.d.ts.map +1 -0
  85. package/lib/ServiceUsage/ApiEnable.js +132 -0
  86. package/lib/ServiceUsage/ApiEnable.js.map +1 -0
  87. package/lib/ServiceUsage/index.d.ts +3 -0
  88. package/lib/ServiceUsage/index.d.ts.map +1 -0
  89. package/lib/ServiceUsage/index.js +2 -0
  90. package/lib/ServiceUsage/index.js.map +1 -0
  91. package/lib/Tags.d.ts +57 -0
  92. package/lib/Tags.d.ts.map +1 -0
  93. package/lib/Tags.js +106 -0
  94. package/lib/Tags.js.map +1 -0
  95. package/lib/index.d.ts +11 -0
  96. package/lib/index.d.ts.map +1 -0
  97. package/lib/index.js +10 -0
  98. package/lib/index.js.map +1 -0
  99. package/package.json +70 -0
  100. package/src/Auth/AuthProvider.ts +180 -0
  101. package/src/Auth/Credentials.ts +69 -0
  102. package/src/CloudResourceManager/Project.ts +517 -0
  103. package/src/CloudResourceManager/index.ts +2 -0
  104. package/src/Compute/GlobalAddress.ts +283 -0
  105. package/src/Compute/Network.ts +306 -0
  106. package/src/Compute/Operations.ts +108 -0
  107. package/src/Compute/SharedVpcHost.ts +141 -0
  108. package/src/Compute/SharedVpcServiceProject.ts +185 -0
  109. package/src/Compute/Subnetwork.ts +375 -0
  110. package/src/Compute/index.ts +5 -0
  111. package/src/Container/Cluster.ts +599 -0
  112. package/src/Container/NodePool.ts +620 -0
  113. package/src/Container/Operations.ts +88 -0
  114. package/src/Container/index.ts +8 -0
  115. package/src/Parallelstore/Instance.ts +371 -0
  116. package/src/Parallelstore/index.ts +1 -0
  117. package/src/Providers.ts +84 -0
  118. package/src/ServiceNetworking/PsaConnection.ts +269 -0
  119. package/src/ServiceNetworking/index.ts +1 -0
  120. package/src/ServiceUsage/ApiEnable.ts +267 -0
  121. package/src/ServiceUsage/index.ts +2 -0
  122. package/src/Tags.ts +130 -0
  123. package/src/index.ts +16 -0
@@ -0,0 +1,216 @@
1
+ import { Resource } from "alchemy";
2
+ import * as Provider from "alchemy/Provider";
3
+ import type * as GCP from "../Providers.ts";
4
+ import { type NodePoolProps } from "./NodePool.ts";
5
+ /**
6
+ * Spec for the bootstrap node pool created inline with the cluster.
7
+ *
8
+ * Same shape as the create-time subset of `NodePoolProps`, minus the
9
+ * parent-identity fields (`project`, `location`, `clusterName`), which
10
+ * are inherited from the cluster.
11
+ */
12
+ export type ClusterInitialNodePool = {
13
+ /** Pool name. Required — no default. Lowercase alphanumeric+hyphens, ≤40 chars. */
14
+ name: string;
15
+ /** Initial node count. Required — cluster needs nonzero capacity at create. */
16
+ initialNodeCount: number;
17
+ /** Per-pool zones. Defaults to the cluster's zone/region. */
18
+ nodeLocations?: ReadonlyArray<string>;
19
+ /** Node configuration (machine type, disk, accelerators, taints, …). */
20
+ config: NodePoolProps["config"];
21
+ /** Cluster autoscaler config. */
22
+ autoscaling?: NodePoolProps["autoscaling"];
23
+ /** Auto-upgrade / auto-repair. */
24
+ management?: NodePoolProps["management"];
25
+ /** Surge upgrade settings. */
26
+ upgradeSettings?: NodePoolProps["upgradeSettings"];
27
+ };
28
+ export type ClusterProps = {
29
+ /** GCP project ID hosting the cluster. Immutable — replace if changed. */
30
+ project: string;
31
+ /**
32
+ * GCP zone (e.g. `us-central1-a`) for a zonal cluster, or region
33
+ * (e.g. `us-central1`) for a regional cluster. Immutable — replace.
34
+ */
35
+ location: string;
36
+ /**
37
+ * Cluster name. Defaults to `createPhysicalName({ id, lowercase: true,
38
+ * maxLength: 40 })`. Lowercase alphanumeric + hyphens, ≤40 chars.
39
+ * Immutable — replace if changed.
40
+ */
41
+ name?: string;
42
+ /**
43
+ * Additional zones for cluster nodes. Mutable via `setLocations`.
44
+ */
45
+ nodeLocations?: ReadonlyArray<string>;
46
+ /**
47
+ * VPC short name or self-link. Omit to use the project's `default`
48
+ * VPC. Immutable — replace if changed.
49
+ */
50
+ network?: string;
51
+ /** Subnet within the VPC. Immutable — replace if changed. */
52
+ subnetwork?: string;
53
+ /**
54
+ * VPC-native settings. `useIpAliases: true` is GKE's default for new
55
+ * clusters and the only path that supports private clusters.
56
+ * Immutable — replace if changed.
57
+ */
58
+ ipAllocationPolicy?: {
59
+ useIpAliases?: boolean;
60
+ clusterIpv4CidrBlock?: string;
61
+ servicesIpv4CidrBlock?: string;
62
+ clusterSecondaryRangeName?: string;
63
+ servicesSecondaryRangeName?: string;
64
+ };
65
+ /** GKE release channel. Mutable via `update` (`desiredReleaseChannel`). */
66
+ releaseChannel?: {
67
+ channel: "RAPID" | "REGULAR" | "STABLE" | "UNSPECIFIED";
68
+ };
69
+ /**
70
+ * Workload Identity binds K8s SAs to GCP SAs. Format:
71
+ * `<projectId>.svc.id.goog`. Mutable via `update`.
72
+ */
73
+ workloadIdentityConfig?: {
74
+ workloadPool: string;
75
+ };
76
+ /** Cluster addons. Mutable via dedicated `setAddons`. */
77
+ addonsConfig?: {
78
+ httpLoadBalancing?: {
79
+ disabled?: boolean;
80
+ };
81
+ horizontalPodAutoscaling?: {
82
+ disabled?: boolean;
83
+ };
84
+ networkPolicyConfig?: {
85
+ disabled?: boolean;
86
+ };
87
+ gcePersistentDiskCsiDriverConfig?: {
88
+ enabled?: boolean;
89
+ };
90
+ gcsFuseCsiDriverConfig?: {
91
+ enabled?: boolean;
92
+ };
93
+ gkeBackupAgentConfig?: {
94
+ enabled?: boolean;
95
+ };
96
+ dnsCacheConfig?: {
97
+ enabled?: boolean;
98
+ };
99
+ configConnectorConfig?: {
100
+ enabled?: boolean;
101
+ };
102
+ };
103
+ /** Logging service. Mutable via `setLogging`. */
104
+ loggingService?: string;
105
+ /** Monitoring service. Mutable via `setMonitoring`. */
106
+ monitoringService?: string;
107
+ /** Maintenance window/exclusions. Mutable via `setMaintenancePolicy`. */
108
+ maintenancePolicy?: {
109
+ window?: {
110
+ dailyMaintenanceWindow?: {
111
+ startTime: string;
112
+ };
113
+ recurringWindow?: {
114
+ window: {
115
+ startTime: string;
116
+ endTime: string;
117
+ };
118
+ recurrence: string;
119
+ };
120
+ };
121
+ };
122
+ /**
123
+ * Network policy enforcement (e.g. Calico). Mutable via
124
+ * `setNetworkPolicy`. Requires `networkPolicyConfig` addon.
125
+ */
126
+ networkPolicy?: {
127
+ enabled?: boolean;
128
+ provider?: "PROVIDER_UNSPECIFIED" | "CALICO";
129
+ };
130
+ /**
131
+ * Resource labels. Alchemy internal labels (`alchemy_app`,
132
+ * `alchemy_stage`, `alchemy_id`) are merged on top automatically and
133
+ * are reserved. Mutable via `setResourceLabels`.
134
+ */
135
+ resourceLabels?: Record<string, string>;
136
+ /**
137
+ * Initial cluster version (`MASTER_DEFAULT` if omitted). Subsequent
138
+ * master upgrades are not exposed in v1.
139
+ */
140
+ initialClusterVersion?: string;
141
+ /**
142
+ * Bootstrap node pool created inline with the cluster. **Required.**
143
+ * GKE rejects cluster creation without at least one pool.
144
+ *
145
+ * Owned by the cluster — its `config.resourceLabels` are stamped
146
+ * with the cluster's `alchemy_*` internal labels at create time.
147
+ * Consumed only on the create path: after the cluster exists,
148
+ * `Cluster.reconcile` does NOT observe, sync, or mutate this pool,
149
+ * and changes to `initialNodePool` props on subsequent runs are a
150
+ * silent no-op (NOT diffed, NOT a replace trigger).
151
+ *
152
+ * Don't declare a separate `GCP.NodePool` for the same physical
153
+ * pool — it would key its own `alchemy_id` against a different
154
+ * logical id and `read` would return `Unowned(...)`. If you want
155
+ * post-create management of the bootstrap pool's size/config, do
156
+ * it via gcloud or expand `Cluster.reconcile` to sync it; declare
157
+ * additional pools (`compute`, `gpu`, …) as separate
158
+ * `GCP.NodePool` resources.
159
+ */
160
+ initialNodePool: ClusterInitialNodePool;
161
+ };
162
+ export type ClusterAttributes = {
163
+ /** Cluster name. */
164
+ name: string;
165
+ /** Server-defined URL. */
166
+ selfLink: string;
167
+ /** IP of the master endpoint. */
168
+ endpoint: string;
169
+ /** Base64-encoded master CA cert. */
170
+ clusterCaCertificate: string;
171
+ /** GCP project ID, threaded through from props for `delete`/`read`. */
172
+ project: string;
173
+ /** Zone or region, threaded through from props. */
174
+ location: string;
175
+ /** Current control-plane version. */
176
+ currentMasterVersion: string | undefined;
177
+ /** Lifecycle status. */
178
+ status: string | undefined;
179
+ /** Active release channel. */
180
+ releaseChannel: {
181
+ channel?: string;
182
+ } | undefined;
183
+ /** Resource labels currently set, including `alchemy_*` internals. */
184
+ resourceLabels: Record<string, string>;
185
+ };
186
+ /**
187
+ * A GKE Standard cluster.
188
+ *
189
+ * Lifecycle: observe → ensure (create with the user-supplied
190
+ * `initialNodePool` inline) → sync (labels, addons, maintenance,
191
+ * locations, network policy, logging, monitoring, generic update) →
192
+ * return.
193
+ *
194
+ * Adoption: a cluster whose `resourceLabels` lack our `alchemy_*` keys
195
+ * is wrapped in `Unowned(attrs)` from `read`, forcing the user to
196
+ * pass `--adopt` before takeover.
197
+ *
198
+ * @section Creating a cluster
199
+ * @example Minimal Standard cluster
200
+ * ```typescript
201
+ * const cluster = yield* GCP.Cluster("Main", {
202
+ * project: project.projectId,
203
+ * location: "us-central1-a",
204
+ * releaseChannel: { channel: "REGULAR" },
205
+ * initialNodePool: {
206
+ * name: "system",
207
+ * initialNodeCount: 1,
208
+ * config: { machineType: "e2-medium" },
209
+ * },
210
+ * });
211
+ * ```
212
+ */
213
+ export type Cluster = Resource<"GCP.Cluster", ClusterProps, ClusterAttributes, never, GCP.Providers>;
214
+ export declare const Cluster: import("alchemy").ResourceClass<Cluster>;
215
+ export declare const ClusterProvider: () => import("effect/Layer").Layer<Provider.Provider<Cluster>, never, import("effect/unstable/http/HttpClient").HttpClient | import("alchemy").Stage | import("alchemy").Stack | import("@distilled.cloud/gcp").Credentials>;
216
+ //# sourceMappingURL=Cluster.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cluster.d.ts","sourceRoot":"","sources":["../../src/Container/Cluster.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,326 @@
1
+ import * as cont from "@distilled.cloud/gcp/container-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 * as Duration from "effect/Duration";
8
+ import * as Effect from "effect/Effect";
9
+ import * as Schedule from "effect/Schedule";
10
+ import { gcpInternalLabels, hasAlchemyLabels } from "../Tags.js";
11
+ import { toNodeConfigCreateBody } from "./NodePool.js";
12
+ import { makeAwaitOperation, qualifyOperationName } from "./Operations.js";
13
+ export const Cluster = Resource("GCP.Cluster");
14
+ /**
15
+ * Build the inline `NodePool` entry for the cluster create body.
16
+ *
17
+ * The cluster's alchemy internal labels (`alchemy_app`, `alchemy_stage`,
18
+ * `alchemy_id` keyed by the cluster's logical id) are merged into the
19
+ * pool's `config.resourceLabels`, marking the bootstrap pool as part
20
+ * of the cluster — not a free-standing resource that needs adoption.
21
+ * It is owned by the cluster, not by any `GCP.NodePool` resource; a
22
+ * separate `GCP.NodePool` declared with a different logical id will
23
+ * still see `Unowned(...)` from `read` (its own `alchemy_id` won't
24
+ * match), which is correct: that pool belongs to the cluster.
25
+ */
26
+ const toInitialNodePoolBody = (spec, clusterInternalLabels) => ({
27
+ name: spec.name,
28
+ initialNodeCount: spec.initialNodeCount,
29
+ ...(spec.nodeLocations ? { locations: spec.nodeLocations } : {}),
30
+ config: toNodeConfigCreateBody(spec.config, {
31
+ ...(spec.config.resourceLabels ?? {}),
32
+ ...clusterInternalLabels,
33
+ }),
34
+ ...(spec.autoscaling ? { autoscaling: spec.autoscaling } : {}),
35
+ ...(spec.management ? { management: spec.management } : {}),
36
+ ...(spec.upgradeSettings ? { upgradeSettings: spec.upgradeSettings } : {}),
37
+ });
38
+ const toClusterAttributes = (c, parent) => ({
39
+ name: c.name ?? "",
40
+ selfLink: c.selfLink ?? "",
41
+ endpoint: c.endpoint ?? "",
42
+ clusterCaCertificate: c.masterAuth?.clusterCaCertificate ?? "",
43
+ project: parent.project,
44
+ location: parent.location,
45
+ currentMasterVersion: c.currentMasterVersion,
46
+ status: c.status,
47
+ releaseChannel: c.releaseChannel,
48
+ resourceLabels: { ...(c.resourceLabels ?? {}) },
49
+ });
50
+ export const ClusterProvider = () => Provider.effect(Cluster, Effect.gen(function* () {
51
+ const getClusters = yield* cont.getProjectsLocationsClusters;
52
+ const createClusters = yield* cont.createProjectsLocationsClusters;
53
+ const updateClusters = yield* cont.updateProjectsLocationsClusters;
54
+ const setAddons = yield* cont.setAddonsProjectsLocationsClusters;
55
+ const setLocations = yield* cont.setLocationsProjectsLocationsClusters;
56
+ const setMaintenance = yield* cont.setMaintenancePolicyProjectsLocationsClusters;
57
+ const setNetworkPolicy = yield* cont.setNetworkPolicyProjectsLocationsClusters;
58
+ const setResourceLabels = yield* cont.setResourceLabelsProjectsLocationsClusters;
59
+ const setLogging = yield* cont.setLoggingProjectsLocationsClusters;
60
+ const setMonitoring = yield* cont.setMonitoringProjectsLocationsClusters;
61
+ const deleteClusters = yield* cont.deleteProjectsLocationsClusters;
62
+ const getOperations = yield* cont.getProjectsLocationsOperations;
63
+ const awaitOperation = makeAwaitOperation(getOperations);
64
+ // Qualify a bare operation id using the parent path of the
65
+ // resource it targets — every fqName in this provider has the
66
+ // shape `projects/{p}/locations/{l}/clusters/{c}`, so the first
67
+ // four segments give us the parent context. Avoids threading
68
+ // project/location through every sync helper's args type.
69
+ const qualifyOp = (fqName, opName) => qualifyOperationName(fqName.split("/")[1], fqName.split("/")[3], opName);
70
+ const syncClusterLabels = Effect.fn(function* (args) {
71
+ if (deepEqual(args.observed.resourceLabels ?? {}, args.desired))
72
+ return;
73
+ // `setResourceLabels` requires `labelFingerprint` for optimistic
74
+ // concurrency — read it fresh from the observed cluster.
75
+ const op = yield* setResourceLabels({
76
+ name: args.fqName,
77
+ body: {
78
+ resourceLabels: args.desired,
79
+ labelFingerprint: args.observed.labelFingerprint,
80
+ },
81
+ });
82
+ if (op.name)
83
+ yield* awaitOperation(qualifyOp(args.fqName, op.name), args.session);
84
+ });
85
+ const syncClusterAddons = Effect.fn(function* (args) {
86
+ if (!args.news.addonsConfig)
87
+ return;
88
+ if (deepEqual(args.observed.addonsConfig, args.news.addonsConfig))
89
+ return;
90
+ const op = yield* setAddons({
91
+ name: args.fqName,
92
+ body: { addonsConfig: args.news.addonsConfig },
93
+ });
94
+ if (op.name)
95
+ yield* awaitOperation(qualifyOp(args.fqName, op.name), args.session);
96
+ });
97
+ const syncClusterMaintenance = Effect.fn(function* (args) {
98
+ if (!args.news.maintenancePolicy)
99
+ return;
100
+ if (deepEqual(args.observed.maintenancePolicy, args.news.maintenancePolicy))
101
+ return;
102
+ const op = yield* setMaintenance({
103
+ name: args.fqName,
104
+ body: { maintenancePolicy: args.news.maintenancePolicy },
105
+ });
106
+ if (op.name)
107
+ yield* awaitOperation(qualifyOp(args.fqName, op.name), args.session);
108
+ });
109
+ const syncClusterLocations = Effect.fn(function* (args) {
110
+ if (!args.news.nodeLocations)
111
+ return;
112
+ if (deepEqual(args.observed.locations ?? [], args.news.nodeLocations))
113
+ return;
114
+ const op = yield* setLocations({
115
+ name: args.fqName,
116
+ body: { locations: args.news.nodeLocations },
117
+ });
118
+ if (op.name)
119
+ yield* awaitOperation(qualifyOp(args.fqName, op.name), args.session);
120
+ });
121
+ const syncClusterNetworkPolicy = Effect.fn(function* (args) {
122
+ if (!args.news.networkPolicy)
123
+ return;
124
+ if (deepEqual(args.observed.networkPolicy, args.news.networkPolicy))
125
+ return;
126
+ const op = yield* setNetworkPolicy({
127
+ name: args.fqName,
128
+ body: { networkPolicy: args.news.networkPolicy },
129
+ });
130
+ if (op.name)
131
+ yield* awaitOperation(qualifyOp(args.fqName, op.name), args.session);
132
+ });
133
+ const syncClusterLogging = Effect.fn(function* (args) {
134
+ if (args.news.loggingService === undefined)
135
+ return;
136
+ if (args.observed.loggingService === args.news.loggingService)
137
+ return;
138
+ const op = yield* setLogging({
139
+ name: args.fqName,
140
+ body: { loggingService: args.news.loggingService },
141
+ });
142
+ if (op.name)
143
+ yield* awaitOperation(qualifyOp(args.fqName, op.name), args.session);
144
+ });
145
+ const syncClusterMonitoring = Effect.fn(function* (args) {
146
+ if (args.news.monitoringService === undefined)
147
+ return;
148
+ if (args.observed.monitoringService === args.news.monitoringService)
149
+ return;
150
+ const op = yield* setMonitoring({
151
+ name: args.fqName,
152
+ body: { monitoringService: args.news.monitoringService },
153
+ });
154
+ if (op.name)
155
+ yield* awaitOperation(qualifyOp(args.fqName, op.name), args.session);
156
+ });
157
+ // Catch-all generic update for fields without dedicated setters:
158
+ // currently `releaseChannel` and `workloadIdentityConfig`. The
159
+ // API auto-derives the field mask from which `desired*` keys are
160
+ // populated — no `updateMask` parameter needed.
161
+ const syncClusterUpdate = Effect.fn(function* (args) {
162
+ const update = {};
163
+ if (args.news.releaseChannel &&
164
+ !deepEqual(args.observed.releaseChannel, args.news.releaseChannel)) {
165
+ update.desiredReleaseChannel = args.news.releaseChannel;
166
+ }
167
+ if (args.news.workloadIdentityConfig &&
168
+ !deepEqual(args.observed.workloadIdentityConfig, args.news.workloadIdentityConfig)) {
169
+ update.desiredWorkloadIdentityConfig = args.news.workloadIdentityConfig;
170
+ }
171
+ if (Object.keys(update).length === 0)
172
+ return;
173
+ const op = yield* updateClusters({
174
+ name: args.fqName,
175
+ body: { update },
176
+ });
177
+ if (op.name)
178
+ yield* awaitOperation(qualifyOp(args.fqName, op.name), args.session);
179
+ });
180
+ return {
181
+ stables: [
182
+ "name",
183
+ "selfLink",
184
+ "project",
185
+ "location",
186
+ "endpoint",
187
+ "clusterCaCertificate",
188
+ ],
189
+ diff: Effect.fn(function* ({ news, olds = {} }) {
190
+ if (!isResolved(news))
191
+ return undefined;
192
+ if (somePropsAreDifferent(olds, news, [
193
+ "project",
194
+ "location",
195
+ "name",
196
+ "network",
197
+ "subnetwork",
198
+ ])) {
199
+ return { action: "replace" };
200
+ }
201
+ if (!deepEqual(olds.ipAllocationPolicy, news.ipAllocationPolicy)) {
202
+ return { action: "replace" };
203
+ }
204
+ // `initialNodePool` is intentionally NOT part of diff — it is
205
+ // consumed only on create. See ClusterProps JSDoc.
206
+ return undefined;
207
+ }),
208
+ reconcile: Effect.fn(function* ({ id, news, session }) {
209
+ const internalLabels = yield* gcpInternalLabels(id);
210
+ const desiredName = news.name ??
211
+ (yield* createPhysicalName({ id, maxLength: 40 })).toLowerCase();
212
+ const parent = `projects/${news.project}/locations/${news.location}`;
213
+ const fqName = `${parent}/clusters/${desiredName}`;
214
+ const desiredLabels = {
215
+ ...(news.resourceLabels ?? {}),
216
+ ...internalLabels,
217
+ };
218
+ // 1. Observe — collapse 403 to "missing" alongside 404. GCP
219
+ // returns 403 for invisible resources/projects.
220
+ let observed = yield* getClusters({ name: fqName }).pipe(Effect.catchTag("NotFound", () => Effect.succeed(undefined)), Effect.catchTag("Forbidden", () => Effect.succeed(undefined)));
221
+ // 2. Ensure — create with the user-supplied bootstrap pool
222
+ // inline. No default-pool dance: an explicit
223
+ // `nodePools: [...]` entry instructs GKE to skip the
224
+ // implicit default. `Conflict` covers concurrent creates
225
+ // and state-persistence races; fall through and re-observe.
226
+ if (!observed) {
227
+ const initialPoolBody = toInitialNodePoolBody(news.initialNodePool, internalLabels);
228
+ // GKE create can fire faster than ApiEnable's effect
229
+ // propagates: GCP returns 403 with "Kubernetes Engine API
230
+ // has not been used in project ... If you enabled this
231
+ // API recently, wait a few minutes …" even when the
232
+ // ApiEnable LRO has reported DONE. Retry the *create call*
233
+ // (not the LRO poll, which doesn't run until create
234
+ // succeeds) on this specific 403 for ~5 minutes; other
235
+ // Forbidden cases propagate normally.
236
+ const op = yield* createClusters({
237
+ parent,
238
+ body: {
239
+ cluster: {
240
+ name: desiredName,
241
+ ...(news.network ? { network: news.network } : {}),
242
+ ...(news.subnetwork ? { subnetwork: news.subnetwork } : {}),
243
+ ...(news.ipAllocationPolicy
244
+ ? { ipAllocationPolicy: news.ipAllocationPolicy }
245
+ : {}),
246
+ ...(news.releaseChannel ? { releaseChannel: news.releaseChannel } : {}),
247
+ ...(news.workloadIdentityConfig
248
+ ? { workloadIdentityConfig: news.workloadIdentityConfig }
249
+ : {}),
250
+ ...(news.addonsConfig ? { addonsConfig: news.addonsConfig } : {}),
251
+ ...(news.loggingService ? { loggingService: news.loggingService } : {}),
252
+ ...(news.monitoringService
253
+ ? { monitoringService: news.monitoringService }
254
+ : {}),
255
+ ...(news.maintenancePolicy
256
+ ? { maintenancePolicy: news.maintenancePolicy }
257
+ : {}),
258
+ ...(news.networkPolicy ? { networkPolicy: news.networkPolicy } : {}),
259
+ ...(news.initialClusterVersion
260
+ ? { initialClusterVersion: news.initialClusterVersion }
261
+ : {}),
262
+ ...(news.nodeLocations ? { locations: news.nodeLocations } : {}),
263
+ resourceLabels: desiredLabels,
264
+ nodePools: [initialPoolBody],
265
+ },
266
+ },
267
+ }).pipe(Effect.retry({
268
+ while: (e) => e?._tag === "Forbidden" &&
269
+ /enabled this API recently|has not been used/i.test(e.message ?? ""),
270
+ schedule: Schedule.spaced(Duration.seconds(15)).pipe(Schedule.both(Schedule.recurs(20)), // 20 × 15s ≈ 5 min
271
+ Schedule.tapOutput(() => session.note("Waiting for Container API enablement to propagate…"))),
272
+ }), Effect.catchTag("Conflict", () => Effect.succeed(undefined)));
273
+ if (op?.name)
274
+ yield* awaitOperation(qualifyOp(fqName, op.name), session);
275
+ observed = yield* getClusters({ name: fqName });
276
+ }
277
+ // 3. Sync — each aspect independently idempotent. Re-observe
278
+ // after the labels call so the fingerprint stays valid for
279
+ // subsequent setters (although they don't all use it,
280
+ // keeping the observed view fresh prevents subtle drift in
281
+ // the deepEqual short-circuits below).
282
+ yield* syncClusterLabels({
283
+ fqName,
284
+ observed,
285
+ desired: desiredLabels,
286
+ session,
287
+ });
288
+ yield* syncClusterAddons({ fqName, observed, news, session });
289
+ yield* syncClusterMaintenance({ fqName, observed, news, session });
290
+ yield* syncClusterLocations({ fqName, observed, news, session });
291
+ yield* syncClusterNetworkPolicy({ fqName, observed, news, session });
292
+ yield* syncClusterLogging({ fqName, observed, news, session });
293
+ yield* syncClusterMonitoring({ fqName, observed, news, session });
294
+ yield* syncClusterUpdate({ fqName, observed, news, session });
295
+ const final = yield* getClusters({ name: fqName });
296
+ return toClusterAttributes(final, {
297
+ project: news.project,
298
+ location: news.location,
299
+ });
300
+ }),
301
+ delete: Effect.fn(function* ({ output, session }) {
302
+ const fqName = `projects/${output.project}/locations/${output.location}/clusters/${output.name}`;
303
+ yield* deleteClusters({ name: fqName }).pipe(Effect.flatMap((op) => op.name
304
+ ? awaitOperation(qualifyOp(fqName, op.name), session)
305
+ : Effect.succeed(op)), Effect.catchTag("NotFound", () => Effect.void));
306
+ }),
307
+ read: Effect.fn(function* ({ id, output, olds }) {
308
+ const project = output?.project ?? olds?.project;
309
+ const location = output?.location ?? olds?.location;
310
+ if (!project || !location)
311
+ return undefined;
312
+ const name = output?.name ??
313
+ olds?.name ??
314
+ (yield* createPhysicalName({ id, maxLength: 40 })).toLowerCase();
315
+ const fqName = `projects/${project}/locations/${location}/clusters/${name}`;
316
+ const observed = yield* getClusters({ name: fqName }).pipe(Effect.catchTag("NotFound", () => Effect.succeed(undefined)), Effect.catchTag("Forbidden", () => Effect.succeed(undefined)));
317
+ if (!observed)
318
+ return undefined;
319
+ const attrs = toClusterAttributes(observed, { project, location });
320
+ return (yield* hasAlchemyLabels(id, observed.resourceLabels))
321
+ ? attrs
322
+ : Unowned(attrs);
323
+ }),
324
+ };
325
+ }));
326
+ //# sourceMappingURL=Cluster.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cluster.js","sourceRoot":"","sources":["../../src/Container/Cluster.ts"],"names":[],"mappings":"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"}