diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index b9139385..aa4e4dc4 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -8,7 +8,7 @@ jobs: strategy: fail-fast: false matrix: - workdir: [ l0, l1, l2 ] + workdir: [ l1, l2 ] steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3.5.0 diff --git a/flux-operator/.gitignore b/flux-operator/.gitignore new file mode 100644 index 00000000..c6958891 --- /dev/null +++ b/flux-operator/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/node_modules/ diff --git a/flux-operator/Pulumi.hetzner.yaml b/flux-operator/Pulumi.hetzner.yaml new file mode 100644 index 00000000..6542299b --- /dev/null +++ b/flux-operator/Pulumi.hetzner.yaml @@ -0,0 +1,4 @@ +config: + flux-operator:namespace: flux-system + flux-operator:pulumiAccessToken: + secure: AAABALoBTdXSWAVFRi9NBSFtJphWE9R5PlU45bo2yDAUmoAKWRLzwy1Rqql6ZhwOhTu+Gl2YBmMuo02CqIW8HO1VOqGWfev1/NKMpA== diff --git a/flux-operator/Pulumi.yaml b/flux-operator/Pulumi.yaml new file mode 100644 index 00000000..5cd5782e --- /dev/null +++ b/flux-operator/Pulumi.yaml @@ -0,0 +1,7 @@ +name: flux-operator +runtime: nodejs +description: Deploy Kubernetes Operator with Typescript +config: + pulumi:tags: + value: + pulumi:template: https://github.com/pulumi/pulumi-kubernetes-operator/deploy/deploy-operator-ts diff --git a/flux-operator/index.ts b/flux-operator/index.ts new file mode 100644 index 00000000..f872448d --- /dev/null +++ b/flux-operator/index.ts @@ -0,0 +1,187 @@ +import * as pulumi from "@pulumi/pulumi"; +import * as kubernetes from "@pulumi/kubernetes"; +import {Secret} from "@pulumi/kubernetes/core/v1"; +import {CustomResource} from "@pulumi/kubernetes/apiextensions"; + +const defaultCRDVersion = "v1.14.0"; +const defaultOperatorVersion = "v1.14.0"; +const image = "bjoern5urban/pulumi-kubernetes-operator:latest" +const config = new pulumi.Config(); +const deployNamespace = config.get("namespace") || 'default'; +const deployNamespaceList = config.getObject("namespaces") || [deployNamespace]; +const crdVersion = config.get("crd-version") || defaultCRDVersion; +const operatorVersion = config.get("operator-version") || defaultOperatorVersion; +// Get the Pulumi API token. +const pulumiAccessToken = config.requireSecret("pulumiAccessToken") + +const stackCRD = new kubernetes.yaml.ConfigFile("stackcrd", { + file: `https://raw.githubusercontent.com/pulumi/pulumi-kubernetes-operator/${crdVersion}/deploy/crds/pulumi.com_stacks.yaml` +}); +const programCRD = new kubernetes.yaml.ConfigFile("programcrd", { + file: `https://raw.githubusercontent.com/pulumi/pulumi-kubernetes-operator/${crdVersion}/deploy/crds/pulumi.com_programs.yaml` +}); + +const deploymentOptions = {dependsOn: [stackCRD, programCRD]}; +const operatorClusterRole = new kubernetes.rbac.v1.ClusterRole(`operator-cluster-role`, { + rules: [ + { + apiGroups: ["*"], + resources: ["*"], + verbs: ["*"], + }, + // Add other rules as needed + ], +}); +const ns = deployNamespaceList[0] + const operatorServiceAccount = new kubernetes.core.v1.ServiceAccount(`operator-service-account-${ns}`, { + metadata: { + "namespace": ns, + }, + }); + + + +// Bind the ClusterRole to the service account + const operatorClusterRoleBinding = new kubernetes.rbac.v1.ClusterRoleBinding(`operator-cluster-role-binding`, { + metadata: { + name: `operator-cluster-role-binding`, + }, + subjects: [{ + kind: "ServiceAccount", + name: operatorServiceAccount.metadata.name, + namespace: ns, // Specify the namespace of the ServiceAccount + }], + roleRef: { + kind: "ClusterRole", + name: operatorClusterRole.metadata.name, + apiGroup: "rbac.authorization.k8s.io", + }, + }); + const operatorDeployment = new kubernetes.apps.v1.Deployment(`pulumi-kubernetes-operator-${ns}`, { + metadata: { + "namespace": ns, + }, + spec: { + replicas: 1, + selector: { + matchLabels: { + name: "pulumi-kubernetes-operator", + }, + }, + template: { + metadata: { + labels: { + name: "pulumi-kubernetes-operator", + }, + }, + spec: { + serviceAccountName: operatorServiceAccount.metadata.name, + containers: [{ + name: "pulumi-kubernetes-operator", + image: image, + args: ["--zap-level=error", "--zap-time-encoding=iso8601"], + imagePullPolicy: "Always", + env: [ + { + name: "WATCH_NAMESPACE", + valueFrom: { + fieldRef: { + fieldPath: "metadata.namespace", + }, + }, + }, + { + name: "POD_NAME", + valueFrom: { + fieldRef: { + fieldPath: "metadata.name", + }, + }, + }, + { + name: "OPERATOR_NAME", + value: "pulumi-kubernetes-operator", + }, + { + name: "GRACEFUL_SHUTDOWN_TIMEOUT_DURATION", + value: "5m", + }, + { + name: "MAX_CONCURRENT_RECONCILES", + value: "10", + }, + + + ], + }], + // Should be same or larger than GRACEFUL_SHUTDOWN_TIMEOUT_DURATION + terminationGracePeriodSeconds: 300, + }, + }, + }, + }, deploymentOptions); + +// Create the API token as a Kubernetes Secret. + const accessToken = new Secret("operator-accesstoken", { + metadata: { + name: "flux-secret", + namespace: ns + }, + stringData: {accessToken: pulumiAccessToken}, + }); +// Create an NGINX deployment in-cluster. + const stackL1 = new CustomResource("l1", { + apiVersion: 'pulumi.com/v1', + kind: 'Stack', + metadata: { + name: "l1", + namespace: ns + }, + spec: { + envRefs: { + PULUMI_ACCESS_TOKEN: { + type: "Secret", + secret: { + key: "accessToken", + name: accessToken.metadata.name, + namespace: ns, + }, + } + }, + stack: "hetzner", + projectRepo: "https://github.com/B-urb/infrastructure", + repoDir: "/l1", + branch: "development", + retryOnUpdateConflict: true, + destroyOnFinalize: true, + } + }); + const stackL2 = new CustomResource("l2", { + apiVersion: 'pulumi.com/v1', + kind: 'Stack', + metadata: { + name: "l2", + namespace: ns + }, + spec: { + envRefs: { + PULUMI_ACCESS_TOKEN: { + type: "Secret", + secret: { + key: "accessToken", + name: accessToken.metadata.name, + namespace: ns, + }, + } + }, + stack: "hetzner", + projectRepo: "https://github.com/B-Urb/infrastructure", + repoDir: "/l2", + branch: "development", + prerequisites: [ + {name: "l1"} + ], + retryOnUpdateConflict: true, + destroyOnFinalize: true, + } + }); diff --git a/flux-operator/package-lock.json b/flux-operator/package-lock.json new file mode 100644 index 00000000..7fb028c2 --- /dev/null +++ b/flux-operator/package-lock.json @@ -0,0 +1,2664 @@ +{ + "name": "deploy-operator-ts", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "deploy-operator-ts", + "dependencies": { + "@pulumi/kubernetes": "^3.0.0", + "@pulumi/kubernetesx": "^0.1.5", + "@pulumi/pulumi": "^3.0.0" + }, + "devDependencies": { + "@types/node": "^14" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.14", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.14.tgz", + "integrity": "sha512-nOpuzZ2G3IuMFN+UPPpKrC6NsLmWsTqSsm66IRfnBt1D4pwTqE27lmbpcPM+l2Ua4gE7PfjRHI6uedAy7hoXUw==", + "dependencies": { + "@grpc/proto-loader": "^0.7.8", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", + "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@logdna/tail-file": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@logdna/tail-file/-/tail-file-2.2.0.tgz", + "integrity": "sha512-XGSsWDweP80Fks16lwkAUIr54ICyBs6PsI4mpfTLQaWgEJRtY9xEV+PeyDpJ+sJEGZxqINlpmAwe/6tS1pP8Ng==", + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.7.0.tgz", + "integrity": "sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-metrics": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.32.0.tgz", + "integrity": "sha512-g1WLhpG8B6iuDyZJFRGsR+JKyZ94m5LEmY2f+duEJ9Xb4XRlLHrZvh6G34OH6GJ8iDHxfHb/sWjJ1ZpkI9yGMQ==", + "deprecated": "Please use @opentelemetry/api >= 1.3.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.21.0.tgz", + "integrity": "sha512-t0iulGPiMjG/NrSjinPQoIf8ST/o9V0dGOJthfrFporJlNdlKIQPfC7lkrV+5s2dyBThfmSbJlp/4hO1eOcDXA==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.21.0.tgz", + "integrity": "sha512-KP+OIweb3wYoP7qTYL/j5IpOlu52uxBv5M4+QhSmmUfLyTgu1OIS71msK3chFo1D6Y61BIH3wMiMYRCxJCQctA==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.21.0.tgz", + "integrity": "sha512-J0ejrOx52s1PqvjNalIHvY/4v9ZxR2r7XS7WZbwK3qpVYZlGVq5V1+iCNweqsKnb/miUt/4TFvJBc9f5Q/kGcA==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0", + "@opentelemetry/semantic-conventions": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.32.0.tgz", + "integrity": "sha512-y6ADjHpkUz/v1nkyyYjsQa/zorhX+0qVGpFvXMcbjU4sHnBnC02c6wcc93sIgZfiQClIWo45TGku1KQxJ5UUbQ==", + "dependencies": { + "@opentelemetry/api-metrics": "0.32.0", + "require-in-the-middle": "^5.0.3", + "semver": "^7.3.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.32.0.tgz", + "integrity": "sha512-Az6wdkPx/Mi26lT9LKFV6GhCA9prwQFPz5eCNSExTnSP49YhQ7XCjzPd2POPeLKt84ICitrBMdE1mj0zbPdLAQ==", + "dependencies": { + "@opentelemetry/api-metrics": "0.32.0", + "@opentelemetry/instrumentation": "0.32.0", + "@opentelemetry/semantic-conventions": "1.6.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.6.0.tgz", + "integrity": "sha512-aPfcBeLErM/PPiAuAbNFLN5sNbZLc3KZlar27uohllN8Zs6jJbHyJU1y7cMA6W/zuq+thkaG8mujiS+3iD/FWQ==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.21.0.tgz", + "integrity": "sha512-3ZTobj2VDIOzLsIvvYCdpw6tunxUVElPxDvog9lS49YX4hohHeD84A8u9Ns/6UYUcaN5GSoEf891lzhcBFiOLA==", + "dependencies": { + "@opentelemetry/core": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.21.0.tgz", + "integrity": "sha512-8TQSwXjBmaDx7JkxRD7hdmBmRK2RGRgzHX1ArJfJhIc5trzlVweyorzqQrXOvqVEdEg+zxUMHkL5qbGH/HDTPA==", + "dependencies": { + "@opentelemetry/core": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.21.0.tgz", + "integrity": "sha512-1Z86FUxPKL6zWVy2LdhueEGl9AHDJcx+bvHStxomruz6Whd02mE3lNUMjVJ+FGRoktx/xYQcxccYb03DiUP6Yw==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/semantic-conventions": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.21.0.tgz", + "integrity": "sha512-yrElGX5Fv0umzp8Nxpta/XqU71+jCAyaLk34GmBzNcrW43nqbrqvdPs4gj4MVy/HcTjr6hifCDCYA3rMkajxxA==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/semantic-conventions": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.21.0.tgz", + "integrity": "sha512-1pdm8jnqs+LuJ0Bvx6sNL28EhC8Rv7NYV8rnoXq3GIQo7uOHBDAFSj7makAfbakrla7ecO1FRfI8emnR4WvhYA==", + "dependencies": { + "@opentelemetry/context-async-hooks": "1.21.0", + "@opentelemetry/core": "1.21.0", + "@opentelemetry/propagator-b3": "1.21.0", + "@opentelemetry/propagator-jaeger": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.21.0.tgz", + "integrity": "sha512-lkC8kZYntxVKr7b8xmjCVUgE0a8xgDakPyDo9uSWavXPyYqLgYYGdEd2j8NxihRyb6UwpX3G/hFUF4/9q2V+/g==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@pulumi/kubernetes": { + "version": "3.30.2", + "resolved": "https://registry.npmjs.org/@pulumi/kubernetes/-/kubernetes-3.30.2.tgz", + "integrity": "sha512-3877pq6eA8HAgULAtPUtihafG8glO8VKUNy6+/4sY9rE9xjnVcIFHE4ymuN+j0e40Wf49pupflhi7taZz1lSMQ==", + "hasInstallScript": true, + "dependencies": { + "@pulumi/pulumi": "^3.25.0", + "@types/glob": "^5.0.35", + "@types/node-fetch": "^2.1.4", + "@types/tmp": "^0.0.33", + "glob": "^7.1.2", + "node-fetch": "^2.3.0", + "shell-quote": "^1.6.1", + "tmp": "^0.0.33" + } + }, + "node_modules/@pulumi/kubernetesx": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@pulumi/kubernetesx/-/kubernetesx-0.1.6.tgz", + "integrity": "sha512-9VL4Yi4b4aLC/obBarJuNkm86kABByUZICYPSTdV396MGZtOc066o2brsB+kWVQcVfkYVXTPrpjIkAwBXXnzGw==", + "peerDependencies": { + "@pulumi/kubernetes": "^3.0.0", + "@pulumi/pulumi": "^3.0.0" + } + }, + "node_modules/@pulumi/pulumi": { + "version": "3.104.2", + "resolved": "https://registry.npmjs.org/@pulumi/pulumi/-/pulumi-3.104.2.tgz", + "integrity": "sha512-Ljl1JaMFjcfse4M4bFQDadU5FTM4R404DZwM7fegcE0KvWJY2RPZj0TzBazv1vbwSlhDvzmuxQhHN1+U9y+EvQ==", + "dependencies": { + "@grpc/grpc-js": "^1.9.14", + "@logdna/tail-file": "^2.0.6", + "@opentelemetry/api": "^1.2.0", + "@opentelemetry/exporter-zipkin": "^1.6.0", + "@opentelemetry/instrumentation": "^0.32.0", + "@opentelemetry/instrumentation-grpc": "^0.32.0", + "@opentelemetry/resources": "^1.6.0", + "@opentelemetry/sdk-trace-base": "^1.6.0", + "@opentelemetry/sdk-trace-node": "^1.6.0", + "@opentelemetry/semantic-conventions": "^1.6.0", + "@pulumi/query": "^0.3.0", + "@types/google-protobuf": "^3.15.5", + "@types/semver": "^7.5.6", + "@types/tmp": "^0.2.6", + "execa": "^5.1.0", + "google-protobuf": "^3.5.0", + "got": "^11.8.6", + "ini": "^2.0.0", + "js-yaml": "^3.14.0", + "minimist": "^1.2.6", + "normalize-package-data": "^3.0.0", + "pkg-dir": "^7.0.0", + "read-package-tree": "^5.3.1", + "require-from-string": "^2.0.1", + "semver": "^7.5.2", + "source-map-support": "^0.5.6", + "tmp": "^0.2.1", + "ts-node": "^7.0.1", + "typescript": "~3.8.3", + "upath": "^1.1.0" + }, + "engines": { + "node": ">=8.13.0 || >=10.10.0" + } + }, + "node_modules/@pulumi/pulumi/node_modules/@types/tmp": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz", + "integrity": "sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==" + }, + "node_modules/@pulumi/pulumi/node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/@pulumi/query": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@pulumi/query/-/query-0.3.0.tgz", + "integrity": "sha512-xfo+yLRM2zVjVEA4p23IjQWzyWl1ZhWOGobsBqRpIarzLvwNH/RAGaoehdxlhx4X92302DrpdIFgTICMN4P38w==" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/glob": { + "version": "5.0.38", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.38.tgz", + "integrity": "sha512-rTtf75rwyP9G2qO5yRpYtdJ6aU1QqEhWbtW55qEgquEDa6bXW0s2TWZfDm02GuppjEozOWG/F2UnPq5hAQb+gw==", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/google-protobuf": { + "version": "3.15.12", + "resolved": "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.12.tgz", + "integrity": "sha512-40um9QqwHjRS92qnOaDpL7RmDK15NuZYo9HihiJRbYkMQZlWnuH8AdvbMy8/o6lgLmKbDUKa+OALCltHdbOTpQ==" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" + }, + "node_modules/@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" + }, + "node_modules/@types/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==" + }, + "node_modules/@types/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-gVC1InwyVrO326wbBZw+AO3u2vRXz/iRWq9jYhpG4W8LXyIgDv3ZmcLQ5Q4Gs+gFMyqx+viFoFT+l3p61QFCmQ==" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", + "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", + "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "engines": { + "node": "*" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/es-abstract": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, + "node_modules/es-errors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.0.0.tgz", + "integrity": "sha512-yHV74THqMJUyFKkHyN7hyENcEZM3Dj2a2IrdClY+IT4BFQHkIVwlh8s6uZfjsFydMdNHv0F5mWgAA3ajFbsvVQ==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.3.tgz", + "integrity": "sha512-JIcZczvcMVE7AUOP+X72bh8HqHBRxFdz5PDHYtNG/lE3yk9b3KZBJlwFcTyPYjg3L4RLLmZJzvjxhaZVapxFrQ==", + "dependencies": { + "es-errors": "^1.0.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/google-protobuf": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", + "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/internal-slot": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "dependencies": { + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", + "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", + "dependencies": { + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "safe-array-concat": "^1.0.0" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/protobufjs": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", + "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-package-json": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", + "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", + "dependencies": { + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "node_modules/read-package-json/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/read-package-json/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-package-json/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-package-tree": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", + "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", + "deprecated": "The functionality that this package provided is now in @npmcli/arborist", + "dependencies": { + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "util-promisify": "^2.1.0" + } + }, + "node_modules/readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-in-the-middle": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz", + "integrity": "sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==", + "dependencies": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", + "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "dependencies": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.4.0.tgz", + "integrity": "sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==" + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dependencies": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + }, + "bin": { + "ts-node": "dist/bin.js" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/util-promisify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", + "integrity": "sha512-K+5eQPYs14b3+E+hmE2J6gCZ4JmMl9DbYS6BeP2CHq6WMuNxErxf5B/n0fz85L8zUuoO6rIzNNmIQDu/j+1OcA==", + "dependencies": { + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dependencies": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/flux-operator/package.json b/flux-operator/package.json new file mode 100644 index 00000000..59c5cc57 --- /dev/null +++ b/flux-operator/package.json @@ -0,0 +1,11 @@ +{ + "name": "deploy-operator-ts", + "devDependencies": { + "@types/node": "^14" + }, + "dependencies": { + "@pulumi/pulumi": "^3.0.0", + "@pulumi/kubernetes": "^3.0.0", + "@pulumi/kubernetesx": "^0.1.5" + } +} diff --git a/flux-operator/tsconfig.json b/flux-operator/tsconfig.json new file mode 100644 index 00000000..ab65afa6 --- /dev/null +++ b/flux-operator/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "strict": true, + "outDir": "bin", + "target": "es2016", + "module": "commonjs", + "moduleResolution": "node", + "sourceMap": true, + "experimentalDecorators": true, + "pretty": true, + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.ts" + ] +} diff --git a/l0/.gitignore b/l0/.gitignore index c6958891..54eb0fdb 100644 --- a/l0/.gitignore +++ b/l0/.gitignore @@ -1,2 +1,3 @@ /bin/ /node_modules/ +urban.yaml diff --git a/l0/Pulumi.hetzner.yaml b/l0/Pulumi.hetzner.yaml new file mode 100644 index 00000000..9adf64ae --- /dev/null +++ b/l0/Pulumi.hetzner.yaml @@ -0,0 +1,3 @@ +config: + l0:hcloudToken: + secure: AAABAKCOWasK5ERVovDiOdG/Fuu8hzuCCON2aX48EoWNDp6uFSFTXOVo6fq8Y40w+llsfRkoBYey6X5Y+TrB8mAEoxVQ4KF1BmxOQBX8Gia4D12vDH7FNR8Y2nF4jAsx diff --git a/l1/etcd.ts b/l0/cloud_providers/AbstractOrchestrator.ts similarity index 100% rename from l1/etcd.ts rename to l0/cloud_providers/AbstractOrchestrator.ts diff --git a/l0/cloud_providers/hetzner/HCloudOrchestrator.ts b/l0/cloud_providers/hetzner/HCloudOrchestrator.ts new file mode 100644 index 00000000..36bb5e53 --- /dev/null +++ b/l0/cloud_providers/hetzner/HCloudOrchestrator.ts @@ -0,0 +1,104 @@ +import * as hcloud from "@pulumi/hcloud"; +import * as pulumi from "@pulumi/pulumi"; + +import {ICloudOrchestrator} from "../../common/interfaces/ICloudOrchestrator"; +import {Input, Output} from "@pulumi/pulumi"; +import {HCloudServer} from "./HCloudServer"; + +export class HCloudOrchestrator { + + private readonly provider: hcloud.Provider + private datacenterId: string + private location: string + + constructor(provider: hcloud.Provider, datacenterId: string, location: string) { +this.provider = provider + this.datacenterId = datacenterId + this.location = location + } + + createNetwork(name: string) { + return new hcloud.Network(name, { + ipRange: "10.0.0.0/16" // Specify an appropriate IP range + }, {provider: this.provider}); + } + + createSubnet(network: hcloud.Network, name: string) { + return new hcloud.NetworkSubnet(name, { + networkId: network.id.apply(id => parseInt(id)), + type: "cloud", + networkZone: "eu-central", + ipRange: "10.0.1.0/24", + }, {provider: this.provider} + ); + } + + createServer( + sshKeys: Array, + network: hcloud.Network, + serverType: string, + userData: Input, + name: string, + ) { + + + // const primaryIpv4 = new hcloud.PrimaryIp(`${name}-primary_ip-v4`, { + // datacenter: this.datacenterId, + // type: "ipv4", + // assigneeType: "server", + // autoDelete: true, + // labels: { + // hallo: "welt", + // }, + // }, {provider: this.provider}); + // const primaryIpv6 = new hcloud.PrimaryIp(`${name}-primary_ip-v6`, { + // datacenter: this.datacenterId, + // type: "ipv6", + // assigneeType: "server", + // autoDelete: true, + // labels: { + // hallo: "welt", + // }, + // }, {provider: this.provider}); + //const volume = this.createVolume(name) + const server = new hcloud.Server(name, { + serverType: serverType, + name: name, + datacenter: this.datacenterId, + image: "ubuntu-22.04", + sshKeys: sshKeys.map(it => it.name), + userData: userData, + publicNets: [ + { + //ipv4Enabled: true, + //ipv4: primaryIpv4.id.apply(id => parseInt(id)), + ipv6Enabled: true, + //ipv6: primaryIpv6.id.apply(id => parseInt(id)), + }], + networks: [{ + networkId: network.id.apply(id => parseInt(id)), + }], + }, {provider: this.provider}); + //this.attachVolumeToServer(volume, server) + return server + } + + createVolume(name: string) { + return pulumi.output(new hcloud.Volume(`${name}-volume`, { + size: 25, // Size of the volume in GB + location: this.location, + format: "ext4", // Specify the format (optional) + }, {provider: this.provider})); + } + + attachVolumeToServer(volume: hcloud.Volume, server: hcloud.Server) { + const main = new hcloud.VolumeAttachment("attach", { + volumeId: volume.id.apply(id => parseInt(id)), + serverId: server.id.apply(id => parseInt(id)), + automount: true, + }, {provider: this.provider}); + } + + + // ... other resource methods as needed ... +} \ No newline at end of file diff --git a/l0/cloud_providers/hetzner/HCloudServer.ts b/l0/cloud_providers/hetzner/HCloudServer.ts new file mode 100644 index 00000000..36248a06 --- /dev/null +++ b/l0/cloud_providers/hetzner/HCloudServer.ts @@ -0,0 +1,17 @@ +import * as hcloud from "@pulumi/hcloud"; +import * as pulumi from "@pulumi/pulumi"; + +import {ICloudServer} from "../../common/interfaces/ICloudServer"; + +export class HCloudServer implements ICloudServer { + private server: hcloud.Server; + + constructor(name: string, config: hcloud.ServerArgs) { + this.server = new hcloud.Server(name, config); + } + + getServerInfo(): string { + // Implement method to return server information + return `Hetzner Server: ${this.server.id.apply(id => id.toString())}`; + } +} diff --git a/l0/cloud_providers/hetzner/index.ts b/l0/cloud_providers/hetzner/index.ts new file mode 100644 index 00000000..b565281a --- /dev/null +++ b/l0/cloud_providers/hetzner/index.ts @@ -0,0 +1,24 @@ +import * as hcloud from "@pulumi/hcloud"; +import {ICloudServer} from "../../common/interfaces/ICloudServer"; +import * as hcloud from "@pulumi/hcloud" +import {Network, NetworkSubnet, Provider, Server, SshKey, Volume} from "@pulumi/hcloud"; +import * as fs from "fs"; +import {Input, interpolate} from "@pulumi/pulumi"; +class HetznerCloudServer implements ICloudServer { + private server: hcloud.Server; + private datacenterId = "fsn1-dc14"; + private location = "fsn1"; + constructor(name: string, config: hcloud.ServerArgs) { + this.server = new hcloud.Server(name, config); + } + + getServerInfo(): string { + // Implement method to return server information + return `Hetzner Server: ${this.server.id.apply(id => id.toString())}`; + } + + + + + +} \ No newline at end of file diff --git a/l0/common/interfaces/ICloudOrchestrator.ts b/l0/common/interfaces/ICloudOrchestrator.ts new file mode 100644 index 00000000..faedefaf --- /dev/null +++ b/l0/common/interfaces/ICloudOrchestrator.ts @@ -0,0 +1,14 @@ +import * as pulumi from "@pulumi/pulumi"; +import {Output} from "@pulumi/pulumi"; + +export interface ICloudOrchestrator { + createServer(sshKey: Array, + network: any, + serverType: string, + userData: Output, + name: string): pulumi.Output + createVolume(name: string, size: number): pulumi.Output; + createNetwork(name: string): pulumi.Output; + createSubnet(network: any, name: string): pulumi.Output + // ... other resource methods as needed ... +} \ No newline at end of file diff --git a/l0/common/interfaces/ICloudServer.ts b/l0/common/interfaces/ICloudServer.ts new file mode 100644 index 00000000..b351b0ac --- /dev/null +++ b/l0/common/interfaces/ICloudServer.ts @@ -0,0 +1,4 @@ +import * as pulumi from "@pulumi/pulumi"; + +export interface ICloudServer { +} \ No newline at end of file diff --git a/l0/common/types/cloudProviderTypes.ts b/l0/common/types/cloudProviderTypes.ts new file mode 100644 index 00000000..5d967316 --- /dev/null +++ b/l0/common/types/cloudProviderTypes.ts @@ -0,0 +1,23 @@ +import * as hcloud from "@pulumi/hcloud" +export type CloudProviderTypes = { + Hetzner: { + Server: hcloud.Server, + Volume: hcloud.Volume, + Network: hcloud.Network + }, + // Azure: { + // Server: AzureServer, + // Volume: AzureVolume, + // Network: AzureNetwork + // }, + // Add other cloud providers as needed +}; +// // Example types for Hetzner +// type HetznerServer = hcl; +// type HetznerVolume = /* ... */; +// type HetznerNetwork = /* ... */; +// +// // Example types for Azure +// type AzureServer = /* ... */; +// type AzureVolume = /* ... */; +// type AzureNetwork = /* ... */; diff --git a/l0/GitlabRunner.ts b/l0/components/GitlabRunner.ts similarity index 91% rename from l0/GitlabRunner.ts rename to l0/components/GitlabRunner.ts index 59132708..8d8275ce 100644 --- a/l0/GitlabRunner.ts +++ b/l0/components/GitlabRunner.ts @@ -1,7 +1,7 @@ import * as k8s from "@pulumi/kubernetes"; import {Namespace} from "@pulumi/kubernetes/core/v1"; -import {createService} from "../src/resources/kubernetes/Service"; -import {createRole, createRoleBinding, createServiceAccount} from "./Serviceaccounts"; +import {createService} from "../../src/resources/kubernetes/Service"; +import {createRole, createRoleBinding, createServiceAccount} from "../Serviceaccounts"; const runnerToken = process.env.RUNNER_REGISTRATION_TOKEN! const runnerConfig = process.env.RUNNER_CONFIG! diff --git a/l0/components/addons.ts b/l0/components/addons.ts new file mode 100644 index 00000000..91a4ae12 --- /dev/null +++ b/l0/components/addons.ts @@ -0,0 +1,77 @@ +import {apiextensions, helm, Provider} from "@pulumi/kubernetes"; +import {Secret} from "@pulumi/kubernetes/core/v1/secret"; +import {CustomResourceOptions, Input, Lifted, OutputInstance} from "@pulumi/pulumi"; + +export function installCilium(opts: CustomResourceOptions) { + return new helm.v3.Chart("cilium", { + chart: "cilium", + version: "1.14.6", + namespace: "kube-system", + fetchOpts: { + repo: "https://helm.cilium.io/", + }, + }, opts) +} + + + +export function installCertManager(opts: CustomResourceOptions) { + //TODO: Switch to Helm Release, to enable Hook Support + return new helm.v3.Chart("cert-manager", { + chart: "cert-manager", + version: "v1.13.3", + fetchOpts: { + repo: "https://charts.jetstack.io", + }, + namespace: "kube-system", + values: { + installCRDs: true, + }, + }, opts); +} + +export function installClusterIssuer(mail: Input, opts: CustomResourceOptions) { + return new apiextensions.CustomResource("letsencrypt-issuer", { + apiVersion: "cert-manager.io/v1", + kind: "ClusterIssuer", + metadata: { + name: "letsencrypt", + }, + spec: { + acme: { + server: "https://acme-v02.api.letsencrypt.org/directory", + email: mail, + privateKeySecretRef: { + name: "letsencrypt", + }, + solvers: [{ + http01: { + ingress: { + class: "traefik", + }, + }, + }], + }, + }, + }, opts); +} + +export function installCSIDriver(token: Input, opts: CustomResourceOptions) { + new Secret("hcloud-token",{ + metadata: { + name: "hcloud", + namespace: "kube-system" + }, + stringData: { + "token": token + } + },opts) + + return new helm.v3.Chart("hcloud-csi", { + chart: "hcloud-csi", + namespace: "kube-system", + fetchOpts: { + repo: "https://charts.hetzner.cloud/" + }, + },opts) +} \ No newline at end of file diff --git a/l0/components/flux/chart/index.ts b/l0/components/flux/chart/index.ts new file mode 100644 index 00000000..9332a4d7 --- /dev/null +++ b/l0/components/flux/chart/index.ts @@ -0,0 +1,14 @@ +import {CustomResourceOptions} from "@pulumi/pulumi"; +import {helm} from "@pulumi/kubernetes"; + + export function installFlux(opts: CustomResourceOptions) { + //TODO: Switch to Helm Release, to enable Hook Support + return new helm.v3.Chart("flux-operator", { + chart: "pulumi-kubernetes-operator", + version: "v0.5.0", + fetchOpts: { + repo: "https://pulumi.github.io/pulumi-kubernetes-operator", + }, + + }, opts); + } diff --git a/l0/components/juicefs.ts b/l0/components/juicefs.ts new file mode 100644 index 00000000..b64d3833 --- /dev/null +++ b/l0/components/juicefs.ts @@ -0,0 +1,113 @@ +/** + * @Author: Felix Breuer(https://github.com/breuerfelix) + */ +import * as k8s from "@pulumi/kubernetes" +import * as pulumi from "@pulumi/pulumi" +import { getIngress } from "../utils" + +const ident = "juicefs" +const ns = new k8s.core.v1.Namespace(ident, { + metadata: { name: ident }, +}) + +const redis = new k8s.helm.v3.Release("redis", { + namespace: ns.metadata.name, + name: "redis", + chart: "redis", + version: "16.12.2", + repositoryOpts: { + repo: "https://charts.bitnami.com/bitnami", + }, + values: { + architecture: "standalone", + auth: { enabled: false }, + master: { + persistence: { + enabled: true, + storageClass: "openstack", + size: "5Gi", + }, + nodeSelector: { owner: "felix" }, + }, + }, +}) + +const redisService = k8s.core.v1.Service.get( + "redis-headless", + pulumi.interpolate`${redis.status.namespace}/${redis.status.name}-headless`, +); + +const minioSecret = { + name: "juice", + metaurl: pulumi.interpolate`redis://${redisService.metadata.name}`, + storage: "s3", + accessKey: "inovex", + secretKey: "ino-cluster", + bucket: "https://minio.tecios.de/juicefs", +} + +const juiceStorageClassName = "juice" +const juicefs = new k8s.helm.v3.Release("juicefs-driver", { + namespace: ns.metadata.name, + chart: "juicefs-csi-driver", + version: "0.13.1", + repositoryOpts: { + repo: "https://juicedata.github.io/charts", + }, + values: { + storageClasses: [ + { + enabled: true, + name: juiceStorageClassName, + annotations: { + "storageclass.kubernetes.io/is-default-class": "true", + }, + reclaimPolicy: "Delete", + backend: { + ...minioSecret, + trashDays: "0", + }, + }, + ], + }, +}) + +const storage = k8s.storage.v1.StorageClass.get( + "juice-delete", + pulumi.interpolate`${juicefs.status.namespace}/${juiceStorageClassName}`, +) + +export const juicefsStorage = storage.metadata.name + +new k8s.helm.v3.Release("juicefs-gateway", { + namespace: ns.metadata.name, + chart: "juicefs-s3-gateway", + version: "0.9.0", + repositoryOpts: { + repo: "https://juicedata.github.io/charts", + }, + values: { + secret: minioSecret, + ingress: { + enabled: true, + className: "", + ...getIngress("juicefs.tecios.de"), + }, + }, +}) + +new k8s.helm.v3.Release("juicefs-volume-hook", { + namespace: ns.metadata.name, + chart: "juicefs-volume-hook", + version: "0.2.4", + repositoryOpts: { + repo: "https://breuerfelix.github.io/juicefs-volume-hook", + }, + values: { + controller: { + tag: "0.2.2", + // TODO: test this out + //storageClasses: juiceStorageClassName, + }, + }, +}) \ No newline at end of file diff --git a/l0/components/velero.ts b/l0/components/velero.ts new file mode 100644 index 00000000..a8ba0a10 --- /dev/null +++ b/l0/components/velero.ts @@ -0,0 +1,54 @@ +/** + * @Author: Felix Breuer(https://github.com/breuerfelix) + */ +import * as k8s from "@pulumi/kubernetes" + +const ident = "velero" +const ns = new k8s.core.v1.Namespace(ident, { + metadata: { name: ident }, +}) + +new k8s.helm.v3.Release("velero", { + namespace: ns.metadata.name, + name: "velero", + chart: "velero", + version: "3.1.2", + repositoryOpts: { + repo: "https://vmware-tanzu.github.io/helm-charts", + }, + values: { + metrics: { enabled: false }, + snapshotsEnabled: false, + initContainers: [{ + name: "velero-plugin-for-aws", + image: "velero/velero-plugin-for-aws:v1.3.0", + imagePullPolicy: "IfNotPresent", + volumeMounts: [{ + mountPath: "/target", + name: "plugins", + }], + }], + configuration: { + provider: "aws", + backupStorageLocation: { + bucket: "velero", + config: { + region: "minio", + s3ForcePathStyle: true, + s3Url: "https://minio.tecios.de", + }, + }, + }, + credentials: { + useSecret: true, + name: "minio-creds", + secretContents: { + cloud: ` +[default] +aws_access_key_id = inovex +aws_secret_access_key = ino - cluster +`, + }, + }, + }, +}) \ No newline at end of file diff --git a/l0/index.ts b/l0/index.ts index 97e22716..f9e2bfac 100644 --- a/l0/index.ts +++ b/l0/index.ts @@ -1,11 +1,55 @@ import * as pulumi from "@pulumi/pulumi"; import {createNamespace} from "./namespace"; -import {createGitlabRunner} from "./GitlabRunner"; +import {createGitlabRunner} from "./components/GitlabRunner"; import * as gitlab from "@pulumi/gitlab"; +import * as github from "@pulumi/github"; +import {Domain} from "@pulumi/mailgun"; +import * as hcloud from "@pulumi/hcloud" +import {HCloudOrchestrator} from "./cloud_providers/hetzner/HCloudOrchestrator"; +import {K3sCluster} from "./k3s/K3sCluster"; +import * as fs from "fs"; +import {Provider} from "@pulumi/kubernetes"; +import {installCertManager, installCilium, installClusterIssuer, installCSIDriver} from "./components/addons"; +import {RandomPassword} from "@pulumi/random"; +import {installFlux} from "./components/flux/chart"; +import {Namespace} from "@pulumi/kubernetes/core/v1"; -const token = "" -// if gitlab +const config = new pulumi.Config(); +const clusterName = "urban" +const filename = `${clusterName}.yaml`; +const mail = config.get("emailAdress") +const hcloudToken = config.requireSecret("hcloudToken"); +const datacenterId = "fsn1-dc14" +const location = "fsn1" +const provider = new hcloud.Provider("hcloud-provider", { token: hcloudToken}) +const hetznerOrchestrator = new HCloudOrchestrator(provider, datacenterId, location); +const k3sToken = new RandomPassword("k3sToken", { + special: false, + length: 30 +}) +const k3sCluster = new K3sCluster(hetznerOrchestrator, provider, hcloudToken, k3sToken); +const result = k3sCluster.createCluster(clusterName, true, 1, 1) +// Write to a file +result.kubeconfig.apply(value => { + fs.writeFileSync(filename, value, 'utf8'); + console.log(`File written: ${filename}`); +}); + +const kubernetesProvider = new Provider("kube-provider", {kubeconfig: result.kubeconfig, cluster: clusterName, context: clusterName }) +const cilium = installCilium({provider:kubernetesProvider}); +installCSIDriver(hcloudToken,{provider: kubernetesProvider, dependsOn: [cilium]}) +const certManager = installCertManager({provider:kubernetesProvider}) +installClusterIssuer(mail!!,{provider: kubernetesProvider, dependsOn: [certManager]}) +//installFlux({provider:kubernetesProvider, dependsOn:[cilium]}) +new Namespace("flux-system", { + metadata: { + name: "flux-system" + }, +}, +{provider: kubernetesProvider} +) + // const example = new gitlab.GroupVariable("kubeconfig", { // environmentScope: "*", @@ -19,8 +63,6 @@ const token = "" // Create Gitlab Runner //else github -import * as github from "@pulumi/github"; -import {Domain} from "@pulumi/mailgun"; /* const exampleSecretActionsEnvironmentSecret = new github.ActionsEnvironmentSecret("exampleSecretActionsEnvironmentSecret", { environment: "example_environment", @@ -42,6 +84,6 @@ const exampleSecretIndex_actionsEnvironmentSecretActionsEnvironmentSecret = new // spamAction: "disabled", // }); -export const namespaceGitlab = createNamespace("gitlab") +//export const namespaceGitlab = createNamespace("gitlab") -const gitlabRunner = createGitlabRunner(namespaceGitlab) +//const gitlabRunner = createGitlabRunner(namespaceGitlab) diff --git a/l0/k3s/K3sCluster.ts b/l0/k3s/K3sCluster.ts new file mode 100644 index 00000000..0e1167bc --- /dev/null +++ b/l0/k3s/K3sCluster.ts @@ -0,0 +1,137 @@ +import * as fs from "fs"; +import * as cloudinit from "@pulumi/cloudinit" +import * as command from "@pulumi/command" +import * as pulumi from "@pulumi/pulumi"; +import * as hcloud from "@pulumi/hcloud"; +import {CloudProviderTypes} from "../common/types/cloudProviderTypes"; +import {masterConfig, workerConfig} from "./cloudinit"; +import {Input} from "@pulumi/pulumi"; +import {HCloudOrchestrator} from "../cloud_providers/hetzner/HCloudOrchestrator"; +import * as tls from "@pulumi/tls"; +import {PrivateKey} from "@pulumi/tls"; +import {updateKubeConfig} from "../utils"; +import {RandomPassword} from "@pulumi/random"; + + +export class K3sCluster { + private orchestrator: HCloudOrchestrator; + private provider: hcloud.Provider; + private hCloudToken: Input; + private k3sToken: RandomPassword; + + constructor(orchestrator: HCloudOrchestrator, provider: hcloud.Provider, hCloudToken: Input, k3sToken: RandomPassword) { + this.provider = provider; + this.orchestrator = orchestrator; + this.hCloudToken = hCloudToken; + this.k3sToken = k3sToken; + } + + createCluster(name: string, useCilium: boolean, masterCount: number, agentCount: number) { + if (masterCount < 1) + { + throw Error("Master Count must at least one or the cluster would be empty.") + } + + const publicKeyHuman = fs.readFileSync('/Users/bjornurban/.ssh/id_rsa.pub', 'utf8'); + const sshKey = new tls.PrivateKey("sshKey", { + algorithm: "RSA", + rsaBits: 4096, + }); + const publicKeys = Array.of(pulumi.output(publicKeyHuman), sshKey.publicKeyOpenssh) + + + // Create the SSH key resource on Hetzner Cloud + const network = this.orchestrator.createNetwork("main-network") + //Network needs a subnet also we do not need to use the value later on manually + this.orchestrator.createSubnet(network, "main-subnet") + const serverType = "cax21" + const sshKeys = publicKeys.map((it, index) => new hcloud.SshKey(`ssh-${index}`, { + publicKey: it, + }, {provider: this.provider})); + const initialNode = this.orchestrator.createServer(sshKeys, network, serverType, masterConfig(this.k3sToken.result, useCilium), "master-main") + for (let i = 0; i < masterCount - 1; i++) { + const serverName = `master-${i+1}` + this.orchestrator.createServer(sshKeys, network, serverType, workerConfig(initialNode.ipv4Address, this.k3sToken.result, useCilium, false), serverName) + } + + for (let i = 0; i < agentCount; i++) { + const serverName = `node-${i}` + this.orchestrator.createServer(sshKeys, network, serverType, workerConfig(initialNode.ipv4Address, this.k3sToken.result, useCilium, true), serverName) + } + + const kubeconfig = this.getConfig(initialNode.ipv4Address, sshKey); // Assuming this returns the kubeconfig as a string + const newContextName = `${name}`; // Replace with your new context name + const newClusterName = `${name}`; // Replace with your new cluster name + const updatedConfig = updateKubeConfig(kubeconfig, initialNode.ipv4Address, newContextName, newClusterName); + // Call the function + return { + "ip": initialNode.ipv4Address, + "sshKey": sshKey, + "kubeconfig": updatedConfig + } + } + + getCloudInit(master: Boolean) { + const k3sInstallPath = master ? "./install-k3s-master.sh" : "./install-k3s.sh" + return cloudinit.getConfig({ + gzip: false, + base64Encode: false, + + parts: [ + { + contentType: "text/x-shellscript", + content: fs.readFileSync("./ensure-curl.sh", "utf8"), + }, + { + contentType: "text/x-shellscript", + content: fs.readFileSync(k3sInstallPath, "utf8"), + }, + ], + }); + } + + createMasterNode(name: string, config: hcloud.ServerArgs, token: pulumi.Output): pulumi.Output { + const modifiedConfig = { + ...config, + userData: token.apply(t => `#cloud-config\nyour-configuration-here\nK3S_TOKEN=${t}`), + }; + + const workerServer = new hcloud.Server(name, modifiedConfig); + return pulumi.output(workerServer); + } + + createWorkerNode(name: string, config: hcloud.ServerArgs, token: pulumi.Output): pulumi.Output { + const modifiedConfig = { + ...config, + userData: token.apply(t => `#cloud-config\nyour-configuration-here\nK3S_TOKEN=${t}`), + }; + + const workerServer = new hcloud.Server(name, modifiedConfig); + return pulumi.output(workerServer); + } + + getNodeToken(server: hcloud.Server, name: string): pulumi.Output { + const tokenCommand = new command.local.Command(name, { + create: `ssh user@${server.ipv4Address.apply(ip => ip)} 'cat /var/lib/rancher/k3s/server/node-token'`, + }, {dependsOn: [server]}); + + return tokenCommand.stdout; + } + + getConfig(ip: Input, sshKey: PrivateKey) { + const fetchKubeconfig = new command.remote.Command("fetch-kubeconfig", { + connection: { + host: ip, + user: "root", + privateKey: sshKey.privateKeyPem, + }, + create: + // First, we use `until` to monitor for the k3s.yaml (our kubeconfig) being created. + // Then we sleep 10, just in-case the k3s server needs a moment to become healthy. Sorry? + "until [ -f /etc/rancher/k3s/k3s.yaml ]; do sleep 5; done; cat /etc/rancher/k3s/k3s.yaml; sleep 10;", + }); + return fetchKubeconfig.stdout; + } +} + + diff --git a/l0/k3s/cloudinit.ts b/l0/k3s/cloudinit.ts new file mode 100644 index 00000000..2a54d843 --- /dev/null +++ b/l0/k3s/cloudinit.ts @@ -0,0 +1,31 @@ +import * as pulumi from "@pulumi/pulumi" +import {Input, Output} from "@pulumi/pulumi"; + +export const masterConfig = (k3sToken: Input, disableFlannel: boolean): Output => { + return pulumi.interpolate` + #cloud-config + users: + - name: k3s-user + groups: sudo + shell: /bin/bash + runcmd: + - | + curl -sfL https://get.k3s.io | K3S_TOKEN=${k3sToken} K3S_KUBECONFIG_MODE="644" sh -s - server \ + ${disableFlannel ? "--flannel-backend none --disable-network-policy" : ""} \ + --cluster-init + `; +} + +export const workerConfig = (masterIp: Output, k3sToken: Input, disableFlannel: boolean, isWorker: boolean = true): Output => { + return pulumi.interpolate` + #cloud-config + users: + - name: k3s-user + groups: sudo + shell: /bin/bash + runcmd: + - | + curl -sfL https://get.k3s.io | K3S_TOKEN=${k3sToken} K3S_URL=https://${masterIp}:6443 sh -s - ${isWorker ? "agent" : "server"} \ + ${disableFlannel && !isWorker ? "--flannel-backend none --disable-network-policy" : ""} + `; +} \ No newline at end of file diff --git a/l0/k3s/ensure-curl.sh b/l0/k3s/ensure-curl.sh new file mode 100644 index 00000000..60576b72 --- /dev/null +++ b/l0/k3s/ensure-curl.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env sh +# ../cloud-init/ensure-curl.sh +DEBIAN_FRONTEND=noninteractive apt update && apt install --yes curl \ No newline at end of file diff --git a/l0/k3s/install-k3s-master.sh b/l0/k3s/install-k3s-master.sh new file mode 100644 index 00000000..12404c0e --- /dev/null +++ b/l0/k3s/install-k3s-master.sh @@ -0,0 +1 @@ +curl -sfL https://get.k3s.io | sh - diff --git a/l0/k3s/install-k3s.sh b/l0/k3s/install-k3s.sh new file mode 100644 index 00000000..e0f70ea4 --- /dev/null +++ b/l0/k3s/install-k3s.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +# ../cloud-init/install-k3s.sh +PUBLIC_IP=$(curl -w "\n" http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address) +curl -sfL https://get.k3s.io | sh -s - --bind-address ${PUBLIC_IP} \ No newline at end of file diff --git a/l0/package-lock.json b/l0/package-lock.json index 5ac077d9..6877f6c5 100644 --- a/l0/package-lock.json +++ b/l0/package-lock.json @@ -6,14 +6,18 @@ "": { "name": "l0", "dependencies": { - "@pulumi/mailgun": "^3.4.1", - "@pulumi/pulumi": "^3.0.0" - }, - "devDependencies": { + "@pulumi/cloudinit": "^1.4.0", + "@pulumi/command": "^0.9.2", "@pulumi/github": "^5.9.0", "@pulumi/gitlab": "^4.10.0", - "@pulumi/kubernetes": "^3.29.0", - "@types/node": "^16" + "@pulumi/hcloud": "^1.17.0", + "@pulumi/kubernetes": "^3.30.2", + "@pulumi/mailgun": "^3.4.1", + "@pulumi/pulumi": "^3.0.0", + "@pulumi/random": "^4.15.1", + "@pulumi/tls": "^5.0.0", + "@types/node": "^16", + "yaml": "^2.3.4" } }, "node_modules/@grpc/grpc-js": { @@ -325,11 +329,27 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, + "node_modules/@pulumi/cloudinit": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pulumi/cloudinit/-/cloudinit-1.4.0.tgz", + "integrity": "sha512-o6swQATswsbgLunEpjU5fL/fxQGN2bHk1JCLoiMc9FbA+N27iplkEJg4yrJadpLxmheZp70Yj8E5f4O6vrHtdw==", + "dependencies": { + "@pulumi/pulumi": "^3.0.0" + } + }, + "node_modules/@pulumi/command": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@pulumi/command/-/command-0.9.2.tgz", + "integrity": "sha512-9RaGDiy8jFCiaarj4EOrMW/fVCM/AgBigzwM6CKzlR49x8UFiRDmKrXfEVHb8r2P9IpC4IaAZf5VbNNAHwN/rA==", + "hasInstallScript": true, + "dependencies": { + "@pulumi/pulumi": "^3.0.0" + } + }, "node_modules/@pulumi/github": { "version": "5.9.0", "resolved": "https://registry.npmjs.org/@pulumi/github/-/github-5.9.0.tgz", "integrity": "sha512-Qpxb0crxZFD9jjxG3FGflL6hZk+GIE6ZB7QpCnWoMTtXjQXNaM1XIkztYPD0hDNNf9aaGH2x5WqsI4v/AZB/jg==", - "dev": true, "hasInstallScript": true, "dependencies": { "@pulumi/pulumi": "^3.0.0" @@ -339,7 +359,6 @@ "version": "4.10.0", "resolved": "https://registry.npmjs.org/@pulumi/gitlab/-/gitlab-4.10.0.tgz", "integrity": "sha512-ZIHmPVIOdUzh1YXeDS7yIdhmoWfa30o4fV3IfD7V84fN0Ka8oMkPspTU3Ey26s9PhwynNIaBAt/gIeZ6hoB3Vg==", - "dev": true, "hasInstallScript": true, "dependencies": { "@pulumi/pulumi": "^3.0.0", @@ -348,11 +367,18 @@ "resolve": "^1.7.1" } }, + "node_modules/@pulumi/hcloud": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@pulumi/hcloud/-/hcloud-1.17.0.tgz", + "integrity": "sha512-fcCFdIoW0mF5ddlQHxVpRrzsjEG6URuOlh7OA5XUPTv4eWGmmi8hHVwWyrJE4y9msT7HkgR9dC6b9P4tSNS3aA==", + "dependencies": { + "@pulumi/pulumi": "^3.0.0" + } + }, "node_modules/@pulumi/kubernetes": { - "version": "3.29.0", - "resolved": "https://registry.npmjs.org/@pulumi/kubernetes/-/kubernetes-3.29.0.tgz", - "integrity": "sha512-NzWfGDNp6BfJJxYLf5Zv+0uM9HVOEhiQyWTQWSNjlToxLiAmtX25J/yMSpLoo17Nqm1oHnNDvGPaM5q0KoDR6Q==", - "dev": true, + "version": "3.30.2", + "resolved": "https://registry.npmjs.org/@pulumi/kubernetes/-/kubernetes-3.30.2.tgz", + "integrity": "sha512-3877pq6eA8HAgULAtPUtihafG8glO8VKUNy6+/4sY9rE9xjnVcIFHE4ymuN+j0e40Wf49pupflhi7taZz1lSMQ==", "hasInstallScript": true, "dependencies": { "@pulumi/pulumi": "^3.25.0", @@ -412,11 +438,26 @@ "resolved": "https://registry.npmjs.org/@pulumi/query/-/query-0.3.0.tgz", "integrity": "sha512-xfo+yLRM2zVjVEA4p23IjQWzyWl1ZhWOGobsBqRpIarzLvwNH/RAGaoehdxlhx4X92302DrpdIFgTICMN4P38w==" }, + "node_modules/@pulumi/random": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@pulumi/random/-/random-4.15.1.tgz", + "integrity": "sha512-qonG+7iE9haQ045hrHQEpF7SsAJLrlkyhhPs/UUOcdjcgoRh68suWxBNvTdtDZXY5Nfhwhh7mszaRbHscSbixg==", + "dependencies": { + "@pulumi/pulumi": "^3.0.0" + } + }, + "node_modules/@pulumi/tls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@pulumi/tls/-/tls-5.0.0.tgz", + "integrity": "sha512-7n3bV9aTKdyC5yft2oREp3Yww9daPnj8GVuypkoL8LIGlVRefm4gBSjso8t3JjpiJZN1hq99NivQp1e0fJkezw==", + "dependencies": { + "@pulumi/pulumi": "^3.0.0" + } + }, "node_modules/@types/glob": { "version": "5.0.38", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.38.tgz", "integrity": "sha512-rTtf75rwyP9G2qO5yRpYtdJ6aU1QqEhWbtW55qEgquEDa6bXW0s2TWZfDm02GuppjEozOWG/F2UnPq5hAQb+gw==", - "dev": true, "dependencies": { "@types/minimatch": "*", "@types/node": "*" @@ -430,8 +471,7 @@ "node_modules/@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" }, "node_modules/@types/node": { "version": "16.18.28", @@ -442,7 +482,6 @@ "version": "2.6.4", "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", - "dev": true, "dependencies": { "@types/node": "*", "form-data": "^3.0.0" @@ -451,8 +490,7 @@ "node_modules/@types/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-gVC1InwyVrO326wbBZw+AO3u2vRXz/iRWq9jYhpG4W8LXyIgDv3ZmcLQ5Q4Gs+gFMyqx+viFoFT+l3p61QFCmQ==", - "dev": true + "integrity": "sha512-gVC1InwyVrO326wbBZw+AO3u2vRXz/iRWq9jYhpG4W8LXyIgDv3ZmcLQ5Q4Gs+gFMyqx+viFoFT+l3p61QFCmQ==" }, "node_modules/ansi-regex": { "version": "5.0.1", @@ -530,8 +568,7 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/available-typed-arrays": { "version": "1.0.5", @@ -567,7 +604,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.0.0.tgz", "integrity": "sha512-hMIeU4K2ilbXV6Uv93ZZ0Avg/M91RaKXucQ+4me2Do1txxBDyDZWCBa5bJSLqoNTRpXTLwEzIk1KmloenDDjhg==", - "dev": true, "engines": { "node": ">=6" } @@ -617,7 +653,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -686,7 +721,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, "engines": { "node": ">=0.4.0" } @@ -848,7 +882,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -1372,7 +1405,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -1381,7 +1413,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -1441,7 +1472,6 @@ "version": "2.6.11", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", - "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -1569,7 +1599,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -1779,7 +1808,6 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1946,7 +1974,6 @@ "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -1957,8 +1984,7 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/ts-node": { "version": "7.0.1", @@ -2049,14 +2075,12 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -2144,6 +2168,14 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "engines": { + "node": ">= 14" + } + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", diff --git a/l0/package.json b/l0/package.json index 3468c5bf..0286e612 100644 --- a/l0/package.json +++ b/l0/package.json @@ -1,13 +1,18 @@ { "name": "l0", "main": "index.ts", - "dependencies": { - "@pulumi/mailgun": "^3.4.1", - "@pulumi/pulumi": "^3.0.0", + "@pulumi/cloudinit": "^1.4.0", + "@pulumi/command": "^0.9.2", "@pulumi/github": "^5.9.0", "@pulumi/gitlab": "^4.10.0", - "@pulumi/kubernetes": "^3.29.0", - "@types/node": "^16" + "@pulumi/hcloud": "^1.17.0", + "@pulumi/kubernetes": "^3.30.2", + "@pulumi/mailgun": "^3.4.1", + "@pulumi/pulumi": "^3.0.0", + "@pulumi/random": "^4.15.1", + "@pulumi/tls": "^5.0.0", + "@types/node": "^16", + "yaml": "^2.3.4" } } diff --git a/l0/utils/index.ts b/l0/utils/index.ts new file mode 100644 index 00000000..3bcc9e3c --- /dev/null +++ b/l0/utils/index.ts @@ -0,0 +1,74 @@ +import * as pulumi from "@pulumi/pulumi"; +import {parse, stringify} from "yaml"; + +export function updateKubeConfig( + kubeconfig: pulumi.Input, + serverIp: pulumi.Input, + newContextName: string, + newClusterName: string +): pulumi.Output { + return pulumi.all([kubeconfig, serverIp]).apply(([kc, ip]) => { + // Parse the YAML kubeconfig to JSON + const config: KubeConfig = parse(kc); + + // Replace the server address in all clusters + config.clusters.forEach((cluster: KubeCluster) => { + if (cluster.name === 'default') { + cluster.cluster.server = `https://${ip}:6443`; + cluster.name = newClusterName; + } + }); + + // Replace the context name in all contexts + config.contexts.forEach((context: KubeContext) => { + if (context.name === 'default') { + context.context.cluster = newClusterName; // Update cluster reference + context.name = newContextName; // Update context name + } + }); + + // Update current-context if it was 'default' + if (config['current-context'] === 'default') { + config['current-context'] = newContextName; + } + + // Convert the modified JSON back to YAML + return stringify(config); + }); +} + +interface KubeContext { + context: { + cluster: string; + user: string; + }; + name: string; +} + +interface KubeConfig { + clusters: KubeCluster[]; + contexts: KubeContext[]; + 'current-context': string; + // Add other properties of kubeconfig as needed +} +interface KubeCluster { + cluster: { + server: string; + }; + name: string; +} + +interface KubeContext { + context: { + cluster: string; + user: string; + }; + name: string; +} + +interface KubeConfig { + clusters: KubeCluster[]; + contexts: KubeContext[]; + 'current-context': string; + // Add other properties of kubeconfig as needed +} \ No newline at end of file diff --git a/l1/Pulumi.prod.yaml b/l1/Pulumi.contabo.yaml similarity index 100% rename from l1/Pulumi.prod.yaml rename to l1/Pulumi.contabo.yaml diff --git a/l1/Pulumi.hetzner.yaml b/l1/Pulumi.hetzner.yaml new file mode 100644 index 00000000..94ad8c20 --- /dev/null +++ b/l1/Pulumi.hetzner.yaml @@ -0,0 +1,3 @@ +config: + l1:mailgunKey: + secure: AAABAJsSCgIj1e7ZDcg1kf63OClcNzYbeC16cPB1Ml3vZfN34el8WbZwrria1UBM8y3bqk2zJ3X8Qpbrej0AgBnR8YwkcTbrX+KSkFLSU7Su/Q== diff --git a/l1/providers/charts/Etcd.ts b/l1/components/etcd/chart/Etcd.ts similarity index 95% rename from l1/providers/charts/Etcd.ts rename to l1/components/etcd/chart/Etcd.ts index 20a080dc..893e32e0 100644 --- a/l1/providers/charts/Etcd.ts +++ b/l1/components/etcd/chart/Etcd.ts @@ -24,7 +24,6 @@ export function createEtcd(namespace: Namespace, secret: Secret) { } }, "persistence": { - "storageClass":"local-path", "size": "3Gi" }, nodeSelector: { diff --git a/l1/components/kafka/chart/Kafka.ts b/l1/components/kafka/chart/Kafka.ts new file mode 100644 index 00000000..7ea76a8f --- /dev/null +++ b/l1/components/kafka/chart/Kafka.ts @@ -0,0 +1,36 @@ +import * as k8s from "@pulumi/kubernetes"; +import {Namespace, Secret} from "@pulumi/kubernetes/core/v1"; + + +export function createKafka(namespace: Namespace, secret: Secret) { + return new k8s.helm.v3.Chart("kafka", { + chart: "kafka", + namespace: namespace.metadata.name, + fetchOpts: { + repo: "https://charts.bitnami.com/bitnami" + }, + values: { + "auth": + { + "rbac": { + create: false, + "existingSecret": secret.metadata.name, + "existingSecretPasswordKey": "root-password" + }, + client: { + //secureTransport: true, + //useAutoTLS: true + //existingSecret: etcdSecret.metadata.name + } + }, + "persistence": { + "storageClass":"local-path", + "size": "3Gi" + }, + nodeSelector: { + // owner: "bjoern" + } + + } + }) +} diff --git a/l1/providers/charts/Postgres.ts b/l1/components/postgres/chart/Postgres.ts similarity index 85% rename from l1/providers/charts/Postgres.ts rename to l1/components/postgres/chart/Postgres.ts index 2b9989c1..0693b1c8 100644 --- a/l1/providers/charts/Postgres.ts +++ b/l1/components/postgres/chart/Postgres.ts @@ -1,6 +1,6 @@ import * as k8s from "@pulumi/kubernetes" import {Namespace} from "@pulumi/kubernetes/core/v1"; -import {dbUsername} from "../../../util/env"; +import {dbUsername} from "../../../../util/env"; import {RandomPassword} from "@pulumi/random"; @@ -10,13 +10,12 @@ export function createPostgresHelm(namespace: Namespace, dbRootPassword: RandomP return new k8s.helm.v3.Chart("postgres", { chart: "postgresql", namespace: namespace.metadata.name, - version: "11.9.13", + version: "14.0.5", fetchOpts: { repo: "https://charts.bitnami.com/bitnami", }, values: { "global": { - "storageClass": "local-path", "postgresql":{ "auth": { "database": "applications", @@ -31,7 +30,8 @@ export function createPostgresHelm(namespace: Namespace, dbRootPassword: RandomP "extendedConfiguration": "max_connections = 400" }, "readReplicas": { - "replicaCount": 2 + "extendedConfiguration": "max_connections = 400", + "replicaCount": 1 } } } diff --git a/l1/postgres.ts b/l1/components/postgres/index.ts similarity index 87% rename from l1/postgres.ts rename to l1/components/postgres/index.ts index f9ea85e5..a89e27dd 100644 --- a/l1/postgres.ts +++ b/l1/components/postgres/index.ts @@ -1,7 +1,7 @@ -import {DirectusConfig, Source} from "../util/types"; +import {DirectusConfig, Source} from "../../../util/types"; import * as postgresql from "@pulumi/postgresql"; -import {createPostgresHelm} from "./providers/charts/Postgres"; +import {createPostgresHelm} from "./chart/Postgres"; import {Namespace} from "@pulumi/kubernetes/core/v1"; import {RandomPassword} from "@pulumi/random"; diff --git a/l1/components/postgres/operator/Zalando.ts b/l1/components/postgres/operator/Zalando.ts new file mode 100644 index 00000000..e69de29b diff --git a/l1/providers/charts/Redis.ts b/l1/components/redis/chart/Redis.ts similarity index 70% rename from l1/providers/charts/Redis.ts rename to l1/components/redis/chart/Redis.ts index 5d4b5c28..8a28f264 100644 --- a/l1/providers/charts/Redis.ts +++ b/l1/components/redis/chart/Redis.ts @@ -1,26 +1,27 @@ import * as k8s from "@pulumi/kubernetes" import {Namespace} from "@pulumi/kubernetes/core/v1"; -import {redisDBPassword} from "../../../util/env"; +import {redisDBPassword} from "../../../../util/env"; export function createRedisHelm(namespace: Namespace) { return new k8s.helm.v3.Chart("redis", { chart: "redis", namespace: namespace.metadata.name, - version: "17.3.8", + version: "18.13.0", fetchOpts: { repo: "https://charts.bitnami.com/bitnami", }, values: { "global": { - "storageClass": "local-path", "redis":{ "password": redisDBPassword, } }, - master: { - nodeSelector: { - owner: "bjoern" - } + auth: { + enabled: false, + sentinel: false, + }, + replica: { + replicaCount: 1 } } } diff --git a/l1/providers/Manual/Surreal.ts b/l1/components/surrealdb/Manual/Surreal.ts similarity index 97% rename from l1/providers/Manual/Surreal.ts rename to l1/components/surrealdb/Manual/Surreal.ts index 1d101fb0..b3ac05c4 100644 --- a/l1/providers/Manual/Surreal.ts +++ b/l1/components/surrealdb/Manual/Surreal.ts @@ -1,5 +1,5 @@ import {ConfigMap, PersistentVolumeClaim, Service} from "@pulumi/kubernetes/core/v1"; -import {keelAnnotationsProd} from "../../../util/globals"; +import {keelAnnotationsProd} from "../../../../util/globals"; import {Namespace, Secret} from "@pulumi/kubernetes/core/v1"; import {RandomPassword} from "@pulumi/random"; import exp = require("constants"); @@ -8,7 +8,7 @@ import {StatefulSet} from "@pulumi/kubernetes/apps/v1"; const name = "surrealdb" const namespaceName = "surrealdb" const image = "surrealdb/surrealdb" -const tag = "1.0.0" +const tag = "v1.2.0" export const surrealPassword = new RandomPassword("surrealPassword",{length: 16, special: true}) diff --git a/l1/index.ts b/l1/index.ts index 952d16de..ef25e574 100644 --- a/l1/index.ts +++ b/l1/index.ts @@ -1,16 +1,17 @@ import * as pulumi from "@pulumi/pulumi"; import {createNamespace} from "./namespace"; -import {createPostgres} from "./postgres"; import {RandomPassword} from "@pulumi/random"; import {Config, secret} from "@pulumi/pulumi"; import {Htpasswd, HtpasswdAlgorithm} from "pulumi-htpasswd"; import * as k8s from "@pulumi/kubernetes"; import {Secret} from "@pulumi/kubernetes/core/v1"; -import {createSurrealManual} from "./providers/Manual/Surreal"; +import {createSurrealManual} from "./components/surrealdb/Manual/Surreal"; +import {createPostgres} from "./components/postgres"; +import {createRedis} from "./redis"; const namespacePostgres = createNamespace("postgres"); export const postgresNamespace = namespacePostgres.metadata.name -const namespaceEtcd = createNamespace("etcd") +//const namespaceEtcd = createNamespace("etcd") const config = new Config() const dbRootPassword = new RandomPassword("postgresRootPassword", { length: 16, @@ -48,7 +49,8 @@ export const mailgunKey = config.requireSecret("mailgunKey") //TODO: Replace wi //export const etcdSecret = createEtcdSecret(env.etcdRootPassword, namespaceEtcd); //const etcd = createEtcd(namespaceEtcd, etcdSecret) -//const redis = createRedis("helm",namespaceRedis); +const namespaceRedis = createNamespace("redis") +const redis = createRedis("helm",namespaceRedis); //FIXME: Update chart export const postgresRootPassword = dbRootPassword.result diff --git a/l1/redis.ts b/l1/redis.ts index 65989811..640134e2 100644 --- a/l1/redis.ts +++ b/l1/redis.ts @@ -1,6 +1,6 @@ import {Source} from "../util/types"; import {Namespace} from "@pulumi/kubernetes/core/v1"; -import {createRedisHelm} from "./providers/charts/Redis"; +import {createRedisHelm} from "./components/redis/chart/Redis"; export function createRedis(by: Source, namespace: Namespace) { switch (by) { diff --git a/l1/surreal.ts b/l1/surreal.ts index 4dff37d6..30e76b92 100644 --- a/l1/surreal.ts +++ b/l1/surreal.ts @@ -1,7 +1,7 @@ import {DirectusConfig, Source} from "../util/types"; import * as postgresql from "@pulumi/postgresql"; -import {createPostgresHelm} from "./providers/charts/Postgres"; +import {createPostgresHelm} from "./components/postgres/chart/Postgres"; import {Namespace} from "@pulumi/kubernetes/core/v1"; import {RandomPassword} from "@pulumi/random"; diff --git a/l2/CronJob.ts b/l2/CronJob.ts index 5d7d5723..8b79f5dc 100644 --- a/l2/CronJob.ts +++ b/l2/CronJob.ts @@ -17,7 +17,7 @@ export default function createBackupCronjob(namespace: Input, backupSecr containers: [ { name: "directus-backup", - image: "bjoern5urban/postgres-s3-backup:v0.4", + image: "bjoern5urban/postgres-s3-backup:v0.5", imagePullPolicy: "Always", env: [{ name: "DB_USER", diff --git a/l2/Pulumi.prod.yaml b/l2/Pulumi.contabo.yaml similarity index 100% rename from l2/Pulumi.prod.yaml rename to l2/Pulumi.contabo.yaml diff --git a/l2/Pulumi.hetzner.yaml b/l2/Pulumi.hetzner.yaml new file mode 100644 index 00000000..7219db19 --- /dev/null +++ b/l2/Pulumi.hetzner.yaml @@ -0,0 +1,15 @@ +config: + l2:admin-mail: bjoclurban@gmail.com + l2:org: bjoern_urban_5 + l2:paperlessAdminPw: + secure: AAABAEtG6Gbz8vJDGyd90/awJ7oaR7MQz63BbSExv5QvR9WzXGREAaagGCHAQ/oQGRipIw== + l2:paperlessAdminUser: + secure: AAABAH8jcjBQ8Dvr6SGWyNb1KW9B2xYWSjDa2eE31qN0uJ87ZhZ3GJPB+9fCIdpL0V7ktg== + l2:paperlessUsermapGid: + secure: AAABACvvMUsj5894CDfUgUSgOuns1GuR6NQV361VDp1jlA== + l2:paperlessUsermapUid: + secure: AAABAKCe90oXvG7YFCdwWdmuhbpBHujqIRFtt/UFOeZ4BY8= + l2:s3-key: + secure: AAABAD/h/5wcP3a2K4aZY3e8zhvSFxpvP4aYzkV3iPl2UE4qauHXV6fMndab2TzKyjoqWOYUAGJWjwW4xRNK0Q== + l2:s3-secret: + secure: AAABAOyJpJFwRpQnQVyFz3S7Pgf41EmOOts3Fzh4QfOMDL+3XY3AHeYjyyIr15NCCTsN879eOJDYgbKl/sWiFg== diff --git a/l2/index.ts b/l2/index.ts index fec8d142..6e84a885 100644 --- a/l2/index.ts +++ b/l2/index.ts @@ -66,9 +66,9 @@ function createDBCredentials(ident: string) { length: 26, special: false, }); - const db = new postgresql.Database(ident, {name: ident}, {provider: postgresProvider}); const role = new Role(ident, {login: true, name: ident, password: password.result}, {provider: postgresProvider}); + const db = new postgresql.Database(ident, {name: ident, owner: role.name}, {provider: postgresProvider}); new postgresql.Grant(`${ident}Full`, { database: db.name, objectType: "database", @@ -84,12 +84,13 @@ function createDBCredentials(ident: string) { } // Create Database for DirectusCMS -const directusDb = new postgresql.Database("directus", {name: "directus"}, {provider: postgresProvider}); const role = new Role("directus", { login: true, name: "directus", password: password.result }, {provider: postgresProvider}); +const directusDb = new postgresql.Database("directus", {name: "directus", owner: role.name}, {provider: postgresProvider}); + const grant = new postgresql.Grant("directusFull", { database: directusDb.name, objectType: "database", @@ -97,6 +98,7 @@ const grant = new postgresql.Grant("directusFull", { role: role.name, }, {provider: postgresProvider}); + const umamiCredentials = createDBCredentials("umami") @@ -137,13 +139,13 @@ const directusSecret = { "directus-secret": directusSecretKey } export const directusConfigMapData = { - PUBLIC_URL: "https://cms.tecios.de", + PUBLIC_URL: "https://cms.burban.me", "db-client": "pg", "db-host": postgresUrl, "db-port": "5432", "s3-bucket": "directus", "directus-key": "bjoern", - "redis-host": "redis-redis-master.redis", + "redis-host": "redis-master.redis", "redis-port": "6379" } diff --git a/l2/package-lock.json b/l2/package-lock.json index b18fe8c0..c5014e0a 100644 --- a/l2/package-lock.json +++ b/l2/package-lock.json @@ -6,11 +6,9 @@ "": { "name": "l2", "dependencies": { - "@pulumi/pulumi": "^3.0.0" - }, - "devDependencies": { "@pulumi/kubernetes": "^3.29.0", - "@pulumi/postgresql": "^3.8.0", + "@pulumi/postgresql": "^3.10.1", + "@pulumi/pulumi": "^3.0.0", "@pulumi/random": "^4.13.2", "@types/node": "^16" } @@ -328,7 +326,6 @@ "version": "3.29.0", "resolved": "https://registry.npmjs.org/@pulumi/kubernetes/-/kubernetes-3.29.0.tgz", "integrity": "sha512-NzWfGDNp6BfJJxYLf5Zv+0uM9HVOEhiQyWTQWSNjlToxLiAmtX25J/yMSpLoo17Nqm1oHnNDvGPaM5q0KoDR6Q==", - "dev": true, "hasInstallScript": true, "dependencies": { "@pulumi/pulumi": "^3.25.0", @@ -342,11 +339,9 @@ } }, "node_modules/@pulumi/postgresql": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@pulumi/postgresql/-/postgresql-3.8.0.tgz", - "integrity": "sha512-Q6kscy/ajA3YGQy25YpBA6I8FsL84XeR/SXal8qNi7SHE4D4s9XsYcKNaA9LfQY0o1fvdfeemi+plGhBtlUMeA==", - "dev": true, - "hasInstallScript": true, + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@pulumi/postgresql/-/postgresql-3.10.1.tgz", + "integrity": "sha512-RzRoLHw5n7I/38w8vkVn5cfwCPBpQ+JcQcVRDqJrC2UH+cNK6RKmG9jwxzN0dtPhQDG6jVlGTFq9CNV+uG9xUg==", "dependencies": { "@pulumi/pulumi": "^3.0.0" } @@ -393,7 +388,6 @@ "version": "4.13.2", "resolved": "https://registry.npmjs.org/@pulumi/random/-/random-4.13.2.tgz", "integrity": "sha512-Ao2lLIwwGm/3xV77tJJt6FCQRuZQZ74/1MkrNf59xsNP8bbT1fXFO6M+qp4QNx5hDHdG0Q5uH3JvqAh3Hwxj7g==", - "dev": true, "hasInstallScript": true, "dependencies": { "@pulumi/pulumi": "^3.0.0" @@ -403,7 +397,6 @@ "version": "5.0.38", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.38.tgz", "integrity": "sha512-rTtf75rwyP9G2qO5yRpYtdJ6aU1QqEhWbtW55qEgquEDa6bXW0s2TWZfDm02GuppjEozOWG/F2UnPq5hAQb+gw==", - "dev": true, "dependencies": { "@types/minimatch": "*", "@types/node": "*" @@ -417,8 +410,7 @@ "node_modules/@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" }, "node_modules/@types/node": { "version": "16.18.28", @@ -429,7 +421,6 @@ "version": "2.6.4", "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", - "dev": true, "dependencies": { "@types/node": "*", "form-data": "^3.0.0" @@ -438,8 +429,7 @@ "node_modules/@types/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-gVC1InwyVrO326wbBZw+AO3u2vRXz/iRWq9jYhpG4W8LXyIgDv3ZmcLQ5Q4Gs+gFMyqx+viFoFT+l3p61QFCmQ==", - "dev": true + "integrity": "sha512-gVC1InwyVrO326wbBZw+AO3u2vRXz/iRWq9jYhpG4W8LXyIgDv3ZmcLQ5Q4Gs+gFMyqx+viFoFT+l3p61QFCmQ==" }, "node_modules/ansi-regex": { "version": "5.0.1", @@ -517,8 +507,7 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/available-typed-arrays": { "version": "1.0.5", @@ -595,7 +584,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -664,7 +652,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, "engines": { "node": ">=0.4.0" } @@ -826,7 +813,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -1350,7 +1336,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -1359,7 +1344,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -1419,7 +1403,6 @@ "version": "2.6.11", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", - "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -1547,7 +1530,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -1757,7 +1739,6 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1924,7 +1905,6 @@ "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -1935,8 +1915,7 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/ts-node": { "version": "7.0.1", @@ -2027,14 +2006,12 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" diff --git a/l2/package.json b/l2/package.json index 19793fd1..02a2b68d 100644 --- a/l2/package.json +++ b/l2/package.json @@ -2,9 +2,9 @@ "name": "l2", "main": "index.ts", "dependencies": { - "@pulumi/pulumi": "^3.0.0", "@pulumi/kubernetes": "^3.29.0", - "@pulumi/postgresql": "^3.8.0", + "@pulumi/postgresql": "^3.10.1", + "@pulumi/pulumi": "^3.0.0", "@pulumi/random": "^4.13.2", "@types/node": "^16" } diff --git a/l2/providers/Manual/Directus.ts b/l2/providers/Manual/Directus.ts index 6d6a6a3f..6e11592b 100644 --- a/l2/providers/Manual/Directus.ts +++ b/l2/providers/Manual/Directus.ts @@ -6,13 +6,16 @@ import {ConfigMap, Namespace, Secret} from "@pulumi/kubernetes/core/v1"; import {keelAnnotationsProd} from "../../../util/globals"; export function createDirectusManual(namespace: Namespace, secret: Secret, config: ConfigMap) { - const website = new WebService("directus", "cms.tecios.de", namespace, "directus/directus", "10.8.2", {}, "prod"); + const url = "cms.burban.me" + const website = new WebService("directus", url, namespace, "directus/directus", "10.9.1", {}, "prod"); const deployment = createDirectusDeployments(website, secret, config); const service = createDirectusService(website); const ingress = createDirectusIngress(website); } function createDirectusDeployments(website: WebService, secret: Secret, config: ConfigMap): Deployment { + const url = "cms.burban.me" + return new k8s.apps.v1.Deployment(website.name, { metadata: { name: website.name, @@ -71,7 +74,7 @@ function createDirectusDeployments(website: WebService, secret: Secret, config: }, { name: "ASSETS_CONTENT_SECURITY_POLICY_DIRECTIVES__MEDIA_SRC", - value: "array:'self',https://cms.tecios.de" + value: "array:'self',https://" + url }, { name: "ASSETS_CONTENT_SECURITY_POLICY_DIRECTIVES__SCRIPT_SRC", value: "array:'self', 'unsafe-inline'" @@ -121,7 +124,7 @@ function createDirectusDeployments(website: WebService, secret: Secret, config: {name: "STORAGE_S3_BUCKET", valueFrom: {configMapKeyRef: {name: config.metadata.name, key: "s3-bucket"}}}, {name: "STORAGE_S3_FORCE_PATH_STYLE", value: "true"}, {name: "EMAIL_VERIFY_SETUP", value: "true"}, - {name: "EMAIL_FROM", value: "no-reply@cms.burban.me"}, + {name: "EMAIL_FROM", value: "no-reply"+url}, {name: "EMAIL_TRANSPORT", value: "mailgun"}, {name: "EMAIL_MAILGUN_DOMAIN", value: "mg.burban.me"}, {name: "EMAIL_MAILGUN_API_KEY", valueFrom: {secretKeyRef: {name: secret.metadata.name, key: "mg-api-key"}} diff --git a/l2/providers/Manual/Umami.ts b/l2/providers/Manual/Umami.ts index 99234620..cff94eac 100644 --- a/l2/providers/Manual/Umami.ts +++ b/l2/providers/Manual/Umami.ts @@ -5,7 +5,7 @@ import { Namespace, Secret} from "@pulumi/kubernetes/core/v1"; import {keelAnnotationsDev} from "../../../util/globals"; export function createUmamiManual(namespace: Namespace, secret: Secret) { - const website = new WebService("umami", "stats.tecios.de", namespace, "docker.umami.dev/umami-software/umami", "postgresql-latest", {}, "prod"); + const website = new WebService("umami", "stats.burban.me", namespace, "docker.umami.dev/umami-software/umami", "postgresql-latest", {}, "prod"); const deployment = createUmamiDeployments(website, secret); const service = createUmamiService(website); diff --git a/l2/providers/Manual/Vaultwarden.ts b/l2/providers/Manual/Vaultwarden.ts index 4d113a05..1e130fa2 100644 --- a/l2/providers/Manual/Vaultwarden.ts +++ b/l2/providers/Manual/Vaultwarden.ts @@ -8,7 +8,7 @@ import {createSecretWrapper} from "../../secrets"; import {Input} from "@pulumi/pulumi"; export function createVaultwardenManual(namespace: Namespace, configMap: ConfigMap, secretData: Input<{[key: string]: Input}>) { - const website = new WebService("vaultwarden", "warden.tecios.de", namespace, "vaultwarden/server", "1.30.0-alpine", {}, "prod"); + const website = new WebService("vaultwarden", "warden.burban.me", namespace, "vaultwarden/server", "1.30.0-alpine", {}, "prod"); const deployment = createVaultwardenDeployments(website, configMap, secretData); const service = createVaultwardenService(website); diff --git a/l2/providers/Manual/paperless/Paperless.ts b/l2/providers/Manual/paperless/Paperless.ts index e67d508f..60e44d90 100644 --- a/l2/providers/Manual/paperless/Paperless.ts +++ b/l2/providers/Manual/paperless/Paperless.ts @@ -123,7 +123,6 @@ export function createPaperless(namespace: Namespace, secret: Secret, config: Co storage: "10Gi", // Adjust the size as needed }, }, - storageClassName: "local-path", // Using the default storage class }, }); @@ -139,7 +138,6 @@ export function createPaperless(namespace: Namespace, secret: Secret, config: Co storage: "10Gi", // Adjust the size as needed }, }, - storageClassName: "local-path", // Using the default storage class }, }); @@ -174,7 +172,7 @@ export function createPaperless(namespace: Namespace, secret: Secret, config: Co } }, env: [ - {name: "PAPERLESS_REDIS", value: "redis://redis-redis-master.redis:6379"}, + {name: "PAPERLESS_REDIS", value: "redis://redis-master.redis:6379"}, {name: "PAPERLESS_URL", value: "https://" + url}, {name: "PAPERLESS_PORT", value: "8000"}, {name: "PAPERLESS_CONVERT_MEMORY_LIMIT", value: memoryLimit}, diff --git a/src/contributors/bjoern.ts b/src/contributors/bjoern.ts deleted file mode 100644 index b05ab125..00000000 --- a/src/contributors/bjoern.ts +++ /dev/null @@ -1,34 +0,0 @@ -import {createDeployments} from "../resources/WebDeployments"; -import {WebService} from "../../l2/types/WebService"; -import {createIngresses} from "../resources/kubernetes/Ingress"; -import {createService} from "../resources/kubernetes/Service"; -import {createNamespace} from "../../l0/namespace"; -import { - createBackupSecret, - createGitlabSecret, -} from "../resources/kubernetes/Secrets"; -import * as env from "../../util/env"; -import createBackupCronjob from "../../l2/CronJob"; -import {basicAuthAnnotation} from "../../util/globals"; - -export function createBjoern() { - const namespaceBurban = createNamespace("burban") - const namespaceBahrenberg = createNamespace("bahrenberg") - let permRedirectAnnotation = {"traefik.ingress.kubernetes.io/redirect-permanent": "true"} - let ws1 = new WebService("webcv-dev", "dev.burban.me", namespaceBurban, "registry.gitlab.com/privateprojectsbu/webcv", "v2.4.0-rc.2", basicAuthAnnotation, "dev"); - let ws2 = new WebService("webcv-prod", "burban.me", namespaceBurban, "registry.gitlab.com/privateprojectsbu/webcv", "v2.4.0", {}, "prod"); - let ws3 = new WebService("webcv-experimental", "experimental.burban.me", namespaceBurban, "registry.gitlab.com/privateprojectsbu/webcv", "feature-next", basicAuthAnnotation, "experimental"); - let ws4 = new WebService("website-dev", "dev.tischlerei-bahrenberg.de", namespaceBahrenberg, "registry.gitlab.com/a9668/bahrenberg/website", "v1.0.0-rc.1", basicAuthAnnotation, "dev"); - let ws5 = new WebService("website-prod", "tischlerei-bahrenberg.de", namespaceBahrenberg, "registry.gitlab.com/a9668/bahrenberg/website", "v1.0.1", {}, "prod"); - - const gitlabSecretB = createGitlabSecret("pulumi", env.pullSecret, "gitlab-pull-secret", namespaceBurban); - const gitlabSecretBa = createGitlabSecret("pulumi", env.pullSecret, "gitlab-pull-secret-bahrenberg", namespaceBahrenberg); - - const dbBackupSecret = createBackupSecret(namespaceBurban); - - const cronjob = createBackupCronjob(namespaceBurban, dbBackupSecret) - createDeployments(new Array(ws1, ws2, ws3, ws4, ws5)); - createService(new Array(ws1, ws2, ws3, ws4, ws5)); - createIngresses(new Array(ws1, ws2, ws3, ws4, ws5)); -} -//console.log(directus.ready); diff --git a/src/resources/WebDeployments.ts b/src/resources/WebDeployments.ts deleted file mode 100644 index cfab606f..00000000 --- a/src/resources/WebDeployments.ts +++ /dev/null @@ -1,89 +0,0 @@ -import * as k8s from "@pulumi/kubernetes" -import {getEnv} from "@pulumi/kubernetes/utilities"; -import {WebService} from "../../l2/types/WebService"; -import {keelAnnotationsDev, keelAnnotationsExp, keelAnnotationsProd} from "../../util/globals"; -import * as pulumi from "@pulumi/pulumi" - - -const env = getEnv("development") - - -export function createDeployments(resources: Array): Array { - const appLabels = {}; - return resources.map(website => { - let keelAnnotations = {}; - switch (website.stage) { - case "prod": - keelAnnotations = keelAnnotationsProd - break - case "dev": - keelAnnotations = keelAnnotationsDev - break - case "experimental": - keelAnnotations = keelAnnotationsExp - } - return new k8s.apps.v1.Deployment(website.name, { - metadata: { - name: website.name, - namespace: website.namespace.metadata.name, - labels: { - name: website.name - }, - "annotations": { - "keel.sh/trigger": "poll", - "keel.sh/pollSchedule": "@every 5m", - ...keelAnnotations - - - } - }, - "spec": { - "strategy": { - "type": "Recreate" - }, - "selector": { - "matchLabels": { - "name": website.name - } - }, - "template": { - "metadata": { - "labels": { - "name": website.name - } - }, - "spec": { - nodeSelector: { - "owner": "bjoern" - }, - "containers": [ - { - "name": website.name, - "image": website.registryImage + ":" + website.imageTag, - "imagePullPolicy": "Always", - "env": [ - { - "name": "url", - "value": website.url - } - ], - "ports": [ - { - "name": "http", - "containerPort": 3000 - } - ] - } - ], - imagePullSecrets: [ - {"name": pulumi.interpolate `gitlab-pull-secret-${website.namespace.metadata.name}`} - ] - - } - } - } - }) - }) -} - - diff --git a/src/resources/kubernetes/Ingress.ts b/src/resources/kubernetes/Ingress.ts deleted file mode 100644 index ece894aa..00000000 --- a/src/resources/kubernetes/Ingress.ts +++ /dev/null @@ -1,39 +0,0 @@ -import {WebService} from "../../../l2/types/WebService"; -import * as k8s from "@pulumi/kubernetes" - - -export function createIngresses(webservices: Array): Array { - - return webservices.map(webservice => - new k8s.networking.v1.Ingress(webservice.name, { - metadata: { - annotations: { - "kubernetes.io/ingress.class": "traefik", - "cert-manager.io/cluster-issuer": "letsencrypt", - ...webservice.ingressAnnotations - }, - namespace: webservice.namespace.metadata.name - }, - - spec: { - tls: [{ - secretName: webservice.name + "-tls", - hosts: [webservice.url] - }], - rules: [ - { - host: webservice.url, - http: { - paths: [{ - pathType: "Prefix", - path: "/", - backend: {service: {name: webservice.name, port:{number: 80 }}} - }] - } - }] - - } - } - )); - -} diff --git a/src/resources/kubernetes/Secrets.ts b/src/resources/kubernetes/Secrets.ts deleted file mode 100644 index 2794c8ef..00000000 --- a/src/resources/kubernetes/Secrets.ts +++ /dev/null @@ -1,59 +0,0 @@ -import * as k8s from "@pulumi/kubernetes"; -import {Htpasswd, HtpasswdAlgorithm} from "pulumi-htpasswd"; -import {Namespace, Secret} from "@pulumi/kubernetes/core/v1"; -import {backupSecret, medusaSecret } from "../../../l2/secrets"; -import * as pulumi from "@pulumi/pulumi" - -export - - -export function createBackupSecret(namespace: Namespace) { - return new k8s.core.v1.Secret("postgres-backup", { - metadata: { - name: "postgres-backup", - namespace: namespace.metadata.name - }, - stringData: backupSecret - }) -} - -export function createMedusaSecret(namespace: Namespace) { - return new k8s.core.v1.Secret("medusa", { - metadata: { - name: "medusa", - namespace: namespace.metadata.name - }, - stringData: medusaSecret - }) -} -export function createEtcdSecret(rootPassword: string, namespace: Namespace) { - return new k8s.core.v1.Secret("etcd", { - metadata: { - name: "etcd", - namespace: namespace.metadata.name - }, - stringData: { - "root-password": rootPassword - } - }) -} - -export function createDbSecret(user: string, password: string, name: string, namespace: Namespace) { - return new k8s.core.v1.Secret(name, { - metadata: { - name: name, - namespace: namespace.metadata.name - }, - stringData: { - "user": user, - "password": password - } - }) -} - - - - - - - diff --git a/src/resources/kubernetes/Service.ts b/src/resources/kubernetes/Service.ts deleted file mode 100644 index 9cfd3b11..00000000 --- a/src/resources/kubernetes/Service.ts +++ /dev/null @@ -1,28 +0,0 @@ -import * as k8s from "@pulumi/kubernetes" -import {WebService} from "../../../l2/types/WebService"; - - - -export function createService(webservices: Array): Array { - - return webservices.map(webservice => - new k8s.core.v1.Service(webservice.name, { - "metadata": { - name: webservice.name, - namespace: webservice.namespace.metadata.name - }, - "spec": { - "ports": [ - { - "name": "http", - "port": 80, - "protocol": "TCP", - "targetPort": "http" - } - ], - "selector": { - "name": webservice.name - } - } - })) -} diff --git a/src/resources/kubernetes/index.ts b/src/resources/kubernetes/index.ts deleted file mode 100644 index e55a5cd6..00000000 --- a/src/resources/kubernetes/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -import {createNamespace} from "../../../l0/namespace"; -import { - createBasicAuthSecret, createDbSecret, - createEtcdSecret, createGitlabSecret, - createMiddleware -} from "./Secrets"; -import * as env from "../../../util/env" - -