underpost 2.8.79 → 2.8.84

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 (53) hide show
  1. package/.github/workflows/ghpkg.yml +22 -20
  2. package/.github/workflows/npmpkg.yml +15 -10
  3. package/.github/workflows/pwa-microservices-template.page.yml +12 -3
  4. package/.github/workflows/pwa-microservices-template.test.yml +20 -17
  5. package/.vscode/extensions.json +2 -3
  6. package/.vscode/settings.json +2 -42
  7. package/Dockerfile +14 -33
  8. package/README.md +43 -25
  9. package/bin/db.js +1 -0
  10. package/bin/deploy.js +104 -797
  11. package/bin/file.js +18 -1
  12. package/bin/vs.js +18 -3
  13. package/cli.md +367 -207
  14. package/conf.js +4 -0
  15. package/docker-compose.yml +1 -1
  16. package/manifests/deployment/dd-template-development/deployment.yaml +167 -0
  17. package/manifests/deployment/dd-template-development/proxy.yaml +46 -0
  18. package/manifests/deployment/tensorflow/tf-gpu-test.yaml +65 -0
  19. package/manifests/lxd/lxd-admin-profile.yaml +1 -0
  20. package/manifests/lxd/lxd-preseed.yaml +9 -37
  21. package/manifests/lxd/underpost-setup.sh +98 -81
  22. package/manifests/maas/device-scan.sh +43 -0
  23. package/manifests/maas/gpu-diag.sh +19 -0
  24. package/manifests/maas/lxd-preseed.yaml +32 -0
  25. package/manifests/maas/maas-setup.sh +120 -0
  26. package/manifests/maas/nat-iptables.sh +26 -0
  27. package/manifests/maas/snap-clean.sh +26 -0
  28. package/manifests/mariadb/statefulset.yaml +2 -1
  29. package/manifests/mariadb/storage-class.yaml +10 -0
  30. package/manifests/mongodb-4.4/service-deployment.yaml +2 -2
  31. package/manifests/valkey/service.yaml +3 -9
  32. package/manifests/valkey/statefulset.yaml +10 -12
  33. package/package.json +1 -1
  34. package/src/cli/baremetal.js +1280 -0
  35. package/src/cli/cloud-init.js +537 -0
  36. package/src/cli/cluster.js +506 -243
  37. package/src/cli/deploy.js +41 -3
  38. package/src/cli/env.js +2 -2
  39. package/src/cli/image.js +57 -9
  40. package/src/cli/index.js +271 -232
  41. package/src/cli/lxd.js +314 -81
  42. package/src/cli/repository.js +7 -4
  43. package/src/cli/run.js +262 -0
  44. package/src/cli/test.js +1 -1
  45. package/src/index.js +28 -1
  46. package/src/runtime/lampp/Dockerfile +41 -47
  47. package/src/server/conf.js +61 -0
  48. package/src/server/logger.js +3 -3
  49. package/src/server/process.js +16 -19
  50. package/src/server/runtime.js +1 -6
  51. package/src/server/ssl.js +1 -12
  52. package/src/server/valkey.js +3 -3
  53. package/supervisord-openssh-server.conf +0 -5
package/src/cli/deploy.js CHANGED
@@ -81,7 +81,7 @@ spec:
81
81
  spec:
82
82
  containers:
83
83
  - name: ${deployId}-${env}-${suffix}
84
- image: localhost/debian-underpost:${Underpost.version}
84
+ image: localhost/rockylinux9-underpost:${Underpost.version}
85
85
  # resources:
86
86
  # requests:
87
87
  # memory: "${resources.requests.memory}"
@@ -256,8 +256,8 @@ kubectl rollout restart deployment/deployment-name
256
256
  kubectl rollout undo deployment/deployment-name
257
257
  kubectl scale statefulsets <stateful-set-name> --replicas=<new-replicas>
258
258
  kubectl get pods -w
259
- kubectl patch statefulset service-valkey --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"valkey/valkey:latest"}]'
260
- kubectl patch statefulset service-valkey -p '{"spec":{"template":{"spec":{"containers":[{"name":"service-valkey","imagePullPolicy":"Never"}]}}}}'
259
+ kubectl patch statefulset valkey-service --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"valkey/valkey:latest"}]'
260
+ kubectl patch statefulset valkey-service -p '{"spec":{"template":{"spec":{"containers":[{"name":"valkey-service","imagePullPolicy":"Never"}]}}}}'
261
261
  kubectl logs -f <pod-name>
262
262
  kubectl describe pod <pod-name>
263
263
  kubectl exec -it <pod-name> -- bash
@@ -273,6 +273,34 @@ kubectl patch ippool default-ipv4-ippool --type='json' -p='[{"op": "replace", "p
273
273
  kubectl patch ippool default-ipv4-ippool --type='json' -p='[{"op": "replace", "path": "/spec/cidr", "value": "192.168.0.0/24"}]'
274
274
  sudo podman run --rm localhost/<image-name>:<image-version> <command>
275
275
  kubectl get configmap kubelet-config -n kube-system -o yaml > kubelet-config.yaml
276
+ kubectl -n kube-system rollout restart daemonset kube-proxy
277
+ kubectl get EndpointSlice -o wide --all-namespaces -w
278
+ kubectl apply -k manifests/deployment/adminer/.
279
+ kubectl wait --for=condition=Ready pod/busybox1
280
+ kubectl wait --for=jsonpath='{.status.phase}'=Running pod/busybox1
281
+ kubectl wait --for='jsonpath={.status.conditions[?(@.type=="Ready")].status}=True' pod/busybox1
282
+ kubectl wait --for=delete pod/busybox1 --timeout=60s
283
+
284
+ kubectl run --rm -it test-dns --image=busybox:latest --restart=Never -- /bin/sh -c "
285
+ nslookup kubernetes.default.svc.cluster.local;
286
+ nslookup mongodb-service.default.svc.cluster.local;
287
+ nslookup valkey-service.default.svc.cluster.local;
288
+ nc -vz mongodb-service 27017;
289
+ nc -vz valkey-service 6379;
290
+ echo exit code: \\\$?
291
+ "
292
+
293
+ kubectl apply -f - <<EOF
294
+ apiVersion: apps/v1
295
+ kind: StatefulSet
296
+ metadata:
297
+ name: ...
298
+ EOF
299
+
300
+ https://org.ngc.nvidia.com/setup/api-keys
301
+ docker login nvcr.io
302
+ Username: $oauthtoken
303
+ Password: <Your Key>
276
304
  `);
277
305
  if (deployList === 'dd' && fs.existsSync(`./engine-private/deploy/dd.router`))
278
306
  deployList = fs.readFileSync(`./engine-private/deploy/dd.router`, 'utf8');
@@ -308,6 +336,7 @@ kubectl get configmap kubelet-config -n kube-system -o yaml > kubelet-config.yam
308
336
  if (options.restoreHosts === true) {
309
337
  renderHosts = etcHost(concatHots);
310
338
  fs.writeFileSync(`/etc/hosts`, renderHosts, 'utf8');
339
+ logger.info(renderHosts);
311
340
  return;
312
341
  }
313
342
 
@@ -490,6 +519,15 @@ node bin/deploy build-full-client ${deployId}
490
519
  logger.error(error, error.stack);
491
520
  }
492
521
  },
522
+ existsContainerFile({ podName, path }) {
523
+ return JSON.parse(
524
+ shellExec(`kubectl exec ${podName} -- test -f ${path} && echo "true" || echo "false"`, {
525
+ stdout: true,
526
+ disableLog: true,
527
+ silent: true,
528
+ }).trim(),
529
+ );
530
+ },
493
531
  };
494
532
  }
495
533
 
package/src/cli/env.js CHANGED
@@ -25,7 +25,7 @@ class UnderpostRootEnv {
25
25
  delete env[key];
26
26
  writeEnv(envPath, env);
27
27
  },
28
- get(key) {
28
+ get(key, value, options = { plain: false }) {
29
29
  const exeRootPath = `${getNpmRootPath()}/underpost`;
30
30
  const envPath = `${exeRootPath}/.env`;
31
31
  if (!fs.existsSync(envPath)) {
@@ -33,7 +33,7 @@ class UnderpostRootEnv {
33
33
  return undefined;
34
34
  }
35
35
  const env = dotenv.parse(fs.readFileSync(envPath, 'utf8'));
36
- logger.info(`${key}(${typeof env[key]})`, env[key]);
36
+ options?.plain === true ? console.log(env[key]) : logger.info(`${key}(${typeof env[key]})`, env[key]);
37
37
  return env[key];
38
38
  },
39
39
  list() {
package/src/cli/image.js CHANGED
@@ -12,24 +12,63 @@ const logger = loggerFactory(import.meta);
12
12
  class UnderpostImage {
13
13
  static API = {
14
14
  dockerfile: {
15
+ /**
16
+ * @method pullBaseImages
17
+ * @description Pulls base images and builds a 'rockylinux9-underpost' image,
18
+ * then loads it into the specified Kubernetes cluster type (Kind, Kubeadm, or K3s).
19
+ * @param {object} options - Options for pulling and loading images.
20
+ * @param {boolean} [options.kindLoad=false] - If true, load image into Kind cluster.
21
+ * @param {boolean} [options.kubeadmLoad=false] - If true, load image into Kubeadm cluster.
22
+ * @param {boolean} [options.k3sLoad=false] - If true, load image into K3s cluster.
23
+ * @param {string} [options.path=false] - Path to the Dockerfile context.
24
+ * @param {string} [options.version=''] - Version tag for the image.
25
+ */
15
26
  pullBaseImages(
16
27
  options = {
17
28
  kindLoad: false,
18
29
  kubeadmLoad: false,
30
+ k3sLoad: false,
19
31
  path: false,
20
32
  version: '',
21
33
  },
22
34
  ) {
23
- shellExec(`sudo podman pull docker.io/library/debian:buster`);
24
- const IMAGE_NAME = `debian-underpost`;
35
+ // shellExec(`sudo podman pull docker.io/library/debian:buster`);
36
+ shellExec(`sudo podman pull docker.io/library/rockylinux:9`);
37
+ const IMAGE_NAME = `rockylinux9-underpost`;
25
38
  const IMAGE_NAME_FULL = `${IMAGE_NAME}:${options.version ?? Underpost.version}`;
26
- const LOAD_TYPE = options.kindLoad === true ? `--kin-load` : `--kubeadm-load`;
39
+ let LOAD_TYPE = '';
40
+ if (options.kindLoad === true) {
41
+ LOAD_TYPE = `--kind-load`;
42
+ } else if (options.kubeadmLoad === true) {
43
+ LOAD_TYPE = `--kubeadm-load`;
44
+ } else if (options.k3sLoad === true) {
45
+ // Handle K3s load type
46
+ LOAD_TYPE = `--k3s-load`;
47
+ }
48
+
27
49
  shellExec(
28
- `underpost dockerfile-image-build --podman-save --no-cache --image-path=. --path ${
50
+ `underpost dockerfile-image-build --podman-save --reset --image-path=. --path ${
29
51
  options.path ?? getUnderpostRootPath()
30
52
  } --image-name=${IMAGE_NAME_FULL} ${LOAD_TYPE}`,
31
53
  );
32
54
  },
55
+ /**
56
+ * @method build
57
+ * @description Builds a Docker image using Podman, optionally saves it as a tar archive,
58
+ * and loads it into a specified Kubernetes cluster (Kind, Kubeadm, or K3s).
59
+ * @param {object} options - Options for building and loading images.
60
+ * @param {string} [options.path=''] - The path to the directory containing the Dockerfile.
61
+ * @param {string} [options.imageName=''] - The name and tag for the image (e.g., 'my-app:latest').
62
+ * @param {string} [options.imagePath=''] - Directory to save the image tar file.
63
+ * @param {string} [options.dockerfileName=''] - Name of the Dockerfile (defaults to 'Dockerfile').
64
+ * @param {boolean} [options.podmanSave=false] - If true, save the image as a tar archive using Podman.
65
+ * @param {boolean} [options.kindLoad=false] - If true, load the image archive into a Kind cluster.
66
+ * @param {boolean} [options.kubeadmLoad=false] - If true, load the image archive into a Kubeadm cluster (uses 'ctr').
67
+ * @param {boolean} [options.k3sLoad=false] - If true, load the image archive into a K3s cluster (uses 'k3s ctr').
68
+ * @param {boolean} [options.secrets=false] - If true, load secrets from the .env file for the build.
69
+ * @param {string} [options.secretsPath=''] - Custom path to the .env file for secrets.
70
+ * @param {boolean} [options.reset=false] - If true, perform a no-cache build.
71
+ */
33
72
  build(
34
73
  options = {
35
74
  path: '',
@@ -39,9 +78,10 @@ class UnderpostImage {
39
78
  podmanSave: false,
40
79
  kindLoad: false,
41
80
  kubeadmLoad: false,
81
+ k3sLoad: false,
42
82
  secrets: false,
43
83
  secretsPath: '',
44
- noCache: false,
84
+ reset: false,
45
85
  },
46
86
  ) {
47
87
  const {
@@ -53,8 +93,9 @@ class UnderpostImage {
53
93
  secrets,
54
94
  secretsPath,
55
95
  kindLoad,
56
- noCache,
57
96
  kubeadmLoad,
97
+ k3sLoad,
98
+ reset,
58
99
  } = options;
59
100
  const podManImg = `localhost/${imageName}`;
60
101
  if (imagePath && typeof imagePath === 'string' && !fs.existsSync(imagePath))
@@ -71,11 +112,11 @@ class UnderpostImage {
71
112
  ),
72
113
  );
73
114
  for (const key of Object.keys(envObj)) {
74
- secretsInput += ` && export ${key}="${envObj[key]}" `; // $(cat gitlab-token.txt)
115
+ secretsInput += ` && export ${key}="${envObj[key]}" `; // Example: $(cat gitlab-token.txt)
75
116
  secretDockerInput += ` --secret id=${key},env=${key} \ `;
76
117
  }
77
118
  }
78
- if (noCache === true) cache += ' --rm --no-cache';
119
+ if (reset === true) cache += ' --rm --no-cache';
79
120
  if (path && typeof path === 'string')
80
121
  shellExec(
81
122
  `cd ${path}${secretsInput}&& sudo podman build -f ./${
@@ -85,7 +126,14 @@ class UnderpostImage {
85
126
 
86
127
  if (podmanSave === true) shellExec(`podman save -o ${tarFile} ${podManImg}`);
87
128
  if (kindLoad === true) shellExec(`sudo kind load image-archive ${tarFile}`);
88
- if (kubeadmLoad === true) shellExec(`sudo ctr -n k8s.io images import ${tarFile}`);
129
+ if (kubeadmLoad === true) {
130
+ // Use 'ctr' for Kubeadm
131
+ shellExec(`sudo ctr -n k8s.io images import ${tarFile}`);
132
+ }
133
+ if (k3sLoad === true) {
134
+ // Use 'k3s ctr' for K3s
135
+ shellExec(`sudo k3s ctr images import ${tarFile}`);
136
+ }
89
137
  },
90
138
  },
91
139
  };