alasio 8.0.0 → 9.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.
Files changed (134) hide show
  1. package/dist/cli/src/api-server.js +18 -0
  2. package/dist/cli/src/api-server.js.map +1 -0
  3. package/dist/cli/src/branches.js +61 -20
  4. package/dist/cli/src/branches.js.map +1 -1
  5. package/dist/cli/src/cluster/docker.js +25 -10
  6. package/dist/cli/src/cluster/docker.js.map +1 -1
  7. package/dist/cli/src/cluster/host.js +33 -7
  8. package/dist/cli/src/cluster/host.js.map +1 -1
  9. package/dist/cli/src/cluster/k3s.js +43 -11
  10. package/dist/cli/src/cluster/k3s.js.map +1 -1
  11. package/dist/cli/src/cluster/node.js +107 -32
  12. package/dist/cli/src/cluster/node.js.map +1 -1
  13. package/dist/cli/src/cluster/stargz.js +55 -0
  14. package/dist/cli/src/cluster/stargz.js.map +1 -0
  15. package/dist/cli/src/commands/branch.js +5 -4
  16. package/dist/cli/src/commands/branch.js.map +1 -1
  17. package/dist/cli/src/commands/common.js +9 -3
  18. package/dist/cli/src/commands/common.js.map +1 -1
  19. package/dist/cli/src/commands/folder.js +14 -0
  20. package/dist/cli/src/commands/folder.js.map +1 -0
  21. package/dist/cli/src/commands/status.js +64 -12
  22. package/dist/cli/src/commands/status.js.map +1 -1
  23. package/dist/cli/src/commands/uninstall.js +8 -9
  24. package/dist/cli/src/commands/uninstall.js.map +1 -1
  25. package/dist/cli/src/commands/up.js +11 -3
  26. package/dist/cli/src/commands/up.js.map +1 -1
  27. package/dist/cli/src/commands/upgrade.js +1 -1
  28. package/dist/cli/src/commands/upgrade.js.map +1 -1
  29. package/dist/cli/src/commands.js +2 -1
  30. package/dist/cli/src/commands.js.map +1 -1
  31. package/dist/cli/src/config.js +4 -1
  32. package/dist/cli/src/config.js.map +1 -1
  33. package/dist/cli/src/cpu-baseline.js +8 -4
  34. package/dist/cli/src/cpu-baseline.js.map +1 -1
  35. package/dist/cli/src/folders.js +67 -0
  36. package/dist/cli/src/folders.js.map +1 -0
  37. package/dist/cli/src/gateway-calls.js +58 -0
  38. package/dist/cli/src/gateway-calls.js.map +1 -0
  39. package/dist/cli/src/install.js +77 -29
  40. package/dist/cli/src/install.js.map +1 -1
  41. package/dist/cli/src/kept-releases.js +27 -20
  42. package/dist/cli/src/kept-releases.js.map +1 -1
  43. package/dist/cli/src/kube/api.js +2 -3
  44. package/dist/cli/src/kube/api.js.map +1 -1
  45. package/dist/cli/src/kube/apply.js +15 -72
  46. package/dist/cli/src/kube/apply.js.map +1 -1
  47. package/dist/cli/src/kube/rollout.js +28 -16
  48. package/dist/cli/src/kube/rollout.js.map +1 -1
  49. package/dist/cli/src/manifests/admission.js +342 -223
  50. package/dist/cli/src/manifests/admission.js.map +1 -1
  51. package/dist/cli/src/manifests/alasio.js +58 -394
  52. package/dist/cli/src/manifests/alasio.js.map +1 -1
  53. package/dist/cli/src/manifests/branch.js +10 -26
  54. package/dist/cli/src/manifests/branch.js.map +1 -1
  55. package/dist/cli/src/manifests/collector.js +60 -44
  56. package/dist/cli/src/manifests/collector.js.map +1 -1
  57. package/dist/cli/src/manifests/common.js +32 -2
  58. package/dist/cli/src/manifests/common.js.map +1 -1
  59. package/dist/cli/src/manifests/config.js +64 -81
  60. package/dist/cli/src/manifests/config.js.map +1 -1
  61. package/dist/cli/src/manifests/disruption.js +10 -0
  62. package/dist/cli/src/manifests/disruption.js.map +1 -1
  63. package/dist/cli/src/manifests/folders.js +128 -0
  64. package/dist/cli/src/manifests/folders.js.map +1 -0
  65. package/dist/cli/src/manifests/grafana.js +4 -2
  66. package/dist/cli/src/manifests/grafana.js.map +1 -1
  67. package/dist/cli/src/manifests/index.js +10 -7
  68. package/dist/cli/src/manifests/index.js.map +1 -1
  69. package/dist/cli/src/manifests/lake.js +18 -4
  70. package/dist/cli/src/manifests/lake.js.map +1 -1
  71. package/dist/cli/src/manifests/log.js +32 -14
  72. package/dist/cli/src/manifests/log.js.map +1 -1
  73. package/dist/cli/src/manifests/neon.js +3 -3
  74. package/dist/cli/src/manifests/neon.js.map +1 -1
  75. package/dist/cli/src/manifests/network-policies.js +140 -74
  76. package/dist/cli/src/manifests/network-policies.js.map +1 -1
  77. package/dist/cli/src/manifests/node-agent.js +11 -4
  78. package/dist/cli/src/manifests/node-agent.js.map +1 -1
  79. package/dist/cli/src/manifests/object-store.js +4 -2
  80. package/dist/cli/src/manifests/object-store.js.map +1 -1
  81. package/dist/cli/src/manifests/sandbox-gateway.js +663 -0
  82. package/dist/cli/src/manifests/sandbox-gateway.js.map +1 -0
  83. package/dist/cli/src/manifests/scalers.js +16 -5
  84. package/dist/cli/src/manifests/scalers.js.map +1 -1
  85. package/dist/cli/src/manifests/sizing.js +16 -8
  86. package/dist/cli/src/manifests/sizing.js.map +1 -1
  87. package/dist/cli/src/manifests/valkey.js +11 -5
  88. package/dist/cli/src/manifests/valkey.js.map +1 -1
  89. package/dist/cli/src/manifests/vpa.js +3 -1
  90. package/dist/cli/src/manifests/vpa.js.map +1 -1
  91. package/dist/cli/src/manifests/workspace-storage.js +174 -89
  92. package/dist/cli/src/manifests/workspace-storage.js.map +1 -1
  93. package/dist/cli/src/neon-storage.js +54 -14
  94. package/dist/cli/src/neon-storage.js.map +1 -1
  95. package/dist/cli/src/release.js +9 -9
  96. package/dist/cluster/node/pins.json +9 -4
  97. package/dist/neon/control/branches.js +6 -6
  98. package/dist/neon/control/branches.js.map +1 -1
  99. package/dist/neon/control/secrets.js +14 -3
  100. package/dist/neon/control/secrets.js.map +1 -1
  101. package/dist/src/binder/names.js +33 -0
  102. package/dist/src/binder/names.js.map +1 -0
  103. package/dist/src/binder/tokens.js +58 -0
  104. package/dist/src/binder/tokens.js.map +1 -0
  105. package/dist/src/branch/names.js +12 -2
  106. package/dist/src/branch/names.js.map +1 -1
  107. package/dist/src/events/names.js +7 -0
  108. package/dist/src/events/names.js.map +1 -0
  109. package/dist/src/gateway/names.js +201 -0
  110. package/dist/src/gateway/names.js.map +1 -0
  111. package/dist/src/harness/names.js +49 -0
  112. package/dist/src/harness/names.js.map +1 -0
  113. package/dist/src/kube/sandbox-shape.js +8 -68
  114. package/dist/src/kube/sandbox-shape.js.map +1 -1
  115. package/dist/src/node-agent/names.js +52 -2
  116. package/dist/src/node-agent/names.js.map +1 -1
  117. package/dist/src/sandbox/names.js +12 -20
  118. package/dist/src/sandbox/names.js.map +1 -1
  119. package/dist/src/sandbox/otlp-resource.js +173 -0
  120. package/dist/src/sandbox/otlp-resource.js.map +1 -0
  121. package/dist/src/sandbox/telemetry.js +43 -0
  122. package/dist/src/sandbox/telemetry.js.map +1 -0
  123. package/dist/src/telemetry/config.js +131 -0
  124. package/dist/src/telemetry/config.js.map +1 -0
  125. package/dist/src/telemetry/forward.js +154 -0
  126. package/dist/src/telemetry/forward.js.map +1 -0
  127. package/package.json +1 -1
  128. package/dist/cli/src/manifests/agent-sandbox.js +0 -92
  129. package/dist/cli/src/manifests/agent-sandbox.js.map +0 -1
  130. package/dist/cli/src/manifests/juicefs-csi.js +0 -320
  131. package/dist/cli/src/manifests/juicefs-csi.js.map +0 -1
  132. package/dist/cli/src/manifests/sandboxes.agents.x-k8s.io.json +0 -6295
  133. package/dist/src/kube/config.js +0 -145
  134. package/dist/src/kube/config.js.map +0 -1
@@ -1,320 +0,0 @@
1
- import { imageReference } from "../images.js";
2
- import { VOLUME_DRIVER_LABEL } from "../kube/apply.js";
3
- import { goJson, ONE, replicasOf } from "./common.js";
4
- import { verticalPodAutoscaler } from "./sizing.js";
5
- /** The driver's name, which StorageClasses name as their provisioner. */
6
- export const CSI_DRIVER = "csi.juicefs.com";
7
- const VERSION = "v0.33.0";
8
- const CONTROLLER = "juicefs-csi-controller";
9
- const NODE = "juicefs-csi-node";
10
- const CONFIG = "juicefs-csi-driver-config";
11
- const CONTROLLER_ACCOUNT = "juicefs-csi-controller-sa";
12
- const NODE_ACCOUNT = "juicefs-csi-node-sa";
13
- /** The PriorityClass of mount pods. */
14
- const MOUNT_PRIORITY_CLASS = "alasio-juicefs-mount";
15
- /** The name label of the node service's mount pods, the clients. */
16
- export const MOUNT_POD_NAME = "juicefs-mount";
17
- /** The name label of the controller's and the node service's pods, the driver. */
18
- export const DRIVER_POD_NAME = "juicefs-csi-driver";
19
- /** The labels of the node service's mount pods. */
20
- export const MOUNT_POD_LABELS = { "app.kubernetes.io/name": MOUNT_POD_NAME };
21
- /** The labels that select the controller's and the node service's pods, upstream's but for its version. */
22
- export const CONTROLLER_POD_LABELS = { app: CONTROLLER, "app.kubernetes.io/name": DRIVER_POD_NAME, "app.kubernetes.io/instance": DRIVER_POD_NAME };
23
- export const NODE_POD_LABELS = { app: NODE, "app.kubernetes.io/name": DRIVER_POD_NAME, "app.kubernetes.io/instance": DRIVER_POD_NAME };
24
- /**
25
- * What selects the pods of the Jobs the controller runs to delete a volume's directory
26
- * once its claim is gone: upstream labels such a Job but not its pod template
27
- * (pkg/juicefs/mount/builder/job.go), so its pod carries only what Kubernetes gives a
28
- * Job's pods, the name of its Job.
29
- */
30
- export const JOB_POD_SELECTOR = { matchExpressions: [{ key: "batch.kubernetes.io/job-name", operator: "Exists" }] };
31
- /** The selector of the controller's, the node service's and the mount pods' pods, by their name labels. */
32
- export const JUICEFS_PODS_SELECTOR = `app.kubernetes.io/name in (${MOUNT_POD_NAME}, ${DRIVER_POD_NAME})`;
33
- /** Where mount pods serve their Prometheus metrics, the client's (administration/monitoring.md). */
34
- export const JUICEFS_METRICS_PORT = 9567;
35
- /** Where the controller's and the node service's pods serve theirs, the driver's own: its provisioning and volume errors among them. */
36
- export const DRIVER_METRICS_PORT = 8080;
37
- /** The label of what the driver needs to delete its volumes' data, which alasio keeps while they remain. */
38
- export const VOLUME_DRIVER = { [VOLUME_DRIVER_LABEL]: CSI_DRIVER };
39
- /** The labels of the driver's objects: upstream's, at its version, managed by alasio, and needed by its volumes. */
40
- const LABELS = {
41
- "app.kubernetes.io/name": "juicefs-csi-driver",
42
- "app.kubernetes.io/instance": "juicefs-csi-driver",
43
- "app.kubernetes.io/version": VERSION,
44
- "app.kubernetes.io/managed-by": "alasio",
45
- ...VOLUME_DRIVER,
46
- };
47
- /** Where the controller and node service keep mount points and the client's configuration, on the node. */
48
- const MOUNT_PATH = "/var/lib/juicefs/volume";
49
- const CONFIG_PATH = "/var/lib/juicefs/config";
50
- /** The controller's socket, which its sidecars reach it by. */
51
- const CONTROLLER_SOCKET_DIR = "/var/lib/csi/sockets/pluginproxy/";
52
- /**
53
- * The driver's configuration, its ConfigMap's config.yaml: two patches. The first, of every
54
- * pod the driver runs, pins its client and sizes it: mount pods, and the Job that deletes a
55
- * volume's directory once its claim is gone, which no patch selecting by claim reaches, so
56
- * that it ran on JuiceFS's defaults, a whole CPU and 1 GiB requested on its default image.
57
- * The second, of the mount pods of workspace storage's class: their mount options, which
58
- * take precedence over a volume's and reach mount pods made after a change, and readiness.
59
- */
60
- export function driverConfig({ workspaceStorage }) {
61
- const { csi, storageClassName, cacheSizeMiB, backupInterval } = workspaceStorage;
62
- return {
63
- enableNodeSelector: false,
64
- mountPodPatch: [{ ceMountImage: imageReference(csi.mountImage), resources: csi.mountPod.resources }, {
65
- pvcSelector: { matchStorageClassName: storageClassName },
66
- mountOptions: [
67
- // The read cache, bounded, and keeping a fifth of the node's disk free.
68
- `cache-size=${cacheSizeMiB}`,
69
- "free-space-ratio=0.2",
70
- `backup-meta=${backupInterval}`,
71
- ],
72
- // Ready once the mount answers as FUSE's. A mount pod mounts its volume's directory
73
- // alone (as `subdir`), so that is the mount's root, and nothing is under it by the
74
- // volume's path; unmounted, the root is the node's own directory.
75
- readinessProbe: { exec: { command: ["sh", "-c", 'test "$(stat --file-system --format=%T ${MOUNT_POINT})" = fuseblk'] }, initialDelaySeconds: 5, periodSeconds: 10, failureThreshold: 3 },
76
- }],
77
- };
78
- }
79
- /** What the controller and node service are told alike: where they are, where mount pods keep their mounts, and the pods' priority. */
80
- function pluginEnv({ workspaceStorage }) {
81
- return [
82
- { name: "NODE_NAME", valueFrom: { fieldRef: { fieldPath: "spec.nodeName" } } },
83
- { name: "JUICEFS_MOUNT_NAMESPACE", valueFrom: { fieldRef: { fieldPath: "metadata.namespace" } } },
84
- { name: "POD_NAME", valueFrom: { fieldRef: { fieldPath: "metadata.name" } } },
85
- { name: "JUICEFS_MOUNT_PATH", value: MOUNT_PATH },
86
- { name: "JUICEFS_CONFIG_PATH", value: CONFIG_PATH },
87
- { name: "JUICEFS_MOUNT_PRIORITY_NAME", value: MOUNT_PRIORITY_CLASS },
88
- { name: "JUICEFS_MOUNT_PREEMPTION_POLICY", value: "Never" },
89
- ...(workspaceStorage.csi.shareMountPod ? [{ name: "FS_SHARE_MOUNT", value: "true" }] : []),
90
- ];
91
- }
92
- /** The plugin's liveness, which its liveness-probe sidecar answers on the plugin's healthz port. */
93
- const PLUGIN_PROBE = { httpGet: { path: "/healthz", port: "healthz" }, initialDelaySeconds: 10, periodSeconds: 10, timeoutSeconds: 3, failureThreshold: 5 };
94
- /** The liveness-probe sidecar, for the plugin's socket in `socketVolume`. */
95
- function livenessProbe({ workspaceStorage }, socketVolume) {
96
- return {
97
- name: "liveness-probe",
98
- image: imageReference(workspaceStorage.csi.livenessProbeImage),
99
- args: ["--csi-address=/csi/csi.sock", "--health-port=9909"],
100
- resources: { requests: { cpu: "5m", memory: "16Mi" }, limits: { memory: "64Mi" } },
101
- volumeMounts: [{ name: socketVolume, mountPath: "/csi" }],
102
- };
103
- }
104
- /** A rule granting `verbs` on `resources` of `apiGroups`. */
105
- function rule(apiGroups, resources, verbs) {
106
- return { apiGroups, resources, verbs };
107
- }
108
- /** Who the controller and node service are, and what they may do, as upstream grants it. */
109
- function identities({ workspaceStorage }) {
110
- const { namespace } = workspaceStorage.csi;
111
- const account = (name) => ({ apiVersion: "v1", kind: "ServiceAccount", metadata: { name, namespace, labels: LABELS } });
112
- const role = (name, rules) => ({
113
- apiVersion: "rbac.authorization.k8s.io/v1",
114
- kind: "ClusterRole",
115
- metadata: { name, labels: LABELS },
116
- rules,
117
- });
118
- const binding = (name, roleName, accountName) => ({
119
- apiVersion: "rbac.authorization.k8s.io/v1",
120
- kind: "ClusterRoleBinding",
121
- metadata: { name, labels: LABELS },
122
- subjects: [{ kind: "ServiceAccount", name: accountName, namespace }],
123
- roleRef: { apiGroup: "rbac.authorization.k8s.io", kind: "ClusterRole", name: roleName },
124
- });
125
- const provisioner = "juicefs-external-provisioner-role";
126
- const nodeService = "juicefs-csi-external-node-service-role";
127
- return [
128
- account(CONTROLLER_ACCOUNT),
129
- account(NODE_ACCOUNT),
130
- role(provisioner, [
131
- rule([""], ["persistentvolumes"], ["get", "list", "watch", "create", "delete", "patch"]),
132
- rule([""], ["persistentvolumeclaims", "persistentvolumeclaims/status"], ["get", "list", "watch", "update", "patch"]),
133
- rule(["storage.k8s.io"], ["storageclasses"], ["get", "list", "watch"]),
134
- rule([""], ["events"], ["list", "watch", "create", "update", "patch"]),
135
- rule(["storage.k8s.io"], ["csinodes"], ["get", "list", "watch"]),
136
- rule([""], ["nodes"], ["get", "list", "watch"]),
137
- rule([""], ["secrets"], ["get", "list", "watch", "create", "update", "patch", "delete"]),
138
- rule([""], ["pods", "pods/log"], ["get", "list", "watch", "create", "update", "patch", "delete"]),
139
- rule(["batch"], ["jobs"], ["get", "create", "update", "patch", "delete", "list", "watch"]),
140
- rule([""], ["endpoints"], ["get", "list", "watch", "create", "update", "patch"]),
141
- rule(["apps"], ["daemonsets"], ["get", "list"]),
142
- rule([""], ["configmaps"], ["get", "watch", "list", "delete", "update", "create"]),
143
- ]),
144
- role(nodeService, [
145
- rule([""], ["pods"], ["get", "list", "create", "update", "delete", "patch", "watch"]),
146
- rule([""], ["pods/log"], ["get"]),
147
- rule([""], ["secrets"], ["get", "create", "update", "delete", "patch"]),
148
- rule(["batch"], ["jobs"], ["get", "create", "update", "delete", "patch"]),
149
- rule([""], ["nodes"], ["get", "list"]),
150
- rule([""], ["nodes/proxy"], ["*"]),
151
- rule([""], ["persistentvolumes", "persistentvolumeclaims"], ["get", "list"]),
152
- rule([""], ["pods/exec"], ["create"]),
153
- rule([""], ["events"], ["create", "get"]),
154
- rule(["storage.k8s.io"], ["storageclasses"], ["get", "watch"]),
155
- rule([""], ["configmaps"], ["get", "update"]),
156
- ]),
157
- binding("juicefs-csi-provisioner-binding", provisioner, CONTROLLER_ACCOUNT),
158
- binding("juicefs-csi-node-service-binding", nodeService, NODE_ACCOUNT),
159
- ];
160
- }
161
- /** The controller: the plugin, provisioning, and the resizer, which grows a volume's quota as its claim grows. */
162
- function controller(config) {
163
- const { csi } = config.workspaceStorage;
164
- return {
165
- apiVersion: "apps/v1",
166
- kind: "StatefulSet",
167
- metadata: { name: CONTROLLER, namespace: csi.namespace, labels: { ...LABELS, "app.kubernetes.io/component": "controller" } },
168
- spec: {
169
- serviceName: CONTROLLER,
170
- // One, and never more: without an election, two would provision alike.
171
- ...replicasOf(ONE),
172
- selector: { matchLabels: CONTROLLER_POD_LABELS },
173
- template: {
174
- metadata: { labels: { ...LABELS, ...CONTROLLER_POD_LABELS } },
175
- spec: {
176
- serviceAccountName: CONTROLLER_ACCOUNT,
177
- priorityClassName: "system-cluster-critical",
178
- tolerations: [{ key: "CriticalAddonsOnly", operator: "Exists" }],
179
- containers: [
180
- {
181
- name: "juicefs-plugin",
182
- image: imageReference(csi.image),
183
- args: ["--endpoint=$(CSI_ENDPOINT)", "--logtostderr", "--nodeid=$(NODE_NAME)", "--provisioner=true", "--config=/etc/config/config.yaml"],
184
- env: [{ name: "CSI_ENDPOINT", value: `unix://${CONTROLLER_SOCKET_DIR}csi.sock` }, ...pluginEnv(config)],
185
- ports: [{ name: "healthz", containerPort: 9909, protocol: "TCP" }],
186
- livenessProbe: PLUGIN_PROBE,
187
- // It mounts the file system itself, to make and remove volumes' directories.
188
- securityContext: { privileged: true, capabilities: { add: ["SYS_ADMIN"] } },
189
- resources: csi.controller.resources,
190
- volumeMounts: [
191
- { name: "socket-dir", mountPath: CONTROLLER_SOCKET_DIR },
192
- { name: "jfs-dir", mountPath: "/jfs", mountPropagation: "Bidirectional" },
193
- { name: "jfs-root-dir", mountPath: "/root/.juicefs", mountPropagation: "Bidirectional" },
194
- { name: "juicefs-config", mountPath: "/etc/config" },
195
- ],
196
- },
197
- {
198
- name: "csi-resizer",
199
- image: imageReference(csi.resizerImage),
200
- args: ["--csi-address=$(ADDRESS)", "--timeout=20s", "--v=2"],
201
- env: [{ name: "ADDRESS", value: `${CONTROLLER_SOCKET_DIR}csi.sock` }],
202
- resources: { requests: { cpu: "5m", memory: "24Mi" }, limits: { memory: "128Mi" } },
203
- volumeMounts: [{ name: "socket-dir", mountPath: CONTROLLER_SOCKET_DIR }],
204
- },
205
- livenessProbe(config, "socket-dir"),
206
- ],
207
- volumes: [
208
- { name: "socket-dir", emptyDir: {} },
209
- { name: "jfs-dir", hostPath: { path: MOUNT_PATH, type: "DirectoryOrCreate" } },
210
- { name: "jfs-root-dir", hostPath: { path: CONFIG_PATH, type: "DirectoryOrCreate" } },
211
- { name: "juicefs-config", configMap: { name: CONFIG } },
212
- ],
213
- },
214
- },
215
- },
216
- };
217
- }
218
- /** The node service: the plugin, which makes mount pods and binds their mounts into pods, and the registrar, which names it to kubelet. */
219
- function nodeService(config) {
220
- const { csi } = config.workspaceStorage;
221
- const pluginDir = `/var/lib/kubelet/csi-plugins/${CSI_DRIVER}/`;
222
- return {
223
- apiVersion: "apps/v1",
224
- kind: "DaemonSet",
225
- metadata: { name: NODE, namespace: csi.namespace, labels: { ...LABELS, "app.kubernetes.io/component": "node" } },
226
- spec: {
227
- selector: { matchLabels: NODE_POD_LABELS },
228
- template: {
229
- metadata: { labels: { ...LABELS, ...NODE_POD_LABELS } },
230
- spec: {
231
- serviceAccountName: NODE_ACCOUNT,
232
- priorityClassName: "system-node-critical",
233
- dnsPolicy: "ClusterFirstWithHostNet",
234
- tolerations: [{ key: "CriticalAddonsOnly", operator: "Exists" }],
235
- containers: [
236
- {
237
- name: "juicefs-plugin",
238
- image: imageReference(csi.image),
239
- args: ["--endpoint=$(CSI_ENDPOINT)", "--logtostderr", "--nodeid=$(NODE_NAME)", "--enable-manager=true", "--config=/etc/config/config.yaml"],
240
- env: [
241
- { name: "CSI_ENDPOINT", value: "unix:/csi/csi.sock" },
242
- { name: "HOST_IP", valueFrom: { fieldRef: { fieldPath: "status.hostIP" } } },
243
- { name: "KUBELET_PORT", value: "10250" },
244
- ...pluginEnv(config),
245
- ],
246
- ports: [{ name: "healthz", containerPort: 9909, protocol: "TCP" }],
247
- livenessProbe: PLUGIN_PROBE,
248
- securityContext: { privileged: true },
249
- resources: csi.node.resources,
250
- volumeMounts: [
251
- { name: "kubelet-dir", mountPath: "/var/lib/kubelet", mountPropagation: "Bidirectional" },
252
- { name: "plugin-dir", mountPath: "/csi" },
253
- { name: "device-dir", mountPath: "/dev" },
254
- { name: "jfs-dir", mountPath: "/jfs", mountPropagation: "Bidirectional" },
255
- { name: "jfs-root-dir", mountPath: "/root/.juicefs", mountPropagation: "Bidirectional" },
256
- { name: "juicefs-config", mountPath: "/etc/config" },
257
- // Where it keeps each mount's FUSE descriptor, by which a mount pod that
258
- // crashes comes back under the same mount (guide/configurations.md
259
- // "Automatic mount point recovery").
260
- { name: "jfs-fuse-fd", mountPath: "/tmp" },
261
- ],
262
- },
263
- {
264
- name: "node-driver-registrar",
265
- image: imageReference(csi.registrarImage),
266
- args: ["--csi-address=$(ADDRESS)", "--kubelet-registration-path=$(DRIVER_REG_SOCK_PATH)", "--v=5"],
267
- env: [{ name: "ADDRESS", value: "/csi/csi.sock" }, { name: "DRIVER_REG_SOCK_PATH", value: `${pluginDir}csi.sock` }],
268
- resources: { requests: { cpu: "5m", memory: "16Mi" }, limits: { memory: "64Mi" } },
269
- volumeMounts: [{ name: "plugin-dir", mountPath: "/csi" }, { name: "registration-dir", mountPath: "/registration" }],
270
- },
271
- livenessProbe(config, "plugin-dir"),
272
- ],
273
- volumes: [
274
- { name: "kubelet-dir", hostPath: { path: "/var/lib/kubelet", type: "Directory" } },
275
- { name: "plugin-dir", hostPath: { path: pluginDir, type: "DirectoryOrCreate" } },
276
- { name: "registration-dir", hostPath: { path: "/var/lib/kubelet/plugins_registry/", type: "Directory" } },
277
- { name: "device-dir", hostPath: { path: "/dev", type: "Directory" } },
278
- { name: "jfs-dir", hostPath: { path: MOUNT_PATH, type: "DirectoryOrCreate" } },
279
- { name: "jfs-root-dir", hostPath: { path: CONFIG_PATH, type: "DirectoryOrCreate" } },
280
- { name: "juicefs-config", configMap: { name: CONFIG } },
281
- { name: "jfs-fuse-fd", hostPath: { path: "/var/run/juicefs-csi", type: "DirectoryOrCreate" } },
282
- ],
283
- },
284
- },
285
- },
286
- };
287
- }
288
- /** The driver's objects, unless the cluster already has the driver: the CSIDriver and the mount pods' PriorityClass among them, which are the cluster's. */
289
- export function juicefsCsiObjects(config) {
290
- const { csi } = config.workspaceStorage;
291
- if (!csi.enabled)
292
- return [];
293
- const csiDriver = {
294
- apiVersion: "storage.k8s.io/v1",
295
- kind: "CSIDriver",
296
- metadata: { name: CSI_DRIVER, labels: LABELS },
297
- spec: { attachRequired: false, podInfoOnMount: true },
298
- };
299
- const priorityClass = {
300
- apiVersion: "scheduling.k8s.io/v1",
301
- kind: "PriorityClass",
302
- metadata: { name: MOUNT_PRIORITY_CLASS, labels: LABELS },
303
- // As high as a pod's may be, so mount pods outlast the workspaces they serve, and
304
- // never preempting, so a new one evicts nothing.
305
- value: 1_000_000_000,
306
- preemptionPolicy: "Never",
307
- globalDefault: false,
308
- description: "JuiceFS's mount pods, which serve alasio's workspaces",
309
- };
310
- const configMap = {
311
- apiVersion: "v1",
312
- kind: "ConfigMap",
313
- metadata: { name: CONFIG, namespace: csi.namespace, labels: LABELS },
314
- data: { "config.yaml": goJson(driverConfig(config), " ") },
315
- };
316
- // Each serves workspaces' mounts, which its recreation would interrupt.
317
- const workloads = [controller(config), nodeService(config)];
318
- return [csiDriver, priorityClass, ...identities(config), configMap, ...workloads.flatMap((workload) => [workload, verticalPodAutoscaler(workload, "Recommended")])];
319
- }
320
- //# sourceMappingURL=juicefs-csi.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"juicefs-csi.js","sourceRoot":"","sources":["../../../../src/manifests/juicefs-csi.ts"],"names":[],"mappings":"AA4CA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAe,GAAG,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,yEAAyE;AACzE,MAAM,CAAC,MAAM,UAAU,GAAG,iBAAiB,CAAC;AAC5C,MAAM,OAAO,GAAG,SAAS,CAAC;AAC1B,MAAM,UAAU,GAAG,wBAAwB,CAAC;AAC5C,MAAM,IAAI,GAAG,kBAAkB,CAAC;AAChC,MAAM,MAAM,GAAG,2BAA2B,CAAC;AAC3C,MAAM,kBAAkB,GAAG,2BAA2B,CAAC;AACvD,MAAM,YAAY,GAAG,qBAAqB,CAAC;AAC3C,uCAAuC;AACvC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAEpD,oEAAoE;AACpE,MAAM,CAAC,MAAM,cAAc,GAAG,eAAe,CAAC;AAC9C,kFAAkF;AAClF,MAAM,CAAC,MAAM,eAAe,GAAG,oBAAoB,CAAC;AACpD,mDAAmD;AACnD,MAAM,CAAC,MAAM,gBAAgB,GAAW,EAAE,wBAAwB,EAAE,cAAc,EAAE,CAAC;AACrF,2GAA2G;AAC3G,MAAM,CAAC,MAAM,qBAAqB,GAAW,EAAE,GAAG,EAAE,UAAU,EAAE,wBAAwB,EAAE,eAAe,EAAE,4BAA4B,EAAE,eAAe,EAAE,CAAC;AAC3J,MAAM,CAAC,MAAM,eAAe,GAAW,EAAE,GAAG,EAAE,IAAI,EAAE,wBAAwB,EAAE,eAAe,EAAE,4BAA4B,EAAE,eAAe,EAAE,CAAC;AAC/I;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAoB,EAAE,gBAAgB,EAAE,CAAC,EAAE,GAAG,EAAE,8BAA8B,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AAErI,2GAA2G;AAC3G,MAAM,CAAC,MAAM,qBAAqB,GAAG,8BAA8B,cAAc,KAAK,eAAe,GAAG,CAAC;AACzG,oGAAoG;AACpG,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AACzC,wIAAwI;AACxI,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAExC,4GAA4G;AAC5G,MAAM,CAAC,MAAM,aAAa,GAAW,EAAE,CAAC,mBAAmB,CAAC,EAAE,UAAU,EAAE,CAAC;AAE3E,oHAAoH;AACpH,MAAM,MAAM,GAAW;IACrB,wBAAwB,EAAE,oBAAoB;IAC9C,4BAA4B,EAAE,oBAAoB;IAClD,2BAA2B,EAAE,OAAO;IACpC,8BAA8B,EAAE,QAAQ;IACxC,GAAG,aAAa;CACjB,CAAC;AAEF,2GAA2G;AAC3G,MAAM,UAAU,GAAG,yBAAyB,CAAC;AAC7C,MAAM,WAAW,GAAG,yBAAyB,CAAC;AAC9C,+DAA+D;AAC/D,MAAM,qBAAqB,GAAG,mCAAmC,CAAC;AAElE;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,EAAE,gBAAgB,EAAiB;IAC9D,MAAM,EAAE,GAAG,EAAE,gBAAgB,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,gBAAgB,CAAC;IACjF,OAAO;QACL,kBAAkB,EAAE,KAAK;QACzB,aAAa,EAAE,CAAC,EAAE,YAAY,EAAE,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE;gBACnG,WAAW,EAAE,EAAE,qBAAqB,EAAE,gBAAgB,EAAE;gBACxD,YAAY,EAAE;oBACZ,wEAAwE;oBACxE,cAAc,YAAY,EAAE;oBAC5B,sBAAsB;oBACtB,eAAe,cAAc,EAAE;iBAChC;gBACD,oFAAoF;gBACpF,mFAAmF;gBACnF,kEAAkE;gBAClE,cAAc,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mEAAmE,CAAC,EAAE,EAAE,mBAAmB,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE;aACzL,CAAC;KACH,CAAC;AACJ,CAAC;AAED,uIAAuI;AACvI,SAAS,SAAS,CAAC,EAAE,gBAAgB,EAAiB;IACpD,OAAO;QACL,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,EAAE;QAC9E,EAAE,IAAI,EAAE,yBAAyB,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,oBAAoB,EAAE,EAAE,EAAE;QACjG,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,EAAE;QAC7E,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,UAAU,EAAE;QACjD,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,WAAW,EAAE;QACnD,EAAE,IAAI,EAAE,6BAA6B,EAAE,KAAK,EAAE,oBAAoB,EAAE;QACpE,EAAE,IAAI,EAAE,iCAAiC,EAAE,KAAK,EAAE,OAAO,EAAE;QAC3D,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3F,CAAC;AACJ,CAAC;AAED,oGAAoG;AACpG,MAAM,YAAY,GAAY,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC;AAErK,6EAA6E;AAC7E,SAAS,aAAa,CAAC,EAAE,gBAAgB,EAAiB,EAAE,YAAoB;IAC9E,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,cAAc,CAAC,gBAAgB,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAC9D,IAAI,EAAE,CAAC,6BAA6B,EAAE,oBAAoB,CAAC;QAC3D,SAAS,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;QAClF,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED,6DAA6D;AAC7D,SAAS,IAAI,CAAC,SAAmB,EAAE,SAAmB,EAAE,KAAe;IACrE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACzC,CAAC;AAED,4FAA4F;AAC5F,SAAS,UAAU,CAAC,EAAE,gBAAgB,EAAiB;IACrD,MAAM,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAAC,GAAG,CAAC;IAC3C,MAAM,OAAO,GAAG,CAAC,IAAY,EAAoB,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IAClJ,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,KAAqB,EAAiB,EAAE,CAAC,CAAC;QACpE,UAAU,EAAE,8BAA8B;QAC1C,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE;QAClC,KAAK;KACN,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,QAAgB,EAAE,WAAmB,EAAwB,EAAE,CAAC,CAAC;QAC9F,UAAU,EAAE,8BAA8B;QAC1C,IAAI,EAAE,oBAAoB;QAC1B,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE;QAClC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;QACpE,OAAO,EAAE,EAAE,QAAQ,EAAE,2BAA2B,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE;KACxF,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,mCAAmC,CAAC;IACxD,MAAM,WAAW,GAAG,wCAAwC,CAAC;IAC7D,OAAO;QACL,OAAO,CAAC,kBAAkB,CAAC;QAC3B,OAAO,CAAC,YAAY,CAAC;QACrB,IAAI,CAAC,WAAW,EAAE;YAChB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YACxF,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,wBAAwB,EAAE,+BAA+B,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YACpH,IAAI,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACtE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YACtE,IAAI,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAChE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC/C,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YACxF,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YACjG,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC1F,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAChF,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC/C,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;SACnF,CAAC;QACF,IAAI,CAAC,WAAW,EAAE;YAChB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YACrF,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;YACjC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YACvE,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YACzE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACtC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,mBAAmB,EAAE,wBAAwB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC5E,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;YACrC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACzC,IAAI,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC9D,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;SAC9C,CAAC;QACF,OAAO,CAAC,iCAAiC,EAAE,WAAW,EAAE,kBAAkB,CAAC;QAC3E,OAAO,CAAC,kCAAkC,EAAE,WAAW,EAAE,YAAY,CAAC;KACvE,CAAC;AACJ,CAAC;AAED,kHAAkH;AAClH,SAAS,UAAU,CAAC,MAAqB;IACvC,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,gBAAgB,CAAC;IACxC,OAAO;QACL,UAAU,EAAE,SAAS;QACrB,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,6BAA6B,EAAE,YAAY,EAAE,EAAE;QAC5H,IAAI,EAAE;YACJ,WAAW,EAAE,UAAU;YACvB,uEAAuE;YACvE,GAAG,UAAU,CAAC,GAAG,CAAC;YAClB,QAAQ,EAAE,EAAE,WAAW,EAAE,qBAAqB,EAAE;YAChD,QAAQ,EAAE;gBACR,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,qBAAqB,EAAE,EAAE;gBAC7D,IAAI,EAAE;oBACJ,kBAAkB,EAAE,kBAAkB;oBACtC,iBAAiB,EAAE,yBAAyB;oBAC5C,WAAW,EAAE,CAAC,EAAE,GAAG,EAAE,oBAAoB,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;oBAChE,UAAU,EAAE;wBACV;4BACE,IAAI,EAAE,gBAAgB;4BACtB,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;4BAChC,IAAI,EAAE,CAAC,4BAA4B,EAAE,eAAe,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,kCAAkC,CAAC;4BACxI,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,qBAAqB,UAAU,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;4BACvG,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;4BAClE,aAAa,EAAE,YAAY;4BAC3B,6EAA6E;4BAC7E,eAAe,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE;4BAC3E,SAAS,EAAE,GAAG,CAAC,UAAU,CAAC,SAAS;4BACnC,YAAY,EAAE;gCACZ,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,qBAAqB,EAAE;gCACxD,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE;gCACzE,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE;gCACxF,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE;6BACrD;yBACF;wBACD;4BACE,IAAI,EAAE,aAAa;4BACnB,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC;4BACvC,IAAI,EAAE,CAAC,0BAA0B,EAAE,eAAe,EAAE,OAAO,CAAC;4BAC5D,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,qBAAqB,UAAU,EAAE,CAAC;4BACrE,SAAS,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;4BACnF,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,qBAAqB,EAAE,CAAC;yBACzE;wBACD,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC;qBACpC;oBACD,OAAO,EAAE;wBACP,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE;wBACpC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE;wBAC9E,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE;wBACpF,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;qBACxD;iBACF;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED,2IAA2I;AAC3I,SAAS,WAAW,CAAC,MAAqB;IACxC,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,gBAAgB,CAAC;IACxC,MAAM,SAAS,GAAG,gCAAgC,UAAU,GAAG,CAAC;IAChE,OAAO;QACL,UAAU,EAAE,SAAS;QACrB,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,6BAA6B,EAAE,MAAM,EAAE,EAAE;QAChH,IAAI,EAAE;YACJ,QAAQ,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE;YAC1C,QAAQ,EAAE;gBACR,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,eAAe,EAAE,EAAE;gBACvD,IAAI,EAAE;oBACJ,kBAAkB,EAAE,YAAY;oBAChC,iBAAiB,EAAE,sBAAsB;oBACzC,SAAS,EAAE,yBAAyB;oBACpC,WAAW,EAAE,CAAC,EAAE,GAAG,EAAE,oBAAoB,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;oBAChE,UAAU,EAAE;wBACV;4BACE,IAAI,EAAE,gBAAgB;4BACtB,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;4BAChC,IAAI,EAAE,CAAC,4BAA4B,EAAE,eAAe,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,kCAAkC,CAAC;4BAC3I,GAAG,EAAE;gCACH,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,oBAAoB,EAAE;gCACrD,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,EAAE;gCAC5E,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE;gCACxC,GAAG,SAAS,CAAC,MAAM,CAAC;6BACrB;4BACD,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;4BAClE,aAAa,EAAE,YAAY;4BAC3B,eAAe,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;4BACrC,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS;4BAC7B,YAAY,EAAE;gCACZ,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE;gCACzF,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE;gCACzC,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE;gCACzC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE;gCACzE,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE;gCACxF,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE;gCACpD,yEAAyE;gCACzE,mEAAmE;gCACnE,qCAAqC;gCACrC,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE;6BAC3C;yBACF;wBACD;4BACE,IAAI,EAAE,uBAAuB;4BAC7B,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC;4BACzC,IAAI,EAAE,CAAC,0BAA0B,EAAE,qDAAqD,EAAE,OAAO,CAAC;4BAClG,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,GAAG,SAAS,UAAU,EAAE,CAAC;4BACnH,SAAS,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;4BAClF,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;yBACpH;wBACD,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC;qBACpC;oBACD,OAAO,EAAE;wBACP,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE;wBAClF,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE;wBAChF,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,oCAAoC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE;wBACzG,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE;wBACrE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE;wBAC9E,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE;wBACpF,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;wBACvD,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE;qBAC/F;iBACF;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED,4JAA4J;AAC5J,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,gBAAgB,CAAC;IACxC,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAgB;QAC7B,UAAU,EAAE,mBAAmB;QAC/B,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE;QAC9C,IAAI,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE;KACtD,CAAC;IACF,MAAM,aAAa,GAAoB;QACrC,UAAU,EAAE,sBAAsB;QAClC,IAAI,EAAE,eAAe;QACrB,QAAQ,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,EAAE;QACxD,kFAAkF;QAClF,iDAAiD;QACjD,KAAK,EAAE,aAAa;QACpB,gBAAgB,EAAE,OAAO;QACzB,aAAa,EAAE,KAAK;QACpB,WAAW,EAAE,uDAAuD;KACrE,CAAC;IACF,MAAM,SAAS,GAAgB;QAC7B,UAAU,EAAE,IAAI;QAChB,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE;QACpE,IAAI,EAAE,EAAE,aAAa,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE;KAC5D,CAAC;IACF,wEAAwE;IACxE,MAAM,SAAS,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,qBAAqB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AACtK,CAAC"}