@flui-cloud/cli 0.0.1
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 +661 -0
- package/README.md +124 -0
- package/bin/run +17 -0
- package/lib/cli/src/background/cluster-worker.d.ts +11 -0
- package/lib/cli/src/background/cluster-worker.js +90 -0
- package/lib/cli/src/cli-providers.module.d.ts +2 -0
- package/lib/cli/src/cli-providers.module.js +118 -0
- package/lib/cli/src/cli.module.d.ts +13 -0
- package/lib/cli/src/cli.module.js +80 -0
- package/lib/cli/src/commands/_diag-oidc.d.ts +6 -0
- package/lib/cli/src/commands/_diag-oidc.js +132 -0
- package/lib/cli/src/commands/app/backup/create.d.ts +20 -0
- package/lib/cli/src/commands/app/backup/create.js +128 -0
- package/lib/cli/src/commands/app/backup/delete.d.ts +19 -0
- package/lib/cli/src/commands/app/backup/delete.js +95 -0
- package/lib/cli/src/commands/app/build.d.ts +17 -0
- package/lib/cli/src/commands/app/build.js +133 -0
- package/lib/cli/src/commands/app/builds.d.ts +14 -0
- package/lib/cli/src/commands/app/builds.js +82 -0
- package/lib/cli/src/commands/app/crash.d.ts +16 -0
- package/lib/cli/src/commands/app/crash.js +106 -0
- package/lib/cli/src/commands/app/crashes.d.ts +15 -0
- package/lib/cli/src/commands/app/crashes.js +99 -0
- package/lib/cli/src/commands/app/delete.d.ts +16 -0
- package/lib/cli/src/commands/app/delete.js +149 -0
- package/lib/cli/src/commands/app/image/delete.d.ts +18 -0
- package/lib/cli/src/commands/app/image/delete.js +72 -0
- package/lib/cli/src/commands/app/init.d.ts +40 -0
- package/lib/cli/src/commands/app/init.js +436 -0
- package/lib/cli/src/commands/app/list.d.ts +11 -0
- package/lib/cli/src/commands/app/list.js +84 -0
- package/lib/cli/src/commands/app/logs.d.ts +18 -0
- package/lib/cli/src/commands/app/logs.js +121 -0
- package/lib/cli/src/commands/app/metrics.d.ts +17 -0
- package/lib/cli/src/commands/app/metrics.js +100 -0
- package/lib/cli/src/commands/app/redeploy.d.ts +14 -0
- package/lib/cli/src/commands/app/redeploy.js +60 -0
- package/lib/cli/src/commands/app/releases.d.ts +15 -0
- package/lib/cli/src/commands/app/releases.js +117 -0
- package/lib/cli/src/commands/app/restart.d.ts +12 -0
- package/lib/cli/src/commands/app/restart.js +44 -0
- package/lib/cli/src/commands/app/scale.d.ts +13 -0
- package/lib/cli/src/commands/app/scale.js +58 -0
- package/lib/cli/src/commands/app/snapshot/create.d.ts +14 -0
- package/lib/cli/src/commands/app/snapshot/create.js +85 -0
- package/lib/cli/src/commands/app/snapshot/delete.d.ts +14 -0
- package/lib/cli/src/commands/app/snapshot/delete.js +63 -0
- package/lib/cli/src/commands/app/snapshot/list.d.ts +11 -0
- package/lib/cli/src/commands/app/snapshot/list.js +82 -0
- package/lib/cli/src/commands/app/snapshot/restore.d.ts +15 -0
- package/lib/cli/src/commands/app/snapshot/restore.js +74 -0
- package/lib/cli/src/commands/app/snapshot/swap.d.ts +15 -0
- package/lib/cli/src/commands/app/snapshot/swap.js +68 -0
- package/lib/cli/src/commands/app/start.d.ts +12 -0
- package/lib/cli/src/commands/app/start.js +45 -0
- package/lib/cli/src/commands/app/status.d.ts +15 -0
- package/lib/cli/src/commands/app/status.js +108 -0
- package/lib/cli/src/commands/app/stop.d.ts +12 -0
- package/lib/cli/src/commands/app/stop.js +45 -0
- package/lib/cli/src/commands/app/versions.d.ts +14 -0
- package/lib/cli/src/commands/app/versions.js +80 -0
- package/lib/cli/src/commands/auth/generate-api-key.d.ts +12 -0
- package/lib/cli/src/commands/auth/generate-api-key.js +90 -0
- package/lib/cli/src/commands/auth/login.d.ts +11 -0
- package/lib/cli/src/commands/auth/login.js +296 -0
- package/lib/cli/src/commands/auth/reset-password.d.ts +15 -0
- package/lib/cli/src/commands/auth/reset-password.js +253 -0
- package/lib/cli/src/commands/backup/destination/create.d.ts +22 -0
- package/lib/cli/src/commands/backup/destination/create.js +102 -0
- package/lib/cli/src/commands/backup/destination/delete.d.ts +11 -0
- package/lib/cli/src/commands/backup/destination/delete.js +46 -0
- package/lib/cli/src/commands/backup/destination/list.d.ts +9 -0
- package/lib/cli/src/commands/backup/destination/list.js +42 -0
- package/lib/cli/src/commands/backup/destination/show.d.ts +11 -0
- package/lib/cli/src/commands/backup/destination/show.js +45 -0
- package/lib/cli/src/commands/backup/destination/test.d.ts +8 -0
- package/lib/cli/src/commands/backup/destination/test.js +39 -0
- package/lib/cli/src/commands/backup/job/list.d.ts +9 -0
- package/lib/cli/src/commands/backup/job/list.js +38 -0
- package/lib/cli/src/commands/backup/job/run.d.ts +8 -0
- package/lib/cli/src/commands/backup/job/run.js +32 -0
- package/lib/cli/src/commands/backup/job/show.d.ts +11 -0
- package/lib/cli/src/commands/backup/job/show.js +38 -0
- package/lib/cli/src/commands/backup/policy/create.d.ts +21 -0
- package/lib/cli/src/commands/backup/policy/create.js +97 -0
- package/lib/cli/src/commands/backup/policy/delete.d.ts +11 -0
- package/lib/cli/src/commands/backup/policy/delete.js +42 -0
- package/lib/cli/src/commands/backup/policy/list.d.ts +9 -0
- package/lib/cli/src/commands/backup/policy/list.js +40 -0
- package/lib/cli/src/commands/backup/policy/show.d.ts +11 -0
- package/lib/cli/src/commands/backup/policy/show.js +45 -0
- package/lib/cli/src/commands/backup/restore/create.d.ts +14 -0
- package/lib/cli/src/commands/backup/restore/create.js +68 -0
- package/lib/cli/src/commands/backup/restore/list.d.ts +8 -0
- package/lib/cli/src/commands/backup/restore/list.js +33 -0
- package/lib/cli/src/commands/backup/restore/preview.d.ts +9 -0
- package/lib/cli/src/commands/backup/restore/preview.js +29 -0
- package/lib/cli/src/commands/backup/restore/show.d.ts +11 -0
- package/lib/cli/src/commands/backup/restore/show.js +40 -0
- package/lib/cli/src/commands/catalog/validate.d.ts +14 -0
- package/lib/cli/src/commands/catalog/validate.js +155 -0
- package/lib/cli/src/commands/cluster/destroy.d.ts +15 -0
- package/lib/cli/src/commands/cluster/destroy.js +137 -0
- package/lib/cli/src/commands/config/get.d.ts +9 -0
- package/lib/cli/src/commands/config/get.js +47 -0
- package/lib/cli/src/commands/config/list.d.ts +15 -0
- package/lib/cli/src/commands/config/list.js +109 -0
- package/lib/cli/src/commands/config/remove.d.ts +12 -0
- package/lib/cli/src/commands/config/remove.js +92 -0
- package/lib/cli/src/commands/config/set.d.ts +15 -0
- package/lib/cli/src/commands/config/set.js +152 -0
- package/lib/cli/src/commands/config/show.d.ts +6 -0
- package/lib/cli/src/commands/config/show.js +15 -0
- package/lib/cli/src/commands/context/create.d.ts +12 -0
- package/lib/cli/src/commands/context/create.js +46 -0
- package/lib/cli/src/commands/context/delete.d.ts +12 -0
- package/lib/cli/src/commands/context/delete.js +53 -0
- package/lib/cli/src/commands/context/list.d.ts +6 -0
- package/lib/cli/src/commands/context/list.js +29 -0
- package/lib/cli/src/commands/context/show.d.ts +6 -0
- package/lib/cli/src/commands/context/show.js +12 -0
- package/lib/cli/src/commands/context/use.d.ts +9 -0
- package/lib/cli/src/commands/context/use.js +30 -0
- package/lib/cli/src/commands/deploy.d.ts +49 -0
- package/lib/cli/src/commands/deploy.js +542 -0
- package/lib/cli/src/commands/dev/creds.d.ts +19 -0
- package/lib/cli/src/commands/dev/creds.js +290 -0
- package/lib/cli/src/commands/dev/tunnel.d.ts +15 -0
- package/lib/cli/src/commands/dev/tunnel.js +268 -0
- package/lib/cli/src/commands/dns/cleanup.d.ts +11 -0
- package/lib/cli/src/commands/dns/cleanup.js +93 -0
- package/lib/cli/src/commands/env/capacity.d.ts +12 -0
- package/lib/cli/src/commands/env/capacity.js +177 -0
- package/lib/cli/src/commands/env/create.d.ts +21 -0
- package/lib/cli/src/commands/env/create.js +721 -0
- package/lib/cli/src/commands/env/credentials.d.ts +21 -0
- package/lib/cli/src/commands/env/credentials.js +435 -0
- package/lib/cli/src/commands/env/destroy.d.ts +9 -0
- package/lib/cli/src/commands/env/destroy.js +145 -0
- package/lib/cli/src/commands/env/diag-ca.d.ts +14 -0
- package/lib/cli/src/commands/env/diag-ca.js +192 -0
- package/lib/cli/src/commands/env/export-config.d.ts +39 -0
- package/lib/cli/src/commands/env/export-config.js +386 -0
- package/lib/cli/src/commands/env/force-ready.d.ts +10 -0
- package/lib/cli/src/commands/env/force-ready.js +222 -0
- package/lib/cli/src/commands/env/inspect.d.ts +12 -0
- package/lib/cli/src/commands/env/inspect.js +192 -0
- package/lib/cli/src/commands/env/kubectl.d.ts +9 -0
- package/lib/cli/src/commands/env/kubectl.js +33 -0
- package/lib/cli/src/commands/env/logs.d.ts +12 -0
- package/lib/cli/src/commands/env/logs.js +136 -0
- package/lib/cli/src/commands/env/orphan-volumes.d.ts +11 -0
- package/lib/cli/src/commands/env/orphan-volumes.js +153 -0
- package/lib/cli/src/commands/env/refresh-kubeconfig.d.ts +6 -0
- package/lib/cli/src/commands/env/refresh-kubeconfig.js +66 -0
- package/lib/cli/src/commands/env/repair-ssh-ca.d.ts +11 -0
- package/lib/cli/src/commands/env/repair-ssh-ca.js +137 -0
- package/lib/cli/src/commands/env/restart.d.ts +10 -0
- package/lib/cli/src/commands/env/restart.js +187 -0
- package/lib/cli/src/commands/env/scale-master.d.ts +11 -0
- package/lib/cli/src/commands/env/scale-master.js +160 -0
- package/lib/cli/src/commands/env/scale-node.d.ts +14 -0
- package/lib/cli/src/commands/env/scale-node.js +139 -0
- package/lib/cli/src/commands/env/status.d.ts +10 -0
- package/lib/cli/src/commands/env/status.js +182 -0
- package/lib/cli/src/commands/env/stop.d.ts +6 -0
- package/lib/cli/src/commands/env/stop.js +147 -0
- package/lib/cli/src/commands/env/storage-expand.d.ts +10 -0
- package/lib/cli/src/commands/env/storage-expand.js +124 -0
- package/lib/cli/src/commands/env/storage.d.ts +8 -0
- package/lib/cli/src/commands/env/storage.js +92 -0
- package/lib/cli/src/commands/env/sync.d.ts +17 -0
- package/lib/cli/src/commands/env/sync.js +225 -0
- package/lib/cli/src/commands/env/uncordon.d.ts +9 -0
- package/lib/cli/src/commands/env/uncordon.js +73 -0
- package/lib/cli/src/commands/env/update-firewall.d.ts +9 -0
- package/lib/cli/src/commands/env/update-firewall.js +185 -0
- package/lib/cli/src/commands/integration/connect.d.ts +13 -0
- package/lib/cli/src/commands/integration/connect.js +161 -0
- package/lib/cli/src/commands/integration/ghcr-pat/revoke.d.ts +9 -0
- package/lib/cli/src/commands/integration/ghcr-pat/revoke.js +61 -0
- package/lib/cli/src/commands/integration/ghcr-pat/set.d.ts +12 -0
- package/lib/cli/src/commands/integration/ghcr-pat/set.js +141 -0
- package/lib/cli/src/commands/integration/ghcr-pat/status.d.ts +6 -0
- package/lib/cli/src/commands/integration/ghcr-pat/status.js +69 -0
- package/lib/cli/src/commands/integration/installations.d.ts +6 -0
- package/lib/cli/src/commands/integration/installations.js +45 -0
- package/lib/cli/src/commands/integration/list.d.ts +8 -0
- package/lib/cli/src/commands/integration/list.js +67 -0
- package/lib/cli/src/commands/integration/remove-installation.d.ts +12 -0
- package/lib/cli/src/commands/integration/remove-installation.js +71 -0
- package/lib/cli/src/commands/integration/setup-github-app.d.ts +10 -0
- package/lib/cli/src/commands/integration/setup-github-app.js +162 -0
- package/lib/cli/src/commands/node/add.d.ts +11 -0
- package/lib/cli/src/commands/node/add.js +103 -0
- package/lib/cli/src/commands/node/list.d.ts +11 -0
- package/lib/cli/src/commands/node/list.js +83 -0
- package/lib/cli/src/commands/node/remove.d.ts +16 -0
- package/lib/cli/src/commands/node/remove.js +161 -0
- package/lib/cli/src/commands/reconcile.d.ts +19 -0
- package/lib/cli/src/commands/reconcile.js +171 -0
- package/lib/cli/src/commands/repo/connect.d.ts +12 -0
- package/lib/cli/src/commands/repo/connect.js +133 -0
- package/lib/cli/src/commands/repo/disconnect.d.ts +12 -0
- package/lib/cli/src/commands/repo/disconnect.js +73 -0
- package/lib/cli/src/commands/repo/list.d.ts +9 -0
- package/lib/cli/src/commands/repo/list.js +66 -0
- package/lib/cli/src/commands/server-types/list.d.ts +12 -0
- package/lib/cli/src/commands/server-types/list.js +205 -0
- package/lib/cli/src/commands/ssh.d.ts +9 -0
- package/lib/cli/src/commands/ssh.js +94 -0
- package/lib/cli/src/commands/standalone/install.d.ts +27 -0
- package/lib/cli/src/commands/standalone/install.js +330 -0
- package/lib/cli/src/commands/template/use.d.ts +16 -0
- package/lib/cli/src/commands/template/use.js +111 -0
- package/lib/cli/src/commands/update.d.ts +6 -0
- package/lib/cli/src/commands/update.js +87 -0
- package/lib/cli/src/config/bootstrap.config.d.ts +37 -0
- package/lib/cli/src/config/bootstrap.config.js +33 -0
- package/lib/cli/src/config/defaults.d.ts +46 -0
- package/lib/cli/src/config/defaults.js +79 -0
- package/lib/cli/src/config/key-router.d.ts +22 -0
- package/lib/cli/src/config/key-router.js +45 -0
- package/lib/cli/src/config/preferences-echo.d.ts +9 -0
- package/lib/cli/src/config/preferences-echo.js +61 -0
- package/lib/cli/src/config/preferences-resolver.d.ts +43 -0
- package/lib/cli/src/config/preferences-resolver.js +100 -0
- package/lib/cli/src/config/preferences-schema.d.ts +32 -0
- package/lib/cli/src/config/preferences-schema.js +53 -0
- package/lib/cli/src/hooks/command_not_found.d.ts +3 -0
- package/lib/cli/src/hooks/command_not_found.js +44 -0
- package/lib/cli/src/lib/api-client.d.ts +58 -0
- package/lib/cli/src/lib/api-client.js +162 -0
- package/lib/cli/src/lib/backup-client.d.ts +131 -0
- package/lib/cli/src/lib/backup-client.js +78 -0
- package/lib/cli/src/lib/browser-callback.d.ts +3 -0
- package/lib/cli/src/lib/browser-callback.js +83 -0
- package/lib/cli/src/lib/byos-precheck.d.ts +29 -0
- package/lib/cli/src/lib/byos-precheck.js +162 -0
- package/lib/cli/src/lib/ca-utils.d.ts +13 -0
- package/lib/cli/src/lib/ca-utils.js +72 -0
- package/lib/cli/src/lib/cli-credential-provider.service.d.ts +31 -0
- package/lib/cli/src/lib/cli-credential-provider.service.js +86 -0
- package/lib/cli/src/lib/config-storage.d.ts +128 -0
- package/lib/cli/src/lib/config-storage.js +349 -0
- package/lib/cli/src/lib/config.d.ts +23 -0
- package/lib/cli/src/lib/config.js +113 -0
- package/lib/cli/src/lib/context-banner.d.ts +12 -0
- package/lib/cli/src/lib/context-banner.js +25 -0
- package/lib/cli/src/lib/format-bytes.d.ts +1 -0
- package/lib/cli/src/lib/format-bytes.js +18 -0
- package/lib/cli/src/lib/framework-detector.d.ts +12 -0
- package/lib/cli/src/lib/framework-detector.js +216 -0
- package/lib/cli/src/lib/framework-postchecks.d.ts +11 -0
- package/lib/cli/src/lib/framework-postchecks.js +152 -0
- package/lib/cli/src/lib/nest-app.d.ts +17 -0
- package/lib/cli/src/lib/nest-app.js +69 -0
- package/lib/cli/src/lib/nip-base-domain.util.d.ts +8 -0
- package/lib/cli/src/lib/nip-base-domain.util.js +17 -0
- package/lib/cli/src/lib/profile-manager.d.ts +56 -0
- package/lib/cli/src/lib/profile-manager.js +207 -0
- package/lib/cli/src/lib/prompts.d.ts +67 -0
- package/lib/cli/src/lib/prompts.js +475 -0
- package/lib/cli/src/lib/provider-credential-schemas.d.ts +29 -0
- package/lib/cli/src/lib/provider-credential-schemas.js +48 -0
- package/lib/cli/src/lib/repositories/cli-cluster.repository.d.ts +56 -0
- package/lib/cli/src/lib/repositories/cli-cluster.repository.js +216 -0
- package/lib/cli/src/lib/repositories/cli-firewall.repository.d.ts +13 -0
- package/lib/cli/src/lib/repositories/cli-firewall.repository.js +147 -0
- package/lib/cli/src/lib/repositories/cli-node.repository.d.ts +26 -0
- package/lib/cli/src/lib/repositories/cli-node.repository.js +164 -0
- package/lib/cli/src/lib/repositories/cli-operation.repository.d.ts +57 -0
- package/lib/cli/src/lib/repositories/cli-operation.repository.js +226 -0
- package/lib/cli/src/lib/repositories/cli-vnet.repository.d.ts +22 -0
- package/lib/cli/src/lib/repositories/cli-vnet.repository.js +175 -0
- package/lib/cli/src/lib/repositories/index.d.ts +5 -0
- package/lib/cli/src/lib/repositories/index.js +21 -0
- package/lib/cli/src/lib/resolve-cluster.d.ts +16 -0
- package/lib/cli/src/lib/resolve-cluster.js +34 -0
- package/lib/cli/src/lib/scaleway-validator.d.ts +5 -0
- package/lib/cli/src/lib/scaleway-validator.js +87 -0
- package/lib/cli/src/lib/server-utils.d.ts +8 -0
- package/lib/cli/src/lib/server-utils.js +19 -0
- package/lib/cli/src/lib/services/cli-app.service.d.ts +294 -0
- package/lib/cli/src/lib/services/cli-app.service.js +162 -0
- package/lib/cli/src/lib/services/cli-node.service.d.ts +43 -0
- package/lib/cli/src/lib/services/cli-node.service.js +34 -0
- package/lib/cli/src/lib/services/provider-sync.service.d.ts +90 -0
- package/lib/cli/src/lib/services/provider-sync.service.js +178 -0
- package/lib/cli/src/lib/services/reconciliation.service.d.ts +40 -0
- package/lib/cli/src/lib/services/reconciliation.service.js +119 -0
- package/lib/cli/src/lib/services/vnet-provisioning.service.d.ts +37 -0
- package/lib/cli/src/lib/services/vnet-provisioning.service.js +164 -0
- package/lib/cli/src/lib/ssh-key.d.ts +23 -0
- package/lib/cli/src/lib/ssh-key.js +126 -0
- package/lib/cli/src/lib/template-fetcher.d.ts +25 -0
- package/lib/cli/src/lib/template-fetcher.js +48 -0
- package/lib/cli/src/lib/templates/firewall-rules.d.ts +8 -0
- package/lib/cli/src/lib/templates/firewall-rules.js +17 -0
- package/lib/cli/src/lib/typeorm-shim.d.ts +12 -0
- package/lib/cli/src/lib/typeorm-shim.js +17 -0
- package/lib/cli/src/lib/utils/env-file.d.ts +2 -0
- package/lib/cli/src/lib/utils/env-file.js +40 -0
- package/lib/cli/src/lib/utils/ip-detection.d.ts +27 -0
- package/lib/cli/src/lib/utils/ip-detection.js +144 -0
- package/lib/cli/src/modules/cli-infrastructure.module.d.ts +14 -0
- package/lib/cli/src/modules/cli-infrastructure.module.js +249 -0
- package/lib/cli/src/services/cli-ca.service.d.ts +62 -0
- package/lib/cli/src/services/cli-ca.service.js +281 -0
- package/lib/cli/src/services/cli-cluster-creator.service.d.ts +78 -0
- package/lib/cli/src/services/cli-cluster-creator.service.js +655 -0
- package/lib/cli/src/services/cli-clusters.service.d.ts +74 -0
- package/lib/cli/src/services/cli-clusters.service.js +762 -0
- package/lib/cli/src/services/cli-endpoint-resolver.service.d.ts +33 -0
- package/lib/cli/src/services/cli-endpoint-resolver.service.js +195 -0
- package/lib/cli/src/services/cli-k3s-script.service.d.ts +114 -0
- package/lib/cli/src/services/cli-k3s-script.service.js +288 -0
- package/lib/cli/src/services/cli-logger.service.d.ts +56 -0
- package/lib/cli/src/services/cli-logger.service.js +188 -0
- package/lib/cli/src/services/cli-observability-cluster.service.d.ts +128 -0
- package/lib/cli/src/services/cli-observability-cluster.service.js +525 -0
- package/lib/cli/src/services/cli-ssh.service.d.ts +90 -0
- package/lib/cli/src/services/cli-ssh.service.js +457 -0
- package/lib/cli/src/services/server-type-cache.service.d.ts +34 -0
- package/lib/cli/src/services/server-type-cache.service.js +156 -0
- package/lib/cli/src/services/server-type-validator.service.d.ts +80 -0
- package/lib/cli/src/services/server-type-validator.service.js +366 -0
- package/lib/cli/src/types/index.d.ts +41 -0
- package/lib/cli/src/types/index.js +2 -0
- package/lib/src/common/utils/project-root.util.d.ts +22 -0
- package/lib/src/common/utils/project-root.util.js +78 -0
- package/lib/src/modules/access/access.controller.d.ts +30 -0
- package/lib/src/modules/access/access.controller.js +336 -0
- package/lib/src/modules/access/access.module.d.ts +2 -0
- package/lib/src/modules/access/access.module.js +92 -0
- package/lib/src/modules/access/controllers/ca.controller.d.ts +22 -0
- package/lib/src/modules/access/controllers/ca.controller.js +242 -0
- package/lib/src/modules/access/dto/api-token.dto.d.ts +11 -0
- package/lib/src/modules/access/dto/api-token.dto.js +74 -0
- package/lib/src/modules/access/dto/bearer-token.dto.d.ts +7 -0
- package/lib/src/modules/access/dto/bearer-token.dto.js +36 -0
- package/lib/src/modules/access/dto/ca-public-key.dto.d.ts +7 -0
- package/lib/src/modules/access/dto/ca-public-key.dto.js +52 -0
- package/lib/src/modules/access/dto/create-api-token.dto.d.ts +7 -0
- package/lib/src/modules/access/dto/create-api-token.dto.js +64 -0
- package/lib/src/modules/access/dto/create-bearer-token.dto.d.ts +9 -0
- package/lib/src/modules/access/dto/create-bearer-token.dto.js +58 -0
- package/lib/src/modules/access/dto/create-ssh-key.dto.d.ts +7 -0
- package/lib/src/modules/access/dto/create-ssh-key.dto.js +61 -0
- package/lib/src/modules/access/dto/refresh-token.dto.d.ts +7 -0
- package/lib/src/modules/access/dto/refresh-token.dto.js +46 -0
- package/lib/src/modules/access/dto/register-ca.dto.d.ts +16 -0
- package/lib/src/modules/access/dto/register-ca.dto.js +111 -0
- package/lib/src/modules/access/dto/ssh-key.dto.d.ts +20 -0
- package/lib/src/modules/access/dto/ssh-key.dto.js +124 -0
- package/lib/src/modules/access/dto/update-ssh-key.dto.d.ts +7 -0
- package/lib/src/modules/access/dto/update-ssh-key.dto.js +73 -0
- package/lib/src/modules/access/entities/api-token.entity.d.ts +30 -0
- package/lib/src/modules/access/entities/api-token.entity.js +87 -0
- package/lib/src/modules/access/entities/ca-keypair.entity.d.ts +13 -0
- package/lib/src/modules/access/entities/ca-keypair.entity.js +63 -0
- package/lib/src/modules/access/entities/credentials.entity.d.ts +18 -0
- package/lib/src/modules/access/entities/credentials.entity.js +87 -0
- package/lib/src/modules/access/entities/ssh-key.entity.d.ts +15 -0
- package/lib/src/modules/access/entities/ssh-key.entity.js +81 -0
- package/lib/src/modules/access/enums/credential-purpose.enum.d.ts +4 -0
- package/lib/src/modules/access/enums/credential-purpose.enum.js +8 -0
- package/lib/src/modules/access/interfaces/access.repository.d.ts +11 -0
- package/lib/src/modules/access/interfaces/access.repository.js +2 -0
- package/lib/src/modules/access/interfaces/ssh-key.interface.d.ts +26 -0
- package/lib/src/modules/access/interfaces/ssh-key.interface.js +2 -0
- package/lib/src/modules/access/mapper/api-token.mapper.d.ts +6 -0
- package/lib/src/modules/access/mapper/api-token.mapper.js +21 -0
- package/lib/src/modules/access/mapper/ssh-key.mapper.d.ts +6 -0
- package/lib/src/modules/access/mapper/ssh-key.mapper.js +25 -0
- package/lib/src/modules/access/providers/contabo-ssh-provider.service.d.ts +13 -0
- package/lib/src/modules/access/providers/contabo-ssh-provider.service.js +40 -0
- package/lib/src/modules/access/providers/hetzner-ssh-provider.service.d.ts +17 -0
- package/lib/src/modules/access/providers/hetzner-ssh-provider.service.js +95 -0
- package/lib/src/modules/access/providers/interfaces/ssh-provider.interface.d.ts +8 -0
- package/lib/src/modules/access/providers/interfaces/ssh-provider.interface.js +3 -0
- package/lib/src/modules/access/providers/ssh-provider.factory.d.ts +13 -0
- package/lib/src/modules/access/providers/ssh-provider.factory.js +44 -0
- package/lib/src/modules/access/repositories/api-token.repository.d.ts +24 -0
- package/lib/src/modules/access/repositories/api-token.repository.js +99 -0
- package/lib/src/modules/access/repositories/default-access.repository.d.ts +16 -0
- package/lib/src/modules/access/repositories/default-access.repository.js +121 -0
- package/lib/src/modules/access/repositories/provider-credentials.repository.d.ts +17 -0
- package/lib/src/modules/access/repositories/provider-credentials.repository.js +106 -0
- package/lib/src/modules/access/services/access.service.d.ts +180 -0
- package/lib/src/modules/access/services/access.service.js +732 -0
- package/lib/src/modules/access/services/bearerToken.service.d.ts +15 -0
- package/lib/src/modules/access/services/bearerToken.service.js +107 -0
- package/lib/src/modules/access/services/ca-manager.service.d.ts +48 -0
- package/lib/src/modules/access/services/ca-manager.service.js +293 -0
- package/lib/src/modules/access/services/certificate-signer.service.d.ts +36 -0
- package/lib/src/modules/access/services/certificate-signer.service.js +155 -0
- package/lib/src/modules/access/services/key-storage.service.d.ts +17 -0
- package/lib/src/modules/access/services/key-storage.service.js +133 -0
- package/lib/src/modules/access/services/ssh-key-generator.service.d.ts +6 -0
- package/lib/src/modules/access/services/ssh-key-generator.service.js +51 -0
- package/lib/src/modules/app-builds/entities/app-build.entity.d.ts +38 -0
- package/lib/src/modules/app-builds/entities/app-build.entity.js +168 -0
- package/lib/src/modules/app-builds/enums/app-build-status.enum.d.ts +10 -0
- package/lib/src/modules/app-builds/enums/app-build-status.enum.js +14 -0
- package/lib/src/modules/app-builds/enums/build-provider.enum.d.ts +6 -0
- package/lib/src/modules/app-builds/enums/build-provider.enum.js +10 -0
- package/lib/src/modules/app-builds/services/build-job.service.d.ts +178 -0
- package/lib/src/modules/app-builds/services/build-job.service.js +1057 -0
- package/lib/src/modules/applications/entities/app-resource.entity.d.ts +24 -0
- package/lib/src/modules/applications/entities/app-resource.entity.js +117 -0
- package/lib/src/modules/applications/entities/app-revision.entity.d.ts +29 -0
- package/lib/src/modules/applications/entities/app-revision.entity.js +133 -0
- package/lib/src/modules/applications/entities/application.entity.d.ts +121 -0
- package/lib/src/modules/applications/entities/application.entity.js +279 -0
- package/lib/src/modules/applications/enums/app-event-type.enum.d.ts +24 -0
- package/lib/src/modules/applications/enums/app-event-type.enum.js +28 -0
- package/lib/src/modules/applications/enums/application-category.enum.d.ts +4 -0
- package/lib/src/modules/applications/enums/application-category.enum.js +8 -0
- package/lib/src/modules/applications/enums/application-exposure.enum.d.ts +4 -0
- package/lib/src/modules/applications/enums/application-exposure.enum.js +8 -0
- package/lib/src/modules/applications/enums/application-kind.enum.d.ts +6 -0
- package/lib/src/modules/applications/enums/application-kind.enum.js +10 -0
- package/lib/src/modules/applications/enums/application-resource-kind.enum.d.ts +17 -0
- package/lib/src/modules/applications/enums/application-resource-kind.enum.js +21 -0
- package/lib/src/modules/applications/enums/application-resource-status.enum.d.ts +8 -0
- package/lib/src/modules/applications/enums/application-resource-status.enum.js +12 -0
- package/lib/src/modules/applications/enums/application-source-type.enum.d.ts +6 -0
- package/lib/src/modules/applications/enums/application-source-type.enum.js +10 -0
- package/lib/src/modules/applications/enums/application-status.enum.d.ts +20 -0
- package/lib/src/modules/applications/enums/application-status.enum.js +24 -0
- package/lib/src/modules/applications/interfaces/source-config.interface.d.ts +132 -0
- package/lib/src/modules/applications/interfaces/source-config.interface.js +2 -0
- package/lib/src/modules/auth/decorators/admin.decorator.d.ts +2 -0
- package/lib/src/modules/auth/decorators/admin.decorator.js +7 -0
- package/lib/src/modules/auth/entities/user.entity.d.ts +19 -0
- package/lib/src/modules/auth/entities/user.entity.js +78 -0
- package/lib/src/modules/auth/guards/admin.guard.d.ts +7 -0
- package/lib/src/modules/auth/guards/admin.guard.js +50 -0
- package/lib/src/modules/auth/interfaces/authenticated-user.interface.d.ts +12 -0
- package/lib/src/modules/auth/interfaces/authenticated-user.interface.js +2 -0
- package/lib/src/modules/common/cache/cache.service.d.ts +77 -0
- package/lib/src/modules/common/cache/cache.service.js +232 -0
- package/lib/src/modules/common/cache/cache.tokens.d.ts +1 -0
- package/lib/src/modules/common/cache/cache.tokens.js +4 -0
- package/lib/src/modules/common/cache/enums/cache-category.enum.d.ts +33 -0
- package/lib/src/modules/common/cache/enums/cache-category.enum.js +42 -0
- package/lib/src/modules/common/common.module.d.ts +2 -0
- package/lib/src/modules/common/common.module.js +20 -0
- package/lib/src/modules/common/dto/async-operation-response.dto.d.ts +19 -0
- package/lib/src/modules/common/dto/async-operation-response.dto.js +65 -0
- package/lib/src/modules/common/dto/index.d.ts +1 -0
- package/lib/src/modules/common/dto/index.js +17 -0
- package/lib/src/modules/common/services/label.service.d.ts +70 -0
- package/lib/src/modules/common/services/label.service.js +128 -0
- package/lib/src/modules/dns/entities/app-endpoint.entity.d.ts +57 -0
- package/lib/src/modules/dns/entities/app-endpoint.entity.js +205 -0
- package/lib/src/modules/dns/entities/cluster-dns-zone.entity.d.ts +21 -0
- package/lib/src/modules/dns/entities/cluster-dns-zone.entity.js +88 -0
- package/lib/src/modules/dns/entities/dns-zone.entity.d.ts +12 -0
- package/lib/src/modules/dns/entities/dns-zone.entity.js +53 -0
- package/lib/src/modules/dns/entities/san-certificate.entity.d.ts +29 -0
- package/lib/src/modules/dns/entities/san-certificate.entity.js +132 -0
- package/lib/src/modules/dns/entities/wildcard-certificate.entity.d.ts +26 -0
- package/lib/src/modules/dns/entities/wildcard-certificate.entity.js +111 -0
- package/lib/src/modules/dns/enums/cert-challenge.enum.d.ts +4 -0
- package/lib/src/modules/dns/enums/cert-challenge.enum.js +8 -0
- package/lib/src/modules/dns/enums/endpoint-type.enum.d.ts +4 -0
- package/lib/src/modules/dns/enums/endpoint-type.enum.js +8 -0
- package/lib/src/modules/dns/enums/hostname-mode.enum.d.ts +4 -0
- package/lib/src/modules/dns/enums/hostname-mode.enum.js +8 -0
- package/lib/src/modules/dns/services/cluster-dns-cleanup.service.d.ts +12 -0
- package/lib/src/modules/dns/services/cluster-dns-cleanup.service.js +79 -0
- package/lib/src/modules/dns/utils/nip-hostname.util.d.ts +12 -0
- package/lib/src/modules/dns/utils/nip-hostname.util.js +27 -0
- package/lib/src/modules/dns/utils/nip-token.util.d.ts +2 -0
- package/lib/src/modules/dns/utils/nip-token.util.js +94 -0
- package/lib/src/modules/frameworks/framework-core/enums/build-stage.enum.d.ts +21 -0
- package/lib/src/modules/frameworks/framework-core/enums/build-stage.enum.js +29 -0
- package/lib/src/modules/frameworks/framework-core/enums/deploy-strategy.enum.d.ts +22 -0
- package/lib/src/modules/frameworks/framework-core/enums/deploy-strategy.enum.js +26 -0
- package/lib/src/modules/frameworks/framework-core/enums/framework-type.enum.d.ts +32 -0
- package/lib/src/modules/frameworks/framework-core/enums/framework-type.enum.js +47 -0
- package/lib/src/modules/grafana/services/grafana-config.service.d.ts +43 -0
- package/lib/src/modules/grafana/services/grafana-config.service.js +177 -0
- package/lib/src/modules/grafana/services/grafana-datasource.service.d.ts +70 -0
- package/lib/src/modules/grafana/services/grafana-datasource.service.js +333 -0
- package/lib/src/modules/infrastructure/clusters/clusters.service.d.ts +126 -0
- package/lib/src/modules/infrastructure/clusters/clusters.service.js +265 -0
- package/lib/src/modules/infrastructure/clusters/constants/storage-conventions.d.ts +60 -0
- package/lib/src/modules/infrastructure/clusters/constants/storage-conventions.js +64 -0
- package/lib/src/modules/infrastructure/clusters/dto/build-resources.dto.d.ts +19 -0
- package/lib/src/modules/infrastructure/clusters/dto/build-resources.dto.js +69 -0
- package/lib/src/modules/infrastructure/clusters/dto/cluster-capacity-plan.dto.d.ts +36 -0
- package/lib/src/modules/infrastructure/clusters/dto/cluster-capacity-plan.dto.js +149 -0
- package/lib/src/modules/infrastructure/clusters/dto/cluster-power-management.dto.d.ts +51 -0
- package/lib/src/modules/infrastructure/clusters/dto/cluster-power-management.dto.js +222 -0
- package/lib/src/modules/infrastructure/clusters/dto/cluster-response.dto.d.ts +42 -0
- package/lib/src/modules/infrastructure/clusters/dto/cluster-response.dto.js +238 -0
- package/lib/src/modules/infrastructure/clusters/dto/cluster-storage.dto.d.ts +35 -0
- package/lib/src/modules/infrastructure/clusters/dto/cluster-storage.dto.js +122 -0
- package/lib/src/modules/infrastructure/clusters/dto/create-cluster.dto.d.ts +43 -0
- package/lib/src/modules/infrastructure/clusters/dto/create-cluster.dto.js +334 -0
- package/lib/src/modules/infrastructure/clusters/dto/register-cluster.dto.d.ts +30 -0
- package/lib/src/modules/infrastructure/clusters/dto/register-cluster.dto.js +190 -0
- package/lib/src/modules/infrastructure/clusters/dto/resource-availability.dto.d.ts +15 -0
- package/lib/src/modules/infrastructure/clusters/dto/resource-availability.dto.js +91 -0
- package/lib/src/modules/infrastructure/clusters/entities/cluster-node.entity.d.ts +28 -0
- package/lib/src/modules/infrastructure/clusters/entities/cluster-node.entity.js +104 -0
- package/lib/src/modules/infrastructure/clusters/entities/cluster.entity.d.ts +64 -0
- package/lib/src/modules/infrastructure/clusters/entities/cluster.entity.js +199 -0
- package/lib/src/modules/infrastructure/clusters/entities/node-billable-interval.entity.d.ts +17 -0
- package/lib/src/modules/infrastructure/clusters/entities/node-billable-interval.entity.js +86 -0
- package/lib/src/modules/infrastructure/clusters/entities/volume-billable-interval.entity.d.ts +18 -0
- package/lib/src/modules/infrastructure/clusters/entities/volume-billable-interval.entity.js +79 -0
- package/lib/src/modules/infrastructure/clusters/services/billing-intervals.service.d.ts +48 -0
- package/lib/src/modules/infrastructure/clusters/services/billing-intervals.service.js +159 -0
- package/lib/src/modules/infrastructure/clusters/services/cluster-capacity.service.d.ts +23 -0
- package/lib/src/modules/infrastructure/clusters/services/cluster-capacity.service.js +198 -0
- package/lib/src/modules/infrastructure/clusters/services/cluster-creation.service.d.ts +25 -0
- package/lib/src/modules/infrastructure/clusters/services/cluster-creation.service.js +192 -0
- package/lib/src/modules/infrastructure/clusters/services/cluster-deletion.service.d.ts +36 -0
- package/lib/src/modules/infrastructure/clusters/services/cluster-deletion.service.js +159 -0
- package/lib/src/modules/infrastructure/clusters/services/cluster-firewall-integration.service.d.ts +25 -0
- package/lib/src/modules/infrastructure/clusters/services/cluster-firewall-integration.service.js +90 -0
- package/lib/src/modules/infrastructure/clusters/services/cluster-mapper.service.d.ts +15 -0
- package/lib/src/modules/infrastructure/clusters/services/cluster-mapper.service.js +63 -0
- package/lib/src/modules/infrastructure/clusters/services/cluster-node-scaling.service.d.ts +78 -0
- package/lib/src/modules/infrastructure/clusters/services/cluster-node-scaling.service.js +644 -0
- package/lib/src/modules/infrastructure/clusters/services/cluster-operations.service.d.ts +37 -0
- package/lib/src/modules/infrastructure/clusters/services/cluster-operations.service.js +244 -0
- package/lib/src/modules/infrastructure/clusters/services/cluster-power-management.service.d.ts +68 -0
- package/lib/src/modules/infrastructure/clusters/services/cluster-power-management.service.js +716 -0
- package/lib/src/modules/infrastructure/clusters/services/cluster-storage.service.d.ts +15 -0
- package/lib/src/modules/infrastructure/clusters/services/cluster-storage.service.js +179 -0
- package/lib/src/modules/infrastructure/clusters/services/cluster-validation.service.d.ts +29 -0
- package/lib/src/modules/infrastructure/clusters/services/cluster-validation.service.js +100 -0
- package/lib/src/modules/infrastructure/firewalls/dto/cluster-firewall.dto.d.ts +62 -0
- package/lib/src/modules/infrastructure/firewalls/dto/cluster-firewall.dto.js +252 -0
- package/lib/src/modules/infrastructure/firewalls/entities/cluster-firewall.entity.d.ts +20 -0
- package/lib/src/modules/infrastructure/firewalls/entities/cluster-firewall.entity.js +83 -0
- package/lib/src/modules/infrastructure/firewalls/services/firewall-desired-state.service.d.ts +73 -0
- package/lib/src/modules/infrastructure/firewalls/services/firewall-desired-state.service.js +329 -0
- package/lib/src/modules/infrastructure/firewalls/services/firewall-reconciliation.service.d.ts +43 -0
- package/lib/src/modules/infrastructure/firewalls/services/firewall-reconciliation.service.js +212 -0
- package/lib/src/modules/infrastructure/firewalls/templates/firewall-rules.template.d.ts +54 -0
- package/lib/src/modules/infrastructure/firewalls/templates/firewall-rules.template.js +167 -0
- package/lib/src/modules/infrastructure/operations/helpers/operation-steps.helper.d.ts +34 -0
- package/lib/src/modules/infrastructure/operations/helpers/operation-steps.helper.js +401 -0
- package/lib/src/modules/infrastructure/servers/dto/create-server.dto.d.ts +40 -0
- package/lib/src/modules/infrastructure/servers/dto/create-server.dto.js +157 -0
- package/lib/src/modules/infrastructure/servers/dto/delete-server.dto.d.ts +17 -0
- package/lib/src/modules/infrastructure/servers/dto/delete-server.dto.js +85 -0
- package/lib/src/modules/infrastructure/servers/dto/server-response.dto.d.ts +29 -0
- package/lib/src/modules/infrastructure/servers/dto/server-response.dto.js +147 -0
- package/lib/src/modules/infrastructure/servers/entities/infrastructure-operations.entity.d.ts +266 -0
- package/lib/src/modules/infrastructure/servers/entities/infrastructure-operations.entity.js +348 -0
- package/lib/src/modules/infrastructure/shared/enums/reconciliation-status.enum.d.ts +7 -0
- package/lib/src/modules/infrastructure/shared/enums/reconciliation-status.enum.js +11 -0
- package/lib/src/modules/infrastructure/shared/services/kubernetes.service.d.ts +304 -0
- package/lib/src/modules/infrastructure/shared/services/kubernetes.service.js +1164 -0
- package/lib/src/modules/infrastructure/shared/services/label.service.d.ts +97 -0
- package/lib/src/modules/infrastructure/shared/services/label.service.js +189 -0
- package/lib/src/modules/infrastructure/shared/shared-infrastructure.module.d.ts +2 -0
- package/lib/src/modules/infrastructure/shared/shared-infrastructure.module.js +24 -0
- package/lib/src/modules/infrastructure/vnets/entities/vnet-route.entity.d.ts +10 -0
- package/lib/src/modules/infrastructure/vnets/entities/vnet-route.entity.js +51 -0
- package/lib/src/modules/infrastructure/vnets/entities/vnet-subnet.entity.d.ts +20 -0
- package/lib/src/modules/infrastructure/vnets/entities/vnet-subnet.entity.js +77 -0
- package/lib/src/modules/infrastructure/vnets/entities/vnet.entity.d.ts +28 -0
- package/lib/src/modules/infrastructure/vnets/entities/vnet.entity.js +88 -0
- package/lib/src/modules/instances/entities/instance-status.enum.d.ts +12 -0
- package/lib/src/modules/instances/entities/instance-status.enum.js +16 -0
- package/lib/src/modules/instances/entities/instance-type.enum.d.ts +6 -0
- package/lib/src/modules/instances/entities/instance-type.enum.js +10 -0
- package/lib/src/modules/instances/entities/instance.entity.d.ts +41 -0
- package/lib/src/modules/instances/entities/instance.entity.js +126 -0
- package/lib/src/modules/management/dto/configure-provider.dto.d.ts +8 -0
- package/lib/src/modules/management/dto/configure-provider.dto.js +51 -0
- package/lib/src/modules/management/dto/credentials.dto.d.ts +15 -0
- package/lib/src/modules/management/dto/credentials.dto.js +114 -0
- package/lib/src/modules/management/dto/health-status.dto.d.ts +12 -0
- package/lib/src/modules/management/dto/health-status.dto.js +40 -0
- package/lib/src/modules/management/dto/node-size-option.dto.d.ts +37 -0
- package/lib/src/modules/management/dto/node-size-option.dto.js +178 -0
- package/lib/src/modules/management/dto/pricing-query.dto.d.ts +5 -0
- package/lib/src/modules/management/dto/pricing-query.dto.js +36 -0
- package/lib/src/modules/management/dto/pricing-response.dto.d.ts +21 -0
- package/lib/src/modules/management/dto/pricing-response.dto.js +80 -0
- package/lib/src/modules/management/dto/provider-configuration.dto.d.ts +23 -0
- package/lib/src/modules/management/dto/provider-configuration.dto.js +72 -0
- package/lib/src/modules/management/dto/provider-filters.dto.d.ts +7 -0
- package/lib/src/modules/management/dto/provider-filters.dto.js +45 -0
- package/lib/src/modules/management/dto/validation-result.dto.d.ts +16 -0
- package/lib/src/modules/management/dto/validation-result.dto.js +35 -0
- package/lib/src/modules/management/entities/credentials.entity.d.ts +21 -0
- package/lib/src/modules/management/entities/credentials.entity.js +10 -0
- package/lib/src/modules/management/entities/provider-capabilities.entity.d.ts +85 -0
- package/lib/src/modules/management/entities/provider-capabilities.entity.js +2 -0
- package/lib/src/modules/management/entities/provider-configuration.entity.d.ts +14 -0
- package/lib/src/modules/management/entities/provider-configuration.entity.js +65 -0
- package/lib/src/modules/management/entities/provider-definition.entity.d.ts +19 -0
- package/lib/src/modules/management/entities/provider-definition.entity.js +2 -0
- package/lib/src/modules/management/entities/provider-region.entity.d.ts +11 -0
- package/lib/src/modules/management/entities/provider-region.entity.js +2 -0
- package/lib/src/modules/management/entities/provider-status.enum.d.ts +8 -0
- package/lib/src/modules/management/entities/provider-status.enum.js +12 -0
- package/lib/src/modules/management/interfaces/provider-configuration.repository.interface.d.ts +17 -0
- package/lib/src/modules/management/interfaces/provider-configuration.repository.interface.js +2 -0
- package/lib/src/modules/management/repositories/provider-configuration.repository.d.ts +21 -0
- package/lib/src/modules/management/repositories/provider-configuration.repository.js +89 -0
- package/lib/src/modules/management/services/configuration-mode.service.d.ts +20 -0
- package/lib/src/modules/management/services/configuration-mode.service.js +54 -0
- package/lib/src/modules/management/services/management.service.d.ts +72 -0
- package/lib/src/modules/management/services/management.service.js +546 -0
- package/lib/src/modules/management/services/provider-definitions.service.d.ts +26 -0
- package/lib/src/modules/management/services/provider-definitions.service.js +133 -0
- package/lib/src/modules/providers/controllers/provider-firewalls.controller.d.ts +28 -0
- package/lib/src/modules/providers/controllers/provider-firewalls.controller.js +277 -0
- package/lib/src/modules/providers/core/factories/capabilities-provider.factory.d.ts +10 -0
- package/lib/src/modules/providers/core/factories/capabilities-provider.factory.js +39 -0
- package/lib/src/modules/providers/core/factories/certificate-provider.factory.d.ts +11 -0
- package/lib/src/modules/providers/core/factories/certificate-provider.factory.js +58 -0
- package/lib/src/modules/providers/core/factories/dns-provider.factory.d.ts +12 -0
- package/lib/src/modules/providers/core/factories/dns-provider.factory.js +65 -0
- package/lib/src/modules/providers/core/factories/firewall-provider.factory.d.ts +12 -0
- package/lib/src/modules/providers/core/factories/firewall-provider.factory.js +61 -0
- package/lib/src/modules/providers/core/factories/provider.factory.d.ts +9 -0
- package/lib/src/modules/providers/core/factories/provider.factory.js +47 -0
- package/lib/src/modules/providers/core/factories/vm-backup-provider.factory.d.ts +12 -0
- package/lib/src/modules/providers/core/factories/vm-backup-provider.factory.js +56 -0
- package/lib/src/modules/providers/core/factories/volume-export.factory.d.ts +12 -0
- package/lib/src/modules/providers/core/factories/volume-export.factory.js +56 -0
- package/lib/src/modules/providers/core/interfaces/certificate-provider.interface.d.ts +1 -0
- package/lib/src/modules/providers/core/interfaces/certificate-provider.interface.js +17 -0
- package/lib/src/modules/providers/core/interfaces/cloud-provider.interface.d.ts +1 -0
- package/lib/src/modules/providers/core/interfaces/cloud-provider.interface.js +17 -0
- package/lib/src/modules/providers/core/interfaces/dns-provider.interface.d.ts +1 -0
- package/lib/src/modules/providers/core/interfaces/dns-provider.interface.js +17 -0
- package/lib/src/modules/providers/core/interfaces/firewall-provider.interface.d.ts +1 -0
- package/lib/src/modules/providers/core/interfaces/firewall-provider.interface.js +17 -0
- package/lib/src/modules/providers/core/interfaces/provider-bootstrap-seeder.interface.d.ts +54 -0
- package/lib/src/modules/providers/core/interfaces/provider-bootstrap-seeder.interface.js +2 -0
- package/lib/src/modules/providers/core/tokens.d.ts +59 -0
- package/lib/src/modules/providers/core/tokens.js +19 -0
- package/lib/src/modules/providers/data/region-coordinates.d.ts +6 -0
- package/lib/src/modules/providers/data/region-coordinates.js +25 -0
- package/lib/src/modules/providers/dto/firewall.dto.d.ts +30 -0
- package/lib/src/modules/providers/dto/firewall.dto.js +105 -0
- package/lib/src/modules/providers/dto/node-size.dto.d.ts +46 -0
- package/lib/src/modules/providers/dto/node-size.dto.js +22 -0
- package/lib/src/modules/providers/dto/pricing.dto.d.ts +24 -0
- package/lib/src/modules/providers/dto/pricing.dto.js +19 -0
- package/lib/src/modules/providers/dto/provider-firewall-response.dto.d.ts +28 -0
- package/lib/src/modules/providers/dto/provider-firewall-response.dto.js +134 -0
- package/lib/src/modules/providers/enums/certificate-provider.enum.d.ts +4 -0
- package/lib/src/modules/providers/enums/certificate-provider.enum.js +8 -0
- package/lib/src/modules/providers/enums/cloud-provider.enum.d.ts +5 -0
- package/lib/src/modules/providers/enums/cloud-provider.enum.js +9 -0
- package/lib/src/modules/providers/enums/dns-provider.enum.d.ts +5 -0
- package/lib/src/modules/providers/enums/dns-provider.enum.js +9 -0
- package/lib/src/modules/providers/implementations/contabo/contabo-capabilities.service.d.ts +19 -0
- package/lib/src/modules/providers/implementations/contabo/contabo-capabilities.service.js +254 -0
- package/lib/src/modules/providers/implementations/contabo/contabo-provider.module.d.ts +10 -0
- package/lib/src/modules/providers/implementations/contabo/contabo-provider.module.js +72 -0
- package/lib/src/modules/providers/implementations/contabo/generated/api.d.ts +13374 -0
- package/lib/src/modules/providers/implementations/contabo/generated/api.js +11341 -0
- package/lib/src/modules/providers/implementations/contabo/generated/base.d.ts +66 -0
- package/lib/src/modules/providers/implementations/contabo/generated/base.js +66 -0
- package/lib/src/modules/providers/implementations/contabo/generated/common.d.ts +65 -0
- package/lib/src/modules/providers/implementations/contabo/generated/common.js +152 -0
- package/lib/src/modules/providers/implementations/contabo/generated/configuration.d.ts +91 -0
- package/lib/src/modules/providers/implementations/contabo/generated/configuration.js +50 -0
- package/lib/src/modules/providers/implementations/contabo/generated/index.d.ts +13 -0
- package/lib/src/modules/providers/implementations/contabo/generated/index.js +31 -0
- package/lib/src/modules/providers/implementations/hetzner/generated/api.d.ts +18419 -0
- package/lib/src/modules/providers/implementations/hetzner/generated/api.js +19133 -0
- package/lib/src/modules/providers/implementations/hetzner/generated/base.d.ts +66 -0
- package/lib/src/modules/providers/implementations/hetzner/generated/base.js +66 -0
- package/lib/src/modules/providers/implementations/hetzner/generated/common.d.ts +65 -0
- package/lib/src/modules/providers/implementations/hetzner/generated/common.js +152 -0
- package/lib/src/modules/providers/implementations/hetzner/generated/configuration.d.ts +91 -0
- package/lib/src/modules/providers/implementations/hetzner/generated/configuration.js +50 -0
- package/lib/src/modules/providers/implementations/hetzner/generated/index.d.ts +13 -0
- package/lib/src/modules/providers/implementations/hetzner/generated/index.js +31 -0
- package/lib/src/modules/providers/implementations/hetzner/hetzner-bootstrap-seeder.service.d.ts +19 -0
- package/lib/src/modules/providers/implementations/hetzner/hetzner-bootstrap-seeder.service.js +68 -0
- package/lib/src/modules/providers/implementations/hetzner/hetzner-capabilities.service.d.ts +29 -0
- package/lib/src/modules/providers/implementations/hetzner/hetzner-capabilities.service.js +392 -0
- package/lib/src/modules/providers/implementations/hetzner/hetzner-provider.module.d.ts +2 -0
- package/lib/src/modules/providers/implementations/hetzner/hetzner-provider.module.js +81 -0
- package/lib/src/modules/providers/implementations/hetzner/hetzner-volume-operations.service.d.ts +31 -0
- package/lib/src/modules/providers/implementations/hetzner/hetzner-volume-operations.service.js +312 -0
- package/lib/src/modules/providers/implementations/hetzner/object-storage/hetzner-object-storage-connection.controller.d.ts +18 -0
- package/lib/src/modules/providers/implementations/hetzner/object-storage/hetzner-object-storage-connection.controller.js +67 -0
- package/lib/src/modules/providers/implementations/hetzner/object-storage/hetzner-object-storage-connection.service.d.ts +24 -0
- package/lib/src/modules/providers/implementations/hetzner/object-storage/hetzner-object-storage-connection.service.js +107 -0
- package/lib/src/modules/providers/implementations/hetzner/object-storage/hetzner-object-storage.backend.d.ts +7 -0
- package/lib/src/modules/providers/implementations/hetzner/object-storage/hetzner-object-storage.backend.js +35 -0
- package/lib/src/modules/providers/implementations/hetzner/object-storage/hetzner-object-storage.module.d.ts +8 -0
- package/lib/src/modules/providers/implementations/hetzner/object-storage/hetzner-object-storage.module.js +60 -0
- package/lib/src/modules/providers/implementations/hetzner/object-storage/hetzner-object-storage.provisioner.d.ts +22 -0
- package/lib/src/modules/providers/implementations/hetzner/object-storage/hetzner-object-storage.provisioner.js +100 -0
- package/lib/src/modules/providers/implementations/hetzner/vm-backup/hetzner-vm-backup.service.d.ts +20 -0
- package/lib/src/modules/providers/implementations/hetzner/vm-backup/hetzner-vm-backup.service.js +118 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/baremetal/api.d.ts +4227 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/baremetal/api.js +3362 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/baremetal/base.d.ts +66 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/baremetal/base.js +66 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/baremetal/common.d.ts +65 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/baremetal/common.js +152 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/baremetal/configuration.d.ts +91 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/baremetal/configuration.js +50 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/baremetal/index.d.ts +13 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/baremetal/index.js +31 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/domain/api.d.ts +2486 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/domain/api.js +2424 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/domain/base.d.ts +66 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/domain/base.js +66 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/domain/common.d.ts +65 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/domain/common.js +152 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/domain/configuration.d.ts +91 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/domain/configuration.js +50 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/domain/index.d.ts +13 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/domain/index.js +31 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/iam/api.d.ts +6425 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/iam/api.js +6925 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/iam/base.d.ts +66 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/iam/base.js +66 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/iam/common.d.ts +65 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/iam/common.js +152 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/iam/configuration.d.ts +91 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/iam/configuration.js +50 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/iam/index.d.ts +13 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/iam/index.js +31 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/instances/api.d.ts +11187 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/instances/api.js +9264 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/instances/base.d.ts +66 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/instances/base.js +66 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/instances/common.d.ts +65 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/instances/common.js +152 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/instances/configuration.d.ts +91 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/instances/configuration.js +50 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/instances/index.d.ts +13 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/instances/index.js +31 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/private-network/api.d.ts +492 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/private-network/api.js +531 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/private-network/base.d.ts +66 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/private-network/base.js +66 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/private-network/common.d.ts +65 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/private-network/common.js +152 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/private-network/configuration.d.ts +91 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/private-network/configuration.js +50 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/private-network/index.d.ts +13 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/private-network/index.js +31 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/vpc/api.d.ts +2305 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/vpc/api.js +2443 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/vpc/base.d.ts +66 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/vpc/base.js +66 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/vpc/common.d.ts +65 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/vpc/common.js +152 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/vpc/configuration.d.ts +91 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/vpc/configuration.js +50 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/vpc/index.d.ts +13 -0
- package/lib/src/modules/providers/implementations/scaleway/generated/vpc/index.js +31 -0
- package/lib/src/modules/providers/implementations/scaleway/object-storage/scaleway-object-storage.backend.d.ts +8 -0
- package/lib/src/modules/providers/implementations/scaleway/object-storage/scaleway-object-storage.backend.js +49 -0
- package/lib/src/modules/providers/implementations/scaleway/object-storage/scaleway-object-storage.module.d.ts +9 -0
- package/lib/src/modules/providers/implementations/scaleway/object-storage/scaleway-object-storage.module.js +56 -0
- package/lib/src/modules/providers/implementations/scaleway/object-storage/scaleway-object-storage.provisioner.d.ts +27 -0
- package/lib/src/modules/providers/implementations/scaleway/object-storage/scaleway-object-storage.provisioner.js +120 -0
- package/lib/src/modules/providers/implementations/scaleway/scaleway-baremetal.adapter.d.ts +22 -0
- package/lib/src/modules/providers/implementations/scaleway/scaleway-baremetal.adapter.js +140 -0
- package/lib/src/modules/providers/implementations/scaleway/scaleway-bootstrap-seeder.service.d.ts +12 -0
- package/lib/src/modules/providers/implementations/scaleway/scaleway-bootstrap-seeder.service.js +65 -0
- package/lib/src/modules/providers/implementations/scaleway/scaleway-capabilities.service.d.ts +23 -0
- package/lib/src/modules/providers/implementations/scaleway/scaleway-capabilities.service.js +319 -0
- package/lib/src/modules/providers/implementations/scaleway/scaleway-dns.service.d.ts +24 -0
- package/lib/src/modules/providers/implementations/scaleway/scaleway-dns.service.js +189 -0
- package/lib/src/modules/providers/implementations/scaleway/scaleway-firewall.service.d.ts +43 -0
- package/lib/src/modules/providers/implementations/scaleway/scaleway-firewall.service.js +455 -0
- package/lib/src/modules/providers/implementations/scaleway/scaleway-iam.adapter.d.ts +32 -0
- package/lib/src/modules/providers/implementations/scaleway/scaleway-iam.adapter.js +108 -0
- package/lib/src/modules/providers/implementations/scaleway/scaleway-instances.adapter.d.ts +66 -0
- package/lib/src/modules/providers/implementations/scaleway/scaleway-instances.adapter.js +289 -0
- package/lib/src/modules/providers/implementations/scaleway/scaleway-provider.module.d.ts +17 -0
- package/lib/src/modules/providers/implementations/scaleway/scaleway-provider.module.js +122 -0
- package/lib/src/modules/providers/implementations/scaleway/scaleway-provider.service.d.ts +100 -0
- package/lib/src/modules/providers/implementations/scaleway/scaleway-provider.service.js +1395 -0
- package/lib/src/modules/providers/implementations/scaleway/scaleway-volume-operations.service.d.ts +24 -0
- package/lib/src/modules/providers/implementations/scaleway/scaleway-volume-operations.service.js +199 -0
- package/lib/src/modules/providers/implementations/scaleway/scaleway-vpc.adapter.d.ts +30 -0
- package/lib/src/modules/providers/implementations/scaleway/scaleway-vpc.adapter.js +180 -0
- package/lib/src/modules/providers/index.d.ts +17 -0
- package/lib/src/modules/providers/index.js +39 -0
- package/lib/src/modules/providers/interfaces/certificate-provider.interface.d.ts +38 -0
- package/lib/src/modules/providers/interfaces/certificate-provider.interface.js +11 -0
- package/lib/src/modules/providers/interfaces/cloud-provider.interface.d.ts +215 -0
- package/lib/src/modules/providers/interfaces/cloud-provider.interface.js +2 -0
- package/lib/src/modules/providers/interfaces/credential-provider.interface.d.ts +23 -0
- package/lib/src/modules/providers/interfaces/credential-provider.interface.js +2 -0
- package/lib/src/modules/providers/interfaces/dns-provider.interface.d.ts +55 -0
- package/lib/src/modules/providers/interfaces/dns-provider.interface.js +12 -0
- package/lib/src/modules/providers/interfaces/firewall-provider.interface.d.ts +47 -0
- package/lib/src/modules/providers/interfaces/firewall-provider.interface.js +2 -0
- package/lib/src/modules/providers/interfaces/network-provider.interface.d.ts +124 -0
- package/lib/src/modules/providers/interfaces/network-provider.interface.js +2 -0
- package/lib/src/modules/providers/interfaces/provider-capabilities.interface.d.ts +87 -0
- package/lib/src/modules/providers/interfaces/provider-capabilities.interface.js +2 -0
- package/lib/src/modules/providers/interfaces/vm-backup-provider.interface.d.ts +39 -0
- package/lib/src/modules/providers/interfaces/vm-backup-provider.interface.js +8 -0
- package/lib/src/modules/providers/interfaces/volume-export.interface.d.ts +162 -0
- package/lib/src/modules/providers/interfaces/volume-export.interface.js +21 -0
- package/lib/src/modules/providers/interfaces/volume-operations.interface.d.ts +149 -0
- package/lib/src/modules/providers/interfaces/volume-operations.interface.js +17 -0
- package/lib/src/modules/providers/mappers/node-size.mapper.d.ts +20 -0
- package/lib/src/modules/providers/mappers/node-size.mapper.js +75 -0
- package/lib/src/modules/providers/mappers/pricing.mapper.d.ts +14 -0
- package/lib/src/modules/providers/mappers/pricing.mapper.js +60 -0
- package/lib/src/modules/providers/provider-core.module.d.ts +13 -0
- package/lib/src/modules/providers/provider-core.module.js +59 -0
- package/lib/src/modules/providers/providers.module.d.ts +2 -0
- package/lib/src/modules/providers/providers.module.js +188 -0
- package/lib/src/modules/providers/services/acme-certificate.service.d.ts +38 -0
- package/lib/src/modules/providers/services/acme-certificate.service.js +144 -0
- package/lib/src/modules/providers/services/contabo-firewall.service.d.ts +11 -0
- package/lib/src/modules/providers/services/contabo-firewall.service.js +40 -0
- package/lib/src/modules/providers/services/contabo-provider.service.d.ts +48 -0
- package/lib/src/modules/providers/services/contabo-provider.service.js +194 -0
- package/lib/src/modules/providers/services/credential-provider.service.d.ts +17 -0
- package/lib/src/modules/providers/services/credential-provider.service.js +78 -0
- package/lib/src/modules/providers/services/dns-provider.factory.d.ts +5 -0
- package/lib/src/modules/providers/services/dns-provider.factory.js +9 -0
- package/lib/src/modules/providers/services/firewall-provider.factory.d.ts +5 -0
- package/lib/src/modules/providers/services/firewall-provider.factory.js +9 -0
- package/lib/src/modules/providers/services/hetzner-dns.service.d.ts +71 -0
- package/lib/src/modules/providers/services/hetzner-dns.service.js +565 -0
- package/lib/src/modules/providers/services/hetzner-firewall.service.d.ts +48 -0
- package/lib/src/modules/providers/services/hetzner-firewall.service.js +472 -0
- package/lib/src/modules/providers/services/hetzner-network.service.d.ts +84 -0
- package/lib/src/modules/providers/services/hetzner-network.service.js +408 -0
- package/lib/src/modules/providers/services/hetzner-provider.service.d.ts +213 -0
- package/lib/src/modules/providers/services/hetzner-provider.service.js +1159 -0
- package/lib/src/modules/providers/services/provider.factory.d.ts +5 -0
- package/lib/src/modules/providers/services/provider.factory.js +9 -0
- package/lib/src/modules/providers/services/volume-export.service.d.ts +50 -0
- package/lib/src/modules/providers/services/volume-export.service.js +650 -0
- package/lib/src/modules/shared/encryption/encryption.module.d.ts +2 -0
- package/lib/src/modules/shared/encryption/encryption.module.js +22 -0
- package/lib/src/modules/shared/encryption/services/encryption.service.d.ts +47 -0
- package/lib/src/modules/shared/encryption/services/encryption.service.js +199 -0
- package/lib/src/modules/storage/enums/storage-backend-provider.enum.d.ts +19 -0
- package/lib/src/modules/storage/enums/storage-backend-provider.enum.js +23 -0
- package/lib/src/modules/storage/factories/object-storage-provisioner.factory.d.ts +11 -0
- package/lib/src/modules/storage/factories/object-storage-provisioner.factory.js +48 -0
- package/lib/src/modules/storage/factories/storage-backend.factory.d.ts +12 -0
- package/lib/src/modules/storage/factories/storage-backend.factory.js +51 -0
- package/lib/src/modules/storage/implementations/generic-s3.backend.d.ts +23 -0
- package/lib/src/modules/storage/implementations/generic-s3.backend.js +172 -0
- package/lib/src/modules/storage/interfaces/backup-storage-backend.interface.d.ts +48 -0
- package/lib/src/modules/storage/interfaces/backup-storage-backend.interface.js +2 -0
- package/lib/src/modules/storage/interfaces/object-storage-provisioner.interface.d.ts +55 -0
- package/lib/src/modules/storage/interfaces/object-storage-provisioner.interface.js +9 -0
- package/lib/src/modules/storage/storage.module.d.ts +2 -0
- package/lib/src/modules/storage/storage.module.js +21 -0
- package/lib/src/modules/storage/tokens/object-storage-provisioner-registry.token.d.ts +12 -0
- package/lib/src/modules/storage/tokens/object-storage-provisioner-registry.token.js +8 -0
- package/lib/src/modules/storage/tokens/storage-backend-registry.token.d.ts +12 -0
- package/lib/src/modules/storage/tokens/storage-backend-registry.token.js +8 -0
- package/lib/src/modules/terminal/services/native-ssh-connection.service.d.ts +48 -0
- package/lib/src/modules/terminal/services/native-ssh-connection.service.js +282 -0
- package/oclif.manifest.json +5243 -0
- package/package.json +125 -0
|
@@ -0,0 +1,1159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
|
+
};
|
|
44
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
45
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
46
|
+
};
|
|
47
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
48
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
49
|
+
};
|
|
50
|
+
var HetznerProviderService_1;
|
|
51
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
52
|
+
exports.HetznerProviderService = void 0;
|
|
53
|
+
const common_1 = require("@nestjs/common");
|
|
54
|
+
const config_1 = require("@nestjs/config");
|
|
55
|
+
const instance_entity_1 = require("../../instances/entities/instance.entity");
|
|
56
|
+
const cloud_provider_enum_1 = require("../enums/cloud-provider.enum");
|
|
57
|
+
const axios_1 = __importDefault(require("axios"));
|
|
58
|
+
const https = __importStar(require("node:https"));
|
|
59
|
+
const generated_1 = require("../../../modules/providers/implementations/hetzner/generated");
|
|
60
|
+
const node_size_mapper_1 = require("../mappers/node-size.mapper");
|
|
61
|
+
const pricing_mapper_1 = require("../mappers/pricing.mapper");
|
|
62
|
+
const instance_status_enum_1 = require("../../instances/entities/instance-status.enum");
|
|
63
|
+
const label_service_1 = require("../../common/services/label.service");
|
|
64
|
+
const hetzner_network_service_1 = require("./hetzner-network.service");
|
|
65
|
+
let HetznerProviderService = HetznerProviderService_1 = class HetznerProviderService {
|
|
66
|
+
constructor(configService, credentialProvider, nodeSizeMapper, pricingMapper, labelService) {
|
|
67
|
+
this.configService = configService;
|
|
68
|
+
this.credentialProvider = credentialProvider;
|
|
69
|
+
this.nodeSizeMapper = nodeSizeMapper;
|
|
70
|
+
this.pricingMapper = pricingMapper;
|
|
71
|
+
this.labelService = labelService;
|
|
72
|
+
this.logger = new common_1.Logger(HetznerProviderService_1.name);
|
|
73
|
+
this.basePath = this.configService.get('HETZNER_API_BASE_PATH', 'https://api.hetzner.cloud/v1');
|
|
74
|
+
this.defaultUser = this.configService.get('HETZNER_DEFAULT_USER', 'root');
|
|
75
|
+
this.timeout = Number.parseInt(this.configService.get('HETZNER_TIMEOUT', '10000'), 10);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Create a custom Axios instance with optimized configuration
|
|
79
|
+
*/
|
|
80
|
+
createAxiosInstance() {
|
|
81
|
+
const httpsAgent = new https.Agent({
|
|
82
|
+
keepAlive: true,
|
|
83
|
+
keepAliveMsecs: 30000,
|
|
84
|
+
maxSockets: 50,
|
|
85
|
+
maxFreeSockets: 10,
|
|
86
|
+
timeout: this.timeout,
|
|
87
|
+
rejectUnauthorized: true,
|
|
88
|
+
family: 4,
|
|
89
|
+
});
|
|
90
|
+
const instance = axios_1.default.create({
|
|
91
|
+
timeout: this.timeout,
|
|
92
|
+
httpsAgent,
|
|
93
|
+
headers: {
|
|
94
|
+
Accept: 'application/json',
|
|
95
|
+
'Content-Type': 'application/json',
|
|
96
|
+
'User-Agent': 'Flui-Cloud-API/1.0',
|
|
97
|
+
Connection: 'keep-alive',
|
|
98
|
+
},
|
|
99
|
+
validateStatus: (status) => status >= 200 && status < 300,
|
|
100
|
+
});
|
|
101
|
+
// Request interceptor for logging
|
|
102
|
+
instance.interceptors.request.use((config) => {
|
|
103
|
+
this.logger.debug(`Hetzner API Request: ${config.method?.toUpperCase()} ${config.url}`);
|
|
104
|
+
this.logger.debug(`Request Headers: ${JSON.stringify(config.headers, null, 2)}`);
|
|
105
|
+
return config;
|
|
106
|
+
}, (error) => {
|
|
107
|
+
const errDetails = error.response?.data
|
|
108
|
+
? ` — ${JSON.stringify(error.response.data)}`
|
|
109
|
+
: '';
|
|
110
|
+
this.logger.error(`Hetzner API Request Error: ${error.message}${errDetails}`);
|
|
111
|
+
return Promise.reject(error);
|
|
112
|
+
});
|
|
113
|
+
// Response interceptor for logging
|
|
114
|
+
instance.interceptors.response.use((response) => {
|
|
115
|
+
this.logger.debug(`Hetzner API Response: ${response.status} ${response.statusText}`);
|
|
116
|
+
return response;
|
|
117
|
+
}, (error) => {
|
|
118
|
+
if (error.response) {
|
|
119
|
+
// Server responded with error status
|
|
120
|
+
this.logger.error(`Hetzner API Error Response: ${error.response.status} ${error.response.statusText}`);
|
|
121
|
+
this.logger.error(`Error Data: ${JSON.stringify(error.response.data, null, 2)}`);
|
|
122
|
+
}
|
|
123
|
+
else if (error.request) {
|
|
124
|
+
// Request was made but no response received
|
|
125
|
+
this.logger.error(`Hetzner API No Response Received - Possible network/timeout issue`);
|
|
126
|
+
this.logger.error(`Request URL: ${error.config?.url}`);
|
|
127
|
+
this.logger.error(`Request Method: ${error.config?.method}`);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
// Something else happened
|
|
131
|
+
this.logger.error(`Hetzner API Error: ${error.message}`);
|
|
132
|
+
}
|
|
133
|
+
return Promise.reject(error);
|
|
134
|
+
});
|
|
135
|
+
return instance;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Create a configured API client with proper headers and custom Axios instance
|
|
139
|
+
*/
|
|
140
|
+
async createConfiguration() {
|
|
141
|
+
const token = await this.credentialProvider.getActiveApiToken(cloud_provider_enum_1.CloudProvider.HETZNER);
|
|
142
|
+
return new generated_1.Configuration({
|
|
143
|
+
accessToken: token,
|
|
144
|
+
basePath: this.basePath,
|
|
145
|
+
baseOptions: {
|
|
146
|
+
headers: {
|
|
147
|
+
'User-Agent': 'Flui-Cloud-API/1.0',
|
|
148
|
+
'Content-Type': 'application/json',
|
|
149
|
+
Accept: 'application/json',
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Create ServersApi instance with custom Axios configuration
|
|
156
|
+
*/
|
|
157
|
+
async createServersApi() {
|
|
158
|
+
const configuration = await this.createConfiguration();
|
|
159
|
+
const axiosInstance = this.createAxiosInstance();
|
|
160
|
+
return new generated_1.ServersApi(configuration, this.basePath, axiosInstance);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Create SSHKeysApi instance with custom Axios configuration
|
|
164
|
+
*/
|
|
165
|
+
async createSSHKeysApi() {
|
|
166
|
+
const configuration = await this.createConfiguration();
|
|
167
|
+
const axiosInstance = this.createAxiosInstance();
|
|
168
|
+
return new generated_1.SSHKeysApi(configuration, this.basePath, axiosInstance);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Create ServerTypesApi instance with custom Axios configuration
|
|
172
|
+
*/
|
|
173
|
+
async createServerTypesApi() {
|
|
174
|
+
const configuration = await this.createConfiguration();
|
|
175
|
+
const axiosInstance = this.createAxiosInstance();
|
|
176
|
+
return new generated_1.ServerTypesApi(configuration, this.basePath, axiosInstance);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Create PricingApi instance with custom Axios configuration
|
|
180
|
+
*/
|
|
181
|
+
async createPricingApi() {
|
|
182
|
+
const configuration = await this.createConfiguration();
|
|
183
|
+
const axiosInstance = this.createAxiosInstance();
|
|
184
|
+
return new generated_1.PricingApi(configuration, this.basePath, axiosInstance);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Create VolumesApi instance with custom Axios configuration.
|
|
188
|
+
* Used by §14 of the scaling architecture to provision Flui-managed
|
|
189
|
+
* block storage Volumes attached to master nodes (NFS export backing).
|
|
190
|
+
*/
|
|
191
|
+
async createVolumesApi() {
|
|
192
|
+
const configuration = await this.createConfiguration();
|
|
193
|
+
const axiosInstance = this.createAxiosInstance();
|
|
194
|
+
return new generated_1.VolumesApi(configuration, this.basePath, axiosInstance);
|
|
195
|
+
}
|
|
196
|
+
async createServerActionsApi() {
|
|
197
|
+
const configuration = await this.createConfiguration();
|
|
198
|
+
const axiosInstance = this.createAxiosInstance();
|
|
199
|
+
return new generated_1.ServerActionsApi(configuration, this.basePath, axiosInstance);
|
|
200
|
+
}
|
|
201
|
+
async createVolumeActionsApi() {
|
|
202
|
+
const configuration = await this.createConfiguration();
|
|
203
|
+
const axiosInstance = this.createAxiosInstance();
|
|
204
|
+
return new generated_1.VolumeActionsApi(configuration, this.basePath, axiosInstance);
|
|
205
|
+
}
|
|
206
|
+
async createActionsApi() {
|
|
207
|
+
const configuration = await this.createConfiguration();
|
|
208
|
+
const axiosInstance = this.createAxiosInstance();
|
|
209
|
+
return new generated_1.ActionsApi(configuration, this.basePath, axiosInstance);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Create DataCentersApi instance with custom Axios configuration
|
|
213
|
+
*/
|
|
214
|
+
async createDataCentersApi() {
|
|
215
|
+
const configuration = await this.createConfiguration();
|
|
216
|
+
const axiosInstance = this.createAxiosInstance();
|
|
217
|
+
return new generated_1.DataCentersApi(configuration, this.basePath, axiosInstance);
|
|
218
|
+
}
|
|
219
|
+
async listInstances(filters) {
|
|
220
|
+
const serversApi = await this.createServersApi();
|
|
221
|
+
// Build label selector if clusterId is provided
|
|
222
|
+
let labelSelector;
|
|
223
|
+
if (filters?.clusterId) {
|
|
224
|
+
labelSelector = `flui-cluster-id=${filters.clusterId}`;
|
|
225
|
+
}
|
|
226
|
+
// Pass labelSelector to the Hetzner API call
|
|
227
|
+
const response = await serversApi.listServers(undefined, labelSelector);
|
|
228
|
+
return response.data.servers.map((server) => {
|
|
229
|
+
return this.mapHetznerInstanceToEntity(server);
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
async testApiKey(apiKey) {
|
|
233
|
+
try {
|
|
234
|
+
const configuration = new generated_1.Configuration({
|
|
235
|
+
accessToken: apiKey,
|
|
236
|
+
basePath: this.basePath,
|
|
237
|
+
baseOptions: {
|
|
238
|
+
headers: {
|
|
239
|
+
'User-Agent': 'Flui-Cloud-API/1.0',
|
|
240
|
+
'Content-Type': 'application/json',
|
|
241
|
+
Accept: 'application/json',
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
});
|
|
245
|
+
const axiosInstance = this.createAxiosInstance();
|
|
246
|
+
const serversApi = new generated_1.ServersApi(configuration, this.basePath, axiosInstance);
|
|
247
|
+
await serversApi.listServers();
|
|
248
|
+
return true;
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
if (error.response?.status === 401) {
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
this.logger.error('Hetzner API key validation error:', error.message);
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
mapHetznerInstanceToEntity(server) {
|
|
259
|
+
// Create a new instance of InstanceEntity
|
|
260
|
+
const instance = new instance_entity_1.InstanceEntity();
|
|
261
|
+
// Map basic fields
|
|
262
|
+
instance.name = server.name;
|
|
263
|
+
instance.displayName = server.name;
|
|
264
|
+
instance.provider = cloud_provider_enum_1.CloudProvider.HETZNER;
|
|
265
|
+
instance.providerId = server.id.toString();
|
|
266
|
+
// Map status
|
|
267
|
+
instance.status = this.mapHetznerStatus(server.status);
|
|
268
|
+
// Map data center and region configuration
|
|
269
|
+
instance.dataCenter = server.datacenter.name;
|
|
270
|
+
instance.region = server.datacenter.location.name;
|
|
271
|
+
instance.regionName = server.datacenter.location.description;
|
|
272
|
+
// Map hardware specifications
|
|
273
|
+
instance.cpuCores = server.server_type.cores;
|
|
274
|
+
instance.ramMb = server.server_type.memory * 1024; // Convert from GB to MB
|
|
275
|
+
instance.diskMb = server.primary_disk_size * 1024; // Convert from GB to MB
|
|
276
|
+
// Operating system information
|
|
277
|
+
instance.osType = server.image
|
|
278
|
+
? `${server.image.os_flavor} ${server.image.os_version}`
|
|
279
|
+
: null;
|
|
280
|
+
// IP configuration
|
|
281
|
+
instance.ipConfig = {
|
|
282
|
+
v4: server.public_net.ipv4
|
|
283
|
+
? {
|
|
284
|
+
ip: server.public_net.ipv4.ip,
|
|
285
|
+
gateway: '', // Information not available in the response
|
|
286
|
+
netmaskCidr: 32, // Standard IPv4
|
|
287
|
+
}
|
|
288
|
+
: undefined,
|
|
289
|
+
v6: server.public_net.ipv6
|
|
290
|
+
? {
|
|
291
|
+
ip: server.public_net.ipv6.ip,
|
|
292
|
+
gateway: '', // Information not available in the response
|
|
293
|
+
netmaskCidr: 64, // Standard IPv6
|
|
294
|
+
}
|
|
295
|
+
: undefined,
|
|
296
|
+
};
|
|
297
|
+
// Additional information
|
|
298
|
+
instance.productType = server.server_type.name;
|
|
299
|
+
instance.productName = server.server_type.description;
|
|
300
|
+
instance.defaultUser = this.defaultUser; // Default user for Hetzner servers
|
|
301
|
+
// Additional IPs (floating IPs)
|
|
302
|
+
instance.additionalIps =
|
|
303
|
+
server.public_net.floating_ips?.map((ip) => ip.toString()) || [];
|
|
304
|
+
// Additional metadata that might be useful
|
|
305
|
+
instance.metadata = {
|
|
306
|
+
created: server.created,
|
|
307
|
+
traffic: {
|
|
308
|
+
outgoing: server.outgoing_traffic,
|
|
309
|
+
ingoing: server.ingoing_traffic,
|
|
310
|
+
included: server.included_traffic,
|
|
311
|
+
},
|
|
312
|
+
volumes: server.volumes,
|
|
313
|
+
loadBalancers: server.load_balancers,
|
|
314
|
+
labels: server.labels,
|
|
315
|
+
locked: server.locked,
|
|
316
|
+
rescueEnabled: server.rescue_enabled,
|
|
317
|
+
placementGroup: server.placement_group,
|
|
318
|
+
};
|
|
319
|
+
return instance;
|
|
320
|
+
}
|
|
321
|
+
mapHetznerStatus(status) {
|
|
322
|
+
switch (status) {
|
|
323
|
+
case generated_1.ListServers200ResponseServersInnerStatusEnum.Running:
|
|
324
|
+
return instance_status_enum_1.InstanceStatus.RUNNING;
|
|
325
|
+
case generated_1.ListServers200ResponseServersInnerStatusEnum.Off:
|
|
326
|
+
return instance_status_enum_1.InstanceStatus.STOPPED;
|
|
327
|
+
case generated_1.ListServers200ResponseServersInnerStatusEnum.Starting:
|
|
328
|
+
return instance_status_enum_1.InstanceStatus.STARTING;
|
|
329
|
+
case generated_1.ListServers200ResponseServersInnerStatusEnum.Initializing:
|
|
330
|
+
return instance_status_enum_1.InstanceStatus.PROVISIONING;
|
|
331
|
+
case generated_1.ListServers200ResponseServersInnerStatusEnum.Stopping:
|
|
332
|
+
return instance_status_enum_1.InstanceStatus.STOPPING;
|
|
333
|
+
case generated_1.ListServers200ResponseServersInnerStatusEnum.Deleting:
|
|
334
|
+
return instance_status_enum_1.InstanceStatus.DELETING;
|
|
335
|
+
case generated_1.ListServers200ResponseServersInnerStatusEnum.Migrating:
|
|
336
|
+
return instance_status_enum_1.InstanceStatus.MIGRATING;
|
|
337
|
+
case generated_1.ListServers200ResponseServersInnerStatusEnum.Rebuilding:
|
|
338
|
+
return instance_status_enum_1.InstanceStatus.REBUILDING;
|
|
339
|
+
case generated_1.ListServers200ResponseServersInnerStatusEnum.Unknown:
|
|
340
|
+
default:
|
|
341
|
+
return instance_status_enum_1.InstanceStatus.UNKNOWN;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
// Server creation methods for infrastructure module
|
|
345
|
+
async createServer(config) {
|
|
346
|
+
this.logger.log(`Creating server ${config.name} via Hetzner API`);
|
|
347
|
+
try {
|
|
348
|
+
const serversApi = await this.createServersApi();
|
|
349
|
+
// Map our config to Hetzner API request
|
|
350
|
+
const createRequest = {
|
|
351
|
+
name: config.name,
|
|
352
|
+
server_type: config.server_type || 'cx11',
|
|
353
|
+
image: 'ubuntu-24.04',
|
|
354
|
+
location: config.location || 'nbg1',
|
|
355
|
+
start_after_create: true,
|
|
356
|
+
ssh_keys: config.ssh_keys || [],
|
|
357
|
+
user_data: config.user_data || '',
|
|
358
|
+
};
|
|
359
|
+
// Convert label array to Record for Hetzner API
|
|
360
|
+
if (config.labels && config.labels.length > 0) {
|
|
361
|
+
createRequest.labels = this.labelService.toRecord(config.labels);
|
|
362
|
+
}
|
|
363
|
+
// Attach firewalls if provided
|
|
364
|
+
if (config.firewalls && config.firewalls.length > 0) {
|
|
365
|
+
createRequest.firewalls = config.firewalls.map((id) => ({
|
|
366
|
+
firewall: Number.parseInt(id, 10),
|
|
367
|
+
}));
|
|
368
|
+
}
|
|
369
|
+
if (config.networks && config.networks.length > 0) {
|
|
370
|
+
createRequest.networks = config.networks.map((id) => Number.parseInt(id, 10));
|
|
371
|
+
}
|
|
372
|
+
this.logger.log(`Sending create server request to Hetzner API for ${config.name}`);
|
|
373
|
+
const response = await serversApi.createServer(createRequest);
|
|
374
|
+
const serverId = response.data.server.id;
|
|
375
|
+
const result = {
|
|
376
|
+
serverId: serverId.toString(),
|
|
377
|
+
ipAddress: response.data.server.public_net.ipv4?.ip,
|
|
378
|
+
privateIp: response.data.server.private_net?.[0]?.ip,
|
|
379
|
+
status: response.data.server.status,
|
|
380
|
+
actionId: response.data.action.id,
|
|
381
|
+
};
|
|
382
|
+
// Provision Flui-managed Volumes if requested (§14 of scaling doc).
|
|
383
|
+
// Each Volume is created with `server: <id>` so Hetzner attaches it
|
|
384
|
+
// immediately, no separate attach action needed. We don't request
|
|
385
|
+
// automount/format — the bootstrap script handles that idempotently.
|
|
386
|
+
if (config.attachedVolumes && config.attachedVolumes.length > 0) {
|
|
387
|
+
const attached = [];
|
|
388
|
+
const volumesApi = await this.createVolumesApi();
|
|
389
|
+
for (const v of config.attachedVolumes) {
|
|
390
|
+
// Hetzner Volume minimum is 10 GB.
|
|
391
|
+
const sizeGb = Math.max(10, v.sizeGb);
|
|
392
|
+
const volumeReq = {
|
|
393
|
+
name: v.name,
|
|
394
|
+
size: sizeGb,
|
|
395
|
+
server: serverId,
|
|
396
|
+
...(v.labels?.length
|
|
397
|
+
? { labels: this.labelService.toRecord(v.labels) }
|
|
398
|
+
: {}),
|
|
399
|
+
};
|
|
400
|
+
this.logger.log(`Creating Hetzner Volume ${v.name} (${sizeGb} GB) for server ${serverId}`);
|
|
401
|
+
try {
|
|
402
|
+
const volResp = await volumesApi.createVolume(volumeReq);
|
|
403
|
+
const volumeId = volResp.data.volume.id;
|
|
404
|
+
attached.push({
|
|
405
|
+
volumeId: volumeId.toString(),
|
|
406
|
+
// Hetzner Volume convention: /dev/disk/by-id/scsi-0HC_Volume_<id>
|
|
407
|
+
devicePath: `/dev/disk/by-id/scsi-0HC_Volume_${volumeId}`,
|
|
408
|
+
sizeGb,
|
|
409
|
+
});
|
|
410
|
+
this.logger.log(`Volume ${v.name} created and attached: id=${volumeId}`);
|
|
411
|
+
}
|
|
412
|
+
catch (volErr) {
|
|
413
|
+
this.logger.error(`Failed to create/attach Volume ${v.name} for server ${serverId}: ${volErr.message}`);
|
|
414
|
+
throw new Error(`Hetzner Volume creation failed for ${v.name}: ${volErr.message}`);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
result.attachedVolumes = attached;
|
|
418
|
+
}
|
|
419
|
+
this.logger.log(`Server ${config.name} created successfully`, result);
|
|
420
|
+
return result;
|
|
421
|
+
}
|
|
422
|
+
catch (error) {
|
|
423
|
+
this.logger.error(`Failed to create server ${config.name}`, error);
|
|
424
|
+
// Handle Hetzner API specific errors
|
|
425
|
+
if (error.response?.data?.error) {
|
|
426
|
+
const apiError = error.response.data.error;
|
|
427
|
+
throw new Error(`Hetzner API Error: ${apiError.message} (${apiError.code})`);
|
|
428
|
+
}
|
|
429
|
+
throw new Error(`Server creation failed: ${error.message}`);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
async getServerStatus(serverId) {
|
|
433
|
+
try {
|
|
434
|
+
const serversApi = await this.createServersApi();
|
|
435
|
+
const response = await serversApi.getServer(Number.parseInt(serverId));
|
|
436
|
+
return response.data.server.status;
|
|
437
|
+
}
|
|
438
|
+
catch (error) {
|
|
439
|
+
this.logger.warn(`Failed to get server status for ${serverId}`, error);
|
|
440
|
+
if (error.response?.status === 404) {
|
|
441
|
+
return 'not-found';
|
|
442
|
+
}
|
|
443
|
+
return 'error';
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
async getServerDetails(serverId) {
|
|
447
|
+
try {
|
|
448
|
+
const serversApi = await this.createServersApi();
|
|
449
|
+
const response = await serversApi.getServer(Number.parseInt(serverId));
|
|
450
|
+
return response.data.server;
|
|
451
|
+
}
|
|
452
|
+
catch (error) {
|
|
453
|
+
this.logger.warn(`Failed to get server details for ${serverId}`, error);
|
|
454
|
+
return null;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Wait for an action to complete by monitoring its status
|
|
459
|
+
* This is more efficient than polling server status as it uses Hetzner's action tracking system
|
|
460
|
+
* @param actionId Action ID to wait for
|
|
461
|
+
* @param timeoutMs Timeout in milliseconds (default: 5 minutes)
|
|
462
|
+
* @param pollIntervalMs Polling interval in milliseconds (default: 3 seconds)
|
|
463
|
+
* @returns Promise that resolves when action is complete
|
|
464
|
+
* @throws Error if action fails or timeout is reached
|
|
465
|
+
*/
|
|
466
|
+
async waitForActionCompletion(actionId, timeoutMs = 300000, pollIntervalMs = 3000) {
|
|
467
|
+
const startTime = Date.now();
|
|
468
|
+
const maxAttempts = Math.ceil(timeoutMs / pollIntervalMs);
|
|
469
|
+
this.logger.log(`Waiting for action ${actionId} to complete (timeout: ${timeoutMs}ms, poll interval: ${pollIntervalMs}ms)`);
|
|
470
|
+
const actionsApi = await this.createActionsApi();
|
|
471
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
472
|
+
try {
|
|
473
|
+
const response = await actionsApi.getAction(actionId);
|
|
474
|
+
const action = response.data.action;
|
|
475
|
+
this.logger.debug(`Poll attempt ${attempt}/${maxAttempts}: Action ${actionId} status = ${action.status}, progress = ${action.progress}%`);
|
|
476
|
+
// Check if action completed successfully
|
|
477
|
+
if (action.status === generated_1.ActionStatusEnum.Success) {
|
|
478
|
+
this.logger.log(`Action ${actionId} completed successfully (took ${Date.now() - startTime}ms)`);
|
|
479
|
+
return;
|
|
480
|
+
}
|
|
481
|
+
// Check if action failed
|
|
482
|
+
if (action.status === generated_1.ActionStatusEnum.Error) {
|
|
483
|
+
const errorMsg = action.error?.message || 'Unknown error during action execution';
|
|
484
|
+
throw new Error(`Action ${actionId} failed: ${errorMsg}`);
|
|
485
|
+
}
|
|
486
|
+
// Check timeout
|
|
487
|
+
if (Date.now() - startTime >= timeoutMs) {
|
|
488
|
+
throw new Error(`Timeout waiting for action ${actionId} to complete after ${timeoutMs}ms. Current status: ${action.status}, progress: ${action.progress}%`);
|
|
489
|
+
}
|
|
490
|
+
// Wait before next poll (unless it's the last attempt)
|
|
491
|
+
if (attempt < maxAttempts &&
|
|
492
|
+
action.status === generated_1.ActionStatusEnum.Running) {
|
|
493
|
+
await this.sleep(pollIntervalMs);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
catch (error) {
|
|
497
|
+
// If we get a 404, the action might have been cleaned up (already completed)
|
|
498
|
+
if (error.response?.status === 404) {
|
|
499
|
+
this.logger.warn(`Action ${actionId} not found (might have been cleaned up). Assuming completion.`);
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
502
|
+
throw error;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
throw new Error(`Failed to confirm action completion after ${maxAttempts} attempts`);
|
|
506
|
+
}
|
|
507
|
+
/**
|
|
508
|
+
* Sleep helper
|
|
509
|
+
*/
|
|
510
|
+
sleep(ms) {
|
|
511
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
512
|
+
}
|
|
513
|
+
async deleteServer(config) {
|
|
514
|
+
this.logger.log(`Deleting server ${config.server_id} via Hetzner API`);
|
|
515
|
+
try {
|
|
516
|
+
const serversApi = await this.createServersApi();
|
|
517
|
+
// First check if server exists and get its status
|
|
518
|
+
const serverDetails = await this.getServerDetails(config.server_id);
|
|
519
|
+
if (!serverDetails) {
|
|
520
|
+
throw new Error(`Server ${config.server_id} not found`);
|
|
521
|
+
}
|
|
522
|
+
// Check if server is running and force is not set
|
|
523
|
+
if (!config.force && serverDetails.status === 'running') {
|
|
524
|
+
throw new Error('Server is running. Use force=true to delete running servers.');
|
|
525
|
+
}
|
|
526
|
+
this.logger.log(`Sending delete server request to Hetzner API for ${config.server_id}`);
|
|
527
|
+
const response = await serversApi.deleteServer(Number.parseInt(config.server_id));
|
|
528
|
+
const result = {
|
|
529
|
+
actionId: response.data.action?.id,
|
|
530
|
+
message: `Server ${config.server_id} deletion initiated`,
|
|
531
|
+
};
|
|
532
|
+
this.logger.log(`Server ${config.server_id} deletion initiated successfully`, result);
|
|
533
|
+
return result;
|
|
534
|
+
}
|
|
535
|
+
catch (error) {
|
|
536
|
+
this.logger.error(`Failed to delete server ${config.server_id}`, error);
|
|
537
|
+
// Handle Hetzner API specific errors
|
|
538
|
+
if (error.response?.data?.error) {
|
|
539
|
+
const apiError = error.response.data.error;
|
|
540
|
+
throw new Error(`Hetzner API Error: ${apiError.message} (${apiError.code})`);
|
|
541
|
+
}
|
|
542
|
+
// Handle 404 errors specially
|
|
543
|
+
if (error.response?.status === 404) {
|
|
544
|
+
throw new Error(`Server ${config.server_id} not found`);
|
|
545
|
+
}
|
|
546
|
+
throw new Error(`Server deletion failed: ${error.message}`);
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
/**
|
|
550
|
+
* Power off a server
|
|
551
|
+
*/
|
|
552
|
+
async powerOffServer(serverId) {
|
|
553
|
+
this.logger.log(`Powering off server ${serverId}`);
|
|
554
|
+
try {
|
|
555
|
+
const actionsApi = await this.createServerActionsApi();
|
|
556
|
+
//serversIdActionsPoweroffPost
|
|
557
|
+
await actionsApi.poweroffServer(Number.parseInt(serverId));
|
|
558
|
+
this.logger.log(`Server ${serverId} poweroff action sent successfully`);
|
|
559
|
+
}
|
|
560
|
+
catch (error) {
|
|
561
|
+
this.logger.error(`Failed to power off server ${serverId}`, error);
|
|
562
|
+
if (error.response?.data?.error) {
|
|
563
|
+
const apiError = error.response.data.error;
|
|
564
|
+
throw new Error(`Hetzner API Error: ${apiError.message} (${apiError.code})`);
|
|
565
|
+
}
|
|
566
|
+
if (error.response?.status === 404) {
|
|
567
|
+
throw new Error(`Server ${serverId} not found`);
|
|
568
|
+
}
|
|
569
|
+
throw new Error(`Server poweroff failed: ${error.message}`);
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
/**
|
|
573
|
+
* Power on a server
|
|
574
|
+
*/
|
|
575
|
+
async powerOnServer(serverId) {
|
|
576
|
+
this.logger.log(`Powering on server ${serverId}`);
|
|
577
|
+
try {
|
|
578
|
+
const actionsApi = await this.createServerActionsApi();
|
|
579
|
+
await actionsApi.poweronServer(Number.parseInt(serverId));
|
|
580
|
+
this.logger.log(`Server ${serverId} poweron action sent successfully`);
|
|
581
|
+
}
|
|
582
|
+
catch (error) {
|
|
583
|
+
this.logger.error(`Failed to power on server ${serverId}`, error);
|
|
584
|
+
if (error.response?.data?.error) {
|
|
585
|
+
const apiError = error.response.data.error;
|
|
586
|
+
throw new Error(`Hetzner API Error: ${apiError.message} (${apiError.code})`);
|
|
587
|
+
}
|
|
588
|
+
if (error.response?.status === 404) {
|
|
589
|
+
throw new Error(`Server ${serverId} not found`);
|
|
590
|
+
}
|
|
591
|
+
throw new Error(`Server poweron failed: ${error.message}`);
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
async changeServerType(serverId, config) {
|
|
595
|
+
this.logger.log(`Hetzner change_type server=${serverId} → ${config.targetServerType} (upgrade_disk=${config.upgradeDisk ?? false})`);
|
|
596
|
+
try {
|
|
597
|
+
const actionsApi = await this.createServerActionsApi();
|
|
598
|
+
const res = await actionsApi.changeServerType(Number.parseInt(serverId), {
|
|
599
|
+
server_type: config.targetServerType,
|
|
600
|
+
upgrade_disk: config.upgradeDisk ?? false,
|
|
601
|
+
});
|
|
602
|
+
return { actionId: res.data.action?.id };
|
|
603
|
+
}
|
|
604
|
+
catch (error) {
|
|
605
|
+
const apiError = error.response?.data?.error;
|
|
606
|
+
if (apiError) {
|
|
607
|
+
throw new Error(`Hetzner change_type failed: ${apiError.message} (${apiError.code})`);
|
|
608
|
+
}
|
|
609
|
+
if (error.response?.status === 404) {
|
|
610
|
+
throw new Error(`Server ${serverId} not found`);
|
|
611
|
+
}
|
|
612
|
+
throw new Error(`Hetzner change_type failed: ${error.message}`);
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
async expandVolume(volumeId, newSizeGb) {
|
|
616
|
+
this.logger.log(`Hetzner resize volume=${volumeId} → ${newSizeGb} GB`);
|
|
617
|
+
try {
|
|
618
|
+
const volumeActionsApi = await this.createVolumeActionsApi();
|
|
619
|
+
const res = await volumeActionsApi.resizeVolume(Number.parseInt(volumeId), { size: newSizeGb });
|
|
620
|
+
return { actionId: res.data.action?.id };
|
|
621
|
+
}
|
|
622
|
+
catch (error) {
|
|
623
|
+
const apiError = error.response?.data?.error;
|
|
624
|
+
if (apiError) {
|
|
625
|
+
throw new Error(`Hetzner resize volume failed: ${apiError.message} (${apiError.code})`);
|
|
626
|
+
}
|
|
627
|
+
if (error.response?.status === 404) {
|
|
628
|
+
throw new Error(`Volume ${volumeId} not found`);
|
|
629
|
+
}
|
|
630
|
+
throw new Error(`Hetzner resize volume failed: ${error.message}`);
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
async detachVolume(volumeId) {
|
|
634
|
+
this.logger.log(`Hetzner detach volume=${volumeId}`);
|
|
635
|
+
try {
|
|
636
|
+
const volumeActionsApi = await this.createVolumeActionsApi();
|
|
637
|
+
const res = await volumeActionsApi.detachVolume(Number.parseInt(volumeId));
|
|
638
|
+
return { actionId: res.data.action?.id };
|
|
639
|
+
}
|
|
640
|
+
catch (error) {
|
|
641
|
+
const apiError = error.response?.data?.error;
|
|
642
|
+
if (apiError?.code === 'locked') {
|
|
643
|
+
this.logger.warn(`Hetzner volume ${volumeId} locked — likely already detaching`);
|
|
644
|
+
return {};
|
|
645
|
+
}
|
|
646
|
+
if (error.response?.status === 404) {
|
|
647
|
+
this.logger.warn(`Hetzner volume ${volumeId} not found during detach — treating as success`);
|
|
648
|
+
return {};
|
|
649
|
+
}
|
|
650
|
+
throw new Error(`Hetzner detach volume failed: ${error.message}`);
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
async deleteVolume(volumeId) {
|
|
654
|
+
this.logger.log(`Hetzner delete volume=${volumeId}`);
|
|
655
|
+
try {
|
|
656
|
+
const volumesApi = await this.createVolumesApi();
|
|
657
|
+
await volumesApi.deleteVolume(Number.parseInt(volumeId));
|
|
658
|
+
}
|
|
659
|
+
catch (error) {
|
|
660
|
+
if (error.response?.status === 404) {
|
|
661
|
+
this.logger.warn(`Hetzner volume ${volumeId} already gone`);
|
|
662
|
+
return;
|
|
663
|
+
}
|
|
664
|
+
const apiError = error.response?.data?.error;
|
|
665
|
+
if (apiError?.code === 'volume_already_attached') {
|
|
666
|
+
throw new Error(`Volume ${volumeId} still attached — call detachVolume first`);
|
|
667
|
+
}
|
|
668
|
+
throw new Error(`Hetzner delete volume failed: ${error.message}`);
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
async listFluiManagedVolumes() {
|
|
672
|
+
try {
|
|
673
|
+
const volumesApi = await this.createVolumesApi();
|
|
674
|
+
const response = await volumesApi.listVolumes(undefined, undefined, undefined, 'managed-by=flui-cloud');
|
|
675
|
+
return (response.data.volumes ?? []).map((v) => ({
|
|
676
|
+
volumeId: String(v.id),
|
|
677
|
+
name: v.name,
|
|
678
|
+
sizeGb: v.size,
|
|
679
|
+
region: v.location?.name,
|
|
680
|
+
attachedServerId: v.server ? String(v.server) : null,
|
|
681
|
+
labels: v.labels ?? {},
|
|
682
|
+
createdAt: v.created,
|
|
683
|
+
}));
|
|
684
|
+
}
|
|
685
|
+
catch (error) {
|
|
686
|
+
this.logger.warn(`Hetzner listFluiManagedVolumes failed: ${error.message}`);
|
|
687
|
+
return [];
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
async listServersAsDto() {
|
|
691
|
+
try {
|
|
692
|
+
const serversApi = await this.createServersApi();
|
|
693
|
+
const response = await serversApi.listServers();
|
|
694
|
+
return response.data.servers.map((server) => this.mapHetznerServerToDto(server));
|
|
695
|
+
}
|
|
696
|
+
catch (error) {
|
|
697
|
+
this.logger.error('Failed to list servers from Hetzner API', error);
|
|
698
|
+
return [];
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
async getServerDetailsAsDto(serverId) {
|
|
702
|
+
try {
|
|
703
|
+
const serverDetails = await this.getServerDetails(serverId);
|
|
704
|
+
if (!serverDetails) {
|
|
705
|
+
return null;
|
|
706
|
+
}
|
|
707
|
+
return this.mapHetznerServerToDto(serverDetails);
|
|
708
|
+
}
|
|
709
|
+
catch (error) {
|
|
710
|
+
this.logger.warn(`Failed to get server details as DTO for ${serverId}`, error);
|
|
711
|
+
return null;
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
async testConnection() {
|
|
715
|
+
try {
|
|
716
|
+
const serversApi = await this.createServersApi();
|
|
717
|
+
// Test with a simple API call
|
|
718
|
+
await serversApi.listServers();
|
|
719
|
+
return { success: true };
|
|
720
|
+
}
|
|
721
|
+
catch (error) {
|
|
722
|
+
this.logger.error('Hetzner API connection test failed', error);
|
|
723
|
+
return {
|
|
724
|
+
success: false,
|
|
725
|
+
error: error.message,
|
|
726
|
+
};
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
mapHetznerServerToDto(server) {
|
|
730
|
+
return {
|
|
731
|
+
id: server.id.toString(),
|
|
732
|
+
name: server.name,
|
|
733
|
+
provider: cloud_provider_enum_1.CloudProvider.HETZNER,
|
|
734
|
+
provider_resource_id: server.id.toString(),
|
|
735
|
+
server_type: server.server_type.name,
|
|
736
|
+
location: server.datacenter.location.name,
|
|
737
|
+
status: server.status,
|
|
738
|
+
public_ip: server.public_net.ipv4?.ip || null,
|
|
739
|
+
private_ip: server.private_net?.[0]?.ip || null,
|
|
740
|
+
created_at: new Date(server.created),
|
|
741
|
+
updated_at: new Date(),
|
|
742
|
+
lastSyncAt: new Date(),
|
|
743
|
+
labels: this.labelService.fromRecord(server.labels || {}),
|
|
744
|
+
};
|
|
745
|
+
}
|
|
746
|
+
async listSSHKeys() {
|
|
747
|
+
try {
|
|
748
|
+
const sshKeysApi = await this.createSSHKeysApi();
|
|
749
|
+
const allKeys = [];
|
|
750
|
+
let page = 1;
|
|
751
|
+
const perPage = 50; // Max allowed by Hetzner API
|
|
752
|
+
// Fetch all pages
|
|
753
|
+
while (true) {
|
|
754
|
+
const response = await sshKeysApi.listSshKeys(undefined, // sort
|
|
755
|
+
undefined, // name
|
|
756
|
+
undefined, // fingerprint
|
|
757
|
+
undefined, // labelSelector
|
|
758
|
+
page, perPage);
|
|
759
|
+
const keys = response.data.ssh_keys
|
|
760
|
+
.filter((sshKey) => this.isFluiManagedKey(sshKey.labels))
|
|
761
|
+
.map((sshKey) => this.mapHetznerSSHKeyToDto(sshKey));
|
|
762
|
+
allKeys.push(...keys);
|
|
763
|
+
// Check if there are more pages
|
|
764
|
+
const meta = response.data.meta;
|
|
765
|
+
if (!meta?.pagination || page >= meta.pagination.last_page) {
|
|
766
|
+
break;
|
|
767
|
+
}
|
|
768
|
+
page++;
|
|
769
|
+
}
|
|
770
|
+
this.logger.log(`Retrieved ${allKeys.length} SSH keys from Hetzner`);
|
|
771
|
+
return allKeys;
|
|
772
|
+
}
|
|
773
|
+
catch (error) {
|
|
774
|
+
this.logger.error('Failed to list SSH keys from Hetzner API', error);
|
|
775
|
+
return [];
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
mapHetznerSSHKeyToDto(sshKey) {
|
|
779
|
+
return {
|
|
780
|
+
id: sshKey.id.toString(),
|
|
781
|
+
name: sshKey.name,
|
|
782
|
+
publicKey: sshKey.public_key,
|
|
783
|
+
fingerprint: sshKey.fingerprint,
|
|
784
|
+
type: this.extractKeyType(sshKey.public_key),
|
|
785
|
+
createdAt: new Date(sshKey.created),
|
|
786
|
+
updatedAt: new Date(sshKey.created),
|
|
787
|
+
source: cloud_provider_enum_1.CloudProvider.HETZNER,
|
|
788
|
+
syncedFromProvider: true,
|
|
789
|
+
providerKeyId: sshKey.id.toString(),
|
|
790
|
+
isActive: sshKey.active || true, // Default to true if not specified
|
|
791
|
+
lastUsed: sshKey.last_used ? new Date(sshKey.last_used) : undefined,
|
|
792
|
+
autoGenerated: false,
|
|
793
|
+
tags: sshKey.labels || {}, // Map Hetzner labels to tags
|
|
794
|
+
};
|
|
795
|
+
}
|
|
796
|
+
isFluiManagedKey(labels) {
|
|
797
|
+
if (!labels)
|
|
798
|
+
return false;
|
|
799
|
+
const isManagedByFlui = labels['managed-by'] === 'flui-cloud';
|
|
800
|
+
const isLegacyFluiCli = labels['flui-cli'] === 'true';
|
|
801
|
+
return isManagedByFlui || isLegacyFluiCli;
|
|
802
|
+
}
|
|
803
|
+
extractKeyType(publicKey) {
|
|
804
|
+
if (publicKey.startsWith('ssh-rsa'))
|
|
805
|
+
return 'rsa';
|
|
806
|
+
if (publicKey.startsWith('ssh-ed25519'))
|
|
807
|
+
return 'ed25519';
|
|
808
|
+
if (publicKey.startsWith('ssh-dss'))
|
|
809
|
+
return 'dsa';
|
|
810
|
+
if (publicKey.startsWith('ecdsa-sha2'))
|
|
811
|
+
return 'ecdsa';
|
|
812
|
+
return 'unknown';
|
|
813
|
+
}
|
|
814
|
+
/**
|
|
815
|
+
* Get available node sizes (server types) from Hetzner
|
|
816
|
+
* Filters out ARM architecture servers
|
|
817
|
+
* @param includeAvailability If true, includes real-time availability data from /datacenters endpoint (NOT cached)
|
|
818
|
+
*/
|
|
819
|
+
async getNodeSizes(includeAvailability = true) {
|
|
820
|
+
this.logger.log(`Fetching node sizes from Hetzner API (includeAvailability: ${includeAvailability})`);
|
|
821
|
+
try {
|
|
822
|
+
const serverTypesApi = await this.createServerTypesApi();
|
|
823
|
+
const response = await serverTypesApi.listServerTypes();
|
|
824
|
+
let nodeSizes = this.nodeSizeMapper.mapHetznerServerTypesToDtos(response.data.server_types);
|
|
825
|
+
// Filter out ARM architecture servers
|
|
826
|
+
nodeSizes = nodeSizes.filter((nodeSize) => nodeSize.architecture !== 'arm');
|
|
827
|
+
// If requested, enrich with real-time availability (NO CACHE)
|
|
828
|
+
if (includeAvailability) {
|
|
829
|
+
const availabilityMap = await this.getDatacenterAvailability();
|
|
830
|
+
nodeSizes = nodeSizes.map((nodeSize) => {
|
|
831
|
+
const serverTypeId = Number.parseInt(nodeSize.id);
|
|
832
|
+
// Build availability info for each location this server type supports
|
|
833
|
+
const availability = nodeSize.locations.map((loc) => ({
|
|
834
|
+
location: loc.name,
|
|
835
|
+
available: availabilityMap.get(loc.name)?.has(serverTypeId) ?? false,
|
|
836
|
+
deprecated: !!loc.deprecation,
|
|
837
|
+
}));
|
|
838
|
+
return {
|
|
839
|
+
...nodeSize,
|
|
840
|
+
availability,
|
|
841
|
+
};
|
|
842
|
+
});
|
|
843
|
+
}
|
|
844
|
+
// Sort by price (ascending, using first location's hourly gross price)
|
|
845
|
+
const sortedNodeSizes = [...nodeSizes].sort((a, b) => {
|
|
846
|
+
const priceA = a.prices[0]?.priceHourly?.gross;
|
|
847
|
+
const priceB = b.prices[0]?.priceHourly?.gross;
|
|
848
|
+
if (!priceA)
|
|
849
|
+
return 1;
|
|
850
|
+
if (!priceB)
|
|
851
|
+
return -1;
|
|
852
|
+
return Number.parseFloat(priceA) - Number.parseFloat(priceB);
|
|
853
|
+
});
|
|
854
|
+
this.logger.log(`Fetched ${response.data.server_types.length} node sizes, filtered to ${sortedNodeSizes.length} (excluding ARM), sorted by price`);
|
|
855
|
+
return sortedNodeSizes;
|
|
856
|
+
}
|
|
857
|
+
catch (error) {
|
|
858
|
+
//error.errors for each concatenate message an log them
|
|
859
|
+
this.logger.error('Failed to fetch Hetzner node sizes', error);
|
|
860
|
+
error?.errors?.forEach((err) => this.logger.error(err));
|
|
861
|
+
throw new Error(`Failed to fetch node sizes`);
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
/**
|
|
865
|
+
* Get pricing information from Hetzner
|
|
866
|
+
*/
|
|
867
|
+
async getPricing(query) {
|
|
868
|
+
this.logger.log('Fetching pricing from Hetzner API', query);
|
|
869
|
+
try {
|
|
870
|
+
const pricingApi = await this.createPricingApi();
|
|
871
|
+
const response = await pricingApi.getPricing();
|
|
872
|
+
return this.pricingMapper.mapHetznerPricingToDto(response.data.pricing, cloud_provider_enum_1.CloudProvider.HETZNER, query.region, query.nodeSize);
|
|
873
|
+
}
|
|
874
|
+
catch (error) {
|
|
875
|
+
this.logger.error('Failed to fetch Hetzner pricing', error);
|
|
876
|
+
throw new Error(`Failed to fetch pricing: ${error.message}`);
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
/**
|
|
880
|
+
* List raw server types with full pricing data including traffic pricing.
|
|
881
|
+
* Used by billing service for cost calculations.
|
|
882
|
+
*/
|
|
883
|
+
async listServerTypesRaw() {
|
|
884
|
+
const serverTypesApi = await this.createServerTypesApi();
|
|
885
|
+
const response = await serverTypesApi.listServerTypes();
|
|
886
|
+
return response.data.server_types;
|
|
887
|
+
}
|
|
888
|
+
/**
|
|
889
|
+
* Get datacenter availability from Hetzner
|
|
890
|
+
* Returns a map of location name to Set of available server type IDs
|
|
891
|
+
*/
|
|
892
|
+
async getDatacenterAvailability() {
|
|
893
|
+
this.logger.log('Fetching datacenter availability from Hetzner API');
|
|
894
|
+
try {
|
|
895
|
+
const datacenterApi = await this.createDataCentersApi();
|
|
896
|
+
const response = await datacenterApi.listDatacenters();
|
|
897
|
+
// Build a map: location name -> Set of available server type IDs
|
|
898
|
+
const availabilityMap = new Map();
|
|
899
|
+
response.data.datacenters.forEach((dc) => {
|
|
900
|
+
const locationName = dc.location.name;
|
|
901
|
+
if (!availabilityMap.has(locationName)) {
|
|
902
|
+
availabilityMap.set(locationName, new Set());
|
|
903
|
+
}
|
|
904
|
+
// Add all available server type IDs for this location
|
|
905
|
+
dc.server_types.available.forEach((typeId) => {
|
|
906
|
+
availabilityMap.get(locationName).add(typeId);
|
|
907
|
+
});
|
|
908
|
+
});
|
|
909
|
+
this.logger.log(`Fetched availability for ${availabilityMap.size} locations from ${response.data.datacenters.length} datacenters`);
|
|
910
|
+
return availabilityMap;
|
|
911
|
+
}
|
|
912
|
+
catch (error) {
|
|
913
|
+
this.logger.error('Failed to fetch datacenter availability', error);
|
|
914
|
+
throw new Error(`Failed to fetch datacenter availability: ${error.message}`);
|
|
915
|
+
}
|
|
916
|
+
}
|
|
917
|
+
/**
|
|
918
|
+
* Create an SSH key on Hetzner
|
|
919
|
+
*/
|
|
920
|
+
async createSSHKey(name, publicKey, labels) {
|
|
921
|
+
try {
|
|
922
|
+
const sshKeysApi = await this.createSSHKeysApi();
|
|
923
|
+
this.logger.log(`Creating SSH key ${name} on Hetzner with labels`, labels);
|
|
924
|
+
const response = await sshKeysApi.createSshKey({
|
|
925
|
+
name,
|
|
926
|
+
public_key: publicKey,
|
|
927
|
+
labels: labels || {},
|
|
928
|
+
});
|
|
929
|
+
this.logger.log(`SSH key ${name} created on Hetzner with ID ${response.data.ssh_key.id}`);
|
|
930
|
+
return {
|
|
931
|
+
id: response.data.ssh_key.id.toString(),
|
|
932
|
+
fingerprint: response.data.ssh_key.fingerprint,
|
|
933
|
+
};
|
|
934
|
+
}
|
|
935
|
+
catch (error) {
|
|
936
|
+
this.logger.error(`Failed to create SSH key ${name} on Hetzner`, error);
|
|
937
|
+
if (error.response?.status === 409) {
|
|
938
|
+
throw new Error(`SSH key with name ${name} already exists on Hetzner`);
|
|
939
|
+
}
|
|
940
|
+
throw new Error(`Failed to create SSH key on Hetzner: ${error.message}`);
|
|
941
|
+
}
|
|
942
|
+
}
|
|
943
|
+
/**
|
|
944
|
+
* Delete an SSH key from Hetzner
|
|
945
|
+
*/
|
|
946
|
+
async deleteSSHKey(providerKeyId) {
|
|
947
|
+
try {
|
|
948
|
+
const sshKeysApi = await this.createSSHKeysApi();
|
|
949
|
+
this.logger.log(`Deleting SSH key ${providerKeyId} from Hetzner`);
|
|
950
|
+
await sshKeysApi.deleteSshKey(Number.parseInt(providerKeyId, 10));
|
|
951
|
+
this.logger.log(`SSH key ${providerKeyId} deleted from Hetzner`);
|
|
952
|
+
}
|
|
953
|
+
catch (error) {
|
|
954
|
+
if (error.response?.status === 404) {
|
|
955
|
+
this.logger.warn(`SSH key ${providerKeyId} not found on Hetzner, skipping deletion`);
|
|
956
|
+
return;
|
|
957
|
+
}
|
|
958
|
+
this.logger.error(`Failed to delete SSH key ${providerKeyId} from Hetzner`, error);
|
|
959
|
+
throw new Error(`Failed to delete SSH key from Hetzner: ${error.message}`);
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
/**
|
|
963
|
+
* Get SSH key details from Hetzner
|
|
964
|
+
*/
|
|
965
|
+
async getSSHKey(providerKeyId) {
|
|
966
|
+
try {
|
|
967
|
+
const sshKeysApi = await this.createSSHKeysApi();
|
|
968
|
+
const response = await sshKeysApi.getSshKey(Number.parseInt(providerKeyId, 10));
|
|
969
|
+
return {
|
|
970
|
+
id: response.data.ssh_key.id.toString(),
|
|
971
|
+
name: response.data.ssh_key.name,
|
|
972
|
+
publicKey: response.data.ssh_key.public_key,
|
|
973
|
+
fingerprint: response.data.ssh_key.fingerprint,
|
|
974
|
+
labels: response.data.ssh_key.labels,
|
|
975
|
+
};
|
|
976
|
+
}
|
|
977
|
+
catch (error) {
|
|
978
|
+
if (error.response?.status === 404) {
|
|
979
|
+
throw new Error(`SSH key ${providerKeyId} not found on Hetzner`);
|
|
980
|
+
}
|
|
981
|
+
this.logger.error(`Failed to get SSH key ${providerKeyId} from Hetzner`, error);
|
|
982
|
+
throw new Error(`Failed to get SSH key from Hetzner: ${error.message}`);
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
async resolveSSHKeys(keys) {
|
|
986
|
+
const providerIds = [];
|
|
987
|
+
for (const key of keys) {
|
|
988
|
+
// Return cached provider ID if already synced
|
|
989
|
+
if (key.existingProviderId) {
|
|
990
|
+
providerIds.push(key.existingProviderId);
|
|
991
|
+
continue;
|
|
992
|
+
}
|
|
993
|
+
try {
|
|
994
|
+
const result = await this.createSSHKey(key.name, key.publicKey);
|
|
995
|
+
providerIds.push(result.id);
|
|
996
|
+
}
|
|
997
|
+
catch (error) {
|
|
998
|
+
if (error.message?.includes('already exists')) {
|
|
999
|
+
// Key exists — find it by fingerprint or name
|
|
1000
|
+
const existing = await this.listSSHKeys();
|
|
1001
|
+
const match = existing.find((k) => k.fingerprint === key.fingerprint || k.name === key.name);
|
|
1002
|
+
if (match) {
|
|
1003
|
+
providerIds.push(match.id);
|
|
1004
|
+
continue;
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
1007
|
+
throw error;
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
1010
|
+
return providerIds;
|
|
1011
|
+
}
|
|
1012
|
+
/**
|
|
1013
|
+
* Update server labels on Hetzner
|
|
1014
|
+
* IMPORTANT: This overwrites ALL labels, so we must merge with existing labels
|
|
1015
|
+
*/
|
|
1016
|
+
async updateServerLabels(serverId, labels) {
|
|
1017
|
+
try {
|
|
1018
|
+
const serversApi = await this.createServersApi();
|
|
1019
|
+
this.logger.log(`Updating labels for server ${serverId}`, JSON.stringify(labels));
|
|
1020
|
+
await serversApi.updateServer(Number.parseInt(serverId, 10), {
|
|
1021
|
+
labels: labels,
|
|
1022
|
+
});
|
|
1023
|
+
this.logger.log(`Server ${serverId} labels updated successfully`);
|
|
1024
|
+
}
|
|
1025
|
+
catch (error) {
|
|
1026
|
+
this.logger.error(`Failed to update labels for server ${serverId}`, error);
|
|
1027
|
+
if (error.response?.status === 404) {
|
|
1028
|
+
throw new Error(`Server ${serverId} not found on Hetzner`);
|
|
1029
|
+
}
|
|
1030
|
+
if (error.response?.data?.error) {
|
|
1031
|
+
const apiError = error.response.data.error;
|
|
1032
|
+
throw new Error(`Hetzner API Error: ${apiError.message} (${apiError.code})`);
|
|
1033
|
+
}
|
|
1034
|
+
throw new Error(`Failed to update server labels: ${error.message}`);
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
// ==================== Network/VNet Management ====================
|
|
1038
|
+
/**
|
|
1039
|
+
* Get network service instance
|
|
1040
|
+
*/
|
|
1041
|
+
async getNetworkService() {
|
|
1042
|
+
const token = await this.credentialProvider.getActiveApiToken(cloud_provider_enum_1.CloudProvider.HETZNER);
|
|
1043
|
+
return new hetzner_network_service_1.HetznerNetworkService(token);
|
|
1044
|
+
}
|
|
1045
|
+
/**
|
|
1046
|
+
* Create a new VNet (private network)
|
|
1047
|
+
*/
|
|
1048
|
+
async createVNet(config) {
|
|
1049
|
+
const networkService = await this.getNetworkService();
|
|
1050
|
+
return networkService.createVNet(config);
|
|
1051
|
+
}
|
|
1052
|
+
/**
|
|
1053
|
+
* Delete a VNet
|
|
1054
|
+
*/
|
|
1055
|
+
async deleteVNet(vnetId) {
|
|
1056
|
+
const networkService = await this.getNetworkService();
|
|
1057
|
+
return networkService.deleteVNet(vnetId);
|
|
1058
|
+
}
|
|
1059
|
+
/**
|
|
1060
|
+
* Get VNet details
|
|
1061
|
+
*/
|
|
1062
|
+
async getVNet(vnetId) {
|
|
1063
|
+
const networkService = await this.getNetworkService();
|
|
1064
|
+
return networkService.getVNet(vnetId);
|
|
1065
|
+
}
|
|
1066
|
+
/**
|
|
1067
|
+
* List all VNets
|
|
1068
|
+
*/
|
|
1069
|
+
async listVNets() {
|
|
1070
|
+
const networkService = await this.getNetworkService();
|
|
1071
|
+
return networkService.listVNets();
|
|
1072
|
+
}
|
|
1073
|
+
/**
|
|
1074
|
+
* Add subnet to VNet
|
|
1075
|
+
*/
|
|
1076
|
+
async addSubnet(config) {
|
|
1077
|
+
const networkService = await this.getNetworkService();
|
|
1078
|
+
return networkService.addSubnet(config);
|
|
1079
|
+
}
|
|
1080
|
+
/**
|
|
1081
|
+
* Delete subnet from VNet
|
|
1082
|
+
*/
|
|
1083
|
+
async deleteSubnet(config) {
|
|
1084
|
+
const networkService = await this.getNetworkService();
|
|
1085
|
+
return networkService.deleteSubnet(config);
|
|
1086
|
+
}
|
|
1087
|
+
/**
|
|
1088
|
+
* Add route to VNet
|
|
1089
|
+
*/
|
|
1090
|
+
async addRoute(config) {
|
|
1091
|
+
const networkService = await this.getNetworkService();
|
|
1092
|
+
return networkService.addRoute(config);
|
|
1093
|
+
}
|
|
1094
|
+
/**
|
|
1095
|
+
* Delete route from VNet
|
|
1096
|
+
*/
|
|
1097
|
+
async deleteRoute(config) {
|
|
1098
|
+
const networkService = await this.getNetworkService();
|
|
1099
|
+
return networkService.deleteRoute(config);
|
|
1100
|
+
}
|
|
1101
|
+
/**
|
|
1102
|
+
* Change IP range of VNet (can only extend, not shrink)
|
|
1103
|
+
*/
|
|
1104
|
+
async changeIpRange(config) {
|
|
1105
|
+
const networkService = await this.getNetworkService();
|
|
1106
|
+
return networkService.changeIpRange(config);
|
|
1107
|
+
}
|
|
1108
|
+
/**
|
|
1109
|
+
* Attach server to VNet
|
|
1110
|
+
*/
|
|
1111
|
+
async attachServerToVNet(config) {
|
|
1112
|
+
try {
|
|
1113
|
+
const serverActionsApi = await this.createServerActionsApi();
|
|
1114
|
+
this.logger.log(`Attaching server ${config.serverId} to VNet ${config.vnetId}`);
|
|
1115
|
+
const response = await serverActionsApi.attachServerToNetwork(Number.parseInt(config.serverId, 10), {
|
|
1116
|
+
network: Number.parseInt(config.vnetId, 10),
|
|
1117
|
+
ip: config.ip,
|
|
1118
|
+
alias_ips: config.aliasIps,
|
|
1119
|
+
});
|
|
1120
|
+
const actionId = response.data.action?.id;
|
|
1121
|
+
this.logger.log(`Server ${config.serverId} attached to VNet ${config.vnetId}, action ID: ${actionId}`);
|
|
1122
|
+
return {
|
|
1123
|
+
actionId,
|
|
1124
|
+
message: `Server attached to VNet successfully`,
|
|
1125
|
+
};
|
|
1126
|
+
}
|
|
1127
|
+
catch (error) {
|
|
1128
|
+
this.logger.error(`Failed to attach server ${config.serverId} to VNet ${config.vnetId}: ${error.message}`, error.stack);
|
|
1129
|
+
throw new Error(`Failed to attach server to VNet on Hetzner: ${error.message}`);
|
|
1130
|
+
}
|
|
1131
|
+
}
|
|
1132
|
+
/**
|
|
1133
|
+
* Detach server from VNet
|
|
1134
|
+
*/
|
|
1135
|
+
async detachServerFromVNet(config) {
|
|
1136
|
+
try {
|
|
1137
|
+
const serverActionsApi = await this.createServerActionsApi();
|
|
1138
|
+
this.logger.log(`Detaching server ${config.serverId} from VNet ${config.vnetId}`);
|
|
1139
|
+
const response = await serverActionsApi.detachServerFromNetwork(Number.parseInt(config.serverId, 10), {
|
|
1140
|
+
network: Number.parseInt(config.vnetId, 10),
|
|
1141
|
+
});
|
|
1142
|
+
const actionId = response.data.action?.id;
|
|
1143
|
+
this.logger.log(`Server ${config.serverId} detached from VNet ${config.vnetId}, action ID: ${actionId}`);
|
|
1144
|
+
return { actionId };
|
|
1145
|
+
}
|
|
1146
|
+
catch (error) {
|
|
1147
|
+
this.logger.error(`Failed to detach server ${config.serverId} from VNet ${config.vnetId}: ${error.message}`, error.stack);
|
|
1148
|
+
throw new Error(`Failed to detach server from VNet on Hetzner: ${error.message}`);
|
|
1149
|
+
}
|
|
1150
|
+
}
|
|
1151
|
+
};
|
|
1152
|
+
exports.HetznerProviderService = HetznerProviderService;
|
|
1153
|
+
exports.HetznerProviderService = HetznerProviderService = HetznerProviderService_1 = __decorate([
|
|
1154
|
+
(0, common_1.Injectable)(),
|
|
1155
|
+
__param(1, (0, common_1.Inject)('ICredentialProvider')),
|
|
1156
|
+
__metadata("design:paramtypes", [config_1.ConfigService, Object, node_size_mapper_1.NodeSizeMapper,
|
|
1157
|
+
pricing_mapper_1.PricingMapper,
|
|
1158
|
+
label_service_1.LabelService])
|
|
1159
|
+
], HetznerProviderService);
|