@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,214 @@
1
+ import * as cont from "@distilled.cloud/gcp/container-v1";
2
+ import { Resource } from "alchemy";
3
+ import * as Provider from "alchemy/Provider";
4
+ import type * as GCP from "../Providers.ts";
5
+ export type NodePoolProps = {
6
+ /** GCP project ID. Immutable — replace if changed. */
7
+ project: string;
8
+ /**
9
+ * Cluster zone (e.g. `us-central1-a`) for a zonal cluster, or region
10
+ * (e.g. `us-central1`) for a regional cluster. Immutable — replace.
11
+ */
12
+ location: string;
13
+ /**
14
+ * Parent cluster name. Immutable — node pools cannot be reparented; a
15
+ * change here triggers a replace.
16
+ */
17
+ clusterName: string;
18
+ /**
19
+ * Pool name. Defaults to `createPhysicalName({ id, lowercase: true,
20
+ * maxLength: 40 })`. Lowercase alphanumeric + hyphens, ≤40 chars.
21
+ * Immutable — replace if changed.
22
+ */
23
+ name?: string;
24
+ /**
25
+ * Initial size at create time. GKE Standard rejects pool creation
26
+ * without a positive node count, so when omitted we default to
27
+ * `autoscaling.minNodeCount ?? 1` on the create path.
28
+ *
29
+ * Subsequent size changes go via `setSize` when `autoscaling` is
30
+ * disabled, or are GKE-managed when `autoscaling.enabled` is true
31
+ * (the size sync is skipped to avoid fighting the autoscaler).
32
+ */
33
+ initialNodeCount?: number;
34
+ /**
35
+ * Per-pool zones. Override the cluster default. Mutable via
36
+ * `update` — sent in a standalone update body to avoid the SDK's
37
+ * "do not combine with other fields" warning.
38
+ */
39
+ nodeLocations?: ReadonlyArray<string>;
40
+ /** Node configuration (machine, disk, accelerators, taints, labels, …). */
41
+ config: {
42
+ /** GCE machine type, e.g. `n2-standard-4`. Mutable via `update`. */
43
+ machineType: string;
44
+ /** Boot disk size GB. Mutable via `update`. */
45
+ diskSizeGb?: number;
46
+ /** Boot disk type, e.g. `pd-balanced`. Mutable via `update`. */
47
+ diskType?: string;
48
+ /**
49
+ * Image, e.g. `COS_CONTAINERD`, `UBUNTU_CONTAINERD`. Omit to let
50
+ * GCP apply the GKE default for the cluster's release channel.
51
+ * Mutable via `update`.
52
+ */
53
+ imageType?: string;
54
+ /** GPUs / TPUs. Mutable via `update`. */
55
+ accelerators?: ReadonlyArray<{
56
+ type: string;
57
+ count: number;
58
+ gpuPartitionSize?: string;
59
+ gpuDriverInstallationConfig?: {
60
+ gpuDriverVersion?: string;
61
+ };
62
+ }>;
63
+ /**
64
+ * GCE service account. Omit to let GCP fall back to the project's
65
+ * default compute SA. **Replace-only** — not in `UpdateNodePoolRequest`.
66
+ */
67
+ serviceAccount?: string;
68
+ /**
69
+ * GCP API scopes. Omit to let GCP apply its default. **Replace-only**.
70
+ */
71
+ oauthScopes?: ReadonlyArray<string>;
72
+ /** Kubernetes node taints. Mutable via `update`. */
73
+ taints?: ReadonlyArray<{
74
+ key: string;
75
+ value: string;
76
+ effect: "NO_SCHEDULE" | "PREFER_NO_SCHEDULE" | "NO_EXECUTE";
77
+ }>;
78
+ /** Kubernetes node labels (NOT GCP labels). Mutable via `update`. */
79
+ labels?: Record<string, string>;
80
+ /**
81
+ * GCE resource labels. Alchemy internal labels are merged on top
82
+ * automatically. Mutable via `update`.
83
+ */
84
+ resourceLabels?: Record<string, string>;
85
+ /** Custom GCE metadata. **Replace-only**. */
86
+ metadata?: Record<string, string>;
87
+ /** Custom GCE tags (firewall). Mutable via `update`. */
88
+ tags?: ReadonlyArray<string>;
89
+ /** Min CPU platform. **Replace-only**. */
90
+ minCpuPlatform?: string;
91
+ /** Boot disk CMEK. **Replace-only**. */
92
+ bootDiskKmsKey?: string;
93
+ /** GKE Sandbox (gVisor). **Replace-only**. */
94
+ sandboxConfig?: {
95
+ type: "GVISOR";
96
+ };
97
+ /** Spot or PVM. **Replace-only**. */
98
+ preemptible?: boolean;
99
+ /** Spot VM. **Replace-only**. */
100
+ spot?: boolean;
101
+ /** Reservation affinity. **Replace-only**. */
102
+ reservationAffinity?: {
103
+ consumeReservationType: string;
104
+ key?: string;
105
+ values?: ReadonlyArray<string>;
106
+ };
107
+ /** Shielded VM. **Replace-only**. */
108
+ shieldedInstanceConfig?: {
109
+ enableSecureBoot?: boolean;
110
+ enableIntegrityMonitoring?: boolean;
111
+ };
112
+ /** Local SSDs. **Replace-only**. */
113
+ localSsdCount?: number;
114
+ /** Workload Identity metadata. Mutable via `update`. */
115
+ workloadMetadataConfig?: {
116
+ mode: "GKE_METADATA" | "GCE_METADATA";
117
+ };
118
+ /** GVNIC. Mutable via `update`. */
119
+ gvnic?: {
120
+ enabled: boolean;
121
+ };
122
+ /** Confidential VM. Mutable via `update`. */
123
+ confidentialNodes?: {
124
+ enabled: boolean;
125
+ };
126
+ };
127
+ /** Cluster autoscaler. Mutable via `setAutoscaling`. */
128
+ autoscaling?: {
129
+ enabled: boolean;
130
+ minNodeCount?: number;
131
+ maxNodeCount?: number;
132
+ locationPolicy?: "BALANCED" | "ANY";
133
+ };
134
+ /** Auto-upgrade / auto-repair. Mutable via `setManagement`. */
135
+ management?: {
136
+ autoUpgrade?: boolean;
137
+ autoRepair?: boolean;
138
+ };
139
+ /** Surge upgrade settings. Mutable via `update`. */
140
+ upgradeSettings?: {
141
+ maxSurge?: number;
142
+ maxUnavailable?: number;
143
+ strategy?: "SURGE" | "BLUE_GREEN";
144
+ };
145
+ };
146
+ export type NodePoolAttributes = {
147
+ /** Pool name (matches the GKE resource). */
148
+ name: string;
149
+ /** Server-defined URL for the pool. */
150
+ selfLink: string;
151
+ /** GCP project ID, threaded through from props for `delete`/`read`. */
152
+ project: string;
153
+ /** Cluster zone or region, threaded through from props. */
154
+ location: string;
155
+ /** Parent cluster name. */
156
+ clusterName: string;
157
+ /** Current Kubernetes version of nodes in this pool. */
158
+ version: string | undefined;
159
+ /** Lifecycle status. */
160
+ status: string | undefined;
161
+ /** Managed instance group URLs backing the pool. */
162
+ instanceGroupUrls: ReadonlyArray<string>;
163
+ };
164
+ /**
165
+ * A node pool inside a GKE Standard cluster.
166
+ *
167
+ * Lifecycle is observe → ensure (create) → sync (size, autoscaling,
168
+ * management, generic update) → return.
169
+ *
170
+ * Adoption: a pool whose `config.resourceLabels` lack our `alchemy_*`
171
+ * keys is wrapped in `Unowned(attrs)`. Useful for adopting the inline
172
+ * bootstrap pool created by `GCP.Cluster.initialNodePool` (which
173
+ * intentionally carries no alchemy labels).
174
+ *
175
+ * @section Creating a node pool
176
+ * @example CPU pool
177
+ * ```typescript
178
+ * const compute = yield* GCP.NodePool("compute", {
179
+ * project: project.projectId,
180
+ * location: cluster.location,
181
+ * clusterName: cluster.name,
182
+ * initialNodeCount: 1,
183
+ * config: { machineType: "n2-standard-16" },
184
+ * });
185
+ * ```
186
+ *
187
+ * @example GPU pool with autoscaling
188
+ * ```typescript
189
+ * const rtx6000 = yield* GCP.NodePool("rtx6000", {
190
+ * project: project.projectId,
191
+ * location: cluster.location,
192
+ * clusterName: cluster.name,
193
+ * config: {
194
+ * machineType: "g2-standard-12",
195
+ * accelerators: [{ type: "nvidia-l40s", count: 1 }],
196
+ * },
197
+ * autoscaling: { enabled: true, minNodeCount: 0, maxNodeCount: 4 },
198
+ * });
199
+ * ```
200
+ */
201
+ export type NodePool = Resource<"GCP.NodePool", NodePoolProps, NodePoolAttributes, never, GCP.Providers>;
202
+ export declare const NodePool: import("alchemy").ResourceClass<NodePool>;
203
+ /**
204
+ * Build the `NodeConfig` sub-object for a create body. Numbers stay as
205
+ * numbers; collections stay unwrapped (this is what GKE expects on
206
+ * create — see SDK NodeConfig at container-v1.ts:1583).
207
+ *
208
+ * Internal alchemy labels are merged into `resourceLabels` here so the
209
+ * pool is recognizable to `read`'s adoption gate. Exported for reuse by
210
+ * `Cluster.toInitialNodePoolBody`.
211
+ */
212
+ export declare const toNodeConfigCreateBody: (config: NodePoolProps["config"], desiredResourceLabels: Record<string, string>) => cont.NodeConfig;
213
+ export declare const NodePoolProvider: () => import("effect/Layer").Layer<Provider.Provider<NodePool>, never, import("effect/unstable/http/HttpClient").HttpClient | import("alchemy").Stage | import("alchemy").Stack | import("@distilled.cloud/gcp").Credentials>;
214
+ //# sourceMappingURL=NodePool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodePool.d.ts","sourceRoot":"","sources":["../../src/Container/NodePool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,344 @@
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 Effect from "effect/Effect";
8
+ import { gcpInternalLabels, hasAlchemyLabels } from "../Tags.js";
9
+ import { makeAwaitOperation, qualifyOperationName } from "./Operations.js";
10
+ export const NodePool = Resource("GCP.NodePool");
11
+ /**
12
+ * Translate a public `accelerators` spec into the SDK's
13
+ * `AcceleratorConfig`. Same shape on both create and update paths.
14
+ */
15
+ const toAcceleratorConfig = (accelerators) => accelerators?.map((a) => ({
16
+ acceleratorType: a.type,
17
+ acceleratorCount: String(a.count),
18
+ ...(a.gpuPartitionSize ? { gpuPartitionSize: a.gpuPartitionSize } : {}),
19
+ ...(a.gpuDriverInstallationConfig
20
+ ? { gpuDriverInstallationConfig: a.gpuDriverInstallationConfig }
21
+ : {}),
22
+ }));
23
+ /**
24
+ * Build the `NodeConfig` sub-object for a create body. Numbers stay as
25
+ * numbers; collections stay unwrapped (this is what GKE expects on
26
+ * create — see SDK NodeConfig at container-v1.ts:1583).
27
+ *
28
+ * Internal alchemy labels are merged into `resourceLabels` here so the
29
+ * pool is recognizable to `read`'s adoption gate. Exported for reuse by
30
+ * `Cluster.toInitialNodePoolBody`.
31
+ */
32
+ export const toNodeConfigCreateBody = (config, desiredResourceLabels) => {
33
+ const accelerators = toAcceleratorConfig(config.accelerators);
34
+ return {
35
+ machineType: config.machineType,
36
+ ...(config.diskSizeGb !== undefined ? { diskSizeGb: config.diskSizeGb } : {}),
37
+ ...(config.diskType ? { diskType: config.diskType } : {}),
38
+ ...(config.imageType ? { imageType: config.imageType } : {}),
39
+ ...(accelerators ? { accelerators } : {}),
40
+ ...(config.serviceAccount ? { serviceAccount: config.serviceAccount } : {}),
41
+ ...(config.oauthScopes ? { oauthScopes: config.oauthScopes } : {}),
42
+ ...(config.taints ? { taints: config.taints } : {}),
43
+ ...(config.labels ? { labels: config.labels } : {}),
44
+ resourceLabels: desiredResourceLabels,
45
+ ...(config.metadata ? { metadata: config.metadata } : {}),
46
+ ...(config.tags ? { tags: config.tags } : {}),
47
+ ...(config.minCpuPlatform ? { minCpuPlatform: config.minCpuPlatform } : {}),
48
+ ...(config.bootDiskKmsKey ? { bootDiskKmsKey: config.bootDiskKmsKey } : {}),
49
+ ...(config.sandboxConfig ? { sandboxConfig: config.sandboxConfig } : {}),
50
+ ...(config.preemptible !== undefined ? { preemptible: config.preemptible } : {}),
51
+ ...(config.spot !== undefined ? { spot: config.spot } : {}),
52
+ ...(config.reservationAffinity
53
+ ? { reservationAffinity: config.reservationAffinity }
54
+ : {}),
55
+ ...(config.shieldedInstanceConfig
56
+ ? { shieldedInstanceConfig: config.shieldedInstanceConfig }
57
+ : {}),
58
+ ...(config.localSsdCount !== undefined
59
+ ? { localSsdCount: config.localSsdCount }
60
+ : {}),
61
+ ...(config.workloadMetadataConfig
62
+ ? { workloadMetadataConfig: config.workloadMetadataConfig }
63
+ : {}),
64
+ ...(config.gvnic ? { gvnic: config.gvnic } : {}),
65
+ ...(config.confidentialNodes ? { confidentialNodes: config.confidentialNodes } : {}),
66
+ };
67
+ };
68
+ /**
69
+ * Build a non-location `UpdateNodePoolRequest` body, populating only
70
+ * fields whose desired value differs from observed. Wrapping (NetworkTags
71
+ * / NodeLabels / NodeTaints / ResourceLabels) and number→string for
72
+ * `diskSizeGb` are applied at this boundary (SDK shapes diverge between
73
+ * create and update — see container-v1.ts:4289).
74
+ *
75
+ * Returns `undefined` if no field requires updating.
76
+ */
77
+ const toNodePoolUpdateBody = (observed, news, desiredResourceLabels) => {
78
+ const body = {};
79
+ const oc = observed.config ?? {};
80
+ const nc = news.config;
81
+ if (nc.machineType !== undefined && nc.machineType !== oc.machineType) {
82
+ body.machineType = nc.machineType;
83
+ }
84
+ if (nc.imageType !== undefined && nc.imageType !== oc.imageType) {
85
+ body.imageType = nc.imageType;
86
+ }
87
+ if (nc.diskType !== undefined && nc.diskType !== oc.diskType) {
88
+ body.diskType = nc.diskType;
89
+ }
90
+ if (nc.diskSizeGb !== undefined &&
91
+ String(nc.diskSizeGb) !== String(oc.diskSizeGb ?? "")) {
92
+ body.diskSizeGb = String(nc.diskSizeGb);
93
+ }
94
+ const desiredAccelerators = toAcceleratorConfig(nc.accelerators);
95
+ if (desiredAccelerators &&
96
+ !deepEqual(oc.accelerators ?? [], desiredAccelerators)) {
97
+ body.accelerators = desiredAccelerators;
98
+ }
99
+ if (nc.tags && !deepEqual(oc.tags ?? [], nc.tags)) {
100
+ body.tags = { tags: nc.tags };
101
+ }
102
+ if (nc.labels && !deepEqual(oc.labels ?? {}, nc.labels)) {
103
+ body.labels = { labels: nc.labels };
104
+ }
105
+ if (nc.taints && !deepEqual(oc.taints ?? [], nc.taints)) {
106
+ body.taints = { taints: nc.taints };
107
+ }
108
+ if (!deepEqual(oc.resourceLabels ?? {}, desiredResourceLabels)) {
109
+ body.resourceLabels = { labels: desiredResourceLabels };
110
+ }
111
+ if (nc.gvnic && !deepEqual(oc.gvnic, nc.gvnic)) {
112
+ body.gvnic = nc.gvnic;
113
+ }
114
+ if (nc.confidentialNodes && !deepEqual(oc.confidentialNodes, nc.confidentialNodes)) {
115
+ body.confidentialNodes = nc.confidentialNodes;
116
+ }
117
+ if (nc.workloadMetadataConfig &&
118
+ !deepEqual(oc.workloadMetadataConfig, nc.workloadMetadataConfig)) {
119
+ body.workloadMetadataConfig = nc.workloadMetadataConfig;
120
+ }
121
+ if (news.upgradeSettings &&
122
+ !deepEqual(observed.upgradeSettings, news.upgradeSettings)) {
123
+ body.upgradeSettings = news.upgradeSettings;
124
+ }
125
+ return Object.keys(body).length === 0 ? undefined : body;
126
+ };
127
+ const toNodePoolAttributes = (pool, parent) => ({
128
+ name: pool.name ?? "",
129
+ selfLink: pool.selfLink ?? "",
130
+ project: parent.project,
131
+ location: parent.location,
132
+ clusterName: parent.clusterName,
133
+ version: pool.version,
134
+ status: pool.status,
135
+ instanceGroupUrls: pool.instanceGroupUrls ?? [],
136
+ });
137
+ export const NodePoolProvider = () => Provider.effect(NodePool, Effect.gen(function* () {
138
+ const getNodePools = yield* cont.getProjectsLocationsClustersNodePools;
139
+ const createNodePools = yield* cont.createProjectsLocationsClustersNodePools;
140
+ const updateNodePools = yield* cont.updateProjectsLocationsClustersNodePools;
141
+ const setSize = yield* cont.setSizeProjectsLocationsClustersNodePools;
142
+ const setAutoscaling = yield* cont.setAutoscalingProjectsLocationsClustersNodePools;
143
+ const setManagement = yield* cont.setManagementProjectsLocationsClustersNodePools;
144
+ const deleteNodePools = yield* cont.deleteProjectsLocationsClustersNodePools;
145
+ const getOperations = yield* cont.getProjectsLocationsOperations;
146
+ const awaitOperation = makeAwaitOperation(getOperations);
147
+ // Qualify a bare GKE operation id using the parent path of the
148
+ // resource it targets. NodePool fqNames have the shape
149
+ // `projects/{p}/locations/{l}/clusters/{c}/nodePools/{n}`; the
150
+ // first four segments give us the parent context for the
151
+ // operation, identical to Cluster's helper.
152
+ const qualifyOp = (fqName, opName) => qualifyOperationName(fqName.split("/")[1], fqName.split("/")[3], opName);
153
+ const syncNodePoolSize = Effect.fn(function* (args) {
154
+ // Skip when the autoscaler is enabled; fighting it creates churn.
155
+ if (args.news.autoscaling?.enabled)
156
+ return;
157
+ if (args.news.initialNodeCount === undefined)
158
+ return;
159
+ const observedCount = args.observed.initialNodeCount;
160
+ if (observedCount === args.news.initialNodeCount)
161
+ return;
162
+ const op = yield* setSize({
163
+ name: args.fqName,
164
+ body: { nodeCount: args.news.initialNodeCount },
165
+ });
166
+ if (op.name)
167
+ yield* awaitOperation(qualifyOp(args.fqName, op.name), args.session);
168
+ });
169
+ const syncNodePoolAutoscaling = Effect.fn(function* (args) {
170
+ if (!args.news.autoscaling)
171
+ return;
172
+ if (deepEqual(args.observed.autoscaling, args.news.autoscaling))
173
+ return;
174
+ const op = yield* setAutoscaling({
175
+ name: args.fqName,
176
+ body: { autoscaling: args.news.autoscaling },
177
+ });
178
+ if (op.name)
179
+ yield* awaitOperation(qualifyOp(args.fqName, op.name), args.session);
180
+ });
181
+ const syncNodePoolManagement = Effect.fn(function* (args) {
182
+ if (!args.news.management)
183
+ return;
184
+ if (deepEqual(args.observed.management, args.news.management))
185
+ return;
186
+ const op = yield* setManagement({
187
+ name: args.fqName,
188
+ body: { management: args.news.management },
189
+ });
190
+ if (op.name)
191
+ yield* awaitOperation(qualifyOp(args.fqName, op.name), args.session);
192
+ });
193
+ const syncNodePoolUpdate = Effect.fn(function* (args) {
194
+ // 1. Locations — sent as a standalone update body. The SDK
195
+ // explicitly warns not to combine `locations` with other
196
+ // fields; if you do, the other fields only apply to newly-
197
+ // created nodes.
198
+ if (args.news.nodeLocations &&
199
+ !deepEqual(args.observed.locations ?? [], args.news.nodeLocations)) {
200
+ const op = yield* updateNodePools({
201
+ name: args.fqName,
202
+ body: { locations: args.news.nodeLocations },
203
+ });
204
+ if (op.name)
205
+ yield* awaitOperation(qualifyOp(args.fqName, op.name), args.session);
206
+ }
207
+ // 2. Re-observe so the non-location update diffs against fresh
208
+ // state (the location update may have rewritten labels/taints
209
+ // on new nodes already).
210
+ const fresh = yield* getNodePools({ name: args.fqName });
211
+ const body = toNodePoolUpdateBody(fresh, args.news, args.desiredResourceLabels);
212
+ if (!body)
213
+ return;
214
+ const op = yield* updateNodePools({ name: args.fqName, body });
215
+ if (op.name)
216
+ yield* awaitOperation(qualifyOp(args.fqName, op.name), args.session);
217
+ });
218
+ return {
219
+ stables: ["name", "selfLink", "project", "location", "clusterName"],
220
+ diff: Effect.fn(function* ({ news, olds = {} }) {
221
+ if (!isResolved(news))
222
+ return undefined;
223
+ if (somePropsAreDifferent(olds, news, [
224
+ "project",
225
+ "location",
226
+ "clusterName",
227
+ "name",
228
+ ])) {
229
+ return { action: "replace" };
230
+ }
231
+ const oc = olds.config ?? {};
232
+ const nc = news.config;
233
+ if (somePropsAreDifferent(oc, nc, [
234
+ "serviceAccount",
235
+ "minCpuPlatform",
236
+ "bootDiskKmsKey",
237
+ "preemptible",
238
+ "spot",
239
+ "localSsdCount",
240
+ ])) {
241
+ return { action: "replace" };
242
+ }
243
+ if (!deepEqual(oc.oauthScopes, nc.oauthScopes) ||
244
+ !deepEqual(oc.metadata, nc.metadata) ||
245
+ !deepEqual(oc.sandboxConfig, nc.sandboxConfig) ||
246
+ !deepEqual(oc.reservationAffinity, nc.reservationAffinity) ||
247
+ !deepEqual(oc.shieldedInstanceConfig, nc.shieldedInstanceConfig)) {
248
+ return { action: "replace" };
249
+ }
250
+ return undefined;
251
+ }),
252
+ reconcile: Effect.fn(function* ({ id, news, session }) {
253
+ const internalLabels = yield* gcpInternalLabels(id);
254
+ const desiredName = news.name ??
255
+ (yield* createPhysicalName({ id, maxLength: 40 })).toLowerCase();
256
+ const clusterPath = `projects/${news.project}/locations/${news.location}/clusters/${news.clusterName}`;
257
+ const fqName = `${clusterPath}/nodePools/${desiredName}`;
258
+ const desiredResourceLabels = {
259
+ ...(news.config.resourceLabels ?? {}),
260
+ ...internalLabels,
261
+ };
262
+ // 1. Observe — collapse 403 to "missing" alongside 404, mirroring
263
+ // Project.observeProject's stance that GCP returns 403 for
264
+ // invisible resources.
265
+ let observed = yield* getNodePools({ name: fqName }).pipe(Effect.catchTag("NotFound", () => Effect.succeed(undefined)), Effect.catchTag("Forbidden", () => Effect.succeed(undefined)));
266
+ // 2. Ensure — create if missing. `Conflict` covers concurrent
267
+ // creates and state-persistence races; fall through and
268
+ // re-observe.
269
+ if (!observed) {
270
+ const config = toNodeConfigCreateBody(news.config, desiredResourceLabels);
271
+ // GKE Standard rejects creates without a positive node
272
+ // count. If the user didn't specify, fall back to the
273
+ // autoscaler floor (or 1 if there's no autoscaler config).
274
+ const createNodeCount = news.initialNodeCount ?? news.autoscaling?.minNodeCount ?? 1;
275
+ const op = yield* createNodePools({
276
+ parent: clusterPath,
277
+ body: {
278
+ nodePool: {
279
+ name: desiredName,
280
+ initialNodeCount: createNodeCount,
281
+ ...(news.nodeLocations ? { locations: news.nodeLocations } : {}),
282
+ config,
283
+ ...(news.autoscaling ? { autoscaling: news.autoscaling } : {}),
284
+ ...(news.management ? { management: news.management } : {}),
285
+ ...(news.upgradeSettings ? { upgradeSettings: news.upgradeSettings } : {}),
286
+ },
287
+ },
288
+ }).pipe(Effect.catchTag("Conflict", () => Effect.succeed(undefined)));
289
+ if (op?.name)
290
+ yield* awaitOperation(qualifyOp(fqName, op.name), session);
291
+ observed = yield* getNodePools({ name: fqName });
292
+ }
293
+ // 3. Sync — sequential, each aspect independently idempotent.
294
+ yield* syncNodePoolSize({ fqName, observed, news, session });
295
+ yield* syncNodePoolAutoscaling({ fqName, observed, news, session });
296
+ yield* syncNodePoolManagement({ fqName, observed, news, session });
297
+ yield* syncNodePoolUpdate({
298
+ fqName,
299
+ observed,
300
+ news,
301
+ desiredResourceLabels,
302
+ session,
303
+ });
304
+ const final = yield* getNodePools({ name: fqName });
305
+ return toNodePoolAttributes(final, {
306
+ project: news.project,
307
+ location: news.location,
308
+ clusterName: news.clusterName,
309
+ });
310
+ }),
311
+ delete: Effect.fn(function* ({ output, session }) {
312
+ const fqName = `projects/${output.project}/locations/${output.location}/clusters/${output.clusterName}/nodePools/${output.name}`;
313
+ yield* deleteNodePools({ name: fqName }).pipe(Effect.flatMap((op) => op.name
314
+ ? awaitOperation(qualifyOp(fqName, op.name), session)
315
+ : Effect.succeed(op)), Effect.catchTag("NotFound", () => Effect.void));
316
+ }),
317
+ read: Effect.fn(function* ({ id, output, olds }) {
318
+ // ProviderService.read receives `{ id, instanceId, olds, output }`
319
+ // — no `news`. Identity must come from output (post-create
320
+ // cache) or olds (last-persisted props).
321
+ const project = output?.project ?? olds?.project;
322
+ const location = output?.location ?? olds?.location;
323
+ const clusterName = output?.clusterName ?? olds?.clusterName;
324
+ if (!project || !location || !clusterName)
325
+ return undefined;
326
+ const name = output?.name ??
327
+ olds?.name ??
328
+ (yield* createPhysicalName({ id, maxLength: 40 })).toLowerCase();
329
+ const fqName = `projects/${project}/locations/${location}/clusters/${clusterName}/nodePools/${name}`;
330
+ const observed = yield* getNodePools({ name: fqName }).pipe(Effect.catchTag("NotFound", () => Effect.succeed(undefined)), Effect.catchTag("Forbidden", () => Effect.succeed(undefined)));
331
+ if (!observed)
332
+ return undefined;
333
+ const attrs = toNodePoolAttributes(observed, {
334
+ project,
335
+ location,
336
+ clusterName,
337
+ });
338
+ return (yield* hasAlchemyLabels(id, observed.config?.resourceLabels))
339
+ ? attrs
340
+ : Unowned(attrs);
341
+ }),
342
+ };
343
+ }));
344
+ //# sourceMappingURL=NodePool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodePool.js","sourceRoot":"","sources":["../../src/Container/NodePool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { ConfigError } from "@distilled.cloud/gcp";
2
+ import * as cont from "@distilled.cloud/gcp/container-v1";
3
+ import type { ScopedPlanStatusSession } from "alchemy/Cli/Cli";
4
+ import * as Effect from "effect/Effect";
5
+ /**
6
+ * Qualify a GKE operation name. The Container API returns
7
+ * `Operation.name` as a bare ID like `operation-1778057673333-...`,
8
+ * but `getProjectsLocationsOperations` expects the fully-qualified
9
+ * path `projects/{p}/locations/{l}/operations/{id}`. Already-qualified
10
+ * names are passed through unchanged so callers can stay agnostic.
11
+ *
12
+ * (CRM operations don't need this because CRM returns names as
13
+ * `operations/...` and its `getOperations` takes the bare path
14
+ * directly.)
15
+ */
16
+ export declare const qualifyOperationName: (project: string, location: string, name: string) => string;
17
+ /**
18
+ * Resolved callable signature of `cont.getProjectsLocationsOperations`.
19
+ *
20
+ * `cont.getProjectsLocationsOperations` is itself an
21
+ * `Effect<callable, never, Credentials | HttpClient>`, so `Effect.Success`
22
+ * extracts the callable type — i.e. what you get back from
23
+ * `yield* cont.getProjectsLocationsOperations`. Using a derived alias
24
+ * keeps the helper aligned with the SDK without us hand-writing the
25
+ * input/output/error union, which would drift if the patch set changes.
26
+ */
27
+ type GetOperations = Effect.Success<typeof cont.getProjectsLocationsOperations>;
28
+ /**
29
+ * Build the GKE long-running-operation polling helper.
30
+ *
31
+ * Container `Operation`s carry `.status: "PENDING" | "RUNNING" | "DONE"
32
+ * | "ABORTING"` (NOT `.done: boolean` like Cloud Resource Manager —
33
+ * verified at `vendor/distilled/packages/gcp/src/services/container-v1.ts:919–976`).
34
+ * The doneness predicate compares `.status === "DONE"` accordingly.
35
+ *
36
+ * Schedule: exponential 2s → 1.5× growth, capped per-poll at 15s via
37
+ * `Schedule.either`, then a hard count cap of 80 retries via
38
+ * `Schedule.both(Schedule.recurs(80))` → ~20 min wall ceiling, well
39
+ * above the worst observed GKE op time (cluster create runs 5–10 min).
40
+ *
41
+ * The helper is a factory — the caller resolves
42
+ * `cont.getProjectsLocationsOperations` once at provider construction
43
+ * (see `Project.ts` for the same idiom) and passes the resulting
44
+ * callable here, so we never re-resolve services on each await.
45
+ */
46
+ export declare const makeAwaitOperation: (getOperations: GetOperations) => (operationName: string, session: ScopedPlanStatusSession) => Effect.Effect<cont.Operation, ConfigError | cont.GetProjectsLocationsOperationsError | {
47
+ _tag: "OperationPending";
48
+ }, never>;
49
+ export {};
50
+ //# sourceMappingURL=Operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Operations.d.ts","sourceRoot":"","sources":["../../src/Container/Operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,IAAI,MAAM,mCAAmC,CAAC;AAC1D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE/D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,oBAAoB,GAC/B,SAAS,MAAM,EACf,UAAU,MAAM,EAChB,MAAM,MAAM,KACX,MAGiE,CAAC;AAErE;;;;;;;;;GASG;AACH,KAAK,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,8BAA8B,CAAC,CAAC;AAEhF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,kBAAkB,GAAI,eAAe,aAAa;;SA8B3D,CAAC"}