alasio 4.2.0 → 5.0.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/dist/cli/src/branches.js +295 -0
- package/dist/cli/src/branches.js.map +1 -0
- package/dist/cli/src/commands/branch.js +112 -0
- package/dist/cli/src/commands/branch.js.map +1 -0
- package/dist/cli/src/commands/common.js +27 -8
- package/dist/cli/src/commands/common.js.map +1 -1
- package/dist/cli/src/commands/grafana.js +72 -0
- package/dist/cli/src/commands/grafana.js.map +1 -0
- package/dist/cli/src/commands/init.js +6 -5
- package/dist/cli/src/commands/init.js.map +1 -1
- package/dist/cli/src/commands/lake.js +18 -4
- package/dist/cli/src/commands/lake.js.map +1 -1
- package/dist/cli/src/commands/login.js +12 -7
- package/dist/cli/src/commands/login.js.map +1 -1
- package/dist/cli/src/commands/logs.js +12 -6
- package/dist/cli/src/commands/logs.js.map +1 -1
- package/dist/cli/src/commands/uninstall.js +16 -1
- package/dist/cli/src/commands/uninstall.js.map +1 -1
- package/dist/cli/src/commands.js +3 -1
- package/dist/cli/src/commands.js.map +1 -1
- package/dist/cli/src/kube/api.js +35 -2
- package/dist/cli/src/kube/api.js.map +1 -1
- package/dist/cli/src/kube/apply.js +21 -8
- package/dist/cli/src/kube/apply.js.map +1 -1
- package/dist/cli/src/manifests/alasio.js +143 -74
- package/dist/cli/src/manifests/alasio.js.map +1 -1
- package/dist/cli/src/manifests/branch.js +45 -0
- package/dist/cli/src/manifests/branch.js.map +1 -0
- package/dist/cli/src/manifests/collector.js +199 -0
- package/dist/cli/src/manifests/collector.js.map +1 -0
- package/dist/cli/src/manifests/common.js +44 -11
- package/dist/cli/src/manifests/common.js.map +1 -1
- package/dist/cli/src/manifests/config.js +33 -19
- package/dist/cli/src/manifests/config.js.map +1 -1
- package/dist/cli/src/manifests/grafana.js +81 -0
- package/dist/cli/src/manifests/grafana.js.map +1 -0
- package/dist/cli/src/manifests/index.js +6 -1
- package/dist/cli/src/manifests/index.js.map +1 -1
- package/dist/cli/src/manifests/juicefs-csi.js +11 -5
- package/dist/cli/src/manifests/juicefs-csi.js.map +1 -1
- package/dist/cli/src/manifests/lake.js +66 -18
- package/dist/cli/src/manifests/lake.js.map +1 -1
- package/dist/cli/src/manifests/neon.js +24 -154
- package/dist/cli/src/manifests/neon.js.map +1 -1
- package/dist/cli/src/manifests/network-policies.js +141 -38
- package/dist/cli/src/manifests/network-policies.js.map +1 -1
- package/dist/cli/src/manifests/workspace-storage.js +98 -29
- package/dist/cli/src/manifests/workspace-storage.js.map +1 -1
- package/dist/cli/src/release.js +6 -5
- package/dist/cli/src/release.js.map +1 -1
- package/dist/neon/control/branches.js +292 -0
- package/dist/neon/control/branches.js.map +1 -0
- package/dist/neon/control/jwt.js +58 -0
- package/dist/neon/control/jwt.js.map +1 -0
- package/dist/neon/control/scram.js +15 -0
- package/dist/neon/control/scram.js.map +1 -0
- package/dist/neon/control/secrets.js +111 -0
- package/dist/neon/control/secrets.js.map +1 -0
- package/dist/src/branch/names.js +18 -0
- package/dist/src/branch/names.js.map +1 -0
- package/dist/src/kube/config.js +14 -1
- package/dist/src/kube/config.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network-policies.js","sourceRoot":"","sources":["../../../../src/manifests/network-policies.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"network-policies.js","sourceRoot":"","sources":["../../../../src/manifests/network-policies.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,10 +9,17 @@ export const WORKSPACES_CREDENTIALS = componentName("workspaces-juicefs");
|
|
|
9
9
|
* quota check's and a restore's, which its store policies admit (./network-policies.ts).
|
|
10
10
|
*/
|
|
11
11
|
export const JUICEFS_ADMIN = { "alasio.dev/workload": "juicefs-admin" };
|
|
12
|
-
/** The quota check runs daily, after the database's backup. */
|
|
12
|
+
/** The quota check runs daily, after the database's backup, and the collection after it. */
|
|
13
13
|
const QUOTA_CHECK_SCHEDULE = "47 3 * * *";
|
|
14
|
-
|
|
14
|
+
const COLLECTION_SCHEDULE = "17 4 * * *";
|
|
15
|
+
/** Whom the quota check and the collection run as: nobody, as they write nothing of their own. */
|
|
15
16
|
const NOBODY = 65534;
|
|
17
|
+
/**
|
|
18
|
+
* The directory of the file system a claim of the class is, `<namespace>-<claim>`: of
|
|
19
|
+
* the driver's template's variables in the StorageClass's pathPattern, of the shell's in
|
|
20
|
+
* the clone's script.
|
|
21
|
+
*/
|
|
22
|
+
const volumeDirectory = (namespace, claim) => `${namespace}-${claim}`;
|
|
16
23
|
/** Valkey's address, as the driver's pods reach it from their own namespace. */
|
|
17
24
|
export const VALKEY_ADDRESS = `${VALKEY}.${NAMESPACE}.svc.cluster.local:${VALKEY_PORT}`;
|
|
18
25
|
/** The workspaces bucket's URL, path-style, as the driver's pods reach it from their own namespace. */
|
|
@@ -35,7 +42,7 @@ function storageClass({ workspaceStorage }) {
|
|
|
35
42
|
"csi.storage.k8s.io/node-publish-secret-namespace": secret.namespace,
|
|
36
43
|
"csi.storage.k8s.io/controller-expand-secret-name": secret.name,
|
|
37
44
|
"csi.storage.k8s.io/controller-expand-secret-namespace": secret.namespace,
|
|
38
|
-
pathPattern: "${.pvc.namespace}
|
|
45
|
+
pathPattern: volumeDirectory("${.pvc.namespace}", "${.pvc.name}"),
|
|
39
46
|
},
|
|
40
47
|
reclaimPolicy: "Delete",
|
|
41
48
|
allowVolumeExpansion: true,
|
|
@@ -43,20 +50,30 @@ function storageClass({ workspaceStorage }) {
|
|
|
43
50
|
};
|
|
44
51
|
}
|
|
45
52
|
/**
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
* write, after which a volume's quota counts wrongly. Each volume, as `juicefs quota
|
|
49
|
-
* list` tables it, is checked in turn. Kept, as the driver's objects are, while the
|
|
50
|
-
* volumes remain.
|
|
53
|
+
* A container of a JuiceFS admin pod, `name`, running `lines` with JuiceFS's command line
|
|
54
|
+
* of the pinned client, the file system's metadata engine's URL in `META_URL`.
|
|
51
55
|
*/
|
|
52
|
-
function
|
|
53
|
-
|
|
56
|
+
function adminContainer(config, name, ...lines) {
|
|
57
|
+
return {
|
|
58
|
+
name,
|
|
59
|
+
image: imageReference(config.workspaceStorage.csi.mountImage),
|
|
60
|
+
imagePullPolicy: "IfNotPresent",
|
|
61
|
+
command: ["/bin/sh", "-c", script("set -eu", ...lines)],
|
|
62
|
+
env: [{ name: "META_URL", valueFrom: { secretKeyRef: { name: WORKSPACES_CREDENTIALS, key: "metaurl" } } }],
|
|
63
|
+
resources: { requests: { cpu: "50m", memory: "64Mi" }, limits: { memory: "512Mi" } },
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* A daily JuiceFS admin task, `component`, whose container `name` runs `lines` restricted
|
|
68
|
+
* as nobody. Kept, as the driver's objects are, while the volumes remain.
|
|
69
|
+
*/
|
|
70
|
+
function dailyAdminTask(config, component, schedule, name, ...lines) {
|
|
54
71
|
return {
|
|
55
72
|
apiVersion: "batch/v1",
|
|
56
73
|
kind: "CronJob",
|
|
57
74
|
metadata: { name: componentName(component), namespace: NAMESPACE, labels: { ...labels(component), ...VOLUME_DRIVER } },
|
|
58
75
|
spec: {
|
|
59
|
-
schedule
|
|
76
|
+
schedule,
|
|
60
77
|
concurrencyPolicy: "Forbid",
|
|
61
78
|
successfulJobsHistoryLimit: 1,
|
|
62
79
|
failedJobsHistoryLimit: 3,
|
|
@@ -70,22 +87,7 @@ function quotaCheck(config) {
|
|
|
70
87
|
restartPolicy: "Never",
|
|
71
88
|
...imagePullSecrets(config),
|
|
72
89
|
securityContext: restrictedPod(NOBODY, NOBODY),
|
|
73
|
-
containers: [{
|
|
74
|
-
name: "quota-check",
|
|
75
|
-
image: imageReference(config.workspaceStorage.csi.mountImage),
|
|
76
|
-
imagePullPolicy: "IfNotPresent",
|
|
77
|
-
command: [
|
|
78
|
-
"/bin/sh",
|
|
79
|
-
"-c",
|
|
80
|
-
script("set -eu", 'quotas=$(juicefs quota list "$META_URL")',
|
|
81
|
-
// The table's rows of volumes, the directories at the file system's top
|
|
82
|
-
// (not those deleted into its trash), whose first column is their path.
|
|
83
|
-
"printf '%s\\n' \"$quotas\" | awk -F '|' '$2 ~ /^ \\/[^\\/ ]+ +$/ { gsub(/ /, \"\", $2); print $2 }' | while read -r path; do", ' juicefs quota check "$META_URL" --path "$path" --repair', "done"),
|
|
84
|
-
],
|
|
85
|
-
env: [{ name: "META_URL", valueFrom: { secretKeyRef: { name: WORKSPACES_CREDENTIALS, key: "metaurl" } } }],
|
|
86
|
-
securityContext: restrictedContainer(),
|
|
87
|
-
resources: { requests: { cpu: "50m", memory: "64Mi" }, limits: { memory: "512Mi" } },
|
|
88
|
-
}],
|
|
90
|
+
containers: [{ ...adminContainer(config, name, ...lines), securityContext: restrictedContainer() }],
|
|
89
91
|
},
|
|
90
92
|
},
|
|
91
93
|
},
|
|
@@ -93,6 +95,73 @@ function quotaCheck(config) {
|
|
|
93
95
|
},
|
|
94
96
|
};
|
|
95
97
|
}
|
|
98
|
+
/**
|
|
99
|
+
* The volumes' usage checked daily against what they hold, and repaired (guide/quota.md
|
|
100
|
+
* "Usage check and fix"): a client that ends unexpectedly loses the usage it had yet to
|
|
101
|
+
* write, after which a volume's quota counts wrongly. Each volume, as `juicefs quota
|
|
102
|
+
* list` tables it, is checked in turn.
|
|
103
|
+
*/
|
|
104
|
+
function quotaCheck(config) {
|
|
105
|
+
return dailyAdminTask(config, "juicefs-quota-check", QUOTA_CHECK_SCHEDULE, "quota-check", 'quotas=$(juicefs quota list "$META_URL")',
|
|
106
|
+
// The table's rows of volumes, the directories at the file system's top (not those
|
|
107
|
+
// deleted into its trash), whose first column is their path.
|
|
108
|
+
"printf '%s\\n' \"$quotas\" | awk -F '|' '$2 ~ /^ \\/[^\\/ ]+ +$/ { gsub(/ /, \"\", $2); print $2 }' | while read -r path; do", ' juicefs quota check "$META_URL" --path "$path" --repair', "done");
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The file system collected daily (`juicefs gc --delete`, guide/gc.md): what no file
|
|
112
|
+
* holds deleted from the bucket, and the trees of clones that never finished removed, a
|
|
113
|
+
* day after they were begun. A clone builds its tree detached and attaches it only once
|
|
114
|
+
* it is whole, and its client removes it when the clone fails; nothing but this removes
|
|
115
|
+
* one whose client ended first.
|
|
116
|
+
*/
|
|
117
|
+
function collection(config) {
|
|
118
|
+
return dailyAdminTask(config, "juicefs-gc", COLLECTION_SCHEDULE, "gc", 'juicefs gc "$META_URL" --delete');
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* The Job that clones the session volume `$SOURCE_CLAIM` of `$SOURCE_NAMESPACE` into
|
|
122
|
+
* the newly made `$DESTINATION_CLAIM` of `$DESTINATION_NAMESPACE`, which alasio runs
|
|
123
|
+
* as it forks a session (src/sandbox/index.ts), giving it those. The workspace and home,
|
|
124
|
+
* `juicefs clone --preserve`d, keep their owners and modes, and their data, shared until
|
|
125
|
+
* either copy changes it, is copied by none. They are cloned under the destination's
|
|
126
|
+
* directory, which the driver makes and gives the claim's quota as it provisions the
|
|
127
|
+
* volume, after the claim is bound: the Job waits for the quota, which the clones are
|
|
128
|
+
* then charged to. The driver counts the new quota's usage in a scan of its own, though,
|
|
129
|
+
* which may end once a clone is in the directory, counting it a second time; so once the
|
|
130
|
+
* clones are done, and the client that charged them has stopped and written what it
|
|
131
|
+
* counted, the usage is counted anew (`juicefs quota check --repair`). The directory is
|
|
132
|
+
* given its source's owner and mode, as kubelet gives a volume whose root is not yet the
|
|
133
|
+
* pod's group that group throughout (fsGroupChangePolicy OnRootMismatch), which would
|
|
134
|
+
* widen every cloned file's mode. On a mount of the whole file system, as a volume's
|
|
135
|
+
* mount pod mounts its directory alone: privileged, as FUSE needs, and as root, to give
|
|
136
|
+
* each file its owner.
|
|
137
|
+
*/
|
|
138
|
+
export function cloneJob(config) {
|
|
139
|
+
const component = "workspace-clone";
|
|
140
|
+
const source = `/jfs/${volumeDirectory("$SOURCE_NAMESPACE", "$SOURCE_CLAIM")}`;
|
|
141
|
+
const destination = volumeDirectory("$DESTINATION_NAMESPACE", "$DESTINATION_CLAIM");
|
|
142
|
+
return {
|
|
143
|
+
apiVersion: "batch/v1",
|
|
144
|
+
kind: "Job",
|
|
145
|
+
metadata: { generateName: `${componentName(component)}-`, namespace: NAMESPACE, labels: labels(component) },
|
|
146
|
+
spec: {
|
|
147
|
+
// A clone that fails leaves half a destination, which alasio deletes with the fork.
|
|
148
|
+
backoffLimit: 0,
|
|
149
|
+
activeDeadlineSeconds: 3600,
|
|
150
|
+
ttlSecondsAfterFinished: 3600,
|
|
151
|
+
template: {
|
|
152
|
+
metadata: { labels: { ...labels(component), ...JUICEFS_ADMIN } },
|
|
153
|
+
spec: {
|
|
154
|
+
restartPolicy: "Never",
|
|
155
|
+
...imagePullSecrets(config),
|
|
156
|
+
containers: [{
|
|
157
|
+
...adminContainer(config, "clone", `until [ -n "$(juicefs quota get "$META_URL" --path "/${destination}" 2>/dev/null)" ]; do sleep 2; done`, "mkdir -p /jfs", 'juicefs mount --no-bgjob --cache-size 0 "$META_URL" /jfs &', "client=$!", 'until [ "$(stat --file-system --format=%T /jfs)" = fuseblk ]; do kill -0 "$client"; sleep 1; done', "for dir in workspace home; do", ` juicefs clone --preserve "${source}/$dir" "/jfs/${destination}/$dir"`, "done", `chown "$(stat --format=%u:%g "${source}")" "/jfs/${destination}"`, `chmod "$(stat --format=%a "${source}")" "/jfs/${destination}"`, "umount /jfs", 'wait "$client"', `juicefs quota check "$META_URL" --path "/${destination}" --repair`),
|
|
158
|
+
securityContext: { privileged: true },
|
|
159
|
+
}],
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
96
165
|
/**
|
|
97
166
|
* Formats the file system, unless it is formatted already, beside Valkey's server, whose
|
|
98
167
|
* pod is ready only once it is: JuiceFS's driver sets a new volume's quota before the
|
|
@@ -125,10 +194,10 @@ function formatter(config) {
|
|
|
125
194
|
resources: { requests: { cpu: "10m", memory: "32Mi" }, limits: { memory: "256Mi" } },
|
|
126
195
|
};
|
|
127
196
|
}
|
|
128
|
-
/** Workspace storage's objects, when it is on: Valkey, the CSI driver, the StorageClass,
|
|
197
|
+
/** Workspace storage's objects, when it is on: Valkey, the CSI driver, the StorageClass, the quota check and the collection. */
|
|
129
198
|
export function workspaceStorageObjects(config) {
|
|
130
199
|
if (!config.workspaceStorage.enabled)
|
|
131
200
|
return [];
|
|
132
|
-
return [...valkeyObjects(config, [formatter(config)]), ...juicefsCsiObjects(config), storageClass(config), quotaCheck(config)];
|
|
201
|
+
return [...valkeyObjects(config, [formatter(config)]), ...juicefsCsiObjects(config), storageClass(config), quotaCheck(config), collection(config)];
|
|
133
202
|
}
|
|
134
203
|
//# sourceMappingURL=workspace-storage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-storage.js","sourceRoot":"","sources":["../../../../src/manifests/workspace-storage.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAe,MAAM,EAAE,SAAS,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1I,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAElF,mDAAmD;AACnD,MAAM,CAAC,MAAM,sBAAsB,GAAG,aAAa,CAAC,oBAAoB,CAAC,CAAC;AAE1E;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAW,EAAE,qBAAqB,EAAE,eAAe,EAAE,CAAC;AAEhF
|
|
1
|
+
{"version":3,"file":"workspace-storage.js","sourceRoot":"","sources":["../../../../src/manifests/workspace-storage.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/src/release.js
CHANGED
|
@@ -3,13 +3,14 @@
|
|
|
3
3
|
* version and the digests of the images it published here, with tooling/pin-release.ts,
|
|
4
4
|
* before it builds the package; this module holds nothing else.
|
|
5
5
|
*/
|
|
6
|
-
export const VERSION = "
|
|
6
|
+
export const VERSION = "5.0.0";
|
|
7
7
|
/** alasio's own images, tagged with the version and pinned by digest once released. */
|
|
8
8
|
export const IMAGES = {
|
|
9
|
-
alasio: { repository: "ghcr.io/eaucoin/alasio", tag: VERSION, digest: "sha256:
|
|
10
|
-
agent: { repository: "ghcr.io/eaucoin/alasio-agent", tag: VERSION, digest: "sha256:
|
|
11
|
-
lake: { repository: "ghcr.io/eaucoin/alasio-lake", tag: VERSION, digest: "sha256:
|
|
9
|
+
alasio: { repository: "ghcr.io/eaucoin/alasio", tag: VERSION, digest: "sha256:3e9e3ace6f20b94c242126a7ab57b7e210d6292829eb0f3b64f3f4ebafd9b98c" },
|
|
10
|
+
agent: { repository: "ghcr.io/eaucoin/alasio-agent", tag: VERSION, digest: "sha256:0a6671c6899b3df079fe0a0646019485a4205af3a0847c95e2def818c63e0261" },
|
|
11
|
+
lake: { repository: "ghcr.io/eaucoin/alasio-lake", tag: VERSION, digest: "sha256:265421f037f2677f955a4a6852872bee4aeb3a258132ef7bf05ab6e3b2ccf277" },
|
|
12
|
+
grafana: { repository: "ghcr.io/eaucoin/alasio-grafana", tag: VERSION, digest: "sha256:885de54829d3b96e5202384ab55b21c39d358dd44aea88eb51cb15d1942b1ad8" },
|
|
12
13
|
};
|
|
13
14
|
/** The node image of the cluster in Docker: k3s with gVisor (cluster/node), pinned like the others. */
|
|
14
|
-
export const NODE_IMAGE = { repository: "ghcr.io/eaucoin/alasio-node", tag: VERSION, digest: "sha256:
|
|
15
|
+
export const NODE_IMAGE = { repository: "ghcr.io/eaucoin/alasio-node", tag: VERSION, digest: "sha256:5f11e256cdbc506f12c371de2b1a57651f9532d9b3e15f2faca477f6b3baa376" };
|
|
15
16
|
//# sourceMappingURL=release.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release.js","sourceRoot":"","sources":["../../../src/release.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,uFAAuF;AACvF,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,MAAM,EAAE,EAAE,UAAU,EAAE,wBAAwB,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,yEAAyE,EAAE;IACjJ,KAAK,EAAE,EAAE,UAAU,EAAE,8BAA8B,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,yEAAyE,EAAE;IACtJ,IAAI,EAAE,EAAE,UAAU,EAAE,6BAA6B,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,yEAAyE,EAAE;
|
|
1
|
+
{"version":3,"file":"release.js","sourceRoot":"","sources":["../../../src/release.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,uFAAuF;AACvF,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,MAAM,EAAE,EAAE,UAAU,EAAE,wBAAwB,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,yEAAyE,EAAE;IACjJ,KAAK,EAAE,EAAE,UAAU,EAAE,8BAA8B,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,yEAAyE,EAAE;IACtJ,IAAI,EAAE,EAAE,UAAU,EAAE,6BAA6B,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,yEAAyE,EAAE;IACpJ,OAAO,EAAE,EAAE,UAAU,EAAE,gCAAgC,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,yEAAyE,EAAE;CAC3J,CAAC;AAEF,uGAAuG;AACvG,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,UAAU,EAAE,6BAA6B,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,yEAAyE,EAAE,CAAC"}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* neon-control's branches: alasio's timeline, the branch `main`, and the child timelines
|
|
3
|
+
* branched from it or from each other, each with a compute neon-control serves a spec.
|
|
4
|
+
* What is decided about them, without I/O: names, requests, the record of each, what
|
|
5
|
+
* the storage controller's answers mean, and the spec of a branch's compute. The service
|
|
6
|
+
* (./service.ts) does the I/O.
|
|
7
|
+
*
|
|
8
|
+
* A branch is `creating` from the moment its timeline id is chosen until the storage
|
|
9
|
+
* controller has placed it, `ready` from then, and `deleting` from when its deletion
|
|
10
|
+
* starts until the storage controller has deleted it, when its record goes. Its id and
|
|
11
|
+
* branch point are recorded before the storage controller is first asked, so a creation
|
|
12
|
+
* asked again, after a failure or a restart, asks for exactly the same timeline.
|
|
13
|
+
*
|
|
14
|
+
* A branch's compute has credentials of its own, which whoever asks for the branch makes
|
|
15
|
+
* and neon-control is given only the hashes of: the SCRAM verifier of the password of
|
|
16
|
+
* alasio's role on it, which its spec gives the role, and the SHA-256 of the token it
|
|
17
|
+
* fetches its spec with, which fetches its spec alone. So what a branch is given reaches
|
|
18
|
+
* neither main's compute nor another branch's spec. main's compute keeps the stack's.
|
|
19
|
+
*/
|
|
20
|
+
import { createHash, timingSafeEqual } from "node:crypto";
|
|
21
|
+
import { DATABASE, ROLE } from "./secrets.js";
|
|
22
|
+
/** alasio's own branch: its first timeline, bootstrapped, never deleted. */
|
|
23
|
+
export const MAIN = "main";
|
|
24
|
+
/**
|
|
25
|
+
* The longest name a branch may have. Branch environments name objects
|
|
26
|
+
* `alasio-branch-<name>-<part>`; at this length one with a part of up to 18 characters
|
|
27
|
+
* still fits the 63 characters Kubernetes allows a namespace, a Service or a label value.
|
|
28
|
+
*/
|
|
29
|
+
export const MAX_NAME_LENGTH = 30;
|
|
30
|
+
/**
|
|
31
|
+
* The scope of the lake's token, which lists the branches and does nothing else: Neon's
|
|
32
|
+
* own services do not know it.
|
|
33
|
+
*/
|
|
34
|
+
export const BRANCHES_SCOPE = "branches";
|
|
35
|
+
/**
|
|
36
|
+
* The scopes of the tokens a call of neon-control's API (`method` on `url`) is taken
|
|
37
|
+
* with: the admin's, as the storage controller's hooks bear it, and for a list of the
|
|
38
|
+
* branches the lake's too, which keeps its files while any branch may read them.
|
|
39
|
+
*/
|
|
40
|
+
export function callScopes(method, url) {
|
|
41
|
+
return method === "GET" && url === "/branches" ? ["admin", BRANCHES_SCOPE] : ["admin"];
|
|
42
|
+
}
|
|
43
|
+
/** A refusal for the API's caller: its HTTP status, and what it says. */
|
|
44
|
+
export class BranchError extends Error {
|
|
45
|
+
status;
|
|
46
|
+
constructor(status, message) {
|
|
47
|
+
super(message);
|
|
48
|
+
this.status = status;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** What is wrong with `name` as a branch's name, or null if nothing is. */
|
|
52
|
+
export function nameProblem(name) {
|
|
53
|
+
if (name === MAIN)
|
|
54
|
+
return `${MAIN} is alasio's own branch`;
|
|
55
|
+
if (name.length > MAX_NAME_LENGTH)
|
|
56
|
+
return `a branch's name is at most ${MAX_NAME_LENGTH} characters`;
|
|
57
|
+
// A DNS-1123 label, as the names of the objects named after it must be.
|
|
58
|
+
if (!/^[a-z0-9]([-a-z0-9]*[a-z0-9])?$/u.test(name))
|
|
59
|
+
return "a branch's name is lowercase letters, digits and inner hyphens";
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* The branch point `text` names, an LSN written `<high>/<low>` in hexadecimal, as Neon
|
|
64
|
+
* writes it, and aligned up to 8 bytes, as the pageserver branches at it; null if it
|
|
65
|
+
* names none.
|
|
66
|
+
*/
|
|
67
|
+
export function branchPoint(text) {
|
|
68
|
+
const match = /^([0-9a-f]{1,8})\/([0-9a-f]{1,8})$/iu.exec(text);
|
|
69
|
+
if (!match)
|
|
70
|
+
return null;
|
|
71
|
+
const [, high = "", low = ""] = match;
|
|
72
|
+
const aligned = ((BigInt(`0x${high}`) << 32n) + BigInt(`0x${low}`) + 7n) & ~7n;
|
|
73
|
+
return `${(aligned >> 32n).toString(16).toUpperCase()}/${(aligned & 0xffffffffn).toString(16).toUpperCase()}`;
|
|
74
|
+
}
|
|
75
|
+
/** The SHA-256 of `token`, in hexadecimal: what neon-control keeps of a compute's token. */
|
|
76
|
+
export const tokenSha256 = (token) => createHash("sha256").update(token).digest("hex");
|
|
77
|
+
/** The credentials `value` gives a branch's compute, checked. */
|
|
78
|
+
function computeCredentials(value) {
|
|
79
|
+
const { passwordVerifier, tokenSha256: sha, ...rest } = (typeof value === "object" && value !== null ? value : {});
|
|
80
|
+
if (Object.keys(rest).length > 0 || typeof passwordVerifier !== "string" || !passwordVerifier.startsWith("SCRAM-SHA-256$") ||
|
|
81
|
+
typeof sha !== "string" || !/^[0-9a-f]{64}$/u.test(sha)) {
|
|
82
|
+
throw new BranchError(400, "a branch's compute is given as { passwordVerifier, tokenSha256 }: a SCRAM-SHA-256 verifier, and a SHA-256 in hexadecimal");
|
|
83
|
+
}
|
|
84
|
+
return { passwordVerifier, tokenSha256: sha };
|
|
85
|
+
}
|
|
86
|
+
/** The branch `body` asks for: `{ name, parent?, lsn?, compute }`, its parent main if not given. */
|
|
87
|
+
export function branchRequest(body) {
|
|
88
|
+
if (typeof body !== "object" || body === null)
|
|
89
|
+
throw new BranchError(400, "a branch is asked for as { name, parent?, lsn?, compute }");
|
|
90
|
+
const { name, parent = MAIN, lsn = null, compute, ...rest } = body;
|
|
91
|
+
const unknown = Object.keys(rest);
|
|
92
|
+
if (unknown.length > 0)
|
|
93
|
+
throw new BranchError(400, `a branch has no ${unknown.join(", ")}`);
|
|
94
|
+
if (typeof name !== "string")
|
|
95
|
+
throw new BranchError(400, "a branch is asked for by its name");
|
|
96
|
+
const problem = nameProblem(name);
|
|
97
|
+
if (problem)
|
|
98
|
+
throw new BranchError(400, `${name} is no branch's name: ${problem}`);
|
|
99
|
+
if (typeof parent !== "string")
|
|
100
|
+
throw new BranchError(400, "a branch's parent is a branch's name");
|
|
101
|
+
const credentials = computeCredentials(compute);
|
|
102
|
+
if (lsn === null)
|
|
103
|
+
return { name, parent, lsn, compute: credentials };
|
|
104
|
+
const point = typeof lsn === "string" ? branchPoint(lsn) : null;
|
|
105
|
+
if (point === null)
|
|
106
|
+
throw new BranchError(400, `${String(lsn)} is no LSN: an LSN is written <high>/<low>, in hexadecimal`);
|
|
107
|
+
return { name, parent, lsn: point, compute: credentials };
|
|
108
|
+
}
|
|
109
|
+
/** The id of the compute of the branch `name`: `alasio` for main's, `branch-<name>` for any other's. */
|
|
110
|
+
export function computeId(name) {
|
|
111
|
+
return name === MAIN ? "alasio" : `branch-${name}`;
|
|
112
|
+
}
|
|
113
|
+
/** The ready branch whose compute is `id`, if any. */
|
|
114
|
+
export function branchOfCompute(branches, id) {
|
|
115
|
+
return branches.find((branch) => branch.state === "ready" && computeId(branch.name) === id);
|
|
116
|
+
}
|
|
117
|
+
/** The compute whose token `authorization` bears, by its id: main's, the stack's `mainToken`, or a branch's own; null for none. */
|
|
118
|
+
export function computeOfToken(branches, authorization, mainToken) {
|
|
119
|
+
const token = /^Bearer (.+)$/u.exec(authorization ?? "")?.[1];
|
|
120
|
+
if (!token)
|
|
121
|
+
return null;
|
|
122
|
+
const same = (a, b) => a.length === b.length && timingSafeEqual(Buffer.from(a), Buffer.from(b));
|
|
123
|
+
if (mainToken && same(token, mainToken))
|
|
124
|
+
return computeId(MAIN);
|
|
125
|
+
const sha = tokenSha256(token);
|
|
126
|
+
const owner = branches.find((branch) => branch.compute !== null && same(sha, branch.compute.tokenSha256));
|
|
127
|
+
return owner ? computeId(owner.name) : null;
|
|
128
|
+
}
|
|
129
|
+
/** `branch` as the API answers it (BranchView). */
|
|
130
|
+
export function branchView({ compute: _credentials, ...branch }) {
|
|
131
|
+
return { ...branch, computeId: computeId(branch.name) };
|
|
132
|
+
}
|
|
133
|
+
/** The branch named `name`, if any. */
|
|
134
|
+
export const branchNamed = (branches, name) => branches.find((branch) => branch.name === name);
|
|
135
|
+
/** `branches` with `branch` in place of the one of its name, or added after them. */
|
|
136
|
+
export function withBranch(branches, branch) {
|
|
137
|
+
const index = branches.findIndex(({ name }) => name === branch.name);
|
|
138
|
+
return index === -1 ? [...branches, branch] : branches.map((existing, at) => (at === index ? branch : existing));
|
|
139
|
+
}
|
|
140
|
+
/** `branches` without the one named `name`. */
|
|
141
|
+
export const withoutBranch = (branches, name) => branches.filter((branch) => branch.name !== name);
|
|
142
|
+
/**
|
|
143
|
+
* What asking for `request` comes to, given `branches`: the branch of that name already
|
|
144
|
+
* there, ready or still being created, when it is the one asked for; null when there is
|
|
145
|
+
* none, and its parent is ready to branch from. Refuses a name taken by another branch,
|
|
146
|
+
* or one being deleted, and a parent that is not ready.
|
|
147
|
+
*/
|
|
148
|
+
export function existingBranch(branches, request) {
|
|
149
|
+
const existing = branchNamed(branches, request.name);
|
|
150
|
+
if (existing) {
|
|
151
|
+
const same = existing.parent === request.parent && (request.lsn === null || existing.lsn === request.lsn);
|
|
152
|
+
if (existing.state === "deleting")
|
|
153
|
+
throw new BranchError(409, `${request.name} is being deleted`);
|
|
154
|
+
if (!same)
|
|
155
|
+
throw new BranchError(409, `${request.name} is a branch of ${existing.parent} at ${existing.lsn} already`);
|
|
156
|
+
return existing;
|
|
157
|
+
}
|
|
158
|
+
const parent = branchNamed(branches, request.parent);
|
|
159
|
+
if (!parent)
|
|
160
|
+
throw new BranchError(404, `there is no branch ${request.parent} to branch from`);
|
|
161
|
+
if (parent.state !== "ready")
|
|
162
|
+
throw new BranchError(409, `${request.parent} is ${parent.state}, and is branched from only once ready`);
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Starts deleting the branch `name`: `branches` with it `deleting`, which neither serves
|
|
167
|
+
* its compute nor is repaired. Refuses main, a branch there is not, and one that is the
|
|
168
|
+
* parent of another, which the pageserver would refuse to delete.
|
|
169
|
+
*/
|
|
170
|
+
export function deleting(branches, name) {
|
|
171
|
+
if (name === MAIN)
|
|
172
|
+
throw new BranchError(400, `${MAIN} is alasio's own branch, which is never deleted`);
|
|
173
|
+
const branch = branchNamed(branches, name);
|
|
174
|
+
if (!branch)
|
|
175
|
+
throw new BranchError(404, `there is no branch ${name}`);
|
|
176
|
+
const children = branches.filter((child) => child.parent === name).map((child) => child.name);
|
|
177
|
+
if (children.length > 0)
|
|
178
|
+
throw new BranchError(412, `${name} has branches of its own, deleted first: ${children.join(", ")}`);
|
|
179
|
+
return withBranch(branches, { name, parent: branch.parent, timelineId: branch.timelineId, lsn: branch.lsn, createdAt: branch.createdAt, compute: branch.compute, state: "deleting" });
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* The placement of `branch`'s timeline the storage controller created, as its answer
|
|
183
|
+
* says, once that answer is checked to be of the timeline asked for. The request is an
|
|
184
|
+
* untagged union whose last form is a timeline bootstrapped anew, which a request for a
|
|
185
|
+
* branch the controller did not read as one becomes; so a branch's answer must name its
|
|
186
|
+
* parent's timeline and its branch point.
|
|
187
|
+
*/
|
|
188
|
+
export function placementOf(branch, parentTimelineId, created) {
|
|
189
|
+
const lsn = typeof created.ancestor_lsn === "string" ? branchPoint(created.ancestor_lsn) : null;
|
|
190
|
+
const made = `the storage controller made timeline ${String(created.timeline_id)}, of ${String(created.ancestor_timeline_id ?? "no ancestor")} at ${lsn ?? "no LSN"}`;
|
|
191
|
+
if (created.timeline_id !== branch.timelineId || (created.ancestor_timeline_id ?? null) !== parentTimelineId || (parentTimelineId !== null && lsn !== branch.lsn)) {
|
|
192
|
+
throw new BranchError(502, `${made}, not ${branch.name}'s ${branch.timelineId} of ${parentTimelineId ?? "no ancestor"} at ${branch.lsn ?? "no LSN"}`);
|
|
193
|
+
}
|
|
194
|
+
if (!created.safekeepers)
|
|
195
|
+
throw new BranchError(502, `the storage controller placed ${branch.name}'s timeline on no safekeepers`);
|
|
196
|
+
return { generation: created.safekeepers.generation, ids: created.safekeepers.safekeepers.map((sk) => sk.id) };
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* What the storage controller's refusal to create `branch` means, its `status` (null when
|
|
200
|
+
* it did not answer) and `message`: a branch point its parent's history no longer holds,
|
|
201
|
+
* or does not reach, is the caller's to change (406); any other is the caller's to ask
|
|
202
|
+
* again, for the same timeline. The controller answers a pageserver's refusal, other than
|
|
203
|
+
* a 404 or 503, as a 409 that names the pageserver's status.
|
|
204
|
+
*/
|
|
205
|
+
export function creationRefused(branch, status, message) {
|
|
206
|
+
if (status === 406 || (status === 409 && message.includes("406 Not Acceptable"))) {
|
|
207
|
+
return new BranchError(406, `${branch.parent} has no ${branch.lsn} to branch ${branch.name} from: it is below its garbage collection cutoff, or past its end (${message})`);
|
|
208
|
+
}
|
|
209
|
+
const answered = status === null ? message : `${status} ${message}`;
|
|
210
|
+
return new BranchError(503, `the storage controller did not create ${branch.name}, which may be asked for again: ${answered}`);
|
|
211
|
+
}
|
|
212
|
+
/** The notification `body` is, checked. */
|
|
213
|
+
export function safekeepersNotified(body) {
|
|
214
|
+
const { timeline_id, generation, safekeepers } = (typeof body === "object" && body !== null ? body : {});
|
|
215
|
+
const ids = Array.isArray(safekeepers) ? safekeepers.map((sk) => (typeof sk === "object" && sk !== null ? sk["id"] : undefined)) : [];
|
|
216
|
+
if (typeof timeline_id !== "string" || typeof generation !== "number" || ids.length === 0 || !ids.every((id) => typeof id === "number")) {
|
|
217
|
+
throw new BranchError(400, "safekeepers are notified as { tenant_id, timeline_id, generation, safekeepers: [{ id }] }");
|
|
218
|
+
}
|
|
219
|
+
return { timelineId: timeline_id, placement: { generation, ids: ids } };
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* `branches` with the ready branch of the notified timeline placed where it says, when
|
|
223
|
+
* it is of a later generation than its own: what its compute's spec names, and what the
|
|
224
|
+
* safekeepers are repaired with, from then on. Null when no branch changes.
|
|
225
|
+
*/
|
|
226
|
+
export function withNotifiedPlacement(branches, { timelineId, placement }) {
|
|
227
|
+
const branch = branches.find((candidate) => candidate.state === "ready" && candidate.timelineId === timelineId);
|
|
228
|
+
if (!branch || placement.generation <= branch.safekeepers.generation)
|
|
229
|
+
return null;
|
|
230
|
+
return withBranch(branches, { ...branch, safekeepers: placement });
|
|
231
|
+
}
|
|
232
|
+
/** The port every compute serves Postgres on. */
|
|
233
|
+
export const COMPUTE_PORT = 55433;
|
|
234
|
+
function setting(name, value, vartype) {
|
|
235
|
+
return { name, value: String(value), vartype };
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* The spec of `branch`'s compute: a primary on its timeline, at its safekeepers. The role
|
|
239
|
+
* and database are main's, which every branch inherits with its data; the role's password
|
|
240
|
+
* is the branch's own.
|
|
241
|
+
*
|
|
242
|
+
* Its storage token is the tenant's, as the pageserver and safekeepers take no narrower
|
|
243
|
+
* one: a timeline is not a scope of theirs. A branch's compute could read main's timeline
|
|
244
|
+
* with it, which only Neon's storage services take, and only from the stack's pods.
|
|
245
|
+
*/
|
|
246
|
+
export function computeConfig(branch, stack) {
|
|
247
|
+
// The timeline was placed on safekeepers of the stack, so each id is one of theirs.
|
|
248
|
+
const safekeeper = (id) => stack.safekeepers.find((sk) => sk.id === id);
|
|
249
|
+
return {
|
|
250
|
+
spec: {
|
|
251
|
+
format_version: 1.0,
|
|
252
|
+
suspend_timeout_seconds: -1,
|
|
253
|
+
cluster: {
|
|
254
|
+
cluster_id: "alasio",
|
|
255
|
+
name: "alasio",
|
|
256
|
+
roles: [{ name: ROLE, encrypted_password: branch.compute?.passwordVerifier ?? stack.passwordVerifier, options: null }],
|
|
257
|
+
databases: [{ name: DATABASE, owner: ROLE, options: null }],
|
|
258
|
+
settings: [
|
|
259
|
+
setting("listen_addresses", "0.0.0.0", "string"),
|
|
260
|
+
setting("port", COMPUTE_PORT, "integer"),
|
|
261
|
+
setting("max_connections", 100, "integer"),
|
|
262
|
+
setting("shared_buffers", "128MB", "string"),
|
|
263
|
+
setting("password_encryption", "scram-sha-256", "enum"),
|
|
264
|
+
// Durability is the safekeepers': a commit waits for their quorum,
|
|
265
|
+
// and the compute's own disk is rebuilt on every start.
|
|
266
|
+
setting("fsync", "off", "bool"),
|
|
267
|
+
setting("synchronous_standby_names", "walproposer", "string"),
|
|
268
|
+
setting("shared_preload_libraries", "neon", "string"),
|
|
269
|
+
setting("wal_level", "replica", "enum"),
|
|
270
|
+
setting("wal_log_hints", "off", "bool"),
|
|
271
|
+
setting("wal_keep_size", 0, "integer"),
|
|
272
|
+
setting("wal_sender_timeout", "5s", "string"),
|
|
273
|
+
setting("max_wal_senders", 10, "integer"),
|
|
274
|
+
setting("max_replication_slots", 10, "integer"),
|
|
275
|
+
setting("max_replication_write_lag", "15MB", "string"),
|
|
276
|
+
setting("max_replication_flush_lag", "10GB", "string"),
|
|
277
|
+
setting("restart_after_crash", "off", "bool"),
|
|
278
|
+
],
|
|
279
|
+
},
|
|
280
|
+
delta_operations: [],
|
|
281
|
+
tenant_id: stack.tenantId,
|
|
282
|
+
timeline_id: branch.timelineId,
|
|
283
|
+
mode: "Primary",
|
|
284
|
+
pageserver_connstring: `postgresql://no_user@${stack.pageserverHost}:6400`,
|
|
285
|
+
safekeepers_generation: branch.safekeepers.generation,
|
|
286
|
+
safekeeper_connstrings: branch.safekeepers.ids.map((id) => `${safekeeper(id).host}:${safekeeper(id).pgPort}`),
|
|
287
|
+
storage_auth_token: stack.storageAuthToken,
|
|
288
|
+
},
|
|
289
|
+
compute_ctl_config: { jwks: stack.jwks },
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=branches.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branches.js","sourceRoot":"","sources":["../../../../neon/control/branches.ts"],"names":[],"mappings":"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"}
|