diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 44aa8a35a3..948463fe90 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -98,16 +98,6 @@ # a single review should be enough /operations/observability/mixins/cross-teams -# werft is shared between all teams -/.werft -/.werft/ide-* @gitpod-io/team-experience -/.werft/platform-* @gitpod-io/team-engine -/.werft/webapp-* @gitpod-io/team-experience -/.werft/workspace-* @gitpod-io/team-engine -/.werft/self-hosted-* @gitpod-io/team-engine -/.werft/*installer-tests* @gitpod-io/team-engine -/.werft/jobs/build/self-hosted-* @gitpod-io/team-engine - .github/workflows/ide-*.yml @gitpod-io/team-experience .github/workflows/jetbrains-*.yml @gitpod-io/team-experience .github/workflows/code-nightly.yml @gitpod-io/team-experience diff --git a/.werft/.prettierignore b/.werft/.prettierignore deleted file mode 100644 index 2058181520..0000000000 --- a/.werft/.prettierignore +++ /dev/null @@ -1,2 +0,0 @@ -vm/charts/** -vm/manifests/** diff --git a/.werft/build.ts b/.werft/build.ts deleted file mode 100644 index 814afd294e..0000000000 --- a/.werft/build.ts +++ /dev/null @@ -1,97 +0,0 @@ -import * as fs from "fs"; -import { SpanStatusCode } from "@opentelemetry/api"; -import { FailedSliceError, Werft } from "./util/werft"; -import { reportBuildFailureInSlack } from "./util/slack"; -import * as Tracing from "./observability/tracing"; -import * as VM from "./vm/vm"; -import { buildAndPublish } from "./jobs/build/build-and-publish"; -import { validateChanges } from "./jobs/build/validate-changes"; -import { prepare } from "./jobs/build/prepare"; -import { deployToPreviewEnvironment } from "./jobs/build/deploy-to-preview-environment"; -import { runIntegrationTests } from "./jobs/build/trigger-integration-tests"; -import { triggerSelfHostedPreview, triggerUpgradeTests } from "./jobs/build/self-hosted-upgrade-tests"; -import { jobConfig } from "./jobs/build/job-config"; - -// Will be set once tracing has been initialized -let werft: Werft; -const context: any = JSON.parse(fs.readFileSync("context.json").toString()); - -Tracing.initialize() - .then(() => { - werft = new Werft("build"); - }) - .then(() => run(context)) - .catch((err) => { - werft.rootSpan.setStatus({ - code: SpanStatusCode.ERROR, - message: err, - }); - - if (err instanceof FailedSliceError) { - // This error was produced using werft.fail which means that we - // already handled it "gracefully" - } else { - console.log("Error", err); - } - - if (context.Repository.ref === "refs/heads/main") { - reportBuildFailureInSlack(context, err).catch((error: Error) => { - console.error("Failed to send message to Slack", error); - }); - } - - // Explicitly not using process.exit as we need to flush tracing, see tracing.js - process.exitCode = 1; - }) - .finally(() => { - werft.phase("Stop kubectl port forwards", "Stopping kubectl port forwards"); - VM.stopKubectlPortForwards(); - - werft.phase("Flushing telemetry", "Flushing telemetry before stopping job"); - werft.endAllSpans(); - }); - -async function run(context: any) { - const config = jobConfig(werft, context); - - if(!config.withWerft) { - werft.phase("Build Disabled"); - werft.log("(not building)","The build is being performed via GitHub Actions; Thus, this Werft build does not run"); - werft.done("(not building)"); - return; - } - - await validateChanges(werft, config); - await prepare(werft, config); - if (config.withUpgradeTests) { - // this will trigger an upgrade test on a self-hosted gitpod instance on a new cluster. - await triggerUpgradeTests(werft, config, context.Owner); - return; - } - - await buildAndPublish(werft, config); - - if (config.withSelfHostedPreview) { - await triggerSelfHostedPreview(werft, config, context.Owner); - return; - } - - if (!config.withPreview || config.publishRelease) { - werft.phase("deploy", "not deploying"); - console.log("running without preview environment or publish-release is set"); - return; - } - - try { - await deployToPreviewEnvironment(werft, config); - } catch (e) { - // We currently don't support concurrent deployments to the same preview environment. - // Until we do we don't want errors to mark the main build as failed. - if (config.mainBuild) { - return; - } - throw e; - } - - await runIntegrationTests(werft, config, context.Owner); -} diff --git a/.werft/build.yaml b/.werft/build.yaml deleted file mode 100644 index 9fa168476b..0000000000 --- a/.werft/build.yaml +++ /dev/null @@ -1,252 +0,0 @@ -# debug using `werft run github -f -s .werft/build.js -j .werft/build.yaml -a debug=true` -pod: - serviceAccount: werft - restartPolicy: Never - affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: dev/workload - operator: In - values: - - "builds" - volumes: - - name: monitoring-satellite-preview-token - secret: - secretName: monitoring-satellite-preview-token - - name: monitoring-satellite-stackdriver-credentials - secret: - secretName: monitoring-satellite-stackdriver-credentials - - name: gcp-sa - secret: - secretName: gcp-sa-gitpod-dev-deployer - - name: gcp-sa-release - secret: - secretName: gcp-sa-gitpod-release-deployer - - name: prometheus-remote-write-auth - secret: - secretName: prometheus-remote-write-auth - - name: go-build-cache - hostPath: - path: /mnt/disks/ssd0/go-build-cache - type: DirectoryOrCreate - - name: harvester-kubeconfig - secret: - secretName: harvester-kubeconfig - - name: harvester-vm-ssh-keys - secret: - secretName: harvester-vm-ssh-keys - - name: harvester-k3s-dockerhub-pull-account - secret: - secretName: harvester-k3s-dockerhub-pull-account - - name: github-token-gitpod-bot - secret: - defaultMode: 420 - secretName: github-token-gitpod-bot - # - name: deploy-key - # secret: - # secretName: deploy-key - # - name: github-ssh-key - # secret: - # secretName: github-ssh-key - # defaultMode: 0600 - # - name: gitpod-test-tokens - # secret: - # secretName: gitpod-test-tokens - containers: - - name: testdb - image: mysql:5.7 - env: - - name: MYSQL_ROOT_PASSWORD - value: test - # Using the same port as in our Gitpod workspaces here - - name: MYSQL_TCP_PORT - value: 23306 - - name: build - image: eu.gcr.io/gitpod-core-dev/dev/dev-environment:aledbf-oci-tool-gha.14121 - workingDir: /workspace - imagePullPolicy: IfNotPresent - resources: - requests: - memory: "10Gi" - cpu: "3500m" - limits: - memory: "20Gi" - cpu: "10000m" - volumeMounts: - - name: monitoring-satellite-stackdriver-credentials - mountPath: /mnt/secrets/monitoring-satellite-stackdriver-credentials - - name: monitoring-satellite-preview-token - mountPath: /mnt/secrets/monitoring-satellite-preview-token - - name: gcp-sa - mountPath: /mnt/secrets/gcp-sa - readOnly: true - - name: gcp-sa-release - mountPath: /mnt/secrets/gcp-sa-release - readOnly: true - - name: go-build-cache - mountPath: /go-build-cache - readOnly: false - - name: harvester-kubeconfig - mountPath: /mnt/secrets/harvester-kubeconfig - - name: harvester-vm-ssh-keys - mountPath: /mnt/secrets/harvester-vm-ssh-keys - - name: harvester-k3s-dockerhub-pull-account - mountPath: /mnt/secrets/harvester-k3s-dockerhub-pull-account - - mountPath: /mnt/secrets/github-token-gitpod-bot - name: github-token-gitpod-bot - # - name: deploy-key - # mountPath: /mnt/secrets/deploy-key - # readOnly: true - # - name: github-ssh-key - # mountPath: /mnt/secrets/github-ssh-key - # readOnly: true - env: - - name: DB_HOST - value: 127.0.0.1 - - name: LEEWAY_WORKSPACE_ROOT - value: /workspace - - name: LEEWAY_REMOTE_CACHE_BUCKET - {{- if eq .Repository.Ref "refs/heads/main" }} - value: gitpod-core-leeway-cache-main - {{- else }} - value: gitpod-core-leeway-cache-branch - {{- end }} - - name: GOPROXY - value: http://athens-athens-proxy.athens.svc.cluster.local:9999 - - name: GOCACHE - value: /go-build-cache - - name: NODENAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: NPM_AUTH_TOKEN - valueFrom: - secretKeyRef: - name: npm-auth-token - key: npm-auth-token.json - - name: JB_MARKETPLACE_PUBLISH_TOKEN - valueFrom: - secretKeyRef: - name: jb-marketplace-publish-token - key: token - - name: SLACK_NOTIFICATION_PATH - valueFrom: - secretKeyRef: - name: slack-path - key: slackPath - - name: DEVX_SLACK_NOTIFICATION_PATH - valueFrom: - secretKeyRef: - name: devx-slack-path - key: token - # used for GitHub releases (NOTE: for some reasons the token contains a trailing \n, is trimmed below) - - name: GITHUB_TOKEN - valueFrom: - secretKeyRef: - name: github-sh-release-token - key: token - # - name: GITPOD_TEST_TOKEN_GITHUB - # valueFrom: - # secretKeyRef: - # name: gitpod-test-tokens - # key: github-test-token.json - # - name: GITPOD_TEST_TOKEN_GITLAB - # valueFrom: - # secretKeyRef: - # name: gitpod-test-tokens - # key: gitlab-test-token.json - # - name: GITPOD_TEST_TOKEN_BITBUCKET - # valueFrom: - # secretKeyRef: - # name: gitpod-test-tokens - # key: bitbucket-test-token.json - - name: CODECOV_TOKEN - valueFrom: - secretKeyRef: - name: codecov - key: token - - name: HONEYCOMB_DATASET - value: "werft" - - name: HONEYCOMB_API_KEY - valueFrom: - secretKeyRef: - name: honeycomb-api-key - key: apikey - - name: SEGMENT_IO_TOKEN - valueFrom: - secretKeyRef: - name: self-hosted - key: segmentIOToken - - name: JAVA_HOME - value: /home/gitpod/.sdkman/candidates/java/current - # Used by the Werft CLI through werft-credential-helper.sh - - name: WERFT_GITHUB_TOKEN_PATH - value: "/mnt/secrets/github-token-gitpod-bot/token" - - name: WERFT_CREDENTIAL_HELPER - value: "/workspace/dev/preview/werft-credential-helper.sh" - # When running the build with 'with-integration-tests' these are used - # to specify what Gitpod user to use in those tests. - - name: INTEGRATION_TEST_USERNAME - valueFrom: - secretKeyRef: - name: integration-test-user - key: username - - name: INTEGRATION_TEST_USER_TOKEN - valueFrom: - secretKeyRef: - name: integration-test-user - key: token - - name: ROBOQUAT_TOKEN - valueFrom: - secretKeyRef: - name: github-roboquat-automatic-changelog - key: token - command: - - bash - - -c - - | - sleep 1 - set -Eeuo pipefail - - export GITHUB_TOKEN=$(echo $GITHUB_TOKEN | xargs) - export DOCKER_HOST=tcp://$NODENAME:2375 - - echo "Job is running on node $NODENAME" | werft log slice "Node information" - - ( \ - sudo chown gitpod:gitpod $GOCACHE && \ - sudo chown -R gitpod:gitpod /workspace && \ - echo "done" \ - ) | werft log slice "chowning /workspace and $GOCACHE" - - {{ if .Annotations.leewayfromgit }} - ( \ - LEEWAY_SRC="github.com/gitpod-io/leeway@{{ .Annotations.leewayfromgit }}" && \ - echo "Installing Leeway from $LEEWAY_SRC" && \ - GOBIN=$(pwd) go install "$LEEWAY_SRC" && \ - sudo mv leeway $(dirname $(which leeway)) - ) | werft log slice "Building fresh Leeway binary from source" - {{ end }} - - ( \ - mkdir -p /workspace/.ssh && \ - cp /mnt/secrets/harvester-vm-ssh-keys/id_rsa /workspace/.ssh/id_rsa_harvester_vm && \ - cp /mnt/secrets/harvester-vm-ssh-keys/id_rsa.pub /workspace/.ssh/id_rsa_harvester_vm.pub && \ - sudo chmod 600 /workspace/.ssh/id_rsa_harvester_vm && \ - sudo chmod 644 /workspace/.ssh/id_rsa_harvester_vm.pub && \ - echo "done" \ - ) | werft log slice "Prepare SSH keys" - - ( \ - cd .werft && \ - yarn install && \ - mv node_modules .. \ - ) | werft log slice "Installing dependencies" - - printf '{{ toJson . }}' > context.json - - npx ts-node .werft/build.ts -sidecars: -- testdb diff --git a/.werft/cleanup-installer-tests.yaml b/.werft/cleanup-installer-tests.yaml deleted file mode 100644 index f147c5f1b1..0000000000 --- a/.werft/cleanup-installer-tests.yaml +++ /dev/null @@ -1,129 +0,0 @@ -# debug using `werft run github -f -s .werft/installer-tests.ts -j .werft/self-hosted-installer-tests.yaml -a debug=true` -pod: - serviceAccount: werft - restartPolicy: Never - affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: dev/workload - operator: In - values: - - "builds" - securityContext: - runAsUser: 0 - volumes: - - name: sh-playground-sa-perm - secret: - secretName: sh-playground-sa-perm - - name: sh-playground-dns-perm - secret: - secretName: sh-playground-dns-perm - - name: sh-aks-perm - secret: - secretName: aks-credentials - containers: - - name: nightly-test - image: eu.gcr.io/gitpod-core-dev/dev/dev-environment:aledbf-oci-tool-gha.14121 - workingDir: /workspace - imagePullPolicy: Always - volumeMounts: - - name: sh-playground-sa-perm - mountPath: /mnt/secrets/sh-playground-sa-perm - - name: sh-playground-dns-perm # this sa is used for the DNS management - mountPath: /mnt/secrets/sh-playground-dns-perm - env: - - name: GOOGLE_APPLICATION_CREDENTIALS - value: "/mnt/secrets/sh-playground-sa-perm/sh-sa.json" - - name: TF_VAR_sa_creds - value: "/mnt/secrets/sh-playground-sa-perm/sh-sa.json" - - name: TF_VAR_dns_sa_creds - value: "/mnt/secrets/sh-playground-dns-perm/sh-dns-sa.json" - - name: ARM_SUBSCRIPTION_ID - valueFrom: - secretKeyRef: - name: aks-credentials - key: subscriptionid - - name: ARM_TENANT_ID - valueFrom: - secretKeyRef: - name: aks-credentials - key: tenantid - - name: ARM_CLIENT_ID - valueFrom: - secretKeyRef: - name: aks-credentials - key: clientid - - name: ARM_CLIENT_SECRET - valueFrom: - secretKeyRef: - name: aks-credentials - key: clientsecret - - name: NODENAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: USER_TOKEN # this is for the integration tests - valueFrom: - secretKeyRef: - name: integration-test-user - key: token - - name: AWS_ACCESS_KEY_ID - valueFrom: - secretKeyRef: - name: aws-credentials - key: aws-access-key - - name: AWS_SECRET_ACCESS_KEY - valueFrom: - secretKeyRef: - name: aws-credentials - key: aws-secret-key - - name: AWS_REGION - valueFrom: - secretKeyRef: - name: aws-credentials - key: aws-region - - name: IDE_SLACK_NOTIFICATION_PATH - valueFrom: - secretKeyRef: - name: slack-webhook-urls - key: ide_jobs - - name: WS_SLACK_NOTIFICATION_PATH - valueFrom: - secretKeyRef: - name: slack-webhook-urls - key: workspace_jobs - - name: SH_SLACK_NOTIFICATION_PATH - valueFrom: - secretKeyRef: - name: slack-webhook-urls - key: self_hosted_jobs - - name: self_hosted_jobs - value: "true" - command: - - bash - - -c - - | - sleep 1 - set -Eeuo pipefail - - sudo chown -R gitpod:gitpod /workspace - sudo apt update && apt install gettext-base - - curl -sLS https://get.k3sup.dev | sh - curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash - - (cd .werft && yarn install && mv node_modules ..) | werft log slice prep - printf '{{ toJson . }}' > context.json - - export domain="{{ .Annotations.subdomain }}" - if [[ "$domain" == "" ]]; then - echo "Cleanup all old workspaces" - else - export TF_VAR_TEST_ID="$domain" - fi - - TESTCONFIG="CLEANUP_OLD_TESTS" - - npx ts-node .werft/installer-tests.ts ${TESTCONFIG} diff --git a/.werft/config.yaml b/.werft/config.yaml deleted file mode 100644 index dc95b5cccf..0000000000 --- a/.werft/config.yaml +++ /dev/null @@ -1,5 +0,0 @@ -rules: - - path: ".werft/build.yaml" - matchesAll: - - or: ["repo.ref ~= refs/heads/"] - - or: ["trigger !== deleted"] diff --git a/.werft/debug.yaml b/.werft/debug.yaml deleted file mode 100644 index 2990c51854..0000000000 --- a/.werft/debug.yaml +++ /dev/null @@ -1,152 +0,0 @@ -# debug using `werft run github -f -s .werft/build.js -j .werft/build.yaml -a debug=true` -pod: - serviceAccount: werft - restartPolicy: Never - affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: dev/workload - operator: In - values: - - "builds" - volumes: - - name: monitoring-satellite-preview-token - secret: - secretName: monitoring-satellite-preview-token - - name: gcp-sa - secret: - secretName: gcp-sa-gitpod-dev-deployer - - name: gcp-sa-release - secret: - secretName: gcp-sa-gitpod-release-deployer - - name: gpsh-coredev-license - secret: - secretName: gpsh-coredev-license - - name: go-build-cache - hostPath: - path: /mnt/disks/ssd0/go-build-cache - type: DirectoryOrCreate - # - name: deploy-key - # secret: - # secretName: deploy-key - # - name: github-ssh-key - # secret: - # secretName: github-ssh-key - # defaultMode: 0600 - # - name: gitpod-test-tokens - # secret: - # secretName: gitpod-test-tokens - containers: - - name: testdb - image: mysql:5.7 - env: - - name: MYSQL_ROOT_PASSWORD - value: test - # Using the same port as in our Gitpod workspaces here - - name: MYSQL_TCP_PORT - value: 23306 - - name: build - image: eu.gcr.io/gitpod-core-dev/dev/dev-environment:aledbf-oci-tool-gha.14121 - workingDir: /workspace - imagePullPolicy: IfNotPresent - volumeMounts: - - name: monitoring-satellite-preview-token - mountPath: /mnt/secrets/monitoring-satellite-preview-token - - name: gcp-sa - mountPath: /mnt/secrets/gcp-sa - readOnly: true - - name: gcp-sa-release - mountPath: /mnt/secrets/gcp-sa-release - readOnly: true - - name: gpsh-coredev-license - mountPath: /mnt/secrets/gpsh-coredev - readOnly: true - - name: go-build-cache - mountPath: /go-build-cache - readOnly: false - # - name: deploy-key - # mountPath: /mnt/secrets/deploy-key - # readOnly: true - # - name: github-ssh-key - # mountPath: /mnt/secrets/github-ssh-key - # readOnly: true - env: - - name: LEEWAY_WORKSPACE_ROOT - value: /workspace - - name: LEEWAY_REMOTE_CACHE_BUCKET - {{- if eq .Repository.Ref "refs/heads/master" }} - value: gitpod-core-leeway-cache-master - {{- else }} - value: gitpod-core-leeway-cache-branch - {{- end }} - - name: GOPROXY - value: http://athens-athens-proxy.athens.svc.cluster.local:9999 - - name: GOCACHE - value: /go-build-cache - - name: NODENAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: NPM_AUTH_TOKEN - valueFrom: - secretKeyRef: - name: npm-auth-token - key: npm-auth-token.json - - name: JB_MARKETPLACE_PUBLISH_TOKEN - valueFrom: - secretKeyRef: - name: jb_marketplace_publish_token - key: token - - name: SLACK_NOTIFICATION_PATH - valueFrom: - secretKeyRef: - name: slack-path - key: slackPath - # used for GitHub releases (NOTE: for some reasons the token contains a trailing \n, is trimmed below) - - name: GITHUB_TOKEN - valueFrom: - secretKeyRef: - name: github-sh-release-token - key: token - # - name: GITPOD_TEST_TOKEN_GITHUB - # valueFrom: - # secretKeyRef: - # name: gitpod-test-tokens - # key: github-test-token.json - # - name: GITPOD_TEST_TOKEN_GITLAB - # valueFrom: - # secretKeyRef: - # name: gitpod-test-tokens - # key: gitlab-test-token.json - # - name: GITPOD_TEST_TOKEN_BITBUCKET - # valueFrom: - # secretKeyRef: - # name: gitpod-test-tokens - # key: bitbucket-test-token.json - - name: CODECOV_TOKEN - valueFrom: - secretKeyRef: - name: codecov - key: token - command: - - bash - - -c - - | - sleep 1 - set -Eeuo pipefail - - sudo chown gitpod:gitpod $GOCACHE - export GITHUB_TOKEN=$(echo $GITHUB_TOKEN | xargs) - - export DOCKER_HOST=tcp://$NODENAME:2375 - sudo chown -R gitpod:gitpod /workspace - - (cd .werft && yarn install && mv node_modules ..) | werft log slice prep - printf '{{ toJson . }}' > context.json - - leeway build components/supervisor/openssh:app - # npx ts-node .werft/build.ts -sidecars: -- testdb diff --git a/.werft/jobs/build/build-and-publish.ts b/.werft/jobs/build/build-and-publish.ts deleted file mode 100644 index 934e1c6d44..0000000000 --- a/.werft/jobs/build/build-and-publish.ts +++ /dev/null @@ -1,97 +0,0 @@ -import * as semver from "semver"; -import { exec } from "../../util/shell"; -import { Werft } from "../../util/werft"; -import { GCLOUD_SERVICE_ACCOUNT_PATH } from "./const"; -import { JobConfig } from "./job-config"; - -export async function buildAndPublish(werft: Werft, jobConfig: JobConfig) { - const { - publishRelease, - dontTest, - version, - localAppVersion, - publishToNpm, - coverageOutput, - } = jobConfig; - - const releaseBranch = jobConfig.repository.ref; - - // We set it to false as default and only set it true if the build succeeds. - werft.rootSpan.setAttributes({ "preview.gitpod_built_successfully": false }); - - werft.phase("build", "build running"); - const imageRepo = publishRelease ? "gcr.io/gitpod-io/self-hosted" : "eu.gcr.io/gitpod-core-dev/build"; - - exec( - `LICENCE_HEADER_CHECK_ONLY=true leeway run components:update-license-header || { echo "[build|FAIL] There are some license headers missing. Please run 'leeway run components:update-license-header'."; exit 1; }`, - ); - - exec( - `leeway build --docker-build-options network=host --werft=true -c remote ${ - dontTest ? "--dont-test" : "" - } --coverage-output-path=${coverageOutput} --save /tmp/dev.tar.gz -Dversion=${version} -DimageRepoBase=eu.gcr.io/gitpod-core-dev/dev dev:all`, - ); - - if (publishRelease) { - exec(`gcloud auth activate-service-account --key-file "/mnt/secrets/gcp-sa-release/service-account.json"`); - } - - const buildArguments = Object.entries({ - version: version, - removeSources: "false", - imageRepoBase: imageRepo, - localAppVersion: localAppVersion, - SEGMENT_IO_TOKEN: process.env.SEGMENT_IO_TOKEN, - npmPublishTrigger: publishToNpm ? Date.now().toString() : "false", - }).map(([key, value]) => `-D${key}=${value}`).join(" "); - - const buildFlags = [ - "--docker-build-options network=host", - "--werft=true", - "-c remote", - dontTest ? "--dont-test" : "", - `--coverage-output-path=${coverageOutput}`, - ].filter((value) => value).join(" "); - - await exec(`leeway build ${buildFlags} ${buildArguments}`, { async: true }); - - if (jobConfig.withLocalPreview) { - await exec(`leeway build install/preview:docker ${buildFlags} ${buildArguments}`, { async: true }); - } - - if (publishRelease) { - try { - werft.phase("publish", "checking version semver compliance..."); - if (!semver.valid(version)) { - // make this an explicit error as early as possible. Is required by helm Charts.yaml/version - throw new Error( - `'${version}' is not semver compliant and thus cannot be used for Self-Hosted releases!`, - ); - } - - werft.phase("publish", `preparing GitHub release files...`); - const releaseFilesTmpDir = exec("mktemp -d", { silent: true }).stdout.trim(); - const releaseTarName = "release.tar.gz"; - exec( - `leeway build --docker-build-options network=host --werft=true chart:release-tars -Dversion=${version} -DimageRepoBase=${imageRepo} --save ${releaseFilesTmpDir}/${releaseTarName}`, - ); - exec(`cd ${releaseFilesTmpDir} && tar xzf ${releaseTarName} && rm -f ${releaseTarName}`); - - werft.phase("publish", `publishing GitHub release ${version}...`); - const prereleaseFlag = semver.prerelease(version) !== null ? "-prerelease" : ""; - const tag = `v${version}`; - const description = `Gitpod Self-Hosted ${version}

Docs: https://www.gitpod.io/docs/self-hosted/latest/self-hosted/`; - exec( - `github-release ${prereleaseFlag} gitpod-io/gitpod ${tag} ${releaseBranch} '${description}' "${releaseFilesTmpDir}/*"`, - ); - - werft.done("publish"); - } catch (err) { - werft.fail("publish", err); - } finally { - exec(`gcloud auth activate-service-account --key-file "${GCLOUD_SERVICE_ACCOUNT_PATH}"`); - } - } - - werft.rootSpan.setAttributes({ "preview.gitpod_built_successfully": true }); -} diff --git a/.werft/jobs/build/const.ts b/.werft/jobs/build/const.ts deleted file mode 100644 index 33d4c36a1e..0000000000 --- a/.werft/jobs/build/const.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const GCLOUD_SERVICE_ACCOUNT_PATH = "/mnt/secrets/gcp-sa/service-account.json"; -export const CORE_DEV_KUBECONFIG_PATH = "/workspace/gitpod/kubeconfigs/core-dev"; -export const HARVESTER_KUBECONFIG_PATH = "/workspace/gitpod/kubeconfigs/harvester"; -export const PREVIEW_K3S_KUBECONFIG_PATH = "/workspace/gitpod/kubeconfigs/k3s"; -export const GLOBAL_KUBECONFIG_PATH = process.env.HOME + "/.kube/config" diff --git a/.werft/jobs/build/deploy-to-preview-environment.ts b/.werft/jobs/build/deploy-to-preview-environment.ts deleted file mode 100644 index 45462949b5..0000000000 --- a/.werft/jobs/build/deploy-to-preview-environment.ts +++ /dev/null @@ -1,155 +0,0 @@ -import * as fs from "fs"; -import { exec } from "../../util/shell"; -import { MonitoringSatelliteInstaller } from "../../observability/monitoring-satellite"; -import { Werft } from "../../util/werft"; -import { Analytics, JobConfig } from "./job-config"; -import * as VM from "../../vm/vm"; -import { Installer } from "./installer/installer"; -import { ChildProcess, spawn } from 'child_process'; - -// used by Installer -const STACKDRIVER_SERVICEACCOUNT = JSON.parse( - fs.readFileSync(`/mnt/secrets/monitoring-satellite-stackdriver-credentials/credentials.json`, "utf8"), -); - -const phases = { - DEPLOY: "deploy", - VM: "Ensure VM Readiness", -}; - -const installerSlices = { - INSTALL: "Generate, validate, and install Gitpod", - DEDICATED_PRESEED: "Preseed for Dedicated", -}; - -const vmSlices = { - VM_READINESS: "Waiting for VM readiness", - KUBECONFIG: "Getting kubeconfig", -}; - -interface DeploymentConfig { - version: string; - destname: string; - namespace: string; - domain: string; - monitoringDomain: string; - url: string; - cleanSlateDeployment: boolean; - installEELicense: boolean; - withObservability: boolean; - analytics: Analytics; -} - -export async function deployToPreviewEnvironment(werft: Werft, jobConfig: JobConfig) { - const { version, cleanSlateDeployment, withObservability, installEELicense, workspaceFeatureFlags } = jobConfig; - - const { destname, namespace } = jobConfig.previewEnvironment; - - const domain = `${destname}.preview.gitpod-dev.com`; - const monitoringDomain = `${destname}.preview.gitpod-dev.com`; - const url = `https://${domain}`; - - const deploymentConfig: DeploymentConfig = { - version, - destname, - namespace, - domain, - monitoringDomain, - url, - cleanSlateDeployment, - installEELicense, - withObservability, - analytics: jobConfig.analytics, - }; - - // We set all attributes to false as default and only set it to true once the each process is complete. - // We only set the attribute for jobs where a VM is expected. - werft.rootSpan.setAttributes({ "preview.monitoring_installed_successfully": false }); - - werft.phase(phases.VM, "Ensuring VM is ready for deployment"); - - werft.log(vmSlices.VM_READINESS, "Wait for VM readiness"); - VM.waitForVMReadiness({ name: destname, timeoutSeconds: 60 * 10, slice: vmSlices.VM_READINESS }); - werft.done(vmSlices.VM_READINESS); - - werft.log(vmSlices.KUBECONFIG, "Installing preview context"); - await VM.installPreviewContext({ name: destname, slice: vmSlices.KUBECONFIG }); - werft.done(vmSlices.KUBECONFIG); - - werft.phase(phases.DEPLOY, "Deploying Gitpod and Observability Stack"); - - const installMonitoringSatellite = (async () => { - if (!jobConfig.withObservability) { - werft.log(installerSlices.INSTALL, "skipping installation of Observability Stack"); - return; - } - - const sliceID = "Install monitoring satellite"; - const monitoringSatelliteInstaller = new MonitoringSatelliteInstaller({ - branch: jobConfig.observability.branch, - previewName: exec(`previewctl get name --branch=${jobConfig.repository.branch}`).stdout.trim(), - stackdriverServiceAccount: STACKDRIVER_SERVICEACCOUNT, - werft: werft, - }); - try { - await monitoringSatelliteInstaller.install(sliceID); - werft.rootSpan.setAttributes({ "preview.monitoring_installed_successfully": true }); - } catch (err) { - // Currently failing to install the monitoring-satellite stack shouldn't cause the job to fail - // so we only mark this single slice as failed. - werft.failSlice(sliceID, err); - } - })(); - - const installGitpod = (async () => { - const installer = new Installer({ - werft: werft, - previewName: deploymentConfig.destname, - version: deploymentConfig.version, - analytics: deploymentConfig.analytics, - withEELicense: deploymentConfig.installEELicense, - workspaceFeatureFlags: workspaceFeatureFlags, - withDedicatedEmulation: jobConfig.withDedicatedEmulation, - }); - try { - werft.log(installerSlices.INSTALL, "deploying using installer"); - await installer.install(installerSlices.INSTALL); - exec( - `werft log result -d "dev installation" -c github-check-preview-env url https://${deploymentConfig.domain}/workspaces`, - ); - } catch (err) { - werft.fail(installerSlices.INSTALL, err); - } - - if (jobConfig.withDedicatedEmulation) { - // After the installation is done, and everything is running, we need to prepare first-time access for the admin-user - let portForwardProcess: ChildProcess | undefined; - try { - werft.log(installerSlices.DEDICATED_PRESEED, "preseed for dedicated"); - portForwardProcess = spawn("kubectl", ["port-forward", "deployment/server", "9000", "&"], { - shell: true, - detached: true, - stdio: "overlapped", - }); - await new Promise(resolve => portForwardProcess.stdout.on('data', resolve)); // wait until process is running - - const adminLoginOts = exec(`curl -X POST localhost:9000/admin-user/login-token/create`, { silent: true }).stdout.trim(); - exec( - `werft log result "admin login OTS token" ${adminLoginOts}`, - ); - exec( - `werft log result -d "admin-user login link" url https://${deploymentConfig.domain}/api/login/ots/admin-user/${adminLoginOts}`, - ); - werft.log(installerSlices.DEDICATED_PRESEED, "done preseeding for dedicated."); - } catch (err) { - werft.fail(installerSlices.DEDICATED_PRESEED, err); - } finally { - if (portForwardProcess) { - portForwardProcess.kill("SIGINT"); - } - } - } - })(); - - await Promise.all([installMonitoringSatellite, installGitpod]); -} diff --git a/.werft/jobs/build/installer/installer.ts b/.werft/jobs/build/installer/installer.ts deleted file mode 100644 index 45c2967745..0000000000 --- a/.werft/jobs/build/installer/installer.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { execStream } from "../../../util/shell"; -import { Werft } from "../../../util/werft"; -import { Analytics } from "../job-config"; -import { CORE_DEV_KUBECONFIG_PATH, PREVIEW_K3S_KUBECONFIG_PATH } from "../const"; - -export type InstallerOptions = { - werft: Werft; - previewName: string; - version: string; - analytics?: Analytics; - withEELicense: boolean; - workspaceFeatureFlags: string[]; - withDedicatedEmulation: boolean; -}; - -export class Installer { - options: InstallerOptions; - - constructor(options: InstallerOptions) { - this.options = options; - } - - async install(slice: string): Promise { - const environment = { - VERSION: this.options.version, - DEV_KUBE_PATH: CORE_DEV_KUBECONFIG_PATH, - DEV_KUBE_CONTEXT: "dev", - PREVIEW_K3S_KUBE_PATH: PREVIEW_K3S_KUBECONFIG_PATH, - PREVIEW_NAME: this.options.previewName, - GITPOD_ANALYTICS: this.options.analytics, - GITPOD_WORKSPACE_FEATURE_FLAGS: this.options.workspaceFeatureFlags.join(" "), - GITPOD_WITH_DEDICATED_EMU: this.options.withDedicatedEmulation, - }; - const variables = Object.entries(environment) - .map(([key, value]) => `${key}="${value}"`) - .join(" "); - await execStream(`${variables} leeway run dev/preview:deploy-gitpod`, { slice: slice }); - this.options.werft.done(slice); - } -} diff --git a/.werft/jobs/build/job-config.ts b/.werft/jobs/build/job-config.ts deleted file mode 100644 index 3e29e37998..0000000000 --- a/.werft/jobs/build/job-config.ts +++ /dev/null @@ -1,263 +0,0 @@ -import {exec} from "../../util/shell"; -import {Werft} from "../../util/werft"; -import {previewNameFromBranchName} from "../../util/preview"; - -type IdeIntegrationTests = "ide" | "jetbrains" | "ssh" | "vscode"; -type WithIntegrationTests = "skip" | "all" | "workspace" | "webapp" | IdeIntegrationTests - -export type Analytics = "skip" | "segment"; - -export interface JobConfig { - analytics: Analytics; - buildConfig: any; - cleanSlateDeployment: boolean; - cluster: string; - coverageOutput: string; - dontTest: boolean; - fromVersion: string; - installEELicense: boolean; - localAppVersion: string; - mainBuild: boolean; - withPreview: boolean; - publishRelease: boolean; - publishToJBMarketplace: boolean; - publishToNpm: string; - storage: string; - storageClass: string; - version: string; - withContrib: boolean; - withIntegrationTests: WithIntegrationTests; - withUpgradeTests: boolean; - withSelfHostedPreview: boolean; - withObservability: boolean; - withLocalPreview: boolean; - withDedicatedEmulation: boolean; - workspaceFeatureFlags: string[]; - previewEnvironment: PreviewEnvironmentConfig; - repository: Repository; - observability: Observability; - withLargeVM: boolean; - certIssuer: string; - recreatePreview: boolean; - recreateVm: boolean; - withWerft: boolean; - withGceVm: boolean; -} - -export interface PreviewEnvironmentConfig { - destname: string; - namespace: string; -} - -export interface Repository { - owner: string; - repo: string; - ref: string; - branch: string; -} - -export interface Observability { - // The branch of gitpod-io/observability to use - branch: string; -} - -export function jobConfig(werft: Werft, context: any): JobConfig { - const sliceId = "Parsing job configuration"; - werft.phase("Job configuration"); - werft.log(sliceId, "Parsing the job configuration"); - const version = parseVersion(context); - const repo = `${context.Repository.host}/${context.Repository.owner}/${context.Repository.repo}`; - const mainBuild = repo === "github.com/gitpod-io/gitpod" && context.Repository.ref.includes("refs/heads/main"); - - let buildConfig = context.Annotations || {}; - const dontTest = "no-test" in buildConfig; - const publishRelease = "publish-release" in buildConfig; - const workspaceFeatureFlags: string[] = ((): string[] => { - const raw: string = buildConfig["ws-feature-flags"] || ""; - if (!raw) { - return []; - } - return raw.split(",").map((e) => e.trim()); - })(); - - const coverageOutput = exec("mktemp -d", {silent: true}).stdout.trim(); - - // Main build should only contain the annotations below: - // ['with-contrib', 'publish-to-npm', 'publish-to-jb-marketplace', 'with-clean-slate-deployment'] - const withContrib = "with-contrib" in buildConfig || mainBuild; - const storage = buildConfig["storage"] || ""; - const withUpgradeTests = "with-upgrade-tests" in buildConfig && !mainBuild; - const fromVersion = withUpgradeTests ? buildConfig["from-version"] : ""; - const cluster = buildConfig["cluster"]; - const withSelfHostedPreview = "with-sh-preview" in buildConfig; - const publishToNpm = "publish-to-npm" in buildConfig || mainBuild; - const publishToJBMarketplace = "publish-to-jb-marketplace" in buildConfig || mainBuild; - - const localAppVersion = mainBuild || "with-localapp-version" in buildConfig ? version : "unknown"; - const cleanSlateDeployment = mainBuild || "with-clean-slate-deployment" in buildConfig; - const installEELicense = !("without-ee-license" in buildConfig) || mainBuild; - const withObservability = "with-observability" in buildConfig && !mainBuild; - const withLargeVM = "with-large-vm" in buildConfig && !mainBuild; - const withLocalPreview = "with-local-preview" in buildConfig || mainBuild - const recreatePreview = "recreate-preview" in buildConfig - const recreateVm = mainBuild || "recreate-vm" in buildConfig; - const withDedicatedEmulation = "with-dedicated-emulation" in buildConfig && !mainBuild; - const storageClass = buildConfig["storage-class"] || ""; - - const analytics = parseAnalytics(werft, sliceId, buildConfig["analytics"]) - const withIntegrationTests = parseWithIntegrationTests(werft, sliceId, buildConfig["with-integration-tests"]); - const withPreview = decideWithPreview({werft, sliceID: sliceId, buildConfig, mainBuild, withIntegrationTests}) - const withWerft = "with-werft" in buildConfig; - const withGceVm = "with-gce-vm" in buildConfig; - - switch (buildConfig["cert-issuer"]) { - case "zerossl": - buildConfig["cert-issuer"] = "zerossl-issuer-gitpod-core-dev" - break - case "letsencrypt": - default: - buildConfig["cert-issuer"] = "letsencrypt-issuer-gitpod-core-dev" - } - const certIssuer = buildConfig["cert-issuer"]; - - const repository: Repository = { - owner: context.Repository.owner, - repo: context.Repository.repo, - ref: context.Repository.ref, - branch: context.Repository.ref, - }; - const refsPrefix = "refs/heads/"; - if (repository.branch.startsWith(refsPrefix)) { - repository.branch = repository.branch.substring(refsPrefix.length); - } - - const previewName = previewNameFromBranchName(repository.branch); - const previewEnvironmentNamespace = `default`; - const previewEnvironment = { - destname: previewName, - namespace: previewEnvironmentNamespace, - }; - - const observability: Observability = { - branch: context.Annotations.withObservabilityBranch || "main", - }; - - const jobConfig = { - analytics, - buildConfig, - cleanSlateDeployment, - cluster, - coverageOutput, - dontTest, - fromVersion, - installEELicense, - localAppVersion, - mainBuild, - withPreview, - observability, - previewEnvironment, - publishRelease, - publishToJBMarketplace, - publishToNpm, - repository, - storage, - storageClass, - version, - withContrib, - withIntegrationTests, - withObservability, - withUpgradeTests, - withSelfHostedPreview, - withLocalPreview, - workspaceFeatureFlags, - withLargeVM, - certIssuer, - recreatePreview, - recreateVm, - withWerft, - withDedicatedEmulation, - withGceVm, - }; - - werft.logOutput(sliceId, JSON.stringify(jobConfig, null, 2)); - werft.log(sliceId, "Expand to see the parsed configuration"); - const globalAttributes = Object.fromEntries( - Object.entries(jobConfig).map((kv) => { - const [key, value] = kv; - return [`werft.job.config.${key}`, value]; - }), - ); - globalAttributes["werft.job.config.branch"] = context.Repository.ref; - werft.addAttributes(globalAttributes); - werft.done(sliceId); - - return jobConfig; -} - -function parseVersion(context: any) { - let buildConfig = context.Annotations || {}; - const explicitVersion = buildConfig.version; - if (explicitVersion) { - return explicitVersion; - } - let version = context.Name; - const PREFIX_TO_STRIP = "gitpod-build-"; - if (version.substr(0, PREFIX_TO_STRIP.length) === PREFIX_TO_STRIP) { - version = version.substr(PREFIX_TO_STRIP.length); - } - return version; -} - -function decideWithPreview(options: { werft: Werft, sliceID: string, buildConfig: any, mainBuild: boolean, withIntegrationTests: WithIntegrationTests }) { - const {werft, sliceID, buildConfig, mainBuild, withIntegrationTests} = options - if (mainBuild) { - werft.log(sliceID, "with-preview is disabled for main builds") - return false - } - if ("with-preview" in buildConfig) { - werft.log(sliceID, "with-preview is enabled as it was passed as a Werft annotation") - return true - } - if (withIntegrationTests != "skip") { - werft.log(sliceID, "with-preview is enabled as the with-integration-tests Werft annotation was used") - return true - } - - return false -} - -export function parseAnalytics(werft: Werft, sliceId: string, value: string): Analytics { - switch (value) { - case "segment": - return "segment" - } - - werft.log(sliceId, "Analytics is not enabled") - return "skip"; -} - - -export function parseWithIntegrationTests(werft: Werft, sliceID: string, value?: string): WithIntegrationTests { - switch (value) { - case null: - case undefined: - werft.log(sliceID, "with-integration-tests was not set - will use 'skip'"); - return "skip"; - case "skip": - case "all": - case "webapp": - case "ide": - case "jetbrains": - case "vscode": - case "ssh": - case "workspace": - case "webapp": - return value; - case "": - werft.log(sliceID, "with-integration-tests was set but no value was provided - falling back to 'all'"); - return "all"; - default: - werft.log(sliceID, `Unknown value for with-integration-tests: '${value}' - falling back to 'all'`); - return "all"; - } -} diff --git a/.werft/jobs/build/payment/chargebee-config-secret.yaml b/.werft/jobs/build/payment/chargebee-config-secret.yaml deleted file mode 100644 index a7fb97a1de..0000000000 --- a/.werft/jobs/build/payment/chargebee-config-secret.yaml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: v1 -data: - providerOptions: eyJzaXRlIjogImdpdHBvZC10ZXN0IiwiYXBpX2tleSI6ICJ0ZXN0X1hheTY0eVJYY2RHR2N1NG1haVhlSTNsY3VZNXlzTmVIWlFwIn0= -kind: Secret -metadata: - name: chargebee-config - namespace: ${NAMESPACE} -type: Opaque diff --git a/.werft/jobs/build/payment/stripe-configmap.yaml b/.werft/jobs/build/payment/stripe-configmap.yaml deleted file mode 100644 index 2eb3e92e98..0000000000 --- a/.werft/jobs/build/payment/stripe-configmap.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: stripe-config - namespace: ${NAMESPACE} -data: - config: | - { - "individualUsagePriceIds": { - "EUR": "price_1LmYVxGadRXm50o3AiLq0Qmo", - "USD": "price_1LmYWRGadRXm50o3Ym8PLqnG" - }, - "teamUsagePriceIds": { - "EUR": "price_1LmYVxGadRXm50o3AiLq0Qmo", - "USD": "price_1LmYWRGadRXm50o3Ym8PLqnG" - } - } diff --git a/.werft/jobs/build/prepare.ts b/.werft/jobs/build/prepare.ts deleted file mode 100644 index 22058fd82d..0000000000 --- a/.werft/jobs/build/prepare.ts +++ /dev/null @@ -1,89 +0,0 @@ -import {execStream} from "../../util/shell"; -import {Werft} from "../../util/werft"; -import {GCLOUD_SERVICE_ACCOUNT_PATH} from "./const"; -import {JobConfig} from "./job-config"; -import {vmExists} from "../../vm/vm"; -import {configureAccess, configureDocker} from "../../util/preview"; - -const phaseName = "prepare"; -const prepareSlices = { - CONFIGURE_K8S: "Configuring k8s access.", - CONFIGURE_CORE_DEV: "Configuring core-dev access.", - BOOT_VM: "Booting VM.", -}; - -export async function prepare(werft: Werft, config: JobConfig) { - werft.phase(phaseName); - try { - werft.log(prepareSlices.CONFIGURE_CORE_DEV, prepareSlices.CONFIGURE_CORE_DEV); - await configureAccess(werft) - configureDocker(); - werft.done(prepareSlices.CONFIGURE_CORE_DEV); - if (!config.withPreview) { - return - } - await decideHarvesterVMCreation(werft, config); - } catch (err) { - werft.fail(phaseName, err); - } - werft.done(phaseName); -} - -async function decideHarvesterVMCreation(werft: Werft, config: JobConfig) { - // always try to create - usually it will be no-op, but if tf changed for any reason we would reconcile - if (config.withPreview && (!vmExists({name: config.previewEnvironment.destname}) || config.cleanSlateDeployment || config.recreatePreview || config.recreateVm)) { - await createVM(werft, config); - } - werft.done(prepareSlices.BOOT_VM); -} - -// createVM only triggers the VM creation. -// Readiness is not guaranted. -async function createVM(werft: Werft, config: JobConfig) { - const infra = config.withGceVm ? "gce" : "harvester" - const replace = config.withGceVm ? "module.preview_gce[0].google_compute_instance.default" : "module.preview_harvester[0].harvester_virtualmachine.harvester" - - const environment = { - // We pass the GCP credentials explicitly, otherwise for some reason TF doesn't pick them up - "GOOGLE_BACKEND_CREDENTIALS": GCLOUD_SERVICE_ACCOUNT_PATH, - "GOOGLE_APPLICATION_CREDENTIALS": GCLOUD_SERVICE_ACCOUNT_PATH, - "TF_VAR_cert_issuer": config.certIssuer, - "TF_VAR_preview_name": config.previewEnvironment.destname, - "TF_VAR_with_large_vm": `${config.withLargeVM}`, - "TF_VAR_infra_provider": `${infra}`, - } - - if (config.storageClass.length > 0) { - environment["TF_VAR_vm_storage_class"] = config.storageClass - } - - const variables = Object - .entries(environment) - .filter(([_, value]) => value.length > 0) - .map(([key, value]) => `${key}="${value}"`) - .join(" ") - - if (config.recreatePreview) { - werft.log(prepareSlices.BOOT_VM, "Recreating environment"); - await execStream(`${variables} \ - leeway run dev/preview:delete-preview`, {slice: prepareSlices.BOOT_VM}); - } else if (config.cleanSlateDeployment || config.recreateVm) { - werft.log(prepareSlices.BOOT_VM, "Cleaning previously created VM"); - // -replace=... forces recreation of the resource - await execStream(`${variables} \ - TF_CLI_ARGS_plan=-replace=${replace} \ - leeway run dev/preview:create-preview`, {slice: prepareSlices.BOOT_VM}); - } - - werft.log(prepareSlices.BOOT_VM, "Creating VM"); - - try { - await execStream(`${variables} leeway run dev/preview:create-preview`, {slice: prepareSlices.BOOT_VM}); - } catch (err) { - werft.currentPhaseSpan.setAttribute("preview.created_vm", false); - werft.fail(prepareSlices.BOOT_VM, new Error(`Failed creating VM: ${err}`)) - return; - } - - werft.currentPhaseSpan.setAttribute("preview.created_vm", true); -} diff --git a/.werft/jobs/build/validate-changes.ts b/.werft/jobs/build/validate-changes.ts deleted file mode 100644 index c1b7027d41..0000000000 --- a/.werft/jobs/build/validate-changes.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { exec } from "../../util/shell"; -import { Werft } from "../../util/werft"; -import { JobConfig } from "./job-config"; - -export async function validateChanges(werft: Werft, config: JobConfig) { - werft.phase("validate-changes", "validating changes"); - // We run pre-commit checks first to avoid potential race conditions with the - // other validation checks. - await preCommitCheck(werft); - await Promise.all([ - branchNameCheck(werft, config), - typecheckWerftJobs(werft), - leewayVet(werft), - ]); -} - -// Branch names cannot be longer than 45 characters. -// -// The branch name is used as part of the Werft job name. The job name is used for the name of the pod -// and k8s has a limit of 63 characters. We use 13 characters for the "gitpod-build-" prefix and 5 -// more for the "." ending. That leaves us 45 characters for the branch name. -// See Werft source https://github.com/csweichel/werft/blob/057cfae0fd7bb1a7b05f89d1b162348378d74e71/pkg/werft/service.go#L376 -async function branchNameCheck(werft: Werft, config: JobConfig) { - if (config.withPreview) { - const maxBranchNameLength = 45; - werft.log("check-branchname", `Checking if branch name is shorter than ${maxBranchNameLength} characters.`); - - if (config.previewEnvironment.destname.length > maxBranchNameLength) { - throw new Error( - `The branch name ${config.previewEnvironment.destname} is more than ${maxBranchNameLength} character. Please choose a shorter name!`, - ); - } - werft.done("check-branchname"); - } -} - -async function preCommitCheck(werft: Werft) { - werft.log("pre-commit checks", "Running pre-commit hooks."); - const preCommitCmd = await exec(`pre-commit run --show-diff-on-failure`, { - slice: "pre-commit checks", - async: true, - }); - - if (preCommitCmd.code != 0) { - throw new Error(preCommitCmd.stderr.toString().trim()); - } - werft.done("pre-commit checks"); -} - -/** - * This validates all the .ts files inside of the .werft folder and fails the - * build if there are compile errors. - */ -export async function typecheckWerftJobs(werft: Werft) { - const slice = "tsc --noEmit"; - try { - werft.log(slice, "Typechecking Werft Typescript files"); - await exec("cd .werft && tsc --noEmit", { slice, async: true }); - werft.log(slice, "No compilation errors"); - } catch (e) { - werft.fail(slice, e); - } - werft.done(slice); -} - -export async function leewayVet(werft: Werft) { - const slice = "leeway vet --ignore-warnings" - try { - werft.log(slice, "Running leeway vet") - await exec(`leeway vet --ignore-warnings`, {slice, async: true}); - werft.log(slice, "leeway vet successful") - } catch (e) { - werft.fail(slice, e) - } - werft.done(slice); -} diff --git a/.werft/observability/monitoring-satellite.ts b/.werft/observability/monitoring-satellite.ts deleted file mode 100644 index 71f0f7fb13..0000000000 --- a/.werft/observability/monitoring-satellite.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { execStream } from "../util/shell"; -import { Werft } from "../util/werft"; -import { CORE_DEV_KUBECONFIG_PATH, PREVIEW_K3S_KUBECONFIG_PATH } from "../jobs/build/const"; - -type MonitoringSatelliteInstallerOptions = { - werft: Werft; - branch: string; - previewName: string; - stackdriverServiceAccount: any; -}; - -/** - * Installs monitoring-satellite, while updating its dependencies to the latest commit in the branch it is running. - */ -export class MonitoringSatelliteInstaller { - constructor(private readonly options: MonitoringSatelliteInstallerOptions) {} - - public async install(slice: string) { - const environment = { - DEV_KUBE_PATH: CORE_DEV_KUBECONFIG_PATH, - DEV_KUBE_CONTEXT: "dev", - PREVIEW_K3S_KUBE_PATH: PREVIEW_K3S_KUBECONFIG_PATH, - PREVIEW_NAME: this.options.previewName, - }; - const variables = Object.entries(environment) - .map(([key, value]) => `${key}="${value}"`) - .join(" "); - this.options.werft.log(slice, `Installing observability stack - Branch: ${this.options.branch}`); - await execStream(`${variables} leeway run dev/preview:deploy-monitoring-satellite`, { - slice: slice, - }); - this.options.werft.log(slice, "Succeeded installing monitoring satellite"); - this.options.werft.done(slice); - } -} diff --git a/.werft/observability/tracing.ts b/.werft/observability/tracing.ts deleted file mode 100644 index 684e1d72c7..0000000000 --- a/.werft/observability/tracing.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Metadata, credentials } from "@grpc/grpc-js"; -import { NodeSDK } from "@opentelemetry/sdk-node"; -import { getNodeAutoInstrumentations } from "@opentelemetry/auto-instrumentations-node"; -import { Resource } from "@opentelemetry/resources"; -import { SemanticResourceAttributes } from "@opentelemetry/semantic-conventions"; -import { CollectorTraceExporter } from "@opentelemetry/exporter-collector-grpc"; - -/** - * Initialize tracing and wait for it to be ready. - * - * Registers a beforeExit event handler to gracefully flush traces upon exit. - */ -export async function initialize() { - const metadata = new Metadata(); - metadata.set("x-honeycomb-team", process.env.HONEYCOMB_API_KEY); - metadata.set("x-honeycomb-dataset", process.env.HONEYCOMB_DATASET); - const traceExporter = new CollectorTraceExporter({ - url: "grpc://api.honeycomb.io:443/", - credentials: credentials.createSsl(), - metadata, - }); - - const sdk = new NodeSDK({ - resource: new Resource({ - [SemanticResourceAttributes.SERVICE_NAME]: "werft", - }), - traceExporter, - instrumentations: [getNodeAutoInstrumentations()], - }); - - console.log("Initializing tracing"); - try { - await sdk.start(); - } catch (err) { - console.log("Error initializing tracing", err); - process.exit(1); - } - - let didFlushTraces = false; - process.on("beforeExit", (code) => { - const sliceID = "tracing shutdown"; - if (!didFlushTraces) { - console.log(`[${sliceID}] About to exit with code ${code}. Shutting down tracing.`); - didFlushTraces = true; - sdk.shutdown() - .then(() => console.log(`[${sliceID}] Tracing terminated`)) - .catch((error) => console.log(`[${sliceID}] Error terminating tracing`, error)); - } else { - console.log( - `[${sliceID}] About to exit with code ${code}. Traces already flushed, no further action needed.`, - ); - } - }); -} diff --git a/.werft/package.json b/.werft/package.json deleted file mode 100644 index c4ed0ecfd6..0000000000 --- a/.werft/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "private": true, - "name": "@gitpod/build", - "version": "0.0.0", - "license": "UNLICENSED", - "scripts": { - "run": "npx ts-node build.ts" - }, - "dependencies": { - "@google-cloud/dns": "^2.2.4", - "@grpc/grpc-js": "1.8.8", - "@opentelemetry/api": "^1.0.3", - "@opentelemetry/auto-instrumentations-node": "^0.26.0", - "@opentelemetry/exporter-collector-grpc": "^0.25.0", - "@opentelemetry/sdk-node": "^0.26.0", - "semver": "7.3.5", - "shelljs": "^0.8.4", - "ts-node": "^10.4.0", - "typescript": "~4.4.2" - }, - "devDependencies": { - "@types/node": "^16.11.0", - "@types/semver": "7.3.5", - "@types/shelljs": "^0.8.8", - "prettier": "2.6.2", - "tslib": "^2.3.0", - "typescript": "~4.4.2" - } -} diff --git a/.werft/parse.sh b/.werft/parse.sh deleted file mode 100755 index 5d4e87226c..0000000000 --- a/.werft/parse.sh +++ /dev/null @@ -1,5 +0,0 @@ -title=":x: *Workspace integration test failed*" -body=$(grep "\-\-\- FAIL: " entrypoing.sh.log) -echo "${title}" -echo "${body}" -# echo "[int-tests|FAIL]" diff --git a/.werft/platform-trigger-werft-cleanup.sh b/.werft/platform-trigger-werft-cleanup.sh deleted file mode 100755 index 9090832437..0000000000 --- a/.werft/platform-trigger-werft-cleanup.sh +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env bash -# -# This script iterates over the "dev/workload: builds" nodes and cordons them if -# their disk usage is higher than DISK_USED_THRESHOLD. -# -# The easiest way to run this script is through Werft so you don't have to worry -# about installing the appropraite service account etc. locally. -# -# werft job run github -j .werft/platform-trigger-werft-cleanup.yaml -s .werft/platform-trigger-werft-cleanup.sh -# - -sleep 1 - -set -Eeuo pipefail - -DISK_USED_THRESHOLD=80 - -function cordon-node-if-almost-full { - local node="$1" - local zone disk_used_pct - local slice_id="Cleanup up node $node" - - zone="$( - kubectl get node "${node}" -o json \ - | jq -r '.metadata.labels["topology.kubernetes.io/zone"]' - )" - - echo "Checking disk usage of /dev/sdb" | werft log slice "$slice_id" - disk_used_pct=$( - gcloud compute ssh \ - --project "gitpod-core-dev" \ - --zone "$zone" \ - --command="df /dev/sdb --output=pcent | tail -n1 | cut -d'%' -f1" \ - "${node}" 2>&1 \ - | tail -n1 \ - | tr -d '[:space:]' - ) - echo "The disk is ${disk_used_pct}% full" | werft log slice "$slice_id" - - if [ "$disk_used_pct" -gt "$DISK_USED_THRESHOLD" ]; then - echo "${disk_used_pct} is greater than ${DISK_USED_THRESHOLD}. Cordining node" | werft log slice "$slice_id" - kubectl cordon "$node" | werft log slice "$slice_id" - - if [[ "${node}" =~ "builds-static" ]]; then - echo "Cleaning up static node [${node}]" - while ! is_node_empty "${node}";do - echo "Node is not empty yet. Sleeping for 15 seconds." | werft log slice "$slice_id" - sleep 15 - done - - kubectl drain "${node}" --delete-emptydir-data --force --ignore-daemonsets=true --grace-period=120 | werft log slice "$slice_id" - - gcloud compute instances delete "${node}" --zone="${zone}" -q | werft log slice "$slice_id" - kubectl uncordon "${node}" | werft log slice "$slice_id" - fi - else - echo "${disk_used_pct} is less than the trehold of ${DISK_USED_THRESHOLD}. Skipping node" | werft log slice "$slice_id" - fi - - werft log slice "$slice_id" --done -} - -function is_node_empty { - local node=$1 - pods=$(kubectl -n werft get pods -o wide --field-selector spec.nodeName="${node}" 2>&1) - if [[ "${pods}" == "No resources found in werft namespace." ]]; then - return 0 - fi - - return 1 -} - -# Activate service account and install core-dev context -gcloud auth activate-service-account --key-file "/mnt/secrets/gcp-sa/service-account.json" -gcloud container clusters get-credentials core-dev --zone europe-west1-b --project gitpod-core-dev - -echo "[Process nodes|PHASE] Processing each build node" -nodes=$(kubectl get nodes -l dev/workload=builds --no-headers -o custom-columns=":metadata.name") -for node in $nodes ; do - cordon-node-if-almost-full "$node" -done diff --git a/.werft/platform-trigger-werft-cleanup.yaml b/.werft/platform-trigger-werft-cleanup.yaml deleted file mode 100644 index 3e2a9b842d..0000000000 --- a/.werft/platform-trigger-werft-cleanup.yaml +++ /dev/null @@ -1,37 +0,0 @@ -# This job is responsible for cordoning Werft build nodes if their disk is almost full. -# It runs periodically but you can always manually trigger it using: -# -# werft job run github -j .werft/platform-trigger-werft-cleanup.yaml -# -pod: - serviceAccount: werft - restartPolicy: Never - affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: dev/workload - operator: In - values: - - "builds" - volumes: - # Needed to talk to the core-dev cluster and SSH to underlying instances - - name: gcp-sa - secret: - secretName: gcp-sa-gitpod-dev-deployer - containers: - - name: build - image: eu.gcr.io/gitpod-core-dev/dev/dev-environment:aledbf-oci-tool-gha.14121 - workingDir: /workspace - imagePullPolicy: IfNotPresent - volumeMounts: - - name: gcp-sa - mountPath: /mnt/secrets/gcp-sa - readOnly: true - command: - - bash - - .werft/platform-trigger-werft-cleanup.sh - -plugins: - cron: "15 * * * *" diff --git a/.werft/tsconfig.json b/.werft/tsconfig.json deleted file mode 100644 index d773c53421..0000000000 --- a/.werft/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "compilerOptions": { - "target": "es2019", - "skipLibCheck": true, - "moduleResolution": "node", - "noUnusedLocals": true - } -} diff --git a/.werft/util/preview.ts b/.werft/util/preview.ts deleted file mode 100644 index bc2df0018a..0000000000 --- a/.werft/util/preview.ts +++ /dev/null @@ -1,145 +0,0 @@ -import {createHash} from "crypto"; -import * as VM from "../vm/vm"; -import {exec, execStream} from "./shell"; -import {Werft} from "./werft"; -import { - CORE_DEV_KUBECONFIG_PATH, - GCLOUD_SERVICE_ACCOUNT_PATH, - GLOBAL_KUBECONFIG_PATH, - HARVESTER_KUBECONFIG_PATH -} from "../jobs/build/const"; - -const SLICES = { - CONFIGURE_DOCKER: "Configuring Docker", - CONFIGURE_GCP_ACCESS: "Activating service account", - CONFIGURE_K8S_ACCESS: "Installing dev/harvester contexts", - INSTALL_PREVIEWCTL: "Install previewctl", -}; - -/** - * Based on the current branch name this will compute the name of the associated - * preview environment. - * - * NOTE: This needs to produce the same result as the function in dev/preview/util/preview-name-from-branch.sh - */ -export function previewNameFromBranchName(branchName: string): string { - // Due to various limitations we have to ensure that we only use 20 characters - // for the preview environment name. - // - // If the branch name is 20 characters or less we just use it. - // - // Otherwise: - // - // We use the first 10 chars of the sanitized branch name - // and then the 10 first chars of the hash of the sanitized branch name - // - // That means collisions can happen. If they do, two jobs would try to deploy to the same - // environment. - // - // see https://github.com/gitpod-io/ops/issues/1252 for details. - const sanitizedBranchName = branchName - .replace(/^refs\/heads\//, "") - .toLocaleLowerCase() - .replace(/[^-a-z0-9]/g, "-"); - - if (sanitizedBranchName.length <= 20) { - return sanitizedBranchName; - } - - const hashed = createHash("sha256").update(sanitizedBranchName).digest("hex"); - return `${sanitizedBranchName.substring(0, 10)}${hashed.substring(0, 10)}`; -} - -export class HarvesterPreviewEnvironment { - // The prefix we use for the namespace - static readonly namespacePrefix: string = "preview-"; - - // The name of the namespace that the VM and related resources are in, e.g. preview-my-branch - namespace: string; - - // The name of the preview environment, e.g. my-branch - name: string; - - werft: Werft; - - constructor(werft: Werft, namespace: string) { - this.werft = werft; - this.namespace = namespace; - this.name = namespace; - if (this.namespace.startsWith(HarvesterPreviewEnvironment.namespacePrefix)) { - this.name = namespace.slice(HarvesterPreviewEnvironment.namespacePrefix.length); - } - } - - async delete(): Promise { - await VM.destroyPreview({name: this.name}); - } -} - -export async function configureAccess(werft: Werft) { - werft.phase("Configure access"); - try { - exec(`gcloud auth activate-service-account --key-file "${GCLOUD_SERVICE_ACCOUNT_PATH}"`, { - slice: SLICES.CONFIGURE_GCP_ACCESS, - }); - werft.done(SLICES.CONFIGURE_GCP_ACCESS); - } catch (err) { - werft.fail(SLICES.CONFIGURE_GCP_ACCESS, err); - } - - try { - await installPreviewCTL() - } catch (e) { - werft.fail(SLICES.INSTALL_PREVIEWCTL, e) - } - - try { - exec(`KUBECONFIG=${GLOBAL_KUBECONFIG_PATH} previewctl get-credentials --gcp-service-account=${GCLOUD_SERVICE_ACCOUNT_PATH}`, { - slice: SLICES.CONFIGURE_K8S_ACCESS - }); - - exec(`mkdir -p $(dirname ${HARVESTER_KUBECONFIG_PATH})`) - - exec( - `kubectl --context=harvester config view --minify --flatten > ${HARVESTER_KUBECONFIG_PATH}`, { - slice: SLICES.CONFIGURE_K8S_ACCESS - }, - ) - - exec( - `kubectl --context=dev config view --minify --flatten > ${CORE_DEV_KUBECONFIG_PATH}`, { - slice: SLICES.CONFIGURE_K8S_ACCESS - }, - ) - werft.done(SLICES.CONFIGURE_K8S_ACCESS); - } catch (e) { - werft.fail(SLICES.CONFIGURE_K8S_ACCESS, e); - throw new Error("Failed to configure kubernetes contexts"); - } - - werft.done("Configure access"); -} - -export async function installPreviewCTL() { - try { - await execStream(`leeway run dev/preview/previewctl:install`, { - slice: SLICES.INSTALL_PREVIEWCTL, - }) - } catch (e) { - throw new Error(`Failed to install previewctl: ${e}`); - } -} - -export function configureDocker() { - const rcDocker = exec("gcloud auth configure-docker --quiet", {slice: SLICES.CONFIGURE_DOCKER}).code; - const rcDockerRegistry = exec("gcloud auth configure-docker europe-docker.pkg.dev --quiet", { - slice: SLICES.CONFIGURE_DOCKER, - }).code; - - if (rcDocker != 0 || rcDockerRegistry != 0) { - throw new Error("Failed to configure docker with gcloud."); - } -} - - -export type PreviewEnvironment = HarvesterPreviewEnvironment; diff --git a/.werft/util/shell.ts b/.werft/util/shell.ts deleted file mode 100644 index b18de01de6..0000000000 --- a/.werft/util/shell.ts +++ /dev/null @@ -1,151 +0,0 @@ -import * as shell from "shelljs"; -import * as fs from "fs"; -import { ChildProcess } from "child_process"; -import { getGlobalWerftInstance } from "./werft"; - -export type ExecOptions = shell.ExecOptions & { - slice?: string; - dontCheckRc?: boolean; -}; -export type ExecResult = { - code: number; - stdout: string; - stderr: string; -}; - -// exec executes a command and throws an exception if that command exits with a non-zero exit code -export function exec(command: string): shell.ShellString; -export function exec(command: string, options: ExecOptions & { async?: false }): shell.ShellString; -export function exec(command: string, options: ExecOptions & { async: true }): Promise; -export function exec(command: string, options: ExecOptions): shell.ShellString | ChildProcess; -export function exec(cmd: string, options?: ExecOptions): ChildProcess | shell.ShellString | Promise { - const werft = getGlobalWerftInstance(); - - if (options && options.slice) { - options.silent = true; - } - - const handleResult = (result, options) => { - let output = []; - if (result.stdout) { - output.push("STDOUT: " + result.stdout); - } - if (result.stderr) { - output.push("STDERR: " + result.stderr); - } - if (options && options.slice) { - werft.logOutput(options.slice, output.join("\n")); - output = []; // don't show the same output as part of the exception again. - } - if ((!options || !options.dontCheckRc) && result.code !== 0) { - output.unshift(`${cmd} exit with non-zero status code.`); - throw new Error(output.join("\n")); - } - }; - - if (options && options.async) { - return new Promise((resolve, reject) => { - shell.exec(cmd, options, (code, stdout, stderr) => { - try { - const result: ExecResult = { code, stdout, stderr }; - handleResult(result, options); - resolve(result); - } catch (err) { - reject(err); - } - }); - }); - } else { - const result = shell.exec(cmd, options); - handleResult(result, options); - return result; - } -} - -/** - * Execute a command and stream output logs. - * - * If a slice is given logs are streamed using the werft log syntax; else they're streamed directly - * to stderr/stdout. - * - * @return The process exit code - */ -export async function execStream(command: string, options: ExecOptions ): Promise { - const werft = getGlobalWerftInstance(); - - options = options || {}; - - if (options.slice) { - options.silent = true; - } - - const child = shell.exec(command, {...options, async: true}); - - // Collect output from a subprocess file and print newline terminated log messages. - // - // The event handlers attached to the child process stdout/stderr aren't guaranteed to be newline - // terminated; this can have odd interactions with `werft.logOutput` which appends newlines. - // to log messages. To ensure faithful reproduction of the underlying command output we - // perform our own buffer management to emit newline delimited logs accurately. - const bufferedLog = (slice: string, buffer: string, data: string) => { - buffer += data; - const lastIndex = buffer.lastIndexOf("\n"); - if (lastIndex >= 0) { - // Extract the substring till the last newline in the buffer, and trim off the newline - // as werft.logOutput will append a newline to the log message. - let msg = buffer.slice(0, lastIndex + 1).trimEnd(); - werft.logOutput(slice, msg); - - buffer = buffer.slice(lastIndex + 1); - } - - }; - - let stdoutBuffer: string = ''; - child.stdout.on('data', (data) => { - if (options.slice) bufferedLog(options.slice, stdoutBuffer, data); - }); - - let stderrBuffer: string = ''; - child.stderr.on('data', (data) => { - if (options.slice) bufferedLog(options.slice, stderrBuffer, data); - }); - - const code = await new Promise((resolve, reject) => { - child.on('close', (code, _signal) => { - if (options.slice) { - // The child process stdout and stderr buffers may not be fully flushed as the child process - // may emit logs that aren't terminated with a newline; flush those buffers now. - if (stdoutBuffer.length > 0) werft.logOutput(options.slice, stdoutBuffer.trimEnd()); - if (stderrBuffer.length > 0) werft.logOutput(options.slice, stderrBuffer.trimEnd()); - } - - if (code === 0 || options.dontCheckRc) { - resolve(code) - } else { - reject(new Error(`Process exited non-zero exit code ${code}`)) - } - }); - }); - - return code; -} - -// gitTag tags the current state and pushes that tag to the repo origin -export const gitTag = (tag) => { - shell.mkdir("/root/.ssh"); - fs.writeFileSync( - "/root/.ssh/config", - `Host github.com - UserKnownHostsFile=/dev/null - StrictHostKeyChecking no - IdentitiesOnly yes - IdentityFile /mnt/secrets/github-ssh-key/github-ssh-key.pem`, - ); - shell.chmod(600, "/root/.ssh/*"); - shell.chmod(700, "/root/.ssh"); - - exec("git config --global url.ssh://git@github.com/.insteadOf https://github.com/"); - exec(`git tag -f ${tag}`); - exec(`git push -f origin ${tag}`); -}; diff --git a/.werft/util/slack.ts b/.werft/util/slack.ts deleted file mode 100644 index b0f1d63345..0000000000 --- a/.werft/util/slack.ts +++ /dev/null @@ -1,100 +0,0 @@ -import * as https from "https"; - -export function reportBuildFailureInSlack(context, err: Error): Promise { - const repo = context.Repository.host + "/" + context.Repository.owner + "/" + context.Repository.repo; - const data = JSON.stringify({ - blocks: [ - { - type: "section", - text: { - type: "mrkdwn", - text: ":X: *build failure*\n_Repo:_ `" + repo + "`\n_Build:_ `" + context.Name + "`", - }, - accessory: { - type: "button", - text: { - type: "plain_text", - text: "Go to Werft", - emoji: true, - }, - value: "click_me_123", - url: "https://werft.gitpod-dev.com/job/" + context.Name, - action_id: "button-action", - }, - }, - { - type: "section", - text: { - type: "mrkdwn", - text: "```\n" + err + "\n```", - }, - }, - ], - }); - return new Promise((resolve, reject) => { - const req = https.request( - { - hostname: "hooks.slack.com", - port: 443, - path: process.env.SLACK_NOTIFICATION_PATH.trim(), - method: "POST", - headers: { - "Content-Type": "application/json", - "Content-Length": data.length, - }, - }, - () => resolve(), - ); - req.on("error", (error: Error) => reject(error)); - req.write(data); - req.end(); - }); -} - -export function reportCertificateError(options: { certificateName: string; certifiateYAML: string, certificateDebug: string }): Promise { - const data = JSON.stringify({ - channel: "C03MWBB5MP1", - blocks: [ - { - type: "section", - text: { - type: "mrkdwn", - text: `A preview environment's certificate ${options.certificateName} never reached the Ready state. @ask-devx please investigate using our [Debugging certificate issues guide](https://www.notion.so/gitpod/Debugging-certificate-issues-9453d1c8ac914ce7962557b67f7b49b3) :hug:`, - }, - }, - { - type: "section", - text: { - type: "mrkdwn", - text: "```\n" + options.certifiateYAML + "\n```", - }, - }, - { - type: "section", - text: { - type: "mrkdwn", - text: "```\n" + options.certificateDebug + "\n```", - }, - }, - ], - }); - return new Promise((resolve, reject) => { - const req = https.request( - { - hostname: "slack.com", - path: "api/chat.postMessage", - method: "POST", - port: 443, - headers: { - "Content-Type": "application/json", - "Content-Length": data.length, - "Authorization": "Bearer " + process.env.DEVX_SLACK_NOTIFICATION_PATH.trim(), - }, - }, - () => resolve(), - ); - req.on("error", (error: Error) => reject(error)); - req.write(data); - req.end(); - }); -} diff --git a/.werft/util/uninstall-gitpod.sh b/.werft/util/uninstall-gitpod.sh deleted file mode 100755 index 2a1ef1837b..0000000000 --- a/.werft/util/uninstall-gitpod.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -NAMESPACE=$1 -KUBECONFIG=$2 - -if [[ -z ${NAMESPACE} ]]; then - echo "One or more input params were invalid. The params we received were: ${NAMESPACE}" - exit 1 -fi - -echo "Removing Gitpod in namespace ${NAMESPACE}" -kubectl --kubeconfig "$KUBECONFIG" get configmap gitpod-app -n "${NAMESPACE}" -o jsonpath='{.data.app\.yaml}' | kubectl --kubeconfig "$KUBECONFIG" delete --ignore-not-found=true -f - - -echo "Removing Gitpod storage from ${NAMESPACE}" -kubectl --kubeconfig "$KUBECONFIG" -n "${NAMESPACE}" --ignore-not-found=true delete pvc data-mysql-0 -# the installer includes the minio PVC in it's config mpap, this is a "just in case" -kubectl --kubeconfig "$KUBECONFIG" -n "${NAMESPACE}" delete pvc minio || true - -echo "Successfully removed Gitpod from ${NAMESPACE}" \ No newline at end of file diff --git a/.werft/util/werft.ts b/.werft/util/werft.ts deleted file mode 100644 index bd127d62b2..0000000000 --- a/.werft/util/werft.ts +++ /dev/null @@ -1,199 +0,0 @@ -import { Span, Tracer, trace, context, SpanStatusCode, SpanAttributes } from "@opentelemetry/api"; -import { exec } from "./shell"; - -let werft: Werft; - -export class FailedSliceError extends Error { - constructor(message: string) { - super(message); - this.name = "FailedSliceError"; - Object.setPrototypeOf(this, FailedSliceError.prototype); - } -} - -/** - * For backwards compatibility with existing code we expose a global Werft instance - */ -export function getGlobalWerftInstance() { - if (!werft) { - throw new Error("Trying to fetch global Werft instance but it hasn't been instantiated yet"); - } - return werft; -} - -/** - * Class for producing Werft compatible log output and generating traces - */ -export class Werft { - private tracer: Tracer; - public rootSpan: Span; - private sliceSpans: { [slice: string]: Span } = {}; - public currentPhaseSpan: Span; - private globalSpanAttributes: SpanAttributes = {}; - - constructor(job: string) { - if (werft) { - throw new Error("Only one Werft instance should be instantiated per job"); - } - this.tracer = trace.getTracer("default"); - this.rootSpan = this.tracer.startSpan(`job: ${job}`, { root: true, attributes: { "werft.job.name": job } }); - - // Expose this instance as part of getGlobalWerftInstance - werft = this; - } - - public phase(name, desc?: string) { - // When you start a new phase the previous phase is implicitly closed. - if (this.currentPhaseSpan) { - this.endPhase(); - } - - const rootSpanCtx = trace.setSpan(context.active(), this.rootSpan); - this.currentPhaseSpan = this.tracer.startSpan( - `phase: ${name}`, - { - attributes: { - "werft.phase.name": name, - "werft.phase.description": desc, - }, - }, - rootSpanCtx, - ); - this.currentPhaseSpan.setAttributes(this.globalSpanAttributes); - - console.log(`[${name}|PHASE] ${desc || name}`); - } - - public log(slice, msg) { - if (!this.sliceSpans[slice]) { - const parentSpanCtx = trace.setSpan(context.active(), this.currentPhaseSpan); - const sliceSpan = this.tracer.startSpan(`slice: ${slice}`, undefined, parentSpanCtx); - sliceSpan.setAttributes(this.globalSpanAttributes); - this.sliceSpans[slice] = sliceSpan; - } - console.log(`[${slice}] ${msg}`); - } - - public logOutput(slice, cmd) { - cmd.toString() - .split("\n") - .forEach((line: string) => this.log(slice, line)); - } - - /** - * Use this when you intend to fail the werft job - */ - public fail(slice: string, err: string | Error) { - const span = this.sliceSpans[slice]; - - if (span) { - span.end(); - } else { - console.log(`[${slice}] tracing warning: No slice span by name ${slice}`); - } - - // Set the status on the span for the slice and also propagate the status to the phase and root span - // as well so we can query on all phases that had an error regardless of which slice produced the error. - [span, this.rootSpan, this.currentPhaseSpan].forEach((span: Span) => { - if (!span) { - return; - } - span.setStatus({ - code: SpanStatusCode.ERROR, - message: err.toString(), - }); - }); - - // In case the error message is a multi-line string we want to ensure that we contain - // the error message within the slice (otherwise they'll be moved to the "default" slice of the phase) - err.toString() - .split("\n") - .forEach((line: string) => console.log(`[${slice}] ${line}`)); - - // The UI shows the last log of the slice which might not make a lot of sense - // for multi-line error messages, so instead we tell the user to expand the slice. - console.log(`[${slice}] Failed. Expand to see why`); - console.log(`[${slice}|FAIL]`); - throw new FailedSliceError(slice); - } - - /** - * Use this when you intend to fail a single slice, but not the entire Werft job. - */ - public failSlice(slice: string, error: Error) { - const span = this.sliceSpans[slice]; - if (span) { - span.setStatus({ - code: SpanStatusCode.ERROR, - message: error.message, - }); - span.end(); - delete this.sliceSpans[slice]; - } - console.log(`[${slice}|FAIL] ${error}`); - } - - public done(slice: string) { - const span = this.sliceSpans[slice]; - if (span) { - span.end(); - delete this.sliceSpans[slice]; - } - console.log(`[${slice}|DONE]`); - } - - public result(description: string, channel: string, value: string) { - exec(`werft log result -d "${description}" -c "${channel}" ${value}`); - } - - private endPhase() { - // End all open slices - Object.entries(this.sliceSpans).forEach((kv) => { - const [id, span] = kv; - span.end(); - delete this.sliceSpans[id]; - }); - // End the phase - this.currentPhaseSpan.end(); - } - - public endAllSpans() { - const traceID = this.rootSpan.spanContext().traceId; - const nowUnix = Math.round(new Date().getTime() / 1000); - // At the moment we're just looking for traces in a 30 minutes timerange with the specific traceID - // A smarter approach would be to get a start timestamp from tracing.Initialize() - exec( - `werft log result -d "Honeycomb trace" -c github-check-honeycomb-trace url "https://ui.honeycomb.io/gitpod/datasets/werft/trace?trace_id=${traceID}&trace_start_ts=${ - nowUnix - 1800 - }&trace_end_ts=${nowUnix + 5}"`, - ); - this.endPhase(); - this.rootSpan.end(); - } - - /** - * This allows you to set attributes on all open and future Werft spans. - * Any spans in phases that have already been closed won't get the attributes. - */ - public addAttributes(attributes: SpanAttributes): void { - // Add the attributes to the root span. - this.rootSpan.setAttributes(attributes); - - // Set the attribute on all spans for the current phase. - this.currentPhaseSpan.setAttributes(attributes); - Object.entries(this.sliceSpans).forEach((kv) => { - const [_, span] = kv; - span.setAttributes(attributes); - }); - - this.globalSpanAttributes = { ...this.globalSpanAttributes, ...attributes }; - } - - public getSpanForSlice(slice: string): Span { - const span = this.sliceSpans[slice]; - if (!span) { - throw new Error(`No open span for ${slice}`); - } - return span; - } -} diff --git a/.werft/vm/vm.ts b/.werft/vm/vm.ts deleted file mode 100644 index 90ffb4832d..0000000000 --- a/.werft/vm/vm.ts +++ /dev/null @@ -1,96 +0,0 @@ -import {GCLOUD_SERVICE_ACCOUNT_PATH, HARVESTER_KUBECONFIG_PATH, PREVIEW_K3S_KUBECONFIG_PATH} from "../jobs/build/const"; -import {exec, execStream} from "../util/shell"; -import {getGlobalWerftInstance} from "../util/werft"; - -/** - * Remove all VM resources - Namespace+VM+Proxy svc on Harvester, LB+SVC on DEV - */ -export async function destroyPreview(options: { name: string }) { - const werft = getGlobalWerftInstance(); - - try { - await execStream(`TF_VAR_preview_name=${options.name} \ - GOOGLE_APPLICATION_CREDENTIALS=${GCLOUD_SERVICE_ACCOUNT_PATH} \ - GOOGLE_BACKEND_CREDENTIALS=${GCLOUD_SERVICE_ACCOUNT_PATH} \ - leeway run dev/preview:delete-preview`, - {slice: "Deleting VM."}) - } catch (err) { - werft.currentPhaseSpan.setAttribute("preview.deleted_vm", false); - werft.fail("Deleting VM.", new Error(`Failed deleting VM: ${err}`)) - return; - } - - werft.currentPhaseSpan.setAttribute("preview.deleted_vm", true); -} - -/** - * Check if a VM with the given name already exists. - * @returns true if the VM already exists - */ -export function vmExists(options: { name: string }) { - const namespace = `preview-${options.name}`; - const status = exec(`kubectl --kubeconfig ${HARVESTER_KUBECONFIG_PATH} -n ${namespace} get svc proxy`, { - dontCheckRc: true, - silent: true, - }); - return status.code == 0; -} - -/** - * Wait until the VM Instance reaches the Running status. - * If the VM Instance doesn't reach Running before the timeoutMS it will throw an Error. - */ -export function waitForVMReadiness(options: { name: string; timeoutSeconds: number; slice: string }) { - const werft = getGlobalWerftInstance(); - const namespace = `preview-${options.name}`; - - const startTime = Date.now(); - const ready = exec( - `kubectl --kubeconfig ${HARVESTER_KUBECONFIG_PATH} -n ${namespace} wait --for=condition=ready --timeout=${options.timeoutSeconds}s pod -l kubevirt.io=virt-launcher -l harvesterhci.io/vmName=${options.name}`, - {dontCheckRc: true, silent: true}, - ); - - if (ready.code == 0) { - werft.log(options.slice, `VM is ready after ${(Date.now() - startTime) / 1000} seconds`); - return; - } - - werft.log( - options.slice, - `Timeout while waiting for VM to get ready. Timeout: ${options.timeoutSeconds}. Stderr: ${ready.stderr}. Stdout: ${ready.stdout}`, - ); - throw new Error("VM didn't reach 'Ready' status before the timeout."); -} - -/** - * Installs the preview environment's context - * If it doesn't manage to do so before the timeout it will throw an Error - */ -export async function installPreviewContext(options: { name: string; slice: string }) { - try { - await execStream( - `previewctl install-context --private-key-path=/workspace/.ssh/id_rsa_harvester_vm --gcp-service-account=${GCLOUD_SERVICE_ACCOUNT_PATH} --branch=${options.name} --timeout=10m`, - {slice: options.slice}, - ); - - exec(`mkdir -p $(dirname ${PREVIEW_K3S_KUBECONFIG_PATH})`) - - exec( - `kubectl --context=${options.name} config view --minify --flatten > ${PREVIEW_K3S_KUBECONFIG_PATH}`, - {dontCheckRc: true, slice: options.slice}, - ) - - return; - } catch (e) { - throw new Error( - `Wasn't able to copy out the kubeconfig before the timeout. `, - ); - } -} - -/** - * Terminates all running kubectl proxies - */ -export function stopKubectlPortForwards() { - exec(`sudo killall kubectl || true`); -} diff --git a/.werft/yarn.lock b/.werft/yarn.lock deleted file mode 100644 index dd71985c58..0000000000 --- a/.werft/yarn.lock +++ /dev/null @@ -1,1425 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@google-cloud/common@^3.0.0": - version "3.10.0" - resolved "https://registry.npmjs.org/@google-cloud/common/-/common-3.10.0.tgz" - integrity sha512-XMbJYMh/ZSaZnbnrrOFfR/oQrb0SxG4qh6hDisWCoEbFcBHV0qHQo4uXfeMCzolx2Mfkh6VDaOGg+hyJsmxrlw== - dependencies: - "@google-cloud/projectify" "^2.0.0" - "@google-cloud/promisify" "^2.0.0" - arrify "^2.0.1" - duplexify "^4.1.1" - ent "^2.2.0" - extend "^3.0.2" - google-auth-library "^7.14.0" - retry-request "^4.2.2" - teeny-request "^7.0.0" - -"@google-cloud/dns@^2.2.4": - version "2.2.4" - resolved "https://registry.npmjs.org/@google-cloud/dns/-/dns-2.2.4.tgz" - integrity sha512-IzTifG4AVhHCbr6IO9cZ0J7Vp/2YtWTz+GMzr+cK1h4IR9xGpvaP58DOugje1yIyLRvdqCG5B5jSVYjPMvf76A== - dependencies: - "@google-cloud/common" "^3.0.0" - "@google-cloud/paginator" "^3.0.0" - "@google-cloud/promisify" "^2.0.0" - arrify "^2.0.0" - dns-zonefile "0.2.10" - lodash.groupby "^4.6.0" - string-format-obj "^1.1.1" - -"@google-cloud/paginator@^3.0.0": - version "3.0.7" - resolved "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.7.tgz" - integrity sha512-jJNutk0arIQhmpUUQJPJErsojqo834KcyB6X7a1mxuic8i1tKXxde8E69IZxNZawRIlZdIK2QY4WALvlK5MzYQ== - dependencies: - arrify "^2.0.0" - extend "^3.0.2" - -"@google-cloud/projectify@^2.0.0": - version "2.1.1" - resolved "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-2.1.1.tgz" - integrity sha512-+rssMZHnlh0twl122gXY4/aCrk0G1acBqkHFfYddtsqpYXGxA29nj9V5V9SfC+GyOG00l650f6lG9KL+EpFEWQ== - -"@google-cloud/promisify@^2.0.0": - version "2.0.4" - resolved "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.4.tgz" - integrity sha512-j8yRSSqswWi1QqUGKVEKOG03Q7qOoZP6/h2zN2YO+F5h2+DHU0bSrHCK9Y7lo2DI9fBd8qGAw795sf+3Jva4yA== - -"@grpc/grpc-js@^1.3.7", "@grpc/grpc-js@^1.4.1": - version "1.4.1" - resolved "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.4.1.tgz" - integrity sha512-/chkA48TdAvATHA7RXJPeHQLdfFhpu51974s8htjO/XTDHA41j5+SkR5Io+lr9XsLmkZD6HxLyRAFGmA9wjO2w== - dependencies: - "@grpc/proto-loader" "^0.6.4" - "@types/node" ">=12.12.47" - -"@grpc/proto-loader@^0.6.4": - version "0.6.6" - resolved "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.6.tgz" - integrity sha512-cdMaPZ8AiFz6ua6PUbP+LKbhwJbFXnrQ/mlnKGUyzDUZ3wp7vPLksnmLCBX6SHgSmjX7CbNVNLFYD5GmmjO4GQ== - dependencies: - "@types/long" "^4.0.1" - lodash.camelcase "^4.3.0" - long "^4.0.0" - protobufjs "^6.10.0" - yargs "^16.1.1" - -"@opentelemetry/api-metrics@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.25.0.tgz" - integrity sha512-9T0c9NQAEGRujUC7HzPa2/qZ5px/UvB2sfSU5CAKFRrAlDl2gn25B0oUbDqSRHW/IG1X2rnQ3z2bBQkJyJvE4g== - -"@opentelemetry/api-metrics@0.26.0": - version "0.26.0" - resolved "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.26.0.tgz" - integrity sha512-idDSUTx+LRwJiHhVHhdh45SWow5u9lKNDROKu5AMzsIVPI29utH5FfT9vor8qMM6blxWWvlT22HUNdNMWqUQfQ== - -"@opentelemetry/api@^1.0.3": - version "1.0.3" - resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.3.tgz" - integrity sha512-puWxACExDe9nxbBB3lOymQFrLYml2dVOrd7USiVRnSbgXE+KwBu+HxFvxrzfqsiSda9IWsXJG1ef7C1O2/GmKQ== - -"@opentelemetry/auto-instrumentations-node@^0.26.0": - version "0.26.0" - resolved "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.26.0.tgz" - integrity sha512-QeTqQlq4lwe6brS4WO4Up7Td2I+gEDW/c10Ml7H2JfmrMH+9KExyCgWyfhDGQBkpovtEuo/08u/wehwZUEpxSg== - dependencies: - "@opentelemetry/instrumentation" "^0.26.0" - "@opentelemetry/instrumentation-dns" "^0.26.0" - "@opentelemetry/instrumentation-express" "^0.26.0" - "@opentelemetry/instrumentation-graphql" "^0.26.0" - "@opentelemetry/instrumentation-grpc" "^0.26.0" - "@opentelemetry/instrumentation-http" "^0.26.0" - "@opentelemetry/instrumentation-ioredis" "^0.26.0" - "@opentelemetry/instrumentation-koa" "^0.26.0" - "@opentelemetry/instrumentation-mongodb" "^0.26.0" - "@opentelemetry/instrumentation-mysql" "^0.26.0" - "@opentelemetry/instrumentation-pg" "^0.26.0" - "@opentelemetry/instrumentation-redis" "^0.26.0" - -"@opentelemetry/context-async-hooks@1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.0.0.tgz" - integrity sha512-MFK7dlwwhp4Qs47X5r9hAK3D8s1WYE2EX5uHs0QdEiMUrDSgDYugk0MjKG24WVjqyLj5cnTLuhUQoLAhm4FOJg== - -"@opentelemetry/core@0.24.0": - version "0.24.0" - resolved "https://registry.npmjs.org/@opentelemetry/core/-/core-0.24.0.tgz" - integrity sha512-KpsfxBbFTZT9zaB4Es/fFLbvSzVl9Io/8UUu/TYl4/HgqkmyVInNlWTgRiKyz9nsHzFpGP1kdZJj+YIut0IFsw== - dependencies: - "@opentelemetry/semantic-conventions" "0.24.0" - semver "^7.1.3" - -"@opentelemetry/core@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@opentelemetry/core/-/core-0.25.0.tgz" - integrity sha512-8OTWF4vfCENU112XB5ElLqf0eq/FhsY0SBvvY65vB3+fbZ2Oi+CPsRASrUZWGtC9MJ5rK2lBlY+/jI4a/NPPBg== - dependencies: - "@opentelemetry/semantic-conventions" "0.25.0" - semver "^7.3.5" - -"@opentelemetry/core@1.0.0", "@opentelemetry/core@^1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.0.tgz" - integrity sha512-1+qvKilADnSFW4PiXy+f7D22pvfGVxepZ69GcbF8cTcbQTUt7w63xEBWn5f5j92x9I3c0sqbW1RUx5/a4wgzxA== - dependencies: - "@opentelemetry/semantic-conventions" "1.0.0" - semver "^7.3.5" - -"@opentelemetry/exporter-collector-grpc@^0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@opentelemetry/exporter-collector-grpc/-/exporter-collector-grpc-0.25.0.tgz" - integrity sha512-Mqkdh89pC1NxX5BngxHmDqMQ6WVCFuMr1PvwRZmJBBR2MXaStO5qIxELHuHgkDZEXpIFJbqNC7JAfDklXm8o1w== - dependencies: - "@grpc/grpc-js" "^1.3.7" - "@grpc/proto-loader" "^0.6.4" - "@opentelemetry/core" "0.25.0" - "@opentelemetry/exporter-collector" "0.25.0" - "@opentelemetry/resources" "0.25.0" - "@opentelemetry/sdk-metrics-base" "0.25.0" - "@opentelemetry/sdk-trace-base" "0.25.0" - -"@opentelemetry/exporter-collector@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@opentelemetry/exporter-collector/-/exporter-collector-0.25.0.tgz" - integrity sha512-xZYstLt4hz1aTloJaepWdjMMf9305MqwqbUWjcU/X9pOxvgFWRlchO6x/HQTw7ow0i/S+ShzC+greKnb+1WvLA== - dependencies: - "@opentelemetry/api-metrics" "0.25.0" - "@opentelemetry/core" "0.25.0" - "@opentelemetry/resources" "0.25.0" - "@opentelemetry/sdk-metrics-base" "0.25.0" - "@opentelemetry/sdk-trace-base" "0.25.0" - -"@opentelemetry/instrumentation-dns@^0.26.0": - version "0.26.0" - resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.26.0.tgz" - integrity sha512-5vGxDiivMIsl74rHMPOtQb+5aYvXcscDXV7Ny8bkGINN7Bb4i4mgr9lugyZK9ihnK7oQjC7VhPWmqyQbRBQ7+Q== - dependencies: - "@opentelemetry/instrumentation" "^0.26.0" - "@opentelemetry/semantic-conventions" "^1.0.0" - semver "^7.3.2" - -"@opentelemetry/instrumentation-express@^0.26.0": - version "0.26.0" - resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.26.0.tgz" - integrity sha512-1mFJQd7TTLZstnZZGY4vceGxhj5ylzNbiYZWGQN7bzMpU56s5wZk/WlIR+6hjsgtMDhy6/SLEy67duqy1sR7ng== - dependencies: - "@opentelemetry/core" "^1.0.0" - "@opentelemetry/instrumentation" "^0.26.0" - "@opentelemetry/semantic-conventions" "^1.0.0" - "@types/express" "4.17.13" - -"@opentelemetry/instrumentation-graphql@^0.26.0": - version "0.26.0" - resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.26.0.tgz" - integrity sha512-dF8gccpOtDlMQ+IbuzfJE/DB3+sZ45A1oA8gYUpZ1eHZnKf4FvGGpRMchrRp1sLr9VdX49EYn7azQBZGTwZCCQ== - dependencies: - "@opentelemetry/instrumentation" "^0.26.0" - "@types/graphql" "14.5.0" - -"@opentelemetry/instrumentation-grpc@^0.26.0": - version "0.26.0" - resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.26.0.tgz" - integrity sha512-D4lVZMGSPdcjMFhecuVnwG6/zrfyv65uwpU72FD8D6I+BhLYQoGQefmFefcpeCWKb5998nRUhf+WqG1ObbJPwQ== - dependencies: - "@opentelemetry/api-metrics" "0.26.0" - "@opentelemetry/instrumentation" "0.26.0" - "@opentelemetry/semantic-conventions" "1.0.0" - -"@opentelemetry/instrumentation-http@^0.26.0": - version "0.26.0" - resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.26.0.tgz" - integrity sha512-Gys7iYuvwiBLkygPFak45i99SJWllft1pWt0NLqCRis5xDEs7ROVjEX+vr2tRZN7k9RkATykCtjsxHsHlrln1w== - dependencies: - "@opentelemetry/core" "1.0.0" - "@opentelemetry/instrumentation" "0.26.0" - "@opentelemetry/semantic-conventions" "1.0.0" - semver "^7.3.5" - -"@opentelemetry/instrumentation-ioredis@^0.26.0": - version "0.26.0" - resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.26.0.tgz" - integrity sha512-EONN2KE03nk9J/M+FJg9err120vW1c1b5jNx59M6+638Q2KVuLuhIb/CCpA+RMOqaL1PtF91iNxtZ9x5+kan5w== - dependencies: - "@opentelemetry/instrumentation" "^0.26.0" - "@opentelemetry/semantic-conventions" "^1.0.0" - "@types/ioredis" "4.26.6" - -"@opentelemetry/instrumentation-koa@^0.26.0": - version "0.26.0" - resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.26.0.tgz" - integrity sha512-Bnpd2PNDSW8HCVFiqCO1/UVH9DwN/asbTXlGEV6BYC7Fp9sqh2FtBnDaI8QQ/dDS3tfIsy3JezhUkqMcZ3dO1A== - dependencies: - "@opentelemetry/core" "^1.0.0" - "@opentelemetry/instrumentation" "^0.26.0" - "@opentelemetry/semantic-conventions" "^1.0.0" - "@types/koa" "2.13.4" - "@types/koa__router" "8.0.7" - -"@opentelemetry/instrumentation-mongodb@^0.26.0": - version "0.26.0" - resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.26.0.tgz" - integrity sha512-b7VM2jKSLuX6pkBlR4f1/bzQnU/9Hgh1dnMRqyZiQ2D/DpOq5XXgSH5xoshcqG1IhhAnyItY7Ccgeh1e4Z01Mw== - dependencies: - "@opentelemetry/instrumentation" "^0.26.0" - "@opentelemetry/semantic-conventions" "^1.0.0" - "@types/mongodb" "3.6.20" - -"@opentelemetry/instrumentation-mysql@^0.26.0": - version "0.26.0" - resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.26.0.tgz" - integrity sha512-Tsf54ETBxdXIbIY1LkUovmiQOg00YoW/+bN/+IkojlSf7926ktIg/Bi5p/cyOkJp5gbkL7q2RvHZxugw2F8Gkw== - dependencies: - "@opentelemetry/instrumentation" "^0.26.0" - "@opentelemetry/semantic-conventions" "^1.0.0" - "@types/mysql" "2.15.19" - -"@opentelemetry/instrumentation-pg@^0.26.0": - version "0.26.0" - resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.26.0.tgz" - integrity sha512-lOu4d3sfQswNqZKH9PzbHMsd6WQWShkxkoskodKC3jligNEOpsp/utpyU6iHfpnk2CAZymugJo6Nyv8I0+Iiig== - dependencies: - "@opentelemetry/instrumentation" "^0.26.0" - "@opentelemetry/semantic-conventions" "^1.0.0" - "@types/pg" "8.6.1" - "@types/pg-pool" "2.0.3" - -"@opentelemetry/instrumentation-redis@^0.26.0": - version "0.26.0" - resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.26.0.tgz" - integrity sha512-g1g2rgGQSrGGXCqYV5CVAQ/ue+RwunQO91wNpXWoY7WKI8muoOlBV3L7J2ZtCgZmBiyb8ciNyjUkbBkQR/wxPg== - dependencies: - "@opentelemetry/instrumentation" "^0.26.0" - "@opentelemetry/semantic-conventions" "^1.0.0" - "@types/redis" "2.8.31" - -"@opentelemetry/instrumentation@0.26.0", "@opentelemetry/instrumentation@^0.26.0": - version "0.26.0" - resolved "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.26.0.tgz" - integrity sha512-KpQfLnHjMnxqMXgEcRYAQ65/3oAl+Q2kHTFYzobjme/zH5n/iOPF94oGqCAr1NLbm2oX2Q6wXiQP/snSVcbJlw== - dependencies: - "@opentelemetry/api-metrics" "0.26.0" - require-in-the-middle "^5.0.3" - semver "^7.3.2" - shimmer "^1.2.1" - -"@opentelemetry/propagator-b3@1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.0.0.tgz" - integrity sha512-KKHUltvvlcxUTyWPPhXi6J7ipUy+bj3zQ8psfhEsdhYM568RimmS5IcZNJMNVCMiuWOdamn5hRBmCNLmn+rFxg== - dependencies: - "@opentelemetry/core" "1.0.0" - -"@opentelemetry/propagator-jaeger@1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.0.0.tgz" - integrity sha512-PTcImfFxTjO1iteV5zgpqvvbSET0nQiYe9BAsWMSk/PPWOvT2acFur/3TjvE6+RIOh1sSTmdQhW6I3Vk0WlzmA== - dependencies: - "@opentelemetry/core" "1.0.0" - -"@opentelemetry/resource-detector-aws@0.24.0": - version "0.24.0" - resolved "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-0.24.0.tgz" - integrity sha512-vaJ6pi9gLVwOmj3mwe6VvbkNXSKc0Oadkjk9tC/Pp0m7QA3PYCcle13byeA6Qqr9YD5b6F7kaU8FXMVZ6FVqjQ== - dependencies: - "@opentelemetry/core" "0.24.0" - "@opentelemetry/resources" "0.24.0" - "@opentelemetry/semantic-conventions" "0.24.0" - -"@opentelemetry/resource-detector-gcp@0.24.0": - version "0.24.0" - resolved "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.24.0.tgz" - integrity sha512-4Js1sybUdrV3gN311XMUYlD2SvOx60YC69RUwz+QXTysma1mgPTMwFJcEwQJzyJEVuzqh+fXxE2QipucFwDI1g== - dependencies: - "@opentelemetry/resources" "0.24.0" - "@opentelemetry/semantic-conventions" "0.24.0" - gcp-metadata "^4.1.4" - semver "7.3.5" - -"@opentelemetry/resources@0.24.0": - version "0.24.0" - resolved "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.24.0.tgz" - integrity sha512-uEr2m13IRkjQAjX6fsYqJ21aONCspRvuQunaCl8LbH1NS1Gj82TuRUHF6TM82ulBPK8pU+nrrqXKuky2cMcIzw== - dependencies: - "@opentelemetry/core" "0.24.0" - "@opentelemetry/semantic-conventions" "0.24.0" - -"@opentelemetry/resources@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.25.0.tgz" - integrity sha512-O46u53vDBlxCML8O9dIjsRcCC2VT5ri1upwhp02ITobgJ16aVD/iScCo1lPl/x2E7yq9uwzMINENiiYZRFb6XA== - dependencies: - "@opentelemetry/core" "0.25.0" - "@opentelemetry/semantic-conventions" "0.25.0" - -"@opentelemetry/resources@1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.0.tgz" - integrity sha512-ORP8F2LLcJEm5M3H24RmdlMdiDc70ySPushpkrAW34KZGdZXwkrFoFXZhhs5MUxPT+fLrTuBafXxZVr8eHtFuQ== - dependencies: - "@opentelemetry/core" "1.0.0" - "@opentelemetry/semantic-conventions" "1.0.0" - -"@opentelemetry/sdk-metrics-base@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.25.0.tgz" - integrity sha512-7fwPlAFB5Xw8mnVQfq0wqKNw3RXiAMad9T1bk5Sza9LK/L6hz8RTuHWCsFMsj+1OOSAaiPFuUMYrK1J75+2IAg== - dependencies: - "@opentelemetry/api-metrics" "0.25.0" - "@opentelemetry/core" "0.25.0" - "@opentelemetry/resources" "0.25.0" - lodash.merge "^4.6.2" - -"@opentelemetry/sdk-metrics-base@0.26.0": - version "0.26.0" - resolved "https://registry.npmjs.org/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.26.0.tgz" - integrity sha512-PbJsso7Vy/CLATAOyXbt/VP7ZQ2QYnvlq28lhOWaLPw8aqLogMBvidNGRrt7rF4/hfzLT6pMgpAAcit2C/nUMA== - dependencies: - "@opentelemetry/api-metrics" "0.26.0" - "@opentelemetry/core" "1.0.0" - "@opentelemetry/resources" "1.0.0" - lodash.merge "^4.6.2" - -"@opentelemetry/sdk-node@^0.26.0": - version "0.26.0" - resolved "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.26.0.tgz" - integrity sha512-YzIvT1kvidiPl+fBLIJdNjz1Fxj0YfGKbJUjRm1Zk1tKaxH6vRh0TRQo+HUj9skQXyguew6zdHIprNhhoik4/w== - dependencies: - "@opentelemetry/api-metrics" "0.26.0" - "@opentelemetry/core" "1.0.0" - "@opentelemetry/instrumentation" "0.26.0" - "@opentelemetry/resource-detector-aws" "0.24.0" - "@opentelemetry/resource-detector-gcp" "0.24.0" - "@opentelemetry/resources" "1.0.0" - "@opentelemetry/sdk-metrics-base" "0.26.0" - "@opentelemetry/sdk-trace-base" "1.0.0" - "@opentelemetry/sdk-trace-node" "1.0.0" - -"@opentelemetry/sdk-trace-base@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-0.25.0.tgz" - integrity sha512-TInkLSF/ThM3GNVM+9tgnCVjyNLnRxvAkG585Fhu0HNwaEtCTUwI0r7AvMRIREOreeRWttBG6kvT0LOKdo8yjw== - dependencies: - "@opentelemetry/core" "0.25.0" - "@opentelemetry/resources" "0.25.0" - "@opentelemetry/semantic-conventions" "0.25.0" - lodash.merge "^4.6.2" - -"@opentelemetry/sdk-trace-base@1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.0.tgz" - integrity sha512-/rXoyQlDlJTJ4SOVAbP0Gpj89B8oZ2hJApYG2Dq5klkgFAtDifN8271TIzwtM8/ET8HUhgx9eyoUJi42LhIesg== - dependencies: - "@opentelemetry/core" "1.0.0" - "@opentelemetry/resources" "1.0.0" - "@opentelemetry/semantic-conventions" "1.0.0" - lodash.merge "^4.6.2" - -"@opentelemetry/sdk-trace-node@1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.0.0.tgz" - integrity sha512-sMjdR26rXtWPPOYnvNkjYzOMVZ/xZUSP4E6VGWh6jEO4a0t81a6jmybc/iCq9071F/JRuKXiOyUejKY6sIRGYA== - dependencies: - "@opentelemetry/context-async-hooks" "1.0.0" - "@opentelemetry/core" "1.0.0" - "@opentelemetry/propagator-b3" "1.0.0" - "@opentelemetry/propagator-jaeger" "1.0.0" - "@opentelemetry/sdk-trace-base" "1.0.0" - semver "^7.3.5" - -"@opentelemetry/semantic-conventions@0.24.0": - version "0.24.0" - resolved "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.24.0.tgz" - integrity sha512-a/szuMQV0Quy0/M7kKdglcbRSoorleyyOwbTNNJ32O+RBN766wbQlMTvdimImTmwYWGr+NJOni1EcC242WlRcA== - -"@opentelemetry/semantic-conventions@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.25.0.tgz" - integrity sha512-V3N+MDBiv0TUlorbgiSqk6CvcP876CYUk/41Tg6s8OIyvniTwprE6vPvFQayuABiVkGlHOxv1Mlvp0w4qNdnVg== - -"@opentelemetry/semantic-conventions@1.0.0", "@opentelemetry/semantic-conventions@^1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.0.tgz" - integrity sha512-XCZ6ZSmc8FOspxKUU+Ow9UtJeSSRcS5rFBYGpjzix02U2v+X9ofjOjgNRnpvxlSvkccYIhdTuwcvNskmZ46SeA== - -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz" - integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz" - integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz" - integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= - dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz" - integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= - -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz" - integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= - -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz" - integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= - -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz" - integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" - integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= - -"@tootallnate/once@2": - version "2.0.0" - resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz" - integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== - -"@types/accepts@*": - version "1.3.5" - resolved "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz" - integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== - dependencies: - "@types/node" "*" - -"@types/body-parser@*": - version "1.19.1" - resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz" - integrity sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/bson@*": - version "4.2.0" - resolved "https://registry.npmjs.org/@types/bson/-/bson-4.2.0.tgz" - integrity sha512-ELCPqAdroMdcuxqwMgUpifQyRoTpyYCNr1V9xKyF40VsBobsj+BbWNRvwGchMgBPGqkw655ypkjj2MEF5ywVwg== - dependencies: - bson "*" - -"@types/connect@*": - version "3.4.35" - resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== - dependencies: - "@types/node" "*" - -"@types/content-disposition@*": - version "0.5.4" - resolved "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.4.tgz" - integrity sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ== - -"@types/cookies@*": - version "0.7.7" - resolved "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.7.tgz" - integrity sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA== - dependencies: - "@types/connect" "*" - "@types/express" "*" - "@types/keygrip" "*" - "@types/node" "*" - -"@types/express-serve-static-core@^4.17.18": - version "4.17.24" - resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz" - integrity sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - -"@types/express@*", "@types/express@4.17.13": - version "4.17.13" - resolved "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz" - integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.18" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/glob@*": - version "7.1.4" - resolved "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz" - integrity sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/graphql@14.5.0": - version "14.5.0" - resolved "https://registry.npmjs.org/@types/graphql/-/graphql-14.5.0.tgz" - integrity sha512-MOkzsEp1Jk5bXuAsHsUi6BVv0zCO+7/2PTiZMXWDSsMXvNU6w/PLMQT2vHn8hy2i0JqojPz1Sz6rsFjHtsU0lA== - dependencies: - graphql "*" - -"@types/http-assert@*": - version "1.5.3" - resolved "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.3.tgz" - integrity sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA== - -"@types/http-errors@*": - version "1.8.1" - resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.1.tgz" - integrity sha512-e+2rjEwK6KDaNOm5Aa9wNGgyS9oSZU/4pfSMMPYNOfjvFI0WVXm29+ITRFr6aKDvvKo7uU1jV68MW4ScsfDi7Q== - -"@types/ioredis@4.26.6": - version "4.26.6" - resolved "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.26.6.tgz" - integrity sha512-Q9ydXL/5Mot751i7WLCm9OGTj5jlW3XBdkdEW21SkXZ8Y03srbkluFGbM3q8c+vzPW30JOLJ+NsZWHoly0+13A== - dependencies: - "@types/node" "*" - -"@types/keygrip@*": - version "1.0.2" - resolved "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz" - integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== - -"@types/koa-compose@*": - version "3.2.5" - resolved "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz" - integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ== - dependencies: - "@types/koa" "*" - -"@types/koa@*", "@types/koa@2.13.4": - version "2.13.4" - resolved "https://registry.npmjs.org/@types/koa/-/koa-2.13.4.tgz" - integrity sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw== - dependencies: - "@types/accepts" "*" - "@types/content-disposition" "*" - "@types/cookies" "*" - "@types/http-assert" "*" - "@types/http-errors" "*" - "@types/keygrip" "*" - "@types/koa-compose" "*" - "@types/node" "*" - -"@types/koa__router@8.0.7": - version "8.0.7" - resolved "https://registry.npmjs.org/@types/koa__router/-/koa__router-8.0.7.tgz" - integrity sha512-OB3Ax75nmTP+WR9AgdzA42DI7YmBtiNKN2g1Wxl+d5Dyek9SWt740t+ukwXSmv/jMBCUPyV3YEI93vZHgdP7UQ== - dependencies: - "@types/koa" "*" - -"@types/long@^4.0.1": - version "4.0.1" - resolved "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz" - integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== - -"@types/mime@^1": - version "1.3.2" - resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== - -"@types/minimatch@*": - version "3.0.5" - resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz" - integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== - -"@types/mongodb@3.6.20": - version "3.6.20" - resolved "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz" - integrity sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ== - dependencies: - "@types/bson" "*" - "@types/node" "*" - -"@types/mysql@2.15.19": - version "2.15.19" - resolved "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.19.tgz" - integrity sha512-wSRg2QZv14CWcZXkgdvHbbV2ACufNy5EgI8mBBxnJIptchv7DBy/h53VMa2jDhyo0C9MO4iowE6z9vF8Ja1DkQ== - dependencies: - "@types/node" "*" - -"@types/node@*", "@types/node@>=12.12.47", "@types/node@>=13.7.0", "@types/node@^16.11.0": - version "16.11.6" - resolved "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz" - integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== - -"@types/pg-pool@2.0.3": - version "2.0.3" - resolved "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.3.tgz" - integrity sha512-fwK5WtG42Yb5RxAwxm3Cc2dJ39FlgcaNiXKvtTLAwtCn642X7dgel+w1+cLWwpSOFImR3YjsZtbkfjxbHtFAeg== - dependencies: - "@types/pg" "*" - -"@types/pg@*", "@types/pg@8.6.1": - version "8.6.1" - resolved "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz" - integrity sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w== - dependencies: - "@types/node" "*" - pg-protocol "*" - pg-types "^2.2.0" - -"@types/qs@*": - version "6.9.7" - resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== - -"@types/range-parser@*": - version "1.2.4" - resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== - -"@types/redis@2.8.31": - version "2.8.31" - resolved "https://registry.npmjs.org/@types/redis/-/redis-2.8.31.tgz" - integrity sha512-daWrrTDYaa5iSDFbgzZ9gOOzyp2AJmYK59OlG/2KGBgYWF3lfs8GDKm1c//tik5Uc93hDD36O+qLPvzDolChbA== - dependencies: - "@types/node" "*" - -"@types/semver@7.3.5": - version "7.3.5" - resolved "https://registry.npmjs.org/@types/semver/-/semver-7.3.5.tgz" - integrity sha512-iotVxtCCsPLRAvxMFFgxL8HD2l4mAZ2Oin7/VJ2ooWO0VOK4EGOGmZWZn1uCq7RofR3I/1IOSjCHlFT71eVK0Q== - -"@types/serve-static@*": - version "1.13.10" - resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz" - integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/shelljs@^0.8.8": - version "0.8.9" - resolved "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.9.tgz" - integrity sha512-flVe1dvlrCyQJN/SGrnBxqHG+RzXrVKsmjD8WS/qYHpq5UPjfq7UWFBENP0ZuOl0g6OpAlL6iBoLSvKYUUmyQw== - dependencies: - "@types/glob" "*" - "@types/node" "*" - -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - -agent-base@6: - version "6.0.2" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.0.0: - 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" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -arrify@^2.0.0, arrify@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz" - integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.3.0, base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bignumber.js@^9.0.0: - version "9.0.1" - resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz" - integrity sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA== - -brace-expansion@^1.1.7: - 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" - -bson@*: - version "4.5.3" - resolved "https://registry.npmjs.org/bson/-/bson-4.5.3.tgz" - integrity sha512-qVX7LX79Mtj7B3NPLzCfBiCP6RAsjiV8N63DjlaVVpZW+PFoDTxQ4SeDbSpcqgE6mXksM5CAwZnXxxxn/XwC0g== - dependencies: - buffer "^5.6.0" - -buffer-equal-constant-time@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" - integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^5.6.0: - version "5.7.1" - resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -color-convert@^2.0.1: - 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" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -debug@4, debug@^4.1.1: - version "4.3.2" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dns-zonefile@0.2.10: - version "0.2.10" - resolved "https://registry.npmjs.org/dns-zonefile/-/dns-zonefile-0.2.10.tgz" - integrity sha512-YXs0T8EjhwI3YFpL4l7n9Uy+g/ufmd3WyDSQsI4mrMNlrrdgK6aN0AbNjOkKoHyF59l/x4Y3/z64F3aJWCKWpg== - -duplexify@^4.1.1: - version "4.1.2" - resolved "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz" - integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw== - dependencies: - end-of-stream "^1.4.1" - inherits "^2.0.3" - readable-stream "^3.1.1" - stream-shift "^1.0.0" - -ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: - version "1.0.11" - resolved "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz" - integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== - dependencies: - safe-buffer "^5.0.1" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -end-of-stream@^1.4.1: - 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" - -ent@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz" - integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - -extend@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -fast-text-encoding@^1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz" - integrity sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -gaxios@^4.0.0: - version "4.3.2" - resolved "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz" - integrity sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q== - dependencies: - abort-controller "^3.0.0" - extend "^3.0.2" - https-proxy-agent "^5.0.0" - is-stream "^2.0.0" - node-fetch "^2.6.1" - -gcp-metadata@^4.1.4, gcp-metadata@^4.2.0: - version "4.3.1" - resolved "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz" - integrity sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A== - dependencies: - gaxios "^4.0.0" - json-bigint "^1.0.0" - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -glob@^7.0.0: - version "7.1.7" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -google-auth-library@^7.14.0: - version "7.14.1" - resolved "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.14.1.tgz" - integrity sha512-5Rk7iLNDFhFeBYc3s8l1CqzbEBcdhwR193RlD4vSNFajIcINKI8W8P0JLmBpwymHqqWbX34pJDQu39cSy/6RsA== - dependencies: - arrify "^2.0.0" - base64-js "^1.3.0" - ecdsa-sig-formatter "^1.0.11" - fast-text-encoding "^1.0.0" - gaxios "^4.0.0" - gcp-metadata "^4.2.0" - gtoken "^5.0.4" - jws "^4.0.0" - lru-cache "^6.0.0" - -google-p12-pem@^3.1.3: - version "3.1.3" - resolved "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.3.tgz" - integrity sha512-MC0jISvzymxePDVembypNefkAQp+DRP7dBE+zNUPaIjEspIlYg0++OrsNr248V9tPbz6iqtZ7rX1hxWA5B8qBQ== - dependencies: - node-forge "^1.0.0" - -graphql@*: - version "15.6.1" - resolved "https://registry.npmjs.org/graphql/-/graphql-15.6.1.tgz" - integrity sha512-3i5lu0z6dRvJ48QP9kFxBkJ7h4Kso7PS8eahyTFz5Jm6CvQfLtNIE8LX9N6JLnXTuwR+sIYnXzaWp6anOg0QQw== - -gtoken@^5.0.4: - version "5.3.2" - resolved "https://registry.npmjs.org/gtoken/-/gtoken-5.3.2.tgz" - integrity sha512-gkvEKREW7dXWF8NV8pVrKfW7WqReAmjjkMBh6lNCCGOM4ucS0r0YyXXl0r/9Yj8wcW/32ISkfc8h5mPTDbtifQ== - dependencies: - gaxios "^4.0.0" - google-p12-pem "^3.1.3" - jws "^4.0.0" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -http-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz" - integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== - dependencies: - "@tootallnate/once" "2" - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -is-core-module@^2.2.0: - version "2.4.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz" - integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== - dependencies: - has "^1.0.3" - -is-fullwidth-code-point@^3.0.0: - 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== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -json-bigint@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz" - integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== - dependencies: - bignumber.js "^9.0.0" - -jwa@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz" - integrity sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA== - dependencies: - buffer-equal-constant-time "1.0.1" - ecdsa-sig-formatter "1.0.11" - safe-buffer "^5.0.1" - -jws@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz" - integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg== - dependencies: - jwa "^2.0.0" - safe-buffer "^5.0.1" - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" - integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= - -lodash.groupby@^4.6.0: - version "4.6.0" - resolved "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz" - integrity sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E= - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -long@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - -lru-cache@^6.0.0: - 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" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -module-details-from-path@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz" - integrity sha1-EUyUlnPiqKNenTV4hSeqN7Z52is= - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -node-fetch@^2.6.1: - version "2.6.5" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz" - integrity sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ== - dependencies: - whatwg-url "^5.0.0" - -node-forge@^1.0.0: - version "1.3.1" - resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== - -once@^1.3.0, once@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-parse@^1.0.6: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -pg-int8@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz" - integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== - -pg-protocol@*: - version "1.5.0" - resolved "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz" - integrity sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ== - -pg-types@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz" - integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== - dependencies: - pg-int8 "1.0.1" - postgres-array "~2.0.0" - postgres-bytea "~1.0.0" - postgres-date "~1.0.4" - postgres-interval "^1.1.0" - -postgres-array@~2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz" - integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== - -postgres-bytea@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz" - integrity sha1-AntTPAqokOJtFy1Hz5zOzFIazTU= - -postgres-date@~1.0.4: - version "1.0.7" - resolved "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz" - integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== - -postgres-interval@^1.1.0: - version "1.2.0" - resolved "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz" - integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== - dependencies: - xtend "^4.0.0" - -prettier@2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" - integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== - -protobufjs@^6.10.0: - version "6.11.2" - resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz" - integrity sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw== - 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/long" "^4.0.1" - "@types/node" ">=13.7.0" - long "^4.0.0" - -readable-stream@^3.1.1: - version "3.6.0" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" - integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= - dependencies: - resolve "^1.1.6" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-in-the-middle@^5.0.3: - version "5.1.0" - resolved "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz" - integrity sha512-M2rLKVupQfJ5lf9OvqFGIT+9iVLnTmjgbOmpil12hiSQNn5zJTKGPoIisETNjfK+09vP3rpm1zJajmErpr2sEQ== - dependencies: - debug "^4.1.1" - module-details-from-path "^1.0.3" - resolve "^1.12.0" - -resolve@^1.1.6, resolve@^1.12.0: - version "1.20.0" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -retry-request@^4.2.2: - version "4.2.2" - resolved "https://registry.npmjs.org/retry-request/-/retry-request-4.2.2.tgz" - integrity sha512-xA93uxUD/rogV7BV59agW/JHPGXeREMWiZc9jhcwY4YdZ7QOtC7qbomYg0n4wyk2lJhggjvKvhNX8wln/Aldhg== - dependencies: - debug "^4.1.1" - extend "^3.0.2" - -safe-buffer@^5.0.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -semver@7.3.5, semver@^7.1.3, semver@^7.3.2, semver@^7.3.5: - version "7.3.5" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -shelljs@^0.8.4: - version "0.8.4" - resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz" - integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -shimmer@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz" - integrity sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw== - -source-map-support@^0.5.17: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -stream-events@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz" - integrity sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg== - dependencies: - stubs "^3.0.0" - -stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== - -string-format-obj@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string-format-obj/-/string-format-obj-1.1.1.tgz" - integrity sha512-Mm+sROy+pHJmx0P/0Bs1uxIX6UhGJGj6xDGQZ5zh9v/SZRmLGevp+p0VJxV7lirrkAmQ2mvva/gHKpnF/pTb+Q== - -string-width@^4.1.0, string-width@^4.2.0: - 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" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - 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" - -stubs@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz" - integrity sha1-6NK6H6nJBXAwPAMLaQD31fiavls= - -teeny-request@^7.0.0: - version "7.2.0" - resolved "https://registry.npmjs.org/teeny-request/-/teeny-request-7.2.0.tgz" - integrity sha512-SyY0pek1zWsi0LRVAALem+avzMLc33MKW/JLLakdP4s9+D7+jHcy5x6P+h94g2QNZsAqQNfX5lsbd3WSeJXrrw== - dependencies: - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" - node-fetch "^2.6.1" - stream-events "^1.0.5" - uuid "^8.0.0" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= - -ts-node@^9.0.0: - version "9.1.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" - integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== - dependencies: - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - source-map-support "^0.5.17" - yn "3.1.1" - -tslib@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz" - integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== - -typescript@~4.4.2: - version "4.4.4" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz" - integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== - -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -uuid@^8.0.0: - version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -wrap-ansi@^7.0.0: - 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" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -xtend@^4.0.0: - version "4.0.2" - resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs@^16.1.1: - version "16.2.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== diff --git a/dev/preview/workflow/preview/deploy-gitpod.sh b/dev/preview/workflow/preview/deploy-gitpod.sh index bf3a073a0b..9ca87157f9 100755 --- a/dev/preview/workflow/preview/deploy-gitpod.sh +++ b/dev/preview/workflow/preview/deploy-gitpod.sh @@ -132,7 +132,7 @@ EOF } function installRookCeph { - diff-apply "${PREVIEW_K3S_KUBE_CONTEXT}" "$ROOT/.werft/vm/manifests/rook-ceph/crds.yaml" + diff-apply "${PREVIEW_K3S_KUBE_CONTEXT}" "$SCRIPT_PATH/../vm/manifests/rook-ceph/crds.yaml" kubectl \ --kubeconfig "${PREVIEW_K3S_KUBE_PATH}" \ @@ -140,7 +140,7 @@ function installRookCeph { wait --for condition=established --timeout=120s crd/cephclusters.ceph.rook.io for file in common operator cluster-test storageclass-test snapshotclass;do - diff-apply "${PREVIEW_K3S_KUBE_CONTEXT}" "$ROOT/.werft/vm/manifests/rook-ceph/$file.yaml" + diff-apply "${PREVIEW_K3S_KUBE_CONTEXT}" "$SCRIPT_PATH/../vm/manifests/rook-ceph/$file.yaml" done } @@ -175,7 +175,7 @@ function installFluentBit { helm3 \ --kubeconfig "${PREVIEW_K3S_KUBE_PATH}" \ --kube-context "${PREVIEW_K3S_KUBE_CONTEXT}" \ - upgrade --install fluent-bit fluent/fluent-bit --version 0.21.6 -n "${PREVIEW_NAMESPACE}" -f "$ROOT/.werft/vm/charts/fluentbit/values.yaml" + upgrade --install fluent-bit fluent/fluent-bit --version 0.21.6 -n "${PREVIEW_NAMESPACE}" -f "$SCRIPT_PATH/../vm/charts/fluentbit/values.yaml" } # ==================================== @@ -553,7 +553,7 @@ done # Run post-process script # -WITH_VM=true "$ROOT/.werft/jobs/build/installer/post-process.sh" "${PREVIEW_NAME}" "${GITPOD_AGENT_SMITH_TOKEN}" +WITH_VM=true "$SCRIPT_PATH/post-process.sh" "${PREVIEW_NAME}" "${GITPOD_AGENT_SMITH_TOKEN}" # # Cleanup from post-processing diff --git a/.werft/jobs/build/installer/post-process.sh b/dev/preview/workflow/preview/post-process.sh similarity index 100% rename from .werft/jobs/build/installer/post-process.sh rename to dev/preview/workflow/preview/post-process.sh diff --git a/.werft/vm/charts/fluentbit/values.yaml b/dev/preview/workflow/vm/charts/fluentbit/values.yaml similarity index 100% rename from .werft/vm/charts/fluentbit/values.yaml rename to dev/preview/workflow/vm/charts/fluentbit/values.yaml diff --git a/.werft/vm/manifests/rook-ceph/cluster-test.yaml b/dev/preview/workflow/vm/manifests/rook-ceph/cluster-test.yaml similarity index 100% rename from .werft/vm/manifests/rook-ceph/cluster-test.yaml rename to dev/preview/workflow/vm/manifests/rook-ceph/cluster-test.yaml diff --git a/.werft/vm/manifests/rook-ceph/common.yaml b/dev/preview/workflow/vm/manifests/rook-ceph/common.yaml similarity index 100% rename from .werft/vm/manifests/rook-ceph/common.yaml rename to dev/preview/workflow/vm/manifests/rook-ceph/common.yaml diff --git a/.werft/vm/manifests/rook-ceph/crds.yaml b/dev/preview/workflow/vm/manifests/rook-ceph/crds.yaml similarity index 100% rename from .werft/vm/manifests/rook-ceph/crds.yaml rename to dev/preview/workflow/vm/manifests/rook-ceph/crds.yaml diff --git a/.werft/vm/manifests/rook-ceph/operator.yaml b/dev/preview/workflow/vm/manifests/rook-ceph/operator.yaml similarity index 100% rename from .werft/vm/manifests/rook-ceph/operator.yaml rename to dev/preview/workflow/vm/manifests/rook-ceph/operator.yaml diff --git a/.werft/vm/manifests/rook-ceph/snapshotclass.yaml b/dev/preview/workflow/vm/manifests/rook-ceph/snapshotclass.yaml similarity index 100% rename from .werft/vm/manifests/rook-ceph/snapshotclass.yaml rename to dev/preview/workflow/vm/manifests/rook-ceph/snapshotclass.yaml diff --git a/.werft/vm/manifests/rook-ceph/storageclass-test.yaml b/dev/preview/workflow/vm/manifests/rook-ceph/storageclass-test.yaml similarity index 100% rename from .werft/vm/manifests/rook-ceph/storageclass-test.yaml rename to dev/preview/workflow/vm/manifests/rook-ceph/storageclass-test.yaml