@microagi/alchemy-gcp 0.8.0 → 0.9.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.
- package/lib/Container/NodePool.d.ts +10 -0
- package/lib/Container/NodePool.d.ts.map +1 -1
- package/lib/Container/NodePool.js +4 -0
- package/lib/Container/NodePool.js.map +1 -1
- package/lib/Iam/ServiceAccount.d.ts.map +1 -1
- package/lib/Iam/ServiceAccount.js +21 -2
- package/lib/Iam/ServiceAccount.js.map +1 -1
- package/lib/Iam/ServiceAccountKey.d.ts +72 -0
- package/lib/Iam/ServiceAccountKey.d.ts.map +1 -0
- package/lib/Iam/ServiceAccountKey.js +164 -0
- package/lib/Iam/ServiceAccountKey.js.map +1 -0
- package/lib/Iam/index.d.ts +2 -0
- package/lib/Iam/index.d.ts.map +1 -1
- package/lib/Iam/index.js +1 -0
- package/lib/Iam/index.js.map +1 -1
- package/lib/Kubernetes/Helm.d.ts +132 -0
- package/lib/Kubernetes/Helm.d.ts.map +1 -0
- package/lib/Kubernetes/Helm.js +314 -0
- package/lib/Kubernetes/Helm.js.map +1 -0
- package/lib/Kubernetes/index.d.ts +1 -0
- package/lib/Kubernetes/index.d.ts.map +1 -1
- package/lib/Kubernetes/index.js +1 -0
- package/lib/Kubernetes/index.js.map +1 -1
- package/lib/Providers.d.ts +1 -1
- package/lib/Providers.d.ts.map +1 -1
- package/lib/Providers.js +7 -1
- package/lib/Providers.js.map +1 -1
- package/lib/Storage/Bucket.d.ts +117 -0
- package/lib/Storage/Bucket.d.ts.map +1 -0
- package/lib/Storage/Bucket.js +239 -0
- package/lib/Storage/Bucket.js.map +1 -0
- package/lib/Storage/BucketIamMember.d.ts +29 -0
- package/lib/Storage/BucketIamMember.d.ts.map +1 -0
- package/lib/Storage/BucketIamMember.js +26 -0
- package/lib/Storage/BucketIamMember.js.map +1 -0
- package/lib/Storage/index.d.ts +4 -0
- package/lib/Storage/index.d.ts.map +1 -0
- package/lib/Storage/index.js +3 -0
- package/lib/Storage/index.js.map +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/package.json +2 -2
- package/src/Container/NodePool.ts +12 -0
- package/src/Iam/ServiceAccount.ts +21 -2
- package/src/Iam/ServiceAccountKey.ts +284 -0
- package/src/Iam/index.ts +5 -0
- package/src/Kubernetes/Helm.ts +536 -0
- package/src/Kubernetes/index.ts +1 -0
- package/src/Providers.ts +18 -0
- package/src/Storage/Bucket.ts +439 -0
- package/src/Storage/BucketIamMember.ts +33 -0
- package/src/Storage/index.ts +10 -0
- package/src/index.ts +1 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { Credentials } from "@distilled.cloud/gcp";
|
|
2
|
+
import { Resource } from "alchemy";
|
|
3
|
+
import * as Provider from "alchemy/Provider";
|
|
4
|
+
import * as FileSystem from "effect/FileSystem";
|
|
5
|
+
import * as Path from "effect/Path";
|
|
6
|
+
import type * as GCP from "../Providers.ts";
|
|
7
|
+
/**
|
|
8
|
+
* Install or upgrade a **Helm release** in a GKE cluster.
|
|
9
|
+
*
|
|
10
|
+
* Shells out to the `helm` CLI (v3.8+, required for OCI chart support) with a
|
|
11
|
+
* temporary kubeconfig minted from the GKE cluster's endpoint + CA + an ADC
|
|
12
|
+
* bearer token. The release is branded with alchemy-internal labels
|
|
13
|
+
* (`alchemy_app` / `alchemy_stage` / `alchemy_id`) via `--labels`, so adoption
|
|
14
|
+
* gating works the same as labelled GCP resources and K8s manifests — a
|
|
15
|
+
* release created out of band reads back as {@link Unowned} until adopted.
|
|
16
|
+
*
|
|
17
|
+
* **Reconcile** runs `helm upgrade --install` (idempotent for both first
|
|
18
|
+
* install and subsequent upgrades). **Delete** runs `helm uninstall`. **Read**
|
|
19
|
+
* runs `helm status -o json` and checks the release's labels for ownership.
|
|
20
|
+
*
|
|
21
|
+
* Both OCI charts (`oci://…`) and repository charts (`repo/chart` with an
|
|
22
|
+
* optional `repoUrl`) are supported. Inline `values` are serialized to a
|
|
23
|
+
* temporary JSON file and passed via `--values`.
|
|
24
|
+
*
|
|
25
|
+
* @section Installing a chart
|
|
26
|
+
* @example OCI chart with inline values
|
|
27
|
+
* ```typescript
|
|
28
|
+
* yield* GCP.HelmRelease("ArchilCsi", {
|
|
29
|
+
* endpoint: cluster.endpoint,
|
|
30
|
+
* caCertificate: cluster.clusterCaCertificate,
|
|
31
|
+
* name: "archil-csi-driver",
|
|
32
|
+
* namespace: "archil-system",
|
|
33
|
+
* chart: "oci://registry-1.docker.io/archildata/csi-driver-chart",
|
|
34
|
+
* createNamespace: true,
|
|
35
|
+
* values: {
|
|
36
|
+
* tolerations: [
|
|
37
|
+
* { key: "nvidia.com/gpu", operator: "Equal", value: "present", effect: "NoSchedule" },
|
|
38
|
+
* ],
|
|
39
|
+
* },
|
|
40
|
+
* });
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export type HelmReleaseProps = {
|
|
44
|
+
/**
|
|
45
|
+
* GKE control-plane endpoint (IP or hostname, no scheme) — typically
|
|
46
|
+
* `cluster.endpoint`. A change points at a different cluster → replace.
|
|
47
|
+
*/
|
|
48
|
+
endpoint: string;
|
|
49
|
+
/**
|
|
50
|
+
* Base64-encoded cluster CA certificate (PEM) — typically
|
|
51
|
+
* `cluster.clusterCaCertificate`. Mutable (can rotate on the same cluster).
|
|
52
|
+
*/
|
|
53
|
+
caCertificate: string;
|
|
54
|
+
/** Release name (helm `--name`). Immutable — replace if changed. */
|
|
55
|
+
name: string;
|
|
56
|
+
/** Target namespace. Immutable — replace if changed. */
|
|
57
|
+
namespace: string;
|
|
58
|
+
/**
|
|
59
|
+
* Chart reference as you'd pass to `helm install`: an OCI URL
|
|
60
|
+
* (`oci://registry…/chart`), a `repo/chart` pair, or a local path.
|
|
61
|
+
* Immutable — replace if changed.
|
|
62
|
+
*/
|
|
63
|
+
chart: string;
|
|
64
|
+
/**
|
|
65
|
+
* Chart version to pin. Mutable (upgrading the chart version is an
|
|
66
|
+
* in-place `helm upgrade`).
|
|
67
|
+
*/
|
|
68
|
+
version?: string;
|
|
69
|
+
/**
|
|
70
|
+
* Inline Helm values (serialized to a temp JSON file and passed via
|
|
71
|
+
* `--values`). Mutable.
|
|
72
|
+
*/
|
|
73
|
+
values?: Record<string, unknown>;
|
|
74
|
+
/**
|
|
75
|
+
* Create the namespace if it doesn't exist (`--create-namespace`).
|
|
76
|
+
* @default false
|
|
77
|
+
*/
|
|
78
|
+
createNamespace?: boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Helm repository URL to add before install (`helm repo add`). Only used
|
|
81
|
+
* when `chart` is a `repo/chart` reference (not OCI). The repo name is
|
|
82
|
+
* derived from the first segment of `chart`.
|
|
83
|
+
*/
|
|
84
|
+
repoUrl?: string;
|
|
85
|
+
/**
|
|
86
|
+
* Wait for all Kubernetes resources to be ready before returning
|
|
87
|
+
* (`--wait --atomic`). Rolls back on failure.
|
|
88
|
+
* @default false
|
|
89
|
+
*/
|
|
90
|
+
wait?: boolean;
|
|
91
|
+
/**
|
|
92
|
+
* Timeout for `--wait` (Helm duration format, e.g. `"5m"`, `"300s"`).
|
|
93
|
+
* @default "5m"
|
|
94
|
+
*/
|
|
95
|
+
timeout?: string;
|
|
96
|
+
/** Extra labels (alchemy ownership labels merge on top). Mutable. */
|
|
97
|
+
labels?: Record<string, string>;
|
|
98
|
+
};
|
|
99
|
+
export type HelmReleaseAttributes = {
|
|
100
|
+
/** Release name. */
|
|
101
|
+
name: string;
|
|
102
|
+
/** Namespace. */
|
|
103
|
+
namespace: string;
|
|
104
|
+
/** Chart reference (as declared). */
|
|
105
|
+
chart: string;
|
|
106
|
+
/** Resolved chart version (from `helm status`). */
|
|
107
|
+
version: string | undefined;
|
|
108
|
+
/** Release status (`"deployed"`, `"failed"`, `"pending-rollout"`, …). */
|
|
109
|
+
status: string | undefined;
|
|
110
|
+
/** Release revision number (increments on each upgrade). */
|
|
111
|
+
revision: number | undefined;
|
|
112
|
+
/** Control-plane endpoint, threaded through for delete/read. */
|
|
113
|
+
endpoint: string;
|
|
114
|
+
/** Cluster CA certificate, threaded through for delete/read. */
|
|
115
|
+
caCertificate: string;
|
|
116
|
+
};
|
|
117
|
+
export type HelmRelease = Resource<"GCP.HelmRelease", HelmReleaseProps, HelmReleaseAttributes, never, GCP.Providers>;
|
|
118
|
+
export declare const HelmRelease: import("alchemy").ResourceClass<HelmRelease>;
|
|
119
|
+
declare const HelmError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
120
|
+
readonly _tag: "HelmError";
|
|
121
|
+
} & Readonly<A>;
|
|
122
|
+
/** Error from a `helm` CLI invocation. */
|
|
123
|
+
export declare class HelmError extends HelmError_base<{
|
|
124
|
+
command: string;
|
|
125
|
+
exitCode: number;
|
|
126
|
+
stderr: string;
|
|
127
|
+
stdout: string;
|
|
128
|
+
}> {
|
|
129
|
+
}
|
|
130
|
+
export declare const HelmReleaseProvider: () => import("effect/Layer").Layer<Provider.Provider<HelmRelease>, never, import("alchemy").Stack | import("alchemy").Stage | Credentials | FileSystem.FileSystem | Path.Path | import("effect/unstable/process/ChildProcessSpawner").ChildProcessSpawner>;
|
|
131
|
+
export {};
|
|
132
|
+
//# sourceMappingURL=Helm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Helm.d.ts","sourceRoot":"","sources":["../../src/Kubernetes/Helm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAG7C,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AAIpC,OAAO,KAAK,KAAK,GAAG,MAAM,iBAAiB,CAAC;AAG5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,yEAAyE;IACzE,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,gEAAgE;IAChE,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,QAAQ,CAChC,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,KAAK,EACL,GAAG,CAAC,SAAS,CACd,CAAC;AACF,eAAO,MAAM,WAAW,8CAEvB,CAAC;;;;AAEF,0CAA0C;AAC1C,qBAAa,SAAU,SAAQ,eAA8B;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;CAAG;AAsDL,eAAO,MAAM,mBAAmB,4PAiV7B,CAAC"}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
import { Credentials } from "@distilled.cloud/gcp";
|
|
2
|
+
import { Resource } from "alchemy";
|
|
3
|
+
import { Unowned } from "alchemy/AdoptPolicy";
|
|
4
|
+
import { isResolved, somePropsAreDifferent } from "alchemy/Diff";
|
|
5
|
+
import * as Provider from "alchemy/Provider";
|
|
6
|
+
import * as Data from "effect/Data";
|
|
7
|
+
import * as Effect from "effect/Effect";
|
|
8
|
+
import * as FileSystem from "effect/FileSystem";
|
|
9
|
+
import * as Path from "effect/Path";
|
|
10
|
+
import * as Redacted from "effect/Redacted";
|
|
11
|
+
import * as Stream from "effect/Stream";
|
|
12
|
+
import { ChildProcess } from "effect/unstable/process";
|
|
13
|
+
import { gcpInternalLabels, hasAlchemyLabels } from "../Tags.js";
|
|
14
|
+
export const HelmRelease = Resource("GCP.HelmRelease");
|
|
15
|
+
/** Error from a `helm` CLI invocation. */
|
|
16
|
+
export class HelmError extends Data.TaggedError("HelmError") {
|
|
17
|
+
}
|
|
18
|
+
const toAttributes = (status, parent) => ({
|
|
19
|
+
name: status?.name ?? parent.name,
|
|
20
|
+
namespace: status?.namespace ?? parent.namespace,
|
|
21
|
+
chart: parent.chart,
|
|
22
|
+
version: status?.chart?.metadata?.version,
|
|
23
|
+
status: status?.info?.status,
|
|
24
|
+
revision: status?.revision,
|
|
25
|
+
endpoint: parent.endpoint,
|
|
26
|
+
caCertificate: parent.caCertificate,
|
|
27
|
+
});
|
|
28
|
+
/** Mint a fresh GKE connection (bearer token) from props + ADC credentials. */
|
|
29
|
+
const connect = Effect.fn("helm.connect")(function* (props) {
|
|
30
|
+
const { accessToken } = yield* yield* Credentials;
|
|
31
|
+
return {
|
|
32
|
+
endpoint: props.endpoint,
|
|
33
|
+
caCertificate: props.caCertificate,
|
|
34
|
+
token: Redacted.value(accessToken),
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
export const HelmReleaseProvider = () => Provider.effect(HelmRelease, Effect.gen(function* () {
|
|
38
|
+
const fs = yield* FileSystem.FileSystem;
|
|
39
|
+
const path = yield* Path.Path;
|
|
40
|
+
/**
|
|
41
|
+
* Write a temp kubeconfig (and optional values file) to a temp dir,
|
|
42
|
+
* returning the paths. The temp dir is tied to a Scope via
|
|
43
|
+
* `acquireRelease` — if any step after `makeTempDirectory` fails, the
|
|
44
|
+
* dir (which contains the sensitive kubeconfig with an ADC bearer
|
|
45
|
+
* token) is removed immediately. Callers wrap their body in
|
|
46
|
+
* `Effect.scoped` so the dir also cleans up on success/interruption.
|
|
47
|
+
*/
|
|
48
|
+
const prepare = (props) => Effect.acquireRelease(Effect.gen(function* () {
|
|
49
|
+
const connection = yield* connect(props);
|
|
50
|
+
const dir = yield* fs.makeTempDirectory({
|
|
51
|
+
prefix: "helm-alchemy-",
|
|
52
|
+
});
|
|
53
|
+
const kubeconfigPath = path.join(dir, "kubeconfig.json");
|
|
54
|
+
const valuesPath = props.values
|
|
55
|
+
? path.join(dir, "values.json")
|
|
56
|
+
: undefined;
|
|
57
|
+
// Kubeconfig with the cluster's CA + the ADC bearer token. The CA
|
|
58
|
+
// is already base64-encoded (as GKE returns it), so it goes
|
|
59
|
+
// straight into `certificate-authority-data`.
|
|
60
|
+
const kubeconfig = JSON.stringify({
|
|
61
|
+
apiVersion: "v1",
|
|
62
|
+
kind: "Config",
|
|
63
|
+
clusters: [
|
|
64
|
+
{
|
|
65
|
+
name: "gke",
|
|
66
|
+
cluster: {
|
|
67
|
+
"certificate-authority-data": props.caCertificate,
|
|
68
|
+
server: `https://${props.endpoint}`,
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
contexts: [
|
|
73
|
+
{
|
|
74
|
+
name: "gke",
|
|
75
|
+
context: { cluster: "gke", user: "gke-user" },
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
"current-context": "gke",
|
|
79
|
+
users: [
|
|
80
|
+
{
|
|
81
|
+
name: "gke-user",
|
|
82
|
+
user: { token: connection.token },
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
});
|
|
86
|
+
yield* fs.writeFileString(kubeconfigPath, kubeconfig);
|
|
87
|
+
if (valuesPath && props.values) {
|
|
88
|
+
// JSON is valid YAML — helm accepts it for --values.
|
|
89
|
+
yield* fs.writeFileString(valuesPath, JSON.stringify(props.values));
|
|
90
|
+
}
|
|
91
|
+
return { dir, kubeconfigPath, valuesPath, connection };
|
|
92
|
+
}),
|
|
93
|
+
// Release: always remove the temp dir, even on success.
|
|
94
|
+
({ dir }) => fs.remove(dir, { recursive: true }).pipe(Effect.ignore));
|
|
95
|
+
/**
|
|
96
|
+
* Run a `helm` command with `KUBECONFIG` pointing at the temp file and
|
|
97
|
+
* `HELM_CONFIG_HOME`/`HELM_CACHE_HOME` isolated to the temp dir so
|
|
98
|
+
* `helm repo add`/`helm repo update` don't mutate the user's global
|
|
99
|
+
* Helm config. Returns stdout/stderr/exitCode. Scoped so the child
|
|
100
|
+
* process is cleaned up even on interruption.
|
|
101
|
+
*/
|
|
102
|
+
const runHelm = Effect.fn("helm.run")(function* (args) {
|
|
103
|
+
const cmd = ChildProcess.make("helm", args.helmArgs, {
|
|
104
|
+
shell: false,
|
|
105
|
+
env: {
|
|
106
|
+
...process.env,
|
|
107
|
+
KUBECONFIG: args.kubeconfigPath,
|
|
108
|
+
// Isolate helm config/cache to the temp dir so parallel
|
|
109
|
+
// reconciles or CI jobs don't race on the shared repository
|
|
110
|
+
// index (~/.config/helm/repositories.yaml).
|
|
111
|
+
HELM_CONFIG_HOME: args.dir,
|
|
112
|
+
HELM_CACHE_HOME: args.dir,
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
const handle = yield* cmd;
|
|
116
|
+
const [exitCode, stdout, stderr] = yield* Effect.all([
|
|
117
|
+
handle.exitCode,
|
|
118
|
+
Stream.mkString(Stream.decodeText(handle.stdout)),
|
|
119
|
+
Stream.mkString(Stream.decodeText(handle.stderr)),
|
|
120
|
+
], { concurrency: 3 });
|
|
121
|
+
return { exitCode, stdout, stderr };
|
|
122
|
+
});
|
|
123
|
+
/** Run a helm command, mapping a non-zero exit to a HelmError. */
|
|
124
|
+
const runHelmOrFail = Effect.fn("helm.runOrFail")(function* (args) {
|
|
125
|
+
const result = yield* runHelm(args);
|
|
126
|
+
if (result.exitCode !== 0) {
|
|
127
|
+
return yield* Effect.fail(new HelmError({
|
|
128
|
+
command: `helm ${args.helmArgs.join(" ")}`,
|
|
129
|
+
exitCode: result.exitCode,
|
|
130
|
+
stderr: result.stderr,
|
|
131
|
+
stdout: result.stdout,
|
|
132
|
+
}));
|
|
133
|
+
}
|
|
134
|
+
return result;
|
|
135
|
+
});
|
|
136
|
+
return {
|
|
137
|
+
// Identity (name/namespace/chart) and endpoint are unchanged by an
|
|
138
|
+
// in-place upgrade. revision increments on every upgrade — it is NOT
|
|
139
|
+
// stable (an update must persist the new revision).
|
|
140
|
+
stables: ["name", "namespace", "chart", "endpoint"],
|
|
141
|
+
diff: Effect.fn(function* ({ news, olds = {} }) {
|
|
142
|
+
if (!isResolved(news))
|
|
143
|
+
return undefined;
|
|
144
|
+
const o = olds;
|
|
145
|
+
// endpoint points at a specific cluster, and name/namespace/chart
|
|
146
|
+
// are the release's identity — any change orphans the old release.
|
|
147
|
+
if (somePropsAreDifferent(o, news, [
|
|
148
|
+
"name",
|
|
149
|
+
"namespace",
|
|
150
|
+
"chart",
|
|
151
|
+
"endpoint",
|
|
152
|
+
])) {
|
|
153
|
+
return { action: "replace" };
|
|
154
|
+
}
|
|
155
|
+
return undefined;
|
|
156
|
+
}),
|
|
157
|
+
reconcile: Effect.fn(function* ({ id, news, session }) {
|
|
158
|
+
return yield* Effect.scoped(Effect.gen(function* () {
|
|
159
|
+
const { dir, kubeconfigPath, valuesPath } = yield* prepare(news);
|
|
160
|
+
// Add helm repo if needed (non-OCI charts with repoUrl).
|
|
161
|
+
if (news.repoUrl && !news.chart.startsWith("oci://")) {
|
|
162
|
+
const repoName = news.chart.split("/")[0];
|
|
163
|
+
yield* session.note(`Adding helm repo: ${repoName}`);
|
|
164
|
+
yield* runHelmOrFail({
|
|
165
|
+
dir,
|
|
166
|
+
kubeconfigPath,
|
|
167
|
+
helmArgs: [
|
|
168
|
+
"repo",
|
|
169
|
+
"add",
|
|
170
|
+
repoName,
|
|
171
|
+
news.repoUrl,
|
|
172
|
+
"--force-update",
|
|
173
|
+
],
|
|
174
|
+
});
|
|
175
|
+
yield* runHelmOrFail({
|
|
176
|
+
dir,
|
|
177
|
+
kubeconfigPath,
|
|
178
|
+
helmArgs: ["repo", "update"],
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
// Build alchemy ownership labels.
|
|
182
|
+
const labels = {
|
|
183
|
+
...(news.labels ?? {}),
|
|
184
|
+
...(yield* gcpInternalLabels(id)),
|
|
185
|
+
};
|
|
186
|
+
const labelsFlag = Object.entries(labels)
|
|
187
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
188
|
+
.join(",");
|
|
189
|
+
// helm upgrade --install is idempotent for both first install
|
|
190
|
+
// and subsequent upgrades. --reset-values makes the declared
|
|
191
|
+
// `values` authoritative: if a key is removed from `values`,
|
|
192
|
+
// the next upgrade reverts it to the chart default rather than
|
|
193
|
+
// silently retaining the prior release's value.
|
|
194
|
+
const helmArgs = [
|
|
195
|
+
"upgrade",
|
|
196
|
+
"--install",
|
|
197
|
+
"--reset-values",
|
|
198
|
+
news.name,
|
|
199
|
+
news.chart,
|
|
200
|
+
"--namespace",
|
|
201
|
+
news.namespace,
|
|
202
|
+
...(news.createNamespace ? ["--create-namespace"] : []),
|
|
203
|
+
...(news.version ? ["--version", news.version] : []),
|
|
204
|
+
...(valuesPath ? ["--values", valuesPath] : []),
|
|
205
|
+
...(labelsFlag ? ["--labels", labelsFlag] : []),
|
|
206
|
+
...(news.wait
|
|
207
|
+
? ["--wait", "--atomic", "--timeout", news.timeout ?? "5m"]
|
|
208
|
+
: []),
|
|
209
|
+
];
|
|
210
|
+
yield* session.note(`Running helm upgrade --install ${news.name} ${news.chart}`);
|
|
211
|
+
yield* runHelmOrFail({ dir, kubeconfigPath, helmArgs });
|
|
212
|
+
// Read the release status to return fresh attributes.
|
|
213
|
+
const statusResult = yield* runHelmOrFail({
|
|
214
|
+
dir,
|
|
215
|
+
kubeconfigPath,
|
|
216
|
+
helmArgs: [
|
|
217
|
+
"status",
|
|
218
|
+
news.name,
|
|
219
|
+
"--namespace",
|
|
220
|
+
news.namespace,
|
|
221
|
+
"-o",
|
|
222
|
+
"json",
|
|
223
|
+
],
|
|
224
|
+
});
|
|
225
|
+
const status = JSON.parse(statusResult.stdout);
|
|
226
|
+
return toAttributes(status, {
|
|
227
|
+
name: news.name,
|
|
228
|
+
namespace: news.namespace,
|
|
229
|
+
chart: news.chart,
|
|
230
|
+
endpoint: news.endpoint,
|
|
231
|
+
caCertificate: news.caCertificate,
|
|
232
|
+
});
|
|
233
|
+
}));
|
|
234
|
+
}),
|
|
235
|
+
delete: Effect.fn(function* ({ output }) {
|
|
236
|
+
yield* Effect.scoped(Effect.gen(function* () {
|
|
237
|
+
const { dir, kubeconfigPath } = yield* prepare(output);
|
|
238
|
+
const result = yield* runHelm({
|
|
239
|
+
dir,
|
|
240
|
+
kubeconfigPath,
|
|
241
|
+
helmArgs: [
|
|
242
|
+
"uninstall",
|
|
243
|
+
output.name,
|
|
244
|
+
"--namespace",
|
|
245
|
+
output.namespace,
|
|
246
|
+
],
|
|
247
|
+
});
|
|
248
|
+
// "release: not found" is success (idempotent teardown).
|
|
249
|
+
if (result.exitCode !== 0 &&
|
|
250
|
+
!/not found/i.test(result.stderr)) {
|
|
251
|
+
return yield* Effect.fail(new HelmError({
|
|
252
|
+
command: `helm uninstall ${output.name}`,
|
|
253
|
+
exitCode: result.exitCode,
|
|
254
|
+
stderr: result.stderr,
|
|
255
|
+
stdout: result.stdout,
|
|
256
|
+
}));
|
|
257
|
+
}
|
|
258
|
+
}));
|
|
259
|
+
}),
|
|
260
|
+
read: Effect.fn(function* ({ id, output, olds }) {
|
|
261
|
+
const endpoint = output?.endpoint ?? olds?.endpoint;
|
|
262
|
+
const caCertificate = output?.caCertificate ?? olds?.caCertificate;
|
|
263
|
+
const name = output?.name ?? olds?.name;
|
|
264
|
+
const namespace = output?.namespace ?? olds?.namespace;
|
|
265
|
+
const chart = output?.chart ?? olds?.chart;
|
|
266
|
+
if (!endpoint || !caCertificate || !name || !namespace || !chart) {
|
|
267
|
+
return undefined;
|
|
268
|
+
}
|
|
269
|
+
return yield* Effect.scoped(Effect.gen(function* () {
|
|
270
|
+
const { dir, kubeconfigPath } = yield* prepare({
|
|
271
|
+
endpoint,
|
|
272
|
+
caCertificate,
|
|
273
|
+
});
|
|
274
|
+
const result = yield* runHelm({
|
|
275
|
+
dir,
|
|
276
|
+
kubeconfigPath,
|
|
277
|
+
helmArgs: [
|
|
278
|
+
"status",
|
|
279
|
+
name,
|
|
280
|
+
"--namespace",
|
|
281
|
+
namespace,
|
|
282
|
+
"-o",
|
|
283
|
+
"json",
|
|
284
|
+
],
|
|
285
|
+
});
|
|
286
|
+
// Release not found → absent.
|
|
287
|
+
if (result.exitCode !== 0 &&
|
|
288
|
+
/not found/i.test(result.stderr)) {
|
|
289
|
+
return undefined;
|
|
290
|
+
}
|
|
291
|
+
if (result.exitCode !== 0) {
|
|
292
|
+
return yield* Effect.fail(new HelmError({
|
|
293
|
+
command: `helm status ${name}`,
|
|
294
|
+
exitCode: result.exitCode,
|
|
295
|
+
stderr: result.stderr,
|
|
296
|
+
stdout: result.stdout,
|
|
297
|
+
}));
|
|
298
|
+
}
|
|
299
|
+
const status = JSON.parse(result.stdout);
|
|
300
|
+
const attrs = toAttributes(status, {
|
|
301
|
+
name,
|
|
302
|
+
namespace,
|
|
303
|
+
chart,
|
|
304
|
+
endpoint,
|
|
305
|
+
caCertificate,
|
|
306
|
+
});
|
|
307
|
+
return (yield* hasAlchemyLabels(id, status.labels))
|
|
308
|
+
? attrs
|
|
309
|
+
: Unowned(attrs);
|
|
310
|
+
}));
|
|
311
|
+
}),
|
|
312
|
+
};
|
|
313
|
+
}));
|
|
314
|
+
//# sourceMappingURL=Helm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Helm.js","sourceRoot":"","sources":["../../src/Kubernetes/Helm.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Kubernetes/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Kubernetes/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,yBAAyB,CAAC;AACxC,cAAc,aAAa,CAAC"}
|
package/lib/Kubernetes/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Kubernetes/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Kubernetes/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,yBAAyB,CAAC;AACxC,cAAc,aAAa,CAAC"}
|
package/lib/Providers.d.ts
CHANGED
|
@@ -19,6 +19,6 @@ export type ProviderRequirements = Layer.Services<ReturnType<typeof providers>>;
|
|
|
19
19
|
* re-provide it here, mirroring `AWS/Providers.ts` and
|
|
20
20
|
* `Cloudflare/Providers.ts`.
|
|
21
21
|
*/
|
|
22
|
-
export declare const providers: () => Layer.Layer<import("@distilled.cloud/gcp").Credentials | Providers, never, import("alchemy").Stack | import("alchemy").Stage | import("effect/unstable/http/HttpClient").HttpClient | import("alchemy").AuthProviders | import("alchemy/Auth/Profile").AlchemyProfile>;
|
|
22
|
+
export declare const providers: () => Layer.Layer<import("@distilled.cloud/gcp").Credentials | Providers, never, import("alchemy").Stack | import("alchemy").Stage | import("effect/unstable/http/HttpClient").HttpClient | import("effect/FileSystem").FileSystem | import("effect/Path").Path | import("effect/unstable/process/ChildProcessSpawner").ChildProcessSpawner | import("alchemy").AuthProviders | import("alchemy/Auth/Profile").AlchemyProfile>;
|
|
23
23
|
export {};
|
|
24
24
|
//# sourceMappingURL=Providers.d.ts.map
|
package/lib/Providers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Providers.d.ts","sourceRoot":"","sources":["../src/Providers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;;
|
|
1
|
+
{"version":3,"file":"Providers.d.ts","sourceRoot":"","sources":["../src/Providers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;;AA+DtC,qBAAa,SAAU,SAAQ,cAA+C;CAAG;AAEjF,MAAM,MAAM,oBAAoB,GAAG,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC;AAEhF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,SAAS,gaAqEnB,CAAC"}
|
package/lib/Providers.js
CHANGED
|
@@ -15,12 +15,15 @@ import { Subnetwork, SubnetworkProvider } from "./Compute/Subnetwork.js";
|
|
|
15
15
|
import { Cluster, ClusterProvider } from "./Container/Cluster.js";
|
|
16
16
|
import { NodePool, NodePoolProvider } from "./Container/NodePool.js";
|
|
17
17
|
import { ServiceAccount, ServiceAccountProvider, } from "./Iam/ServiceAccount.js";
|
|
18
|
+
import { ServiceAccountKey, ServiceAccountKeyProvider, } from "./Iam/ServiceAccountKey.js";
|
|
19
|
+
import { HelmRelease, HelmReleaseProvider, } from "./Kubernetes/Helm.js";
|
|
18
20
|
import { KubernetesManifest, KubernetesManifestProvider, } from "./Kubernetes/KubernetesManifest.js";
|
|
19
21
|
import { KubernetesSecret, KubernetesSecretProvider, } from "./Kubernetes/Secret.js";
|
|
20
22
|
import { ManagedLustreInstance, ManagedLustreInstanceProvider, } from "./ManagedLustre/Instance.js";
|
|
21
23
|
import { Job, JobProvider } from "./Run/Job.js";
|
|
22
24
|
import { Service, ServiceProvider } from "./Run/Service.js";
|
|
23
25
|
import { PsaConnection, PsaConnectionProvider, } from "./ServiceNetworking/PsaConnection.js";
|
|
26
|
+
import { StorageBucket, StorageBucketProvider, } from "./Storage/Bucket.js";
|
|
24
27
|
import { ApiEnable, ApiEnableProvider } from "./ServiceUsage/ApiEnable.js";
|
|
25
28
|
import { SqlDatabase, SqlDatabaseProvider } from "./Sqladmin/Database.js";
|
|
26
29
|
import { SqlInstance, SqlInstanceProvider } from "./Sqladmin/Instance.js";
|
|
@@ -57,6 +60,7 @@ export const providers = () => Layer.effect(Providers, Provider.collection([
|
|
|
57
60
|
SharedVpcServiceProject,
|
|
58
61
|
PsaConnection,
|
|
59
62
|
ManagedLustreInstance,
|
|
63
|
+
StorageBucket,
|
|
60
64
|
Service,
|
|
61
65
|
Job,
|
|
62
66
|
SqlInstance,
|
|
@@ -64,9 +68,11 @@ export const providers = () => Layer.effect(Providers, Provider.collection([
|
|
|
64
68
|
SqlUser,
|
|
65
69
|
ArtifactRegistryRepository,
|
|
66
70
|
ServiceAccount,
|
|
71
|
+
ServiceAccountKey,
|
|
67
72
|
KubernetesSecret,
|
|
68
73
|
KubernetesManifest,
|
|
69
|
-
|
|
74
|
+
HelmRelease,
|
|
75
|
+
])).pipe(Layer.provide(Layer.mergeAll(ProjectProvider(), ClusterProvider(), NodePoolProvider(), ApiEnableProvider(), NetworkProvider(), SubnetworkProvider(), FirewallProvider(), AddressProvider(), ForwardingRuleProvider(), GlobalAddressProvider(), SharedVpcHostProvider(), SharedVpcServiceProjectProvider(), PsaConnectionProvider(), ManagedLustreInstanceProvider(), StorageBucketProvider(), ServiceProvider(), JobProvider(), SqlInstanceProvider(), SqlDatabaseProvider(), SqlUserProvider(), ArtifactRegistryRepositoryProvider(), ServiceAccountProvider(), ServiceAccountKeyProvider(), KubernetesSecretProvider(), KubernetesManifestProvider(), HelmReleaseProvider())), Layer.provideMerge(fromAuthProvider()), Layer.provideMerge(GCPAuth),
|
|
70
76
|
// Auth/config failures (missing ADC, malformed profile) become
|
|
71
77
|
// unrecoverable defects rather than typed errors — mirrors
|
|
72
78
|
// `AWS/Providers.ts` and `Cloudflare/Providers.ts`. Resource lifecycle
|
package/lib/Providers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Providers.js","sourceRoot":"","sources":["../src/Providers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EACL,0BAA0B,EAC1B,kCAAkC,GACnC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EACL,cAAc,EACd,sBAAsB,GACvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,EACL,uBAAuB,EACvB,+BAA+B,GAChC,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EACL,cAAc,EACd,sBAAsB,GACvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kBAAkB,EAClB,0BAA0B,GAC3B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,qBAAqB,EACrB,6BAA6B,GAC9B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EACL,aAAa,EACb,qBAAqB,GACtB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE9D,MAAM,OAAO,SAAU,SAAQ,QAAQ,CAAC,kBAAkB,EAAa,CAAC,KAAK,CAAC;CAAG;AAIjF;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,EAAE,CAC5B,KAAK,CAAC,MAAM,CACV,SAAS,EACT,QAAQ,CAAC,UAAU,CAAC;IAClB,OAAO;IACP,OAAO;IACP,QAAQ;IACR,SAAS;IACT,OAAO;IACP,UAAU;IACV,QAAQ;IACR,OAAO;IACP,cAAc;IACd,aAAa;IACb,aAAa;IACb,uBAAuB;IACvB,aAAa;IACb,qBAAqB;IACrB,OAAO;IACP,GAAG;IACH,WAAW;IACX,WAAW;IACX,OAAO;IACP,0BAA0B;IAC1B,cAAc;IACd,gBAAgB;IAChB,kBAAkB;
|
|
1
|
+
{"version":3,"file":"Providers.js","sourceRoot":"","sources":["../src/Providers.ts"],"names":[],"mappings":"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"}
|