@intentic/providers 1.240.0 → 1.242.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +5 -0
  2. package/dist/auth/authentik.d.ts +1 -1
  3. package/dist/auth/authentik.d.ts.map +1 -1
  4. package/dist/auth/authentik.js +28 -99
  5. package/dist/auth/authentik.js.map +1 -1
  6. package/dist/backings/garage-bucket.d.ts +1 -1
  7. package/dist/backings/garage-bucket.d.ts.map +1 -1
  8. package/dist/backings/garage-bucket.js +18 -63
  9. package/dist/backings/garage-bucket.js.map +1 -1
  10. package/dist/backings/garage.d.ts +1 -1
  11. package/dist/backings/garage.d.ts.map +1 -1
  12. package/dist/backings/garage.js +19 -87
  13. package/dist/backings/garage.js.map +1 -1
  14. package/dist/backings/postgres-database.d.ts +1 -1
  15. package/dist/backings/postgres-database.d.ts.map +1 -1
  16. package/dist/backings/postgres-database.js +20 -72
  17. package/dist/backings/postgres-database.js.map +1 -1
  18. package/dist/backings/postgres.d.ts +1 -1
  19. package/dist/backings/postgres.d.ts.map +1 -1
  20. package/dist/backings/postgres.js +15 -98
  21. package/dist/backings/postgres.js.map +1 -1
  22. package/dist/backings/valkey-namespace.d.ts +1 -1
  23. package/dist/backings/valkey-namespace.d.ts.map +1 -1
  24. package/dist/backings/valkey-namespace.js +15 -60
  25. package/dist/backings/valkey-namespace.js.map +1 -1
  26. package/dist/backings/valkey.d.ts +1 -1
  27. package/dist/backings/valkey.d.ts.map +1 -1
  28. package/dist/backings/valkey.js +18 -98
  29. package/dist/backings/valkey.js.map +1 -1
  30. package/dist/core/backing-provider.d.ts +33 -0
  31. package/dist/core/backing-provider.d.ts.map +1 -0
  32. package/dist/core/backing-provider.js +97 -0
  33. package/dist/core/backing-provider.js.map +1 -0
  34. package/dist/core/backing-ssh.d.ts +2 -0
  35. package/dist/core/backing-ssh.d.ts.map +1 -1
  36. package/dist/core/backing-ssh.js +2 -0
  37. package/dist/core/backing-ssh.js.map +1 -1
  38. package/dist/core/host-files.d.ts +13 -0
  39. package/dist/core/host-files.d.ts.map +1 -0
  40. package/dist/core/host-files.js +27 -0
  41. package/dist/core/host-files.js.map +1 -0
  42. package/dist/core/instance-binding.d.ts +24 -0
  43. package/dist/core/instance-binding.d.ts.map +1 -0
  44. package/dist/core/instance-binding.js +68 -0
  45. package/dist/core/instance-binding.js.map +1 -0
  46. package/dist/observability/signoz.d.ts +1 -1
  47. package/dist/observability/signoz.d.ts.map +1 -1
  48. package/dist/observability/signoz.js +25 -127
  49. package/dist/observability/signoz.js.map +1 -1
  50. package/dist/services/compose-service.d.ts +3 -5
  51. package/dist/services/compose-service.d.ts.map +1 -1
  52. package/dist/services/compose-service.js +4 -22
  53. package/dist/services/compose-service.js.map +1 -1
  54. package/package.json +8 -8
package/README.md CHANGED
@@ -15,6 +15,11 @@ The real **Provider SPI implementations** the engine reconciles against: the onl
15
15
  - `src/<kind>.ts`, one provider per kind: e.g. [src/cloudflare.ts](src/cloudflare.ts), [src/forgejo.ts](src/forgejo.ts), [src/komodo.ts](src/komodo.ts), [src/deployment.ts](src/deployment.ts), [src/cf-route.ts](src/cf-route.ts), [src/ci.ts](src/ci.ts).
16
16
  - `src/<system>-api.ts`, HTTP adapters: [src/forgejo-api.ts](src/forgejo-api.ts), [src/komodo-api.ts](src/komodo-api.ts), [src/cloudflare-api.ts](src/cloudflare-api.ts), [src/authentik-api.ts](src/authentik-api.ts); fakes like [src/forgejo-api.fake.ts](src/forgejo-api.fake.ts).
17
17
  - [src/backings](src/backings): `sshExecutor` (+ `SshExecutor`/`SshSession`); [src/api-validation.test.ts](src/api-validation.test.ts), input-validation coverage.
18
+ - The three **skeletons** every Docker-deploying provider is built from, so a new one is a spec rather than another copy of `read`/`diff`/`apply`/`delete`/`list`:
19
+ - [src/core/backing-provider.ts](src/core/backing-provider.ts) — one container per node id (postgres, valkey, garage, authentik): a schema, a compose file, a readiness probe.
20
+ - [src/core/instance-binding.ts](src/core/instance-binding.ts) — an app's slice INSIDE a backing (a database, an ACL user, a bucket), reached with `docker exec`.
21
+ - [src/services/compose-service.ts](src/services/compose-service.ts) — one singleton stack per kind (the catalog services, signoz), diffed per compose service.
22
+ - [src/core/host-files.ts](src/core/host-files.ts) is the writing the three share: rewritten config files, and the write-once `.env` whose two quoting layers are the part that used to be got wrong.
18
23
 
19
24
  ## How it fits
20
25
 
@@ -1,4 +1,4 @@
1
1
  import type { Provider } from "@intentic/engine";
2
- import { type SshExecutor } from "../core/ssh.js";
2
+ import type { SshExecutor } from "../core/ssh.js";
3
3
  export declare const createAuthentikProvider: (executor?: SshExecutor) => Provider;
4
4
  //# sourceMappingURL=authentik.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"authentik.d.ts","sourceRoot":"","sources":["../../src/auth/authentik.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAOjE,OAAO,EAAmB,KAAK,WAAW,EAAe,MAAM,gBAAgB,CAAC;AAwGhF,eAAO,MAAM,uBAAuB,cAAc,WAAW,KAAiB,QA2D5E,CAAC"}
1
+ {"version":3,"file":"authentik.d.ts","sourceRoot":"","sources":["../../src/auth/authentik.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AA6DlD,eAAO,MAAM,uBAAuB,cAAc,WAAW,KAAiB,QAgCzE,CAAC"}
@@ -1,33 +1,19 @@
1
- import { HASH_KEY } from "@intentic/graph";
2
- import { envLine, shellQuote } from "@intentic/sandbox-run/quote";
3
1
  import { z } from "zod";
4
- import { composeDown, composeUp, containerImage, containerLabel, stateDir, waitReady } from "../core/backing-ssh.js";
5
- import { hasPendingRef, parseInputs, sshSchema, sshTarget } from "../core/inputs.js";
6
- import { listStampedContainers } from "../core/list-stamped.js";
2
+ import { backingSchema, createBackingProvider } from "../core/backing-provider.js";
3
+ import { stampLabels } from "../core/backing-ssh.js";
7
4
  import { sshExecutor } from "../core/ssh.js";
8
5
  const KIND = "authentik";
9
- const READY_TIMEOUT_MS = 300_000;
10
- const authentikSchema = sshSchema.extend({
11
- internalIp: z.string(),
12
- publishPort: z.number(),
6
+ const authentikSchema = backingSchema.extend({
13
7
  domain: z.string(),
14
8
  secretKey: z.string(),
15
9
  bootstrapToken: z.string(),
16
10
  bootstrapPassword: z.string(),
17
11
  dbPassword: z.string(),
18
- image: z.string(),
19
12
  pgImage: z.string(),
20
13
  redisImage: z.string(),
21
- protect: z.boolean().default(false),
22
14
  });
23
- const parse = (inputs) => parseInputs(authentikSchema, inputs, KIND);
24
15
  const internalUrl = (parsed) => `http://${parsed.internalIp}:${parsed.publishPort}`;
25
- const outputsFor = (parsed) => ({
26
- url: `https://${parsed.domain}`,
27
- issuerUrl: `https://${parsed.domain}/application/o/`,
28
- internalUrl: internalUrl(parsed),
29
- });
30
- const composeYaml = (id, hash, parsed) => [
16
+ const composeYaml = (parsed, id, hash) => [
31
17
  "services:",
32
18
  " postgresql:",
33
19
  ` image: ${parsed.pgImage}`,
@@ -49,7 +35,7 @@ const composeYaml = (id, hash, parsed) => [
49
35
  ` ports: [ "${parsed.publishPort}:9000" ]`,
50
36
  " volumes: [ media:/media, templates:/templates ]",
51
37
  " depends_on: { postgresql: { condition: service_healthy }, redis: { condition: service_healthy } }",
52
- ` labels: [ "intentic.id=${id}", "intentic.type=${KIND}", "intentic.hash=${hash}"${parsed.protect ? ', "intentic.protect=true"' : ""} ]`,
38
+ stampLabels(KIND, id, hash, parsed.protect),
53
39
  " worker:",
54
40
  ` image: ${parsed.image}`,
55
41
  " restart: unless-stopped",
@@ -60,84 +46,27 @@ const composeYaml = (id, hash, parsed) => [
60
46
  "volumes: { database: {}, redis: {}, media: {}, certs: {}, templates: {} }",
61
47
  "",
62
48
  ].join("\n");
63
- const ensureFiles = async (session, id, hash, parsed) => {
64
- const dir = stateDir(KIND, id);
65
- await session.exec(`mkdir -p ${dir}`);
66
- await session.exec(`cat > ${dir}/compose.yaml <<'COMPOSE_EOF'\n${composeYaml(id, hash, parsed)}COMPOSE_EOF`);
67
- const envPairs = [
68
- ["AUTHENTIK_POSTGRESQL__HOST", "postgresql"],
69
- ["AUTHENTIK_POSTGRESQL__USER", "authentik"],
70
- ["AUTHENTIK_POSTGRESQL__NAME", "authentik"],
71
- ["AUTHENTIK_REDIS__HOST", "redis"],
72
- ["AUTHENTIK_BOOTSTRAP_EMAIL", `akadmin@${parsed.domain}`],
73
- ["AUTHENTIK_SECRET_KEY", parsed.secretKey],
74
- ["AUTHENTIK_POSTGRESQL__PASSWORD", parsed.dbPassword],
75
- ["AUTHENTIK_BOOTSTRAP_PASSWORD", parsed.bootstrapPassword],
76
- ["AUTHENTIK_BOOTSTRAP_TOKEN", parsed.bootstrapToken],
77
- ];
78
- const envLines = envPairs.map(([key, value]) => shellQuote(envLine(key, value))).join(" ");
79
- await session.exec(`test -f ${dir}/.env || { printf '%s' ${envLines} > ${dir}/.env && chmod 600 ${dir}/.env; }`);
80
- };
81
- const readyProbe = (parsed) => `wget -q -T 10 -O /dev/null ${internalUrl(parsed)}/-/health/ready/`;
82
- export const createAuthentikProvider = (executor = sshExecutor) => ({
83
- read: async (inputs, ctx) => {
84
- if (hasPendingRef(inputs, "internalIp")) {
85
- return undefined;
86
- }
87
- const parsed = parse(inputs);
88
- let session;
89
- try {
90
- session = await executor.connect(sshTarget(parsed));
91
- }
92
- catch (error) {
93
- ctx.log(`authentik "${ctx.id}": host not reachable over SSH, treating as not-yet-created: ${String(error)}`);
94
- return undefined;
95
- }
96
- try {
97
- const probe = await session.exec(readyProbe(parsed));
98
- if (probe.code !== 0) {
99
- return undefined;
100
- }
101
- const stampHash = await containerLabel(session, ctx.id, HASH_KEY);
102
- return {
103
- outputs: outputsFor(parsed),
104
- detail: { image: await containerImage(session, ctx.id) },
105
- ...(stampHash === "" ? {} : { stampHash }),
106
- };
107
- }
108
- finally {
109
- await session.dispose();
110
- }
111
- },
112
- diff: (inputs, observed) => {
113
- const parsed = parse(inputs);
114
- const image = (observed.detail?.["image"] ?? "");
115
- return image === parsed.image
116
- ? { action: "noop" }
117
- : { action: "update", reason: `authentik image differs (running ${image}, want ${parsed.image})` };
118
- },
119
- apply: async (inputs, _observed, ctx) => {
120
- const parsed = parse(inputs);
121
- const session = await executor.connect(sshTarget(parsed));
122
- try {
123
- await ensureFiles(session, ctx.id, ctx.inputsHash ?? "", parsed);
124
- await composeUp(session, KIND, ctx.id);
125
- await waitReady(session, KIND, ctx.id, readyProbe(parsed), READY_TIMEOUT_MS);
126
- return outputsFor(parsed);
127
- }
128
- finally {
129
- await session.dispose();
130
- }
131
- },
132
- delete: async (inputs, ctx) => {
133
- const session = await executor.connect(sshTarget(parseInputs(sshSchema, inputs, KIND)));
134
- try {
135
- await composeDown(session, KIND, ctx.id);
136
- }
137
- finally {
138
- await session.dispose();
139
- }
140
- },
141
- list: (sources, ctx) => listStampedContainers(executor, KIND, sources, ctx.log),
142
- });
49
+ export const createAuthentikProvider = (executor = sshExecutor) => createBackingProvider({
50
+ kind: KIND,
51
+ schema: authentikSchema,
52
+ readyTimeoutMs: 300_000,
53
+ outputs: (parsed) => ({
54
+ url: `https://${parsed.domain}`,
55
+ issuerUrl: `https://${parsed.domain}/application/o/`,
56
+ internalUrl: internalUrl(parsed),
57
+ }),
58
+ files: (parsed, id, hash) => ({ "compose.yaml": composeYaml(parsed, id, hash) }),
59
+ env: (parsed) => [
60
+ { key: "AUTHENTIK_POSTGRESQL__HOST", value: "postgresql" },
61
+ { key: "AUTHENTIK_POSTGRESQL__USER", value: "authentik" },
62
+ { key: "AUTHENTIK_POSTGRESQL__NAME", value: "authentik" },
63
+ { key: "AUTHENTIK_REDIS__HOST", value: "redis" },
64
+ { key: "AUTHENTIK_BOOTSTRAP_EMAIL", value: `akadmin@${parsed.domain}` },
65
+ { key: "AUTHENTIK_SECRET_KEY", value: parsed.secretKey },
66
+ { key: "AUTHENTIK_POSTGRESQL__PASSWORD", value: parsed.dbPassword },
67
+ { key: "AUTHENTIK_BOOTSTRAP_PASSWORD", value: parsed.bootstrapPassword },
68
+ { key: "AUTHENTIK_BOOTSTRAP_TOKEN", value: parsed.bootstrapToken },
69
+ ],
70
+ probe: (parsed) => `wget -q -T 10 -O /dev/null ${internalUrl(parsed)}/-/health/ready/`,
71
+ }, executor);
143
72
  //# sourceMappingURL=authentik.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"authentik.js","sourceRoot":"","sources":["../../src/auth/authentik.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"authentik.js","sourceRoot":"","sources":["../../src/auth/authentik.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  import type { Provider } from "@intentic/engine";
2
- import { type SshExecutor } from "../core/ssh.js";
2
+ import type { SshExecutor } from "../core/ssh.js";
3
3
  export declare const createGarageBucketProvider: (executor?: SshExecutor) => Provider;
4
4
  //# sourceMappingURL=garage-bucket.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"garage-bucket.d.ts","sourceRoot":"","sources":["../../src/backings/garage-bucket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAIjE,OAAO,EAAmB,KAAK,WAAW,EAAe,MAAM,gBAAgB,CAAC;AA4ChF,eAAO,MAAM,0BAA0B,cAAc,WAAW,KAAiB,QA2D/E,CAAC"}
1
+ {"version":3,"file":"garage-bucket.d.ts","sourceRoot":"","sources":["../../src/backings/garage-bucket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,gBAAgB,CAAC;AA0C9D,eAAO,MAAM,0BAA0B,cAAc,WAAW,KAAiB,QAyB5E,CAAC"}
@@ -1,15 +1,12 @@
1
1
  import { z } from "zod";
2
- import { containerId } from "../core/backing-ssh.js";
3
- import { parseInputs, sshSchema, sshTarget } from "../core/inputs.js";
2
+ import { bindingSchema, createInstanceBindingProvider } from "../core/instance-binding.js";
4
3
  import { sshExecutor } from "../core/ssh.js";
5
4
  const BIN = "/garage";
6
- const bucketSchema = sshSchema.extend({
7
- instance: z.string(),
5
+ const bucketSchema = bindingSchema.extend({
8
6
  endpoint: z.string(),
9
7
  bucket: z.string(),
10
8
  keyName: z.string(),
11
9
  });
12
- const parse = (inputs) => parseInputs(bucketSchema, inputs, "garage-bucket");
13
10
  const garage = async (session, cid, args) => {
14
11
  const result = await session.exec(`docker exec ${cid} ${BIN} ${args}`);
15
12
  if (result.code !== 0) {
@@ -28,65 +25,23 @@ const outputsFor = (parsed, key) => ({
28
25
  secretKey: key.secretKey,
29
26
  bucket: parsed.bucket,
30
27
  });
31
- export const createGarageBucketProvider = (executor = sshExecutor) => ({
32
- read: async (inputs, ctx) => {
33
- const parsed = parse(inputs);
34
- let session;
35
- try {
36
- session = await executor.connect(sshTarget(parsed));
37
- }
38
- catch (error) {
39
- ctx.log(`garage-bucket "${ctx.id}": host not reachable over SSH, treating as not-yet-created: ${String(error)}`);
40
- return undefined;
41
- }
42
- try {
43
- const cid = await containerId(session, parsed.instance);
44
- if (cid === "") {
45
- return undefined;
46
- }
47
- const info = await session.exec(`docker exec ${cid} ${BIN} bucket info ${parsed.bucket}`);
48
- if (info.code !== 0) {
49
- return undefined;
50
- }
51
- return { outputs: outputsFor(parsed, await readKey(session, cid, parsed.keyName)) };
52
- }
53
- finally {
54
- await session.dispose();
55
- }
28
+ export const createGarageBucketProvider = (executor = sshExecutor) => createInstanceBindingProvider({
29
+ kind: "garage-bucket",
30
+ schema: bucketSchema,
31
+ pendingRefs: ["endpoint"],
32
+ present: async (session, cid, parsed) => {
33
+ const info = await session.exec(`docker exec ${cid} ${BIN} bucket info ${parsed.bucket}`);
34
+ return info.code === 0 ? outputsFor(parsed, await readKey(session, cid, parsed.keyName)) : undefined;
56
35
  },
57
- diff: () => ({ action: "noop" }),
58
- apply: async (inputs, _observed, ctx) => {
59
- const parsed = parse(inputs);
60
- const session = await executor.connect(sshTarget(parsed));
61
- try {
62
- const cid = await containerId(session, parsed.instance);
63
- if (cid === "") {
64
- throw new Error(`garage-bucket "${ctx.id}": instance "${parsed.instance}" is not running`);
65
- }
66
- await session.exec(`docker exec ${cid} ${BIN} bucket create ${parsed.bucket} 2>/dev/null || true`);
67
- await session.exec(`docker exec ${cid} ${BIN} key create ${parsed.keyName} 2>/dev/null || true`);
68
- await garage(session, cid, `bucket allow --read --write ${parsed.bucket} --key ${parsed.keyName}`);
69
- return outputsFor(parsed, await readKey(session, cid, parsed.keyName));
70
- }
71
- finally {
72
- await session.dispose();
73
- }
36
+ create: async (session, cid, parsed) => {
37
+ await session.exec(`docker exec ${cid} ${BIN} bucket create ${parsed.bucket} 2>/dev/null || true`);
38
+ await session.exec(`docker exec ${cid} ${BIN} key create ${parsed.keyName} 2>/dev/null || true`);
39
+ await garage(session, cid, `bucket allow --read --write ${parsed.bucket} --key ${parsed.keyName}`);
40
+ return outputsFor(parsed, await readKey(session, cid, parsed.keyName));
74
41
  },
75
- delete: async (inputs, ctx) => {
76
- const parsed = parse(inputs);
77
- const session = await executor.connect(sshTarget(parsed));
78
- try {
79
- const cid = await containerId(session, parsed.instance);
80
- if (cid === "") {
81
- ctx.log(`garage-bucket "${ctx.id}": instance "${parsed.instance}" already gone; nothing to drop`);
82
- return;
83
- }
84
- await session.exec(`docker exec ${cid} ${BIN} bucket delete --yes ${parsed.bucket} 2>/dev/null || true`);
85
- await session.exec(`docker exec ${cid} ${BIN} key delete --yes ${parsed.keyName} 2>/dev/null || true`);
86
- }
87
- finally {
88
- await session.dispose();
89
- }
42
+ drop: async (session, cid, parsed) => {
43
+ await session.exec(`docker exec ${cid} ${BIN} bucket delete --yes ${parsed.bucket} 2>/dev/null || true`);
44
+ await session.exec(`docker exec ${cid} ${BIN} key delete --yes ${parsed.keyName} 2>/dev/null || true`);
90
45
  },
91
- });
46
+ }, executor);
92
47
  //# sourceMappingURL=garage-bucket.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"garage-bucket.js","sourceRoot":"","sources":["../../src/backings/garage-bucket.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"garage-bucket.js","sourceRoot":"","sources":["../../src/backings/garage-bucket.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AAE3F,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,GAAG,GAAG,SAAS,CAAC;AAEtB,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC;IAEtC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IAEpB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC;AAIH,MAAM,MAAM,GAAG,KAAK,EAAE,OAAmB,EAAE,GAAW,EAAE,IAAY,EAAmB,EAAE;IACrF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC;IACvE,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACrG,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAChC,CAAC,CAAC;AAIF,MAAM,OAAO,GAAG,KAAK,EAAE,OAAmB,EAAE,GAAW,EAAE,OAAe,EAAqD,EAAE;IAC3H,MAAM,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,2BAA2B,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IACxG,MAAM,KAAK,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,GAAG,KAAK,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClG,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;AAC1E,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,MAAoB,EAAE,GAA6C,EAA2B,EAAE,CAAC,CAAC;IAClH,QAAQ,EAAE,MAAM,CAAC,QAAQ;IACzB,SAAS,EAAE,GAAG,CAAC,SAAS;IACxB,SAAS,EAAE,GAAG,CAAC,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC,MAAM;CACxB,CAAC,CAAC;AAMH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,QAAQ,GAAgB,WAAW,EAAY,EAAE,CACxF,6BAA6B,CACzB;IACI,IAAI,EAAE,eAAe;IACrB,MAAM,EAAE,YAAY;IAEpB,WAAW,EAAE,CAAC,UAAU,CAAC;IACzB,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QACpC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,gBAAgB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1F,OAAO,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACzG,CAAC;IACD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QAGnC,MAAM,OAAO,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,kBAAkB,MAAM,CAAC,MAAM,sBAAsB,CAAC,CAAC;QACnG,MAAM,OAAO,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,eAAe,MAAM,CAAC,OAAO,sBAAsB,CAAC,CAAC;QACjG,MAAM,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,+BAA+B,MAAM,CAAC,MAAM,UAAU,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACnG,OAAO,UAAU,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QACjC,MAAM,OAAO,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,wBAAwB,MAAM,CAAC,MAAM,sBAAsB,CAAC,CAAC;QACzG,MAAM,OAAO,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,qBAAqB,MAAM,CAAC,OAAO,sBAAsB,CAAC,CAAC;IAC3G,CAAC;CACJ,EACD,QAAQ,CACX,CAAC"}
@@ -1,4 +1,4 @@
1
1
  import type { Provider } from "@intentic/engine";
2
- import { type SshExecutor } from "../core/ssh.js";
2
+ import type { SshExecutor } from "../core/ssh.js";
3
3
  export declare const createGarageProvider: (executor?: SshExecutor) => Provider;
4
4
  //# sourceMappingURL=garage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"garage.d.ts","sourceRoot":"","sources":["../../src/backings/garage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAMjE,OAAO,EAAmB,KAAK,WAAW,EAAe,MAAM,gBAAgB,CAAC;AA8FhF,eAAO,MAAM,oBAAoB,cAAc,WAAW,KAAiB,QA4DzE,CAAC"}
1
+ {"version":3,"file":"garage.d.ts","sourceRoot":"","sources":["../../src/backings/garage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,gBAAgB,CAAC;AAsE9D,eAAO,MAAM,oBAAoB,cAAc,WAAW,KAAiB,QAoBtE,CAAC"}
@@ -1,27 +1,15 @@
1
- import { HASH_KEY } from "@intentic/graph";
2
1
  import { z } from "zod";
3
- import { composeDown, composeUp, containerId, containerImage, containerLabel, stateDir, waitReady } from "../core/backing-ssh.js";
4
- import { hasPendingRef, parseInputs, sshSchema, sshTarget } from "../core/inputs.js";
5
- import { listStampedContainers } from "../core/list-stamped.js";
2
+ import { backingSchema, createBackingProvider } from "../core/backing-provider.js";
3
+ import { containerId, execProbe, stampLabels } from "../core/backing-ssh.js";
6
4
  import { sshExecutor } from "../core/ssh.js";
7
5
  const KIND = "garage";
8
- const READY_TIMEOUT_MS = 120_000;
9
6
  const BIN = "/garage";
10
- const garageSchema = sshSchema.extend({
11
- internalIp: z.string(),
12
- publishPort: z.number(),
7
+ const garageSchema = backingSchema.extend({
13
8
  region: z.string(),
14
- image: z.string(),
15
9
  domain: z.string().optional(),
16
- protect: z.boolean().default(false),
17
10
  });
18
- const parse = (inputs) => parseInputs(garageSchema, inputs, KIND);
19
11
  const internalEndpoint = (parsed) => `http://${parsed.internalIp}:${parsed.publishPort}`;
20
- const outputsFor = (parsed) => ({
21
- internalEndpoint: internalEndpoint(parsed),
22
- endpoint: parsed.domain !== undefined ? `https://${parsed.domain}` : internalEndpoint(parsed),
23
- });
24
- const composeYaml = (id, hash, parsed) => [
12
+ const composeYaml = (parsed, id, hash) => [
25
13
  "services:",
26
14
  " garage:",
27
15
  ` image: ${parsed.image}`,
@@ -32,7 +20,7 @@ const composeYaml = (id, hash, parsed) => [
32
20
  " - ./garage.toml:/etc/garage.toml:ro",
33
21
  " - ./rpc_secret:/etc/garage/rpc_secret:ro",
34
22
  ` ports: [ "${parsed.publishPort}:3900" ]`,
35
- ` labels: [ "intentic.id=${id}", "intentic.type=${KIND}", "intentic.hash=${hash}"${parsed.protect ? ', "intentic.protect=true"' : ""} ]`,
23
+ stampLabels(KIND, id, hash, parsed.protect),
36
24
  "volumes: { meta: {}, data: {} }",
37
25
  "",
38
26
  ].join("\n");
@@ -48,15 +36,6 @@ const garageToml = (parsed) => [
48
36
  'api_bind_addr = "[::]:3900"',
49
37
  "",
50
38
  ].join("\n");
51
- const ensureFiles = async (session, id, hash, parsed) => {
52
- const dir = stateDir(KIND, id);
53
- await session.exec(`mkdir -p ${dir}`);
54
- await session.exec(`cat > ${dir}/compose.yaml <<'COMPOSE_EOF'\n${composeYaml(id, hash, parsed)}COMPOSE_EOF`);
55
- await session.exec(`cat > ${dir}/garage.toml <<'GARAGE_EOF'\n${garageToml(parsed)}GARAGE_EOF`);
56
- await session.exec(`test -f ${dir}/.env || printf 'TZ=Etc/UTC\\n' > ${dir}/.env`);
57
- await session.exec(`test -f ${dir}/rpc_secret || { openssl rand -hex 32 > ${dir}/rpc_secret && chmod 600 ${dir}/rpc_secret; }`);
58
- };
59
- const readyProbe = (id) => `cid=$(docker ps -q --filter "label=intentic.id=${id}"); [ -n "$cid" ] && docker exec "$cid" ${BIN} status`;
60
39
  const ensureLayout = async (session, id) => {
61
40
  const cid = await containerId(session, id);
62
41
  const nodeId = (await session.exec(`docker exec ${cid} ${BIN} node id -q`)).stdout.trim().split("@")[0] ?? "";
@@ -70,66 +49,19 @@ const ensureLayout = async (session, id) => {
70
49
  await session.exec(`docker exec ${cid} ${BIN} layout assign -z dc1 -c 1G ${nodeId}`);
71
50
  await session.exec(`docker exec ${cid} ${BIN} layout apply --version 1`);
72
51
  };
73
- export const createGarageProvider = (executor = sshExecutor) => ({
74
- read: async (inputs, ctx) => {
75
- if (hasPendingRef(inputs, "internalIp")) {
76
- return undefined;
77
- }
78
- const parsed = parse(inputs);
79
- let session;
80
- try {
81
- session = await executor.connect(sshTarget(parsed));
82
- }
83
- catch (error) {
84
- ctx.log(`garage "${ctx.id}": host not reachable over SSH, treating as not-yet-created: ${String(error)}`);
85
- return undefined;
86
- }
87
- try {
88
- const probe = await session.exec(readyProbe(ctx.id));
89
- if (probe.code !== 0) {
90
- return undefined;
91
- }
92
- const stampHash = await containerLabel(session, ctx.id, HASH_KEY);
93
- return {
94
- outputs: outputsFor(parsed),
95
- detail: { image: await containerImage(session, ctx.id) },
96
- ...(stampHash === "" ? {} : { stampHash }),
97
- };
98
- }
99
- finally {
100
- await session.dispose();
101
- }
102
- },
103
- diff: (inputs, observed) => {
104
- const parsed = parse(inputs);
105
- const image = (observed.detail?.["image"] ?? "");
106
- return image === parsed.image
107
- ? { action: "noop" }
108
- : { action: "update", reason: `garage image differs (running ${image}, want ${parsed.image})` };
52
+ export const createGarageProvider = (executor = sshExecutor) => createBackingProvider({
53
+ kind: KIND,
54
+ schema: garageSchema,
55
+ readyTimeoutMs: 120_000,
56
+ outputs: (parsed) => ({
57
+ internalEndpoint: internalEndpoint(parsed),
58
+ endpoint: parsed.domain !== undefined ? `https://${parsed.domain}` : internalEndpoint(parsed),
59
+ }),
60
+ files: (parsed, id, hash) => ({ "compose.yaml": composeYaml(parsed, id, hash), "garage.toml": garageToml(parsed) }),
61
+ prepare: async (session, _parsed, dir) => {
62
+ await session.exec(`test -f ${dir}/rpc_secret || { openssl rand -hex 32 > ${dir}/rpc_secret && chmod 600 ${dir}/rpc_secret; }`);
109
63
  },
110
- apply: async (inputs, _observed, ctx) => {
111
- const parsed = parse(inputs);
112
- const session = await executor.connect(sshTarget(parsed));
113
- try {
114
- await ensureFiles(session, ctx.id, ctx.inputsHash ?? "", parsed);
115
- await composeUp(session, KIND, ctx.id);
116
- await waitReady(session, KIND, ctx.id, readyProbe(ctx.id), READY_TIMEOUT_MS);
117
- await ensureLayout(session, ctx.id);
118
- return outputsFor(parsed);
119
- }
120
- finally {
121
- await session.dispose();
122
- }
123
- },
124
- delete: async (inputs, ctx) => {
125
- const session = await executor.connect(sshTarget(parseInputs(sshSchema, inputs, KIND)));
126
- try {
127
- await composeDown(session, KIND, ctx.id);
128
- }
129
- finally {
130
- await session.dispose();
131
- }
132
- },
133
- list: (sources, ctx) => listStampedContainers(executor, KIND, sources, ctx.log),
134
- });
64
+ probe: (_parsed, id) => execProbe(id, `${BIN} status`),
65
+ ready: (session, _parsed, id) => ensureLayout(session, id),
66
+ }, executor);
135
67
  //# sourceMappingURL=garage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"garage.js","sourceRoot":"","sources":["../../src/backings/garage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"garage.js","sourceRoot":"","sources":["../../src/backings/garage.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  import type { Provider } from "@intentic/engine";
2
- import { type SshExecutor } from "../core/ssh.js";
2
+ import type { SshExecutor } from "../core/ssh.js";
3
3
  export declare const createPostgresDatabaseProvider: (executor?: SshExecutor) => Provider;
4
4
  //# sourceMappingURL=postgres-database.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-database.d.ts","sourceRoot":"","sources":["../../src/backings/postgres-database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAKjE,OAAO,EAAmB,KAAK,WAAW,EAAe,MAAM,gBAAgB,CAAC;AAoChF,eAAO,MAAM,8BAA8B,cAAc,WAAW,KAAiB,QAkEnF,CAAC"}
1
+ {"version":3,"file":"postgres-database.d.ts","sourceRoot":"","sources":["../../src/backings/postgres-database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,gBAAgB,CAAC;AAqC9D,eAAO,MAAM,8BAA8B,cAAc,WAAW,KAAiB,QAwBhF,CAAC"}