@intentic/state-resolver 1.0.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.
- package/LICENSE +21 -0
- package/README.md +27 -0
- package/dist/emit/emit-github.d.ts +4 -0
- package/dist/emit/emit-github.d.ts.map +1 -0
- package/dist/emit/emit-github.js +92 -0
- package/dist/emit/emit-github.js.map +1 -0
- package/dist/emit/emit-gitlab.d.ts +4 -0
- package/dist/emit/emit-gitlab.d.ts.map +1 -0
- package/dist/emit/emit-gitlab.js +100 -0
- package/dist/emit/emit-gitlab.js.map +1 -0
- package/dist/emit/emit.d.ts +7 -0
- package/dist/emit/emit.d.ts.map +1 -0
- package/dist/emit/emit.js +222 -0
- package/dist/emit/emit.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/catalog.d.ts +13 -0
- package/dist/lib/catalog.d.ts.map +1 -0
- package/dist/lib/catalog.js +32 -0
- package/dist/lib/catalog.js.map +1 -0
- package/dist/lib/ids.d.ts +34 -0
- package/dist/lib/ids.d.ts.map +1 -0
- package/dist/lib/ids.js +43 -0
- package/dist/lib/ids.js.map +1 -0
- package/dist/lib/images.d.ts +28 -0
- package/dist/lib/images.d.ts.map +1 -0
- package/dist/lib/images.js +28 -0
- package/dist/lib/images.js.map +1 -0
- package/dist/lib/ssh.d.ts +3 -0
- package/dist/lib/ssh.d.ts.map +1 -0
- package/dist/lib/ssh.js +8 -0
- package/dist/lib/ssh.js.map +1 -0
- package/dist/lib/zone.d.ts +4 -0
- package/dist/lib/zone.d.ts.map +1 -0
- package/dist/lib/zone.js +33 -0
- package/dist/lib/zone.js.map +1 -0
- package/dist/resolvers/app-github.d.ts +9 -0
- package/dist/resolvers/app-github.d.ts.map +1 -0
- package/dist/resolvers/app-github.js +64 -0
- package/dist/resolvers/app-github.js.map +1 -0
- package/dist/resolvers/app-gitlab.d.ts +9 -0
- package/dist/resolvers/app-gitlab.d.ts.map +1 -0
- package/dist/resolvers/app-gitlab.js +76 -0
- package/dist/resolvers/app-gitlab.js.map +1 -0
- package/dist/resolvers/app.d.ts +13 -0
- package/dist/resolvers/app.d.ts.map +1 -0
- package/dist/resolvers/app.js +108 -0
- package/dist/resolvers/app.js.map +1 -0
- package/dist/resolvers/backing.d.ts +11 -0
- package/dist/resolvers/backing.d.ts.map +1 -0
- package/dist/resolvers/backing.js +142 -0
- package/dist/resolvers/backing.js.map +1 -0
- package/dist/resolvers/backup.d.ts +6 -0
- package/dist/resolvers/backup.d.ts.map +1 -0
- package/dist/resolvers/backup.js +26 -0
- package/dist/resolvers/backup.js.map +1 -0
- package/dist/resolvers/identity.d.ts +5 -0
- package/dist/resolvers/identity.d.ts.map +1 -0
- package/dist/resolvers/identity.js +112 -0
- package/dist/resolvers/identity.js.map +1 -0
- package/dist/resolvers/platform.d.ts +20 -0
- package/dist/resolvers/platform.d.ts.map +1 -0
- package/dist/resolvers/platform.js +77 -0
- package/dist/resolvers/platform.js.map +1 -0
- package/dist/resolvers/route.d.ts +12 -0
- package/dist/resolvers/route.d.ts.map +1 -0
- package/dist/resolvers/route.js +17 -0
- package/dist/resolvers/route.js.map +1 -0
- package/dist/resolvers/service.d.ts +13 -0
- package/dist/resolvers/service.d.ts.map +1 -0
- package/dist/resolvers/service.js +88 -0
- package/dist/resolvers/service.js.map +1 -0
- package/dist/resolvers/workspace.d.ts +14 -0
- package/dist/resolvers/workspace.d.ts.map +1 -0
- package/dist/resolvers/workspace.js +46 -0
- package/dist/resolvers/workspace.js.map +1 -0
- package/dist/state.d.ts +5 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +20 -0
- package/dist/state.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { generated, makeRef } from "@intentic/graph";
|
|
2
|
+
import { appSlug, backingPort, bindingId, bucketName, cacheUser, dbName, secretKey } from "../lib/ids.js";
|
|
3
|
+
import { IMAGES } from "../lib/images.js";
|
|
4
|
+
import { sshOf } from "../lib/ssh.js";
|
|
5
|
+
import { exposeRoute, routeId } from "./route.js";
|
|
6
|
+
const catalog = {
|
|
7
|
+
database: { type: "postgres", bindingType: "postgres-database", image: IMAGES.postgres, routes: false },
|
|
8
|
+
cache: { type: "valkey", bindingType: "valkey-namespace", image: IMAGES.valkey, routes: false },
|
|
9
|
+
auth: { type: "authentik", bindingType: "authentik-client", image: IMAGES.authentik, routes: true },
|
|
10
|
+
"object-storage": { type: "garage", bindingType: "garage-bucket", image: IMAGES.garage, routes: false },
|
|
11
|
+
};
|
|
12
|
+
const envContract = {
|
|
13
|
+
database: [["DATABASE_URL", "url"]],
|
|
14
|
+
cache: [
|
|
15
|
+
["VALKEY_URL", "url"],
|
|
16
|
+
["REDIS_URL", "url"],
|
|
17
|
+
],
|
|
18
|
+
auth: [
|
|
19
|
+
["OIDC_ISSUER", "issuer"],
|
|
20
|
+
["OIDC_CLIENT_ID", "clientId"],
|
|
21
|
+
["OIDC_CLIENT_SECRET", "clientSecret"],
|
|
22
|
+
],
|
|
23
|
+
"object-storage": [
|
|
24
|
+
["S3_ENDPOINT", "endpoint"],
|
|
25
|
+
["S3_ACCESS_KEY", "accessKey"],
|
|
26
|
+
["S3_SECRET_KEY", "secretKey"],
|
|
27
|
+
["S3_BUCKET", "bucket"],
|
|
28
|
+
],
|
|
29
|
+
};
|
|
30
|
+
const adminSecretKey = (capability, instanceId) => secretKey(capability === "database" ? "POSTGRES_ADMIN_PASSWORD" : "VALKEY_ADMIN_PASSWORD", instanceId);
|
|
31
|
+
const authBootstrapTokenKey = (instanceId) => secretKey("AUTHENTIK_BOOTSTRAP_TOKEN", instanceId);
|
|
32
|
+
const instanceExtra = (intent) => {
|
|
33
|
+
switch (intent.capability) {
|
|
34
|
+
case "database":
|
|
35
|
+
case "cache":
|
|
36
|
+
return { adminPassword: generated(adminSecretKey(intent.capability, intent.id)) };
|
|
37
|
+
case "auth":
|
|
38
|
+
return {
|
|
39
|
+
domain: intent.domain,
|
|
40
|
+
secretKey: generated(secretKey("AUTHENTIK_SECRET_KEY", intent.id)),
|
|
41
|
+
bootstrapToken: generated(authBootstrapTokenKey(intent.id)),
|
|
42
|
+
bootstrapPassword: generated(secretKey("AUTHENTIK_BOOTSTRAP_PASSWORD", intent.id)),
|
|
43
|
+
dbPassword: generated(secretKey("AUTHENTIK_DB_PASSWORD", intent.id)),
|
|
44
|
+
pgImage: IMAGES.postgres,
|
|
45
|
+
redisImage: IMAGES.valkey,
|
|
46
|
+
};
|
|
47
|
+
case "object-storage":
|
|
48
|
+
return {
|
|
49
|
+
region: "garage",
|
|
50
|
+
...(intent.domain !== undefined ? { domain: intent.domain } : {}),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
export const resolveBacking = (intent, host, apiToken) => {
|
|
55
|
+
const spec = catalog[intent.capability];
|
|
56
|
+
const node = {
|
|
57
|
+
id: intent.id,
|
|
58
|
+
type: spec.type,
|
|
59
|
+
inputs: {
|
|
60
|
+
server: makeRef(intent.on),
|
|
61
|
+
...sshOf(host),
|
|
62
|
+
internalIp: makeRef(intent.on, "internalIp"),
|
|
63
|
+
publishPort: backingPort(intent.id),
|
|
64
|
+
image: spec.image,
|
|
65
|
+
...instanceExtra(intent),
|
|
66
|
+
},
|
|
67
|
+
explicitDependsOn: [intent.on],
|
|
68
|
+
};
|
|
69
|
+
const nodes = [node];
|
|
70
|
+
const ingress = [];
|
|
71
|
+
if (spec.routes || intent.domain !== undefined) {
|
|
72
|
+
if (intent.domain === undefined || intent.expose === undefined) {
|
|
73
|
+
throw new Error(`backing "${intent.id}" (${intent.capability}) must be exposed with a domain; declare it with { expose, domain }`);
|
|
74
|
+
}
|
|
75
|
+
const exposure = exposeRoute(intent.expose, intent.on, intent.domain, backingPort(intent.id), apiToken);
|
|
76
|
+
nodes.push(exposure.route);
|
|
77
|
+
ingress.push(exposure.ingress);
|
|
78
|
+
}
|
|
79
|
+
return { nodes, ingress };
|
|
80
|
+
};
|
|
81
|
+
export const resolveBinding = (appId, intent, host, appDomains) => {
|
|
82
|
+
const spec = catalog[intent.capability];
|
|
83
|
+
const id = bindingId(appId, intent.id);
|
|
84
|
+
const shared = { ...sshOf(host), instance: intent.id };
|
|
85
|
+
const node = (inputs) => ({ id, type: spec.bindingType, inputs, explicitDependsOn: [intent.id] });
|
|
86
|
+
switch (intent.capability) {
|
|
87
|
+
case "database":
|
|
88
|
+
return node({
|
|
89
|
+
...shared,
|
|
90
|
+
instanceHost: makeRef(intent.id, "internalHost"),
|
|
91
|
+
instancePort: makeRef(intent.id, "port"),
|
|
92
|
+
database: dbName(appId),
|
|
93
|
+
role: dbName(appId),
|
|
94
|
+
password: generated(secretKey("APP_DATABASE_PASSWORD", id)),
|
|
95
|
+
});
|
|
96
|
+
case "cache":
|
|
97
|
+
return node({
|
|
98
|
+
...shared,
|
|
99
|
+
instanceHost: makeRef(intent.id, "internalHost"),
|
|
100
|
+
instancePort: makeRef(intent.id, "port"),
|
|
101
|
+
adminPassword: generated(adminSecretKey("cache", intent.id)),
|
|
102
|
+
username: cacheUser(appId),
|
|
103
|
+
password: generated(secretKey("APP_CACHE_PASSWORD", id)),
|
|
104
|
+
keyPrefix: cacheUser(appId),
|
|
105
|
+
});
|
|
106
|
+
case "auth": {
|
|
107
|
+
if (intent.domain === undefined || intent.expose === undefined) {
|
|
108
|
+
throw new Error(`auth backing "${intent.id}" must be exposed with a domain; declare it with i.want.auth({ expose, domain })`);
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
id,
|
|
112
|
+
type: spec.bindingType,
|
|
113
|
+
inputs: {
|
|
114
|
+
authentikUrl: `https://${intent.domain}`,
|
|
115
|
+
bootstrapToken: generated(authBootstrapTokenKey(intent.id)),
|
|
116
|
+
domain: intent.domain,
|
|
117
|
+
slug: appSlug(appId),
|
|
118
|
+
clientId: generated(secretKey("OIDC_CLIENT_ID", id)),
|
|
119
|
+
clientSecret: generated(secretKey("OIDC_CLIENT_SECRET", id)),
|
|
120
|
+
redirectDomains: appDomains,
|
|
121
|
+
},
|
|
122
|
+
explicitDependsOn: [intent.id, routeId(intent.expose, intent.domain)],
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
case "object-storage":
|
|
126
|
+
return node({
|
|
127
|
+
...shared,
|
|
128
|
+
endpoint: makeRef(intent.id, "internalEndpoint"),
|
|
129
|
+
bucket: bucketName(appId),
|
|
130
|
+
keyName: bucketName(appId),
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
export const bindingEnv = (appId, intent) => {
|
|
135
|
+
const id = bindingId(appId, intent.id);
|
|
136
|
+
const env = {};
|
|
137
|
+
for (const [name, output] of envContract[intent.capability]) {
|
|
138
|
+
env[name] = makeRef(id, output);
|
|
139
|
+
}
|
|
140
|
+
return env;
|
|
141
|
+
};
|
|
142
|
+
//# sourceMappingURL=backing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backing.js","sourceRoot":"","sources":["../../src/resolvers/backing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { BackupInput, HostInput } from "@intentic/need-resolver";
|
|
2
|
+
import type { ResolvedNode } from "@intentic/resources";
|
|
3
|
+
export declare const DEFAULT_BACKUP_REPO = "/repo";
|
|
4
|
+
export declare const defaultBackupInput: () => BackupInput;
|
|
5
|
+
export declare const resolveBackup: (hostId: string, host: HostInput, input: BackupInput, signozServiceId: string | undefined) => ResolvedNode;
|
|
6
|
+
//# sourceMappingURL=backup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/resolvers/backup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAUxD,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAC3C,eAAO,MAAM,kBAAkB,QAAO,WAAsF,CAAC;AAQ7H,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,EAAE,MAAM,SAAS,EAAE,OAAO,WAAW,EAAE,iBAAiB,MAAM,GAAG,SAAS,KAAG,YAkBxH,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { generated } from "@intentic/graph";
|
|
2
|
+
import { backupId, forgejoId, komodoId } from "../lib/ids.js";
|
|
3
|
+
import { IMAGES } from "../lib/images.js";
|
|
4
|
+
import { sshOf } from "../lib/ssh.js";
|
|
5
|
+
export const DEFAULT_BACKUP_REPO = "/repo";
|
|
6
|
+
export const defaultBackupInput = () => ({ repo: DEFAULT_BACKUP_REPO, password: generated("RESTIC_PASSWORD") });
|
|
7
|
+
export const resolveBackup = (hostId, host, input, signozServiceId) => {
|
|
8
|
+
const ssh = sshOf(host);
|
|
9
|
+
const signoz = input.signoz === true && signozServiceId !== undefined;
|
|
10
|
+
return {
|
|
11
|
+
id: backupId(hostId),
|
|
12
|
+
type: "backup",
|
|
13
|
+
inputs: {
|
|
14
|
+
...ssh,
|
|
15
|
+
repo: input.repo,
|
|
16
|
+
password: input.password,
|
|
17
|
+
signoz,
|
|
18
|
+
image: IMAGES.backup,
|
|
19
|
+
...(input.credentials !== undefined ? { credentials: input.credentials } : {}),
|
|
20
|
+
...(input.schedule !== undefined ? { schedule: input.schedule } : {}),
|
|
21
|
+
...(input.retention !== undefined ? { retention: input.retention } : {}),
|
|
22
|
+
},
|
|
23
|
+
explicitDependsOn: [forgejoId(hostId), komodoId(hostId), ...(signoz ? [signozServiceId] : [])],
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=backup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/resolvers/backup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAOtC,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAC3C,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAgB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,SAAS,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;AAQ7H,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,IAAe,EAAE,KAAkB,EAAE,eAAmC,EAAgB,EAAE;IACpI,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,eAAe,KAAK,SAAS,CAAC;IACtE,OAAO;QACH,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC;QACpB,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE;YACJ,GAAG,GAAG;YACN,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM;YACN,KAAK,EAAE,MAAM,CAAC,MAAM;YACpB,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9E,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3E;QACD,iBAAiB,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;KACjG,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { IntentSet } from "@intentic/need-resolver";
|
|
2
|
+
import type { ResolvedNode } from "@intentic/resources";
|
|
3
|
+
import type { PlatformRefs } from "./platform.js";
|
|
4
|
+
export declare const resolveIdentities: (intent: IntentSet, platform: PlatformRefs, hostId: string) => ResolvedNode[];
|
|
5
|
+
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/resolvers/identity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAe,SAAS,EAAc,MAAM,yBAAyB,CAAC;AAClF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAYxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AA4BlD,eAAO,MAAM,iBAAiB,GAAI,QAAQ,SAAS,EAAE,UAAU,YAAY,EAAE,QAAQ,MAAM,KAAG,YAAY,EAuHzG,CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { generated, makeRef } from "@intentic/graph";
|
|
2
|
+
import { adminUsername, deploymentId, forgejoOrgId, forgejoTeamId, forgejoUserId, komodoUserId, orgName, repoId, userPasswordKey, } from "../lib/ids.js";
|
|
3
|
+
const TEAM_NAME = "members";
|
|
4
|
+
const forgejoRoleRank = { read: 1, write: 2, admin: 3 };
|
|
5
|
+
const strongerForgejoRole = (a, b) => (forgejoRoleRank[a] >= forgejoRoleRank[b] ? a : b);
|
|
6
|
+
const komodoLevel = { read: "Read", execute: "Execute", admin: "Write" };
|
|
7
|
+
const komodoLevelRank = { Read: 1, Execute: 2, Write: 3 };
|
|
8
|
+
export const resolveIdentities = (intent, platform, hostId) => {
|
|
9
|
+
const forgejoUrl = makeRef(platform.forgejo, "url");
|
|
10
|
+
const komodoUrl = makeRef(platform.deploy, "url");
|
|
11
|
+
const forgejoAdmin = { adminUser: adminUsername, adminPassword: generated("FORGEJO_ADMIN_PASSWORD") };
|
|
12
|
+
const komodoAdmin = { adminUser: adminUsername, adminPassword: generated("KOMODO_ADMIN_PASSWORD") };
|
|
13
|
+
const userById = new Map(intent.users.map((user) => [user.id, user.input]));
|
|
14
|
+
const teamById = new Map(intent.teams.map((team) => [team.id, team.input]));
|
|
15
|
+
for (const team of intent.teams) {
|
|
16
|
+
for (const member of team.input.members) {
|
|
17
|
+
if (!userById.has(member)) {
|
|
18
|
+
throw new Error(`team "${team.id}" references unknown user "${member}"; declare it with i.want.user`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
for (const app of intent.apps) {
|
|
23
|
+
for (const grant of app.teams ?? []) {
|
|
24
|
+
if (!teamById.has(grant.team)) {
|
|
25
|
+
throw new Error(`app "${app.id}" grants unknown team "${grant.team}"; declare it with i.want.team`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const teamPermission = new Map();
|
|
30
|
+
const teamRepos = new Map();
|
|
31
|
+
const userGrants = new Map();
|
|
32
|
+
const teamMembers = (teamId) => teamById.get(teamId)?.members ?? [];
|
|
33
|
+
for (const app of intent.apps) {
|
|
34
|
+
const grants = app.teams ?? [];
|
|
35
|
+
const ownerGrant = grants[0];
|
|
36
|
+
if (ownerGrant === undefined) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const owner = orgName(ownerGrant.team);
|
|
40
|
+
const deployments = Object.keys(app.environments).map((environment) => deploymentId(app.id, environment));
|
|
41
|
+
for (const grant of grants) {
|
|
42
|
+
const current = teamPermission.get(grant.team);
|
|
43
|
+
teamPermission.set(grant.team, current === undefined ? grant.role : strongerForgejoRole(current, grant.role));
|
|
44
|
+
const repos = teamRepos.get(grant.team) ?? [];
|
|
45
|
+
repos.push({ owner, name: app.id });
|
|
46
|
+
teamRepos.set(grant.team, repos);
|
|
47
|
+
const level = komodoLevel[teamById.get(grant.team)?.komodo ?? "read"];
|
|
48
|
+
for (const member of teamMembers(grant.team)) {
|
|
49
|
+
const grantsForUser = userGrants.get(member) ?? new Map();
|
|
50
|
+
for (const deployment of deployments) {
|
|
51
|
+
const existing = grantsForUser.get(deployment);
|
|
52
|
+
if (existing === undefined || komodoLevelRank[level] > komodoLevelRank[existing]) {
|
|
53
|
+
grantsForUser.set(deployment, level);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
userGrants.set(member, grantsForUser);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const nodes = [];
|
|
61
|
+
for (const user of intent.users) {
|
|
62
|
+
const grants = [...(userGrants.get(user.id) ?? new Map()).entries()].map(([deployment, level]) => ({ deployment, level }));
|
|
63
|
+
nodes.push({
|
|
64
|
+
id: forgejoUserId(hostId, user.id),
|
|
65
|
+
type: "forgejo-user",
|
|
66
|
+
inputs: {
|
|
67
|
+
forgejoUrl,
|
|
68
|
+
...forgejoAdmin,
|
|
69
|
+
username: user.input.username,
|
|
70
|
+
email: user.input.email,
|
|
71
|
+
accountPassword: generated(userPasswordKey(user.id)),
|
|
72
|
+
},
|
|
73
|
+
explicitDependsOn: [platform.forgejo, platform.gitRoute],
|
|
74
|
+
});
|
|
75
|
+
nodes.push({
|
|
76
|
+
id: komodoUserId(hostId, user.id),
|
|
77
|
+
type: "komodo-user",
|
|
78
|
+
inputs: { komodoUrl, ...komodoAdmin, username: user.input.username, password: generated(userPasswordKey(user.id)), grants },
|
|
79
|
+
explicitDependsOn: [platform.deploy, platform.deployRoute, ...grants.map((grant) => grant.deployment)],
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
for (const team of intent.teams) {
|
|
83
|
+
const org = orgName(team.id);
|
|
84
|
+
const repos = teamRepos.get(team.id) ?? [];
|
|
85
|
+
nodes.push({
|
|
86
|
+
id: forgejoOrgId(hostId, team.id),
|
|
87
|
+
type: "forgejo-org",
|
|
88
|
+
inputs: { forgejoUrl, ...forgejoAdmin, org },
|
|
89
|
+
explicitDependsOn: [platform.forgejo, platform.gitRoute],
|
|
90
|
+
});
|
|
91
|
+
nodes.push({
|
|
92
|
+
id: forgejoTeamId(hostId, team.id),
|
|
93
|
+
type: "forgejo-team",
|
|
94
|
+
inputs: {
|
|
95
|
+
forgejoUrl,
|
|
96
|
+
...forgejoAdmin,
|
|
97
|
+
org,
|
|
98
|
+
name: TEAM_NAME,
|
|
99
|
+
permission: teamPermission.get(team.id) ?? "read",
|
|
100
|
+
members: team.input.members.map((member) => userById.get(member)?.username ?? member),
|
|
101
|
+
repos,
|
|
102
|
+
},
|
|
103
|
+
explicitDependsOn: [
|
|
104
|
+
forgejoOrgId(hostId, team.id),
|
|
105
|
+
...team.input.members.map((member) => forgejoUserId(hostId, member)),
|
|
106
|
+
...repos.map((repo) => repoId(repo.name)),
|
|
107
|
+
],
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
return nodes;
|
|
111
|
+
};
|
|
112
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/resolvers/identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { SecretRef } from "@intentic/graph";
|
|
2
|
+
import type { HostInput } from "@intentic/need-resolver";
|
|
3
|
+
import type { ResolvedNode } from "@intentic/resources";
|
|
4
|
+
import type { IngressPair } from "./route.js";
|
|
5
|
+
export interface PlatformRefs {
|
|
6
|
+
readonly forgejo: string;
|
|
7
|
+
readonly deploy: string;
|
|
8
|
+
readonly gitRoute: string;
|
|
9
|
+
readonly deployRoute: string;
|
|
10
|
+
}
|
|
11
|
+
export interface GuardConfig {
|
|
12
|
+
readonly repo: string;
|
|
13
|
+
readonly resticImage: string;
|
|
14
|
+
}
|
|
15
|
+
export declare const resolvePlatform: (hostId: string, cloudflareId: string, zone: string, apiToken: SecretRef, host: HostInput, guard: GuardConfig | undefined) => {
|
|
16
|
+
nodes: ResolvedNode[];
|
|
17
|
+
refs: PlatformRefs;
|
|
18
|
+
ingress: IngressPair[];
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=platform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/resolvers/platform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAGxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAChC;AAcD,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAChC;AAED,eAAO,MAAM,eAAe,GACxB,QAAQ,MAAM,EACd,cAAc,MAAM,EACpB,MAAM,MAAM,EACZ,UAAU,SAAS,EACnB,MAAM,SAAS,EACf,OAAO,WAAW,GAAG,SAAS,KAC/B;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,WAAW,EAAE,CAAA;CA+ErE,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { generated, httpOk, makeRef } from "@intentic/graph";
|
|
2
|
+
import { adminUsername, deployDomain, forgejoId, gitDomain, komodoId, registryAuthority, runnerId } from "../lib/ids.js";
|
|
3
|
+
import { IMAGES } from "../lib/images.js";
|
|
4
|
+
import { sshOf } from "../lib/ssh.js";
|
|
5
|
+
import { exposeRoute } from "./route.js";
|
|
6
|
+
const FORGEJO_PORT = 3000;
|
|
7
|
+
const KOMODO_PORT = 9120;
|
|
8
|
+
export const resolvePlatform = (hostId, cloudflareId, zone, apiToken, host, guard) => {
|
|
9
|
+
const guarded = guard !== undefined ? { guardRepo: guard.repo, resticImage: guard.resticImage } : {};
|
|
10
|
+
const forgejo = forgejoId(hostId);
|
|
11
|
+
const deploy = komodoId(hostId);
|
|
12
|
+
const server = makeRef(hostId);
|
|
13
|
+
const ssh = sshOf(host);
|
|
14
|
+
const internalIp = makeRef(hostId, "internalIp");
|
|
15
|
+
const git = exposeRoute(cloudflareId, hostId, gitDomain(zone), FORGEJO_PORT, apiToken);
|
|
16
|
+
const komodo = exposeRoute(cloudflareId, hostId, deployDomain(zone), KOMODO_PORT, apiToken);
|
|
17
|
+
const nodes = [
|
|
18
|
+
{
|
|
19
|
+
id: forgejo,
|
|
20
|
+
type: "forgejo",
|
|
21
|
+
inputs: {
|
|
22
|
+
server,
|
|
23
|
+
...ssh,
|
|
24
|
+
internalIp,
|
|
25
|
+
domain: gitDomain(zone),
|
|
26
|
+
adminUser: adminUsername,
|
|
27
|
+
adminPassword: generated("FORGEJO_ADMIN_PASSWORD"),
|
|
28
|
+
image: IMAGES.forgejo,
|
|
29
|
+
...guarded,
|
|
30
|
+
},
|
|
31
|
+
explicitDependsOn: [],
|
|
32
|
+
readyWhen: httpOk(makeRef(forgejo, "internalUrl"), { timeout: "120s" }),
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: runnerId(hostId),
|
|
36
|
+
type: "forgejo-runner",
|
|
37
|
+
inputs: {
|
|
38
|
+
server,
|
|
39
|
+
...ssh,
|
|
40
|
+
instanceUrl: makeRef(forgejo, "internalUrl"),
|
|
41
|
+
token: makeRef(forgejo, "runnerToken"),
|
|
42
|
+
image: IMAGES.forgejoRunner,
|
|
43
|
+
jobImage: IMAGES.forgejoRunnerJob,
|
|
44
|
+
},
|
|
45
|
+
explicitDependsOn: [],
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: deploy,
|
|
49
|
+
type: "komodo",
|
|
50
|
+
inputs: {
|
|
51
|
+
server,
|
|
52
|
+
...ssh,
|
|
53
|
+
internalIp,
|
|
54
|
+
domain: deployDomain(zone),
|
|
55
|
+
forgejoUrl: makeRef(forgejo, "internalUrl"),
|
|
56
|
+
runnerToken: makeRef(forgejo, "runnerToken"),
|
|
57
|
+
adminUser: adminUsername,
|
|
58
|
+
adminPassword: generated("KOMODO_ADMIN_PASSWORD"),
|
|
59
|
+
gitAccount: adminUsername,
|
|
60
|
+
gitToken: makeRef(forgejo, "gitToken"),
|
|
61
|
+
registry: registryAuthority(zone),
|
|
62
|
+
packagesToken: makeRef(forgejo, "packagesToken"),
|
|
63
|
+
coreImage: IMAGES.komodoCore,
|
|
64
|
+
peripheryImage: IMAGES.komodoPeriphery,
|
|
65
|
+
ferretdbImage: IMAGES.ferretdb,
|
|
66
|
+
postgresImage: IMAGES.postgresDocumentdb,
|
|
67
|
+
...guarded,
|
|
68
|
+
},
|
|
69
|
+
explicitDependsOn: [],
|
|
70
|
+
readyWhen: httpOk(makeRef(deploy, "internalUrl"), { timeout: "90s" }),
|
|
71
|
+
},
|
|
72
|
+
git.route,
|
|
73
|
+
komodo.route,
|
|
74
|
+
];
|
|
75
|
+
return { nodes, refs: { forgejo, deploy, gitRoute: git.route.id, deployRoute: komodo.route.id }, ingress: [git.ingress, komodo.ingress] };
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/resolvers/platform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SecretRef } from "@intentic/graph";
|
|
2
|
+
import type { ResolvedNode } from "@intentic/resources";
|
|
3
|
+
export declare const routeId: (cloudflareId: string, hostname: string) => string;
|
|
4
|
+
export interface IngressPair {
|
|
5
|
+
readonly hostname: string;
|
|
6
|
+
readonly port: number;
|
|
7
|
+
}
|
|
8
|
+
export declare const exposeRoute: (cloudflareId: string, hostId: string, hostname: string, port: number, apiToken: SecretRef) => {
|
|
9
|
+
route: ResolvedNode;
|
|
10
|
+
ingress: IngressPair;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=route.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../src/resolvers/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAUxD,eAAO,MAAM,OAAO,GAAI,cAAc,MAAM,EAAE,UAAU,MAAM,KAAG,MAA6C,CAAC;AAK/G,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB;AAKD,eAAO,MAAM,WAAW,GACpB,cAAc,MAAM,EACpB,QAAQ,MAAM,EACd,UAAU,MAAM,EAChB,MAAM,MAAM,EACZ,UAAU,SAAS,KACpB;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAQ5C,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { makeRef } from "@intentic/graph";
|
|
2
|
+
import { tunnelId } from "../lib/ids.js";
|
|
3
|
+
const slug = (hostname) => hostname
|
|
4
|
+
.toLowerCase()
|
|
5
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
6
|
+
.replace(/^-+|-+$/g, "");
|
|
7
|
+
export const routeId = (cloudflareId, hostname) => `${cloudflareId}-${slug(hostname)}`;
|
|
8
|
+
export const exposeRoute = (cloudflareId, hostId, hostname, port, apiToken) => ({
|
|
9
|
+
route: {
|
|
10
|
+
id: routeId(cloudflareId, hostname),
|
|
11
|
+
type: "cf-route",
|
|
12
|
+
inputs: { hostname, zoneId: makeRef(cloudflareId, "zoneId"), apiToken, cname: makeRef(tunnelId(hostId), "cname") },
|
|
13
|
+
explicitDependsOn: [cloudflareId, tunnelId(hostId)],
|
|
14
|
+
},
|
|
15
|
+
ingress: { hostname, port },
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../src/resolvers/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,IAAI,GAAG,CAAC,QAAgB,EAAU,EAAE,CACtC,QAAQ;KACH,WAAW,EAAE;KACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;KAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAGjC,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,YAAoB,EAAE,QAAgB,EAAU,EAAE,CAAC,GAAG,YAAY,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;AAa/G,MAAM,CAAC,MAAM,WAAW,GAAG,CACvB,YAAoB,EACpB,MAAc,EACd,QAAgB,EAChB,IAAY,EACZ,QAAmB,EAC0B,EAAE,CAAC,CAAC;IACjD,KAAK,EAAE;QACH,EAAE,EAAE,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC;QACnC,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE;QAClH,iBAAiB,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;KACtD;IACD,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;CAC9B,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SecretRef } from "@intentic/graph";
|
|
2
|
+
import type { HostInput, ServiceIntent, ServiceKind } from "@intentic/need-resolver";
|
|
3
|
+
import type { ResolvedNode } from "@intentic/resources";
|
|
4
|
+
import type { IngressPair } from "./route.js";
|
|
5
|
+
export declare const serviceMcp: (kind: ServiceKind) => {
|
|
6
|
+
readonly path: string;
|
|
7
|
+
readonly tokenSecret: string;
|
|
8
|
+
} | undefined;
|
|
9
|
+
export declare const resolveService: (intent: ServiceIntent, host: HostInput, zone: string, apiToken: SecretRef) => {
|
|
10
|
+
nodes: ResolvedNode[];
|
|
11
|
+
ingress: IngressPair[];
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/resolvers/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,qBAAqB,CAAC;AAGtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAgF9C,eAAO,MAAM,UAAU,GAAI,MAAM,WAAW,KAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,SAA8B,CAAC;AAUxI,eAAO,MAAM,cAAc,GACvB,QAAQ,aAAa,EACrB,MAAM,SAAS,EACf,MAAM,MAAM,EACZ,UAAU,SAAS,KACpB;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,OAAO,EAAE,WAAW,EAAE,CAAA;CAuCjD,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { generated, httpOk, makeRef } from "@intentic/graph";
|
|
2
|
+
import { IMAGES } from "../lib/images.js";
|
|
3
|
+
import { sshOf } from "../lib/ssh.js";
|
|
4
|
+
import { exposeRoute } from "./route.js";
|
|
5
|
+
const catalog = {
|
|
6
|
+
signoz: {
|
|
7
|
+
type: "signoz",
|
|
8
|
+
port: 8080,
|
|
9
|
+
images: {
|
|
10
|
+
clickhouseImage: IMAGES.clickhouse,
|
|
11
|
+
signozImage: IMAGES.signoz,
|
|
12
|
+
otelImage: IMAGES.signozOtelCollector,
|
|
13
|
+
zookeeperImage: IMAGES.signozZookeeper,
|
|
14
|
+
},
|
|
15
|
+
mcp: { path: "/mcp", tokenSecret: "SIGNOZ_MCP_TOKEN" },
|
|
16
|
+
},
|
|
17
|
+
outline: {
|
|
18
|
+
type: "outline",
|
|
19
|
+
port: 3210,
|
|
20
|
+
authPort: 5556,
|
|
21
|
+
images: {
|
|
22
|
+
outlineImage: IMAGES.outline,
|
|
23
|
+
postgresImage: IMAGES.postgres,
|
|
24
|
+
valkeyImage: IMAGES.valkey,
|
|
25
|
+
dexImage: IMAGES.dex,
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
paperless: {
|
|
29
|
+
type: "paperless",
|
|
30
|
+
port: 8000,
|
|
31
|
+
images: { paperlessImage: IMAGES.paperless, valkeyImage: IMAGES.valkey },
|
|
32
|
+
},
|
|
33
|
+
openproject: {
|
|
34
|
+
type: "openproject",
|
|
35
|
+
port: 8082,
|
|
36
|
+
adminLogin: "admin",
|
|
37
|
+
readyTimeout: "600s",
|
|
38
|
+
images: { openprojectImage: IMAGES.openproject },
|
|
39
|
+
},
|
|
40
|
+
invoiceninja: {
|
|
41
|
+
type: "invoiceninja",
|
|
42
|
+
port: 8083,
|
|
43
|
+
readyTimeout: "600s",
|
|
44
|
+
images: { invoiceninjaImage: IMAGES.invoiceninja, mariadbImage: IMAGES.mariadb, valkeyImage: IMAGES.valkey },
|
|
45
|
+
},
|
|
46
|
+
infisical: {
|
|
47
|
+
type: "infisical",
|
|
48
|
+
port: 8084,
|
|
49
|
+
images: { infisicalImage: IMAGES.infisical, postgresImage: IMAGES.postgres, valkeyImage: IMAGES.valkey },
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
export const serviceMcp = (kind) => catalog[kind].mcp;
|
|
53
|
+
const serviceAdminEmail = (zone) => `intentic@${zone}`;
|
|
54
|
+
export const resolveService = (intent, host, zone, apiToken) => {
|
|
55
|
+
const spec = catalog[intent.kind];
|
|
56
|
+
const ssh = sshOf(host);
|
|
57
|
+
const exposure = exposeRoute(intent.expose, intent.on, intent.domain, spec.port, apiToken);
|
|
58
|
+
const authDomain = spec.authPort === undefined
|
|
59
|
+
? undefined
|
|
60
|
+
: intent.domain === zone
|
|
61
|
+
? `auth.${zone}`
|
|
62
|
+
: `${intent.domain.slice(0, -(zone.length + 1))}-auth.${zone}`;
|
|
63
|
+
const authExposure = spec.authPort === undefined || authDomain === undefined
|
|
64
|
+
? undefined
|
|
65
|
+
: exposeRoute(intent.expose, intent.on, authDomain, spec.authPort, apiToken);
|
|
66
|
+
const nodes = [
|
|
67
|
+
{
|
|
68
|
+
id: intent.id,
|
|
69
|
+
type: spec.type,
|
|
70
|
+
inputs: {
|
|
71
|
+
server: makeRef(intent.on),
|
|
72
|
+
...ssh,
|
|
73
|
+
internalIp: makeRef(intent.on, "internalIp"),
|
|
74
|
+
domain: intent.domain,
|
|
75
|
+
...(authDomain === undefined ? {} : { authDomain }),
|
|
76
|
+
adminUser: spec.adminLogin ?? serviceAdminEmail(zone),
|
|
77
|
+
adminPassword: generated(`${intent.kind.toUpperCase()}_ADMIN_PASSWORD`),
|
|
78
|
+
...spec.images,
|
|
79
|
+
},
|
|
80
|
+
explicitDependsOn: [],
|
|
81
|
+
readyWhen: httpOk(makeRef(intent.id, "internalUrl"), { timeout: spec.readyTimeout ?? "180s" }),
|
|
82
|
+
},
|
|
83
|
+
exposure.route,
|
|
84
|
+
...(authExposure === undefined ? [] : [authExposure.route]),
|
|
85
|
+
];
|
|
86
|
+
return { nodes, ingress: [exposure.ingress, ...(authExposure === undefined ? [] : [authExposure.ingress])] };
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/resolvers/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SecretRef } from "@intentic/graph";
|
|
2
|
+
import type { HostInput, ServiceKind, WorkspaceIntent } from "@intentic/need-resolver";
|
|
3
|
+
import type { ResolvedNode } from "@intentic/resources";
|
|
4
|
+
import type { IngressPair } from "./route.js";
|
|
5
|
+
export interface WorkspaceTool {
|
|
6
|
+
readonly id: string;
|
|
7
|
+
readonly kind: ServiceKind;
|
|
8
|
+
readonly domain: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const resolveWorkspace: (intent: WorkspaceIntent, host: HostInput, zone: string, apiToken: SecretRef, tools: readonly WorkspaceTool[]) => {
|
|
11
|
+
nodes: ResolvedNode[];
|
|
12
|
+
ingress: IngressPair[];
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/resolvers/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAM9C,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CAC3B;AAgBD,eAAO,MAAM,gBAAgB,GACzB,QAAQ,eAAe,EACvB,MAAM,SAAS,EACf,MAAM,MAAM,EACZ,UAAU,SAAS,EACnB,OAAO,SAAS,aAAa,EAAE,KAChC;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,OAAO,EAAE,WAAW,EAAE,CAAA;CA4CjD,CAAC"}
|