diff --git a/.gitignore b/.gitignore index f6b46e96787acd..07da0d4760176c 100644 --- a/.gitignore +++ b/.gitignore @@ -49,7 +49,6 @@ venv/ charts/gitpod_io/secrets/decrypted # Build artifacts -components/ws-scheduler/ws-scheduler components/ws-proxy/ws-proxy # Logs diff --git a/.werft/util/kubectl.ts b/.werft/util/kubectl.ts index b93867fe573c84..c039c6e69557c5 100644 --- a/.werft/util/kubectl.ts +++ b/.werft/util/kubectl.ts @@ -165,7 +165,7 @@ export async function deleteNonNamespaceObjects(namespace: string, destname: str exec(`/usr/local/bin/helm3 delete gitpod-${destname} || echo gitpod-${destname} was not installed yet`, { ...shellOpts }); let objs = []; - ["ws-scheduler", "node-daemon", "cluster", "workspace", "jaeger", "jaeger-agent", "ws-sync", "ws-manager-node", "ws-daemon", "registry-facade"].forEach(comp => + ["node-daemon", "cluster", "workspace", "jaeger", "jaeger-agent", "ws-sync", "ws-manager-node", "ws-daemon", "registry-facade"].forEach(comp => ["ClusterRole", "ClusterRoleBinding", "PodSecurityPolicy"].forEach(kind => exec(`kubectl get ${kind} -l component=${comp} --no-headers -o=custom-columns=:metadata.name | grep ${namespace}-ns`, { ...shellOpts, dontCheckRc: true, async: false }) .split("\n") diff --git a/WORKSPACE.yaml b/WORKSPACE.yaml index 0a77fbb67c9402..995d75b579b163 100644 --- a/WORKSPACE.yaml +++ b/WORKSPACE.yaml @@ -22,9 +22,6 @@ defaultVariant: variants: - name: oss - components: - exclude: - - components/ee/ws-scheduler srcs: exclude: - "**/ee" diff --git a/chart/templates/ws-manager-configmap.yaml b/chart/templates/ws-manager-configmap.yaml index 2a9ee9cfccf619..ebe4d63685ab2e 100644 --- a/chart/templates/ws-manager-configmap.yaml +++ b/chart/templates/ws-manager-configmap.yaml @@ -22,7 +22,6 @@ data: { "manager": { "namespace": "{{ .Release.Namespace }}", - "schedulerName": "{{ .Values.workspaceScheduler }}", {{- if $wsdaemon.userNamespaces.seccompProfileInstaller.enabled }} "seccompProfile": "localhost/workspace_default_{{ $gp.version }}.json", {{- else }} diff --git a/chart/templates/ws-manager-tlssecret.yaml b/chart/templates/ws-manager-tlssecret.yaml index 5ed82b4d336564..86a47a781b85fb 100644 --- a/chart/templates/ws-manager-tlssecret.yaml +++ b/chart/templates/ws-manager-tlssecret.yaml @@ -5,7 +5,7 @@ {{- $this := dict "root" . "gp" $.Values "comp" $comp -}} {{- if not $comp.disabled -}} {{- $serverAltNames := list ( printf "%s.%s" (include "gitpod.fullname" .) .Release.Namespace ) ( printf "%s.%s.svc" "ws-manager" .Release.Namespace ) "ws-manager" "ws-manager-dev" -}} -{{- $clientAltNames := list "registry-facade" "server" "ws-manager-bridge" "ws-scheduler" "ws-proxy" "ws-manager" -}} +{{- $clientAltNames := list "registry-facade" "server" "ws-manager-bridge" "ws-proxy" "ws-manager" -}} {{- $server := $comp.tls.server }} {{- $client := $comp.tls.client }} diff --git a/chart/templates/ws-scheduler-clusterrole.yaml b/chart/templates/ws-scheduler-clusterrole.yaml deleted file mode 100644 index 77c274d4ecebe6..00000000000000 --- a/chart/templates/ws-scheduler-clusterrole.yaml +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright (c) 2020 Gitpod GmbH. All rights reserved. -# Licensed under the MIT License. See License-MIT.txt in the project root for license information. - -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: {{ .Release.Namespace }}-ns-ws-scheduler - labels: - app: {{ template "gitpod.fullname" . }} - component: ws-scheduler - kind: role - stage: {{ .Values.installation.stage }} -rules: - - apiGroups: - - "" - resources: - - "nodes" - verbs: - - "get" - - "list" - - "watch" - - apiGroups: - - "" - resources: - - "pods" - verbs: - - "delete" - - "get" - - "list" - - "watch" - - "update" - - "patch" - - apiGroups: - - "" - resources: - - "pods/status" - verbs: - - "update" - - apiGroups: - - "" - resources: - - "pods/binding" - - "events" - verbs: - - "create" - - apiGroups: - - "policy" - resources: - - "podsecuritypolicies" - verbs: - - "use" - resourceNames: - - "{{ .Release.Namespace }}-ns-unprivileged" diff --git a/chart/templates/ws-scheduler-clusterrolebinding.yaml b/chart/templates/ws-scheduler-clusterrolebinding.yaml deleted file mode 100644 index a77c0747c47ec6..00000000000000 --- a/chart/templates/ws-scheduler-clusterrolebinding.yaml +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright (c) 2020 Gitpod GmbH. All rights reserved. -# Licensed under the MIT License. See License-MIT.txt in the project root for license information. - -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: {{ .Release.Namespace }}-ns-ws-scheduler - labels: - app: {{ template "gitpod.fullname" . }} - component: ws-scheduler - kind: role-binding - stage: {{ .Values.installation.stage }} -subjects: -- kind: ServiceAccount - name: ws-scheduler - namespace: {{ .Release.Namespace }} -roleRef: - kind: ClusterRole - name: {{ .Release.Namespace }}-ns-ws-scheduler - apiGroup: rbac.authorization.k8s.io - ---- - -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: {{ .Release.Namespace }}-ns-ws-scheduler-kube-rbac-proxy - labels: - app: {{ template "gitpod.fullname" . }} - component: ws-scheduler - kind: role-binding - stage: {{ .Values.installation.stage }} -subjects: -- kind: ServiceAccount - name: ws-scheduler - namespace: {{ .Release.Namespace }} -roleRef: - kind: ClusterRole - name: {{ .Release.Namespace }}-kube-rbac-proxy - apiGroup: rbac.authorization.k8s.io - - diff --git a/chart/templates/ws-scheduler-configmap.yaml b/chart/templates/ws-scheduler-configmap.yaml deleted file mode 100644 index c9940f895b5df2..00000000000000 --- a/chart/templates/ws-scheduler-configmap.yaml +++ /dev/null @@ -1,66 +0,0 @@ -# Copyright (c) 2020 Gitpod GmbH. All rights reserved. -# Licensed under the MIT License. See License-MIT.txt in the project root for license information. - -{{ $comp := .Values.components.wsScheduler }} -{{- if not $comp.disabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: ws-scheduler-config - labels: - app: {{ template "gitpod.fullname" . }} - chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" - release: "{{ .Release.Name }}" - heritage: "{{ .Release.Service }}" -data: - config.json: |- - { - "pprof": { - "addr": "localhost:6060" - }, - "prometheus": { - "addr": "127.0.0.1:9500" - }, - "scheduler": { - "schedulerName": "{{ $comp.schedulerName }}", - "namespace": "{{ .Release.Namespace }}", - "nodeLabelSelector": {}, - "strategyName": "DensityAndExperience", - "densityAndExperienceConfig": { - "workspaceFreshPeriodSeconds": 120, - "nodeFreshWorkspaceLimit": 2 - } - {{- if $comp.ratelimit }} - , "rateLimit": { - "maxRPS": {{ $comp.ratelimit.maxRPS }} - } - {{- end }} - } - {{ if $comp.scaler.enabled }} - , - "scaler": { - "enabled": true, - "driver": { - "wsman": { - "addr": "dns:///ws-manager:8080", - "tls": { - "ca": "/ws-manager-client-tls-certs/ca.crt", - "crt": "/ws-manager-client-tls-certs/tls.crt", - "key": "/ws-manager-client-tls-certs/tls.key" - } - }, - "workspaceImage": "{{ template "gitpod.comp.imageFull" (dict "root" . "gp" $.Values "comp" .Values.components.workspace.defaultImage) }}", - "ideImage": "{{ template "gitpod.comp.imageRepo" (dict "root" . "gp" $.Values "comp" .Values.components.workspace.codeImage) }}:{{ .Values.components.workspace.codeImage.stableVersion }}", - "supervisorImage": "{{ template "gitpod.comp.imageFull" (dict "root" . "gp" $.Values "comp" .Values.components.workspace.supervisor) }}", - "maxGhostWorkspaces": {{ $comp.scaler.maxGhostWorkspaces | default 0 }}, - "schedulerInterval": "{{ $comp.scaler.schedulerInterval | default "5s" }}", - "renewal": { - "interval": {{ $comp.scaler.renewal.interval | quote }}, - "percentage": {{ $comp.scaler.renewal.percentage }} - } - }, - "controller": {{ $comp.scaler.controller | toJson }} - } - {{ end }} - } -{{- end }} \ No newline at end of file diff --git a/chart/templates/ws-scheduler-deployment.yaml b/chart/templates/ws-scheduler-deployment.yaml deleted file mode 100644 index 940c6187b95bf7..00000000000000 --- a/chart/templates/ws-scheduler-deployment.yaml +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright (c) 2020 Gitpod GmbH. All rights reserved. -# Licensed under the MIT License. See License-MIT.txt in the project root for license information. - -{{ $comp := .Values.components.wsScheduler -}} -{{- $this := dict "root" . "gp" $.Values "comp" $comp -}} -{{- if not $comp.disabled -}} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: ws-scheduler - labels: - app: {{ template "gitpod.fullname" . }} - component: ws-scheduler - kind: deployment - stage: {{ .Values.installation.stage }} -spec: - selector: - matchLabels: - app: {{ template "gitpod.fullname" . }} - component: ws-scheduler - kind: pod - stage: {{ .Values.installation.stage }} - replicas: {{ $comp.replicas | default 1 }} - strategy: - type: RollingUpdate - rollingUpdate: - maxSurge: 1 - maxUnavailable: 0 - template: - metadata: - name: ws-scheduler - labels: - app: {{ template "gitpod.fullname" . }} - component: ws-scheduler - kind: pod - stage: {{ .Values.installation.stage }} - spec: - priorityClassName: system-node-critical -{{ include "gitpod.pod.affinity" $this | indent 6 }} - serviceAccountName: ws-scheduler - securityContext: - runAsUser: 31002 - volumes: - - name: config - configMap: - name: {{ template "gitpod.comp.configMap" $this }} - - name: ws-manager-client-tls-certs - secret: - secretName: {{ .Values.components.wsManager.tls.client.secretName }} - enableServiceLinks: false - containers: - - name: scheduler - args: ["run", "--config", "/config/config.json"] - image: {{ template "gitpod.comp.imageFull" $this }} -{{ include "gitpod.container.imagePullPolicy" $this | indent 8 }} -{{ include "gitpod.container.resources" $this | indent 8 }} -{{ include "gitpod.container.ports" $this | indent 8 }} - volumeMounts: - - name: config - mountPath: "/config" - readOnly: true - - mountPath: /ws-manager-client-tls-certs - name: ws-manager-client-tls-certs - readOnly: true - securityContext: - privileged: false -{{ include "gitpod.container.defaultEnv" $this | indent 8 }} -{{ include "gitpod.container.tracingEnv" $this | indent 8 }} -{{ include "gitpod.kube-rbac-proxy" $this | indent 6 }} -{{ toYaml .Values.defaults | indent 6 }} -{{ end }} diff --git a/chart/templates/ws-scheduler-networkpolicy.yaml b/chart/templates/ws-scheduler-networkpolicy.yaml deleted file mode 100644 index d02ac4acd4d9e3..00000000000000 --- a/chart/templates/ws-scheduler-networkpolicy.yaml +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (c) 2020 Gitpod GmbH. All rights reserved. -# Licensed under the MIT License. See License-MIT.txt in the project root for license information. - -{{ if .Values.installNetworkPolicies -}} -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: ws-scheduler - labels: - app: {{ template "gitpod.fullname" . }} - component: ws-scheduler - kind: networkpolicy - stage: {{ .Values.installation.stage }} -spec: - podSelector: - matchLabels: - app: {{ template "gitpod.fullname" . }} - component: ws-scheduler - policyTypes: - - Ingress - ingress: - - {} -{{- end -}} diff --git a/chart/templates/ws-scheduler-serviceaccount.yaml b/chart/templates/ws-scheduler-serviceaccount.yaml deleted file mode 100644 index 3f31b0444b52f1..00000000000000 --- a/chart/templates/ws-scheduler-serviceaccount.yaml +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (c) 2020 Gitpod GmbH. All rights reserved. -# Licensed under the MIT License. See License-MIT.txt in the project root for license information. - -apiVersion: v1 -kind: ServiceAccount -metadata: - name: ws-scheduler - labels: - app: {{ template "gitpod.fullname" . }} - component: ws-scheduler - kind: service-account - stage: {{ .Values.installation.stage }} \ No newline at end of file diff --git a/chart/values.yaml b/chart/values.yaml index 3ef34f116d2006..c1e1f7c53c19ed 100644 --- a/chart/values.yaml +++ b/chart/values.yaml @@ -97,7 +97,6 @@ authProviders: [] # settingsUrl: "https://gitlab.com/-/profile/applications" # description: "" # icon: "" -workspaceScheduler: workspace-scheduler components: @@ -500,27 +499,6 @@ components: enabled: true imageName: "seccomp-profile-installer" - wsScheduler: - name: "ws-scheduler" - disabled: false - resources: - cpu: 100m - memory: 32Mi - schedulerName: "workspace-scheduler" - ratelimit: - # Limits the # of scheduling attempts (per second) to limit traffic to the k8s master. - maxRPS: 10 - scaler: - enabled: false - maxGhostWorkspaces: 10 - renewal: - interval: "5m" - percentage: 20 - controller: - kind: "constant" - constant: - setpoint: 5 - wsProxy: name: "ws-proxy" disabled: false diff --git a/codecov.yml b/codecov.yml index a81daa2c11f045..9177485e2e757b 100644 --- a/codecov.yml +++ b/codecov.yml @@ -35,9 +35,6 @@ flags: components-ee-kedge-app: paths: - components/ee/kedge/ - components-ee-ws-scheduler-app: - paths: - - components/ee/ws-scheduler/ components-gitpod-cli-app: paths: - components/gitpod-cli/ diff --git a/components/BUILD.yaml b/components/BUILD.yaml index 0e3a44031c70be..51bc1e3f4e0572 100644 --- a/components/BUILD.yaml +++ b/components/BUILD.yaml @@ -37,7 +37,6 @@ packages: - components/ee/db-sync:docker - components/ee/kedge:docker - components/ee/payment-endpoint:docker - - components/ee/ws-scheduler:docker - components/gitpod-db:docker - components/ide/code-desktop:docker - components/ide/code-desktop:docker-insiders @@ -91,7 +90,6 @@ packages: - components/ee/db-sync:app - components/ee/kedge:app - components/ee/payment-endpoint:app - - components/ee/ws-scheduler:app - components/image-builder-mk3:app - components/openvsx-proxy:app - components/registry-facade:app diff --git a/components/common-go/kubernetes/kubernetes.go b/components/common-go/kubernetes/kubernetes.go index c8904f6df8d3c5..49dfcacd0c0259 100644 --- a/components/common-go/kubernetes/kubernetes.go +++ b/components/common-go/kubernetes/kubernetes.go @@ -4,8 +4,6 @@ package kubernetes -// wsman and ws-scheduler need to share labels/annotations so that we can have consistent logging and tracing. -// // Those two are the only cases where you would actually need this package. If you think you need this elsewhere, // please make sure you're not better of using wsman's API to solve your problem. If this is actually what you need, // please update this comment. diff --git a/components/ee/ws-scheduler/.gitignore b/components/ee/ws-scheduler/.gitignore deleted file mode 100644 index 5c0c454418d3a3..00000000000000 --- a/components/ee/ws-scheduler/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/ws-scheduler \ No newline at end of file diff --git a/components/ee/ws-scheduler/.golangci.yml b/components/ee/ws-scheduler/.golangci.yml deleted file mode 100644 index 6f1cdfb5b5a8cd..00000000000000 --- a/components/ee/ws-scheduler/.golangci.yml +++ /dev/null @@ -1,9 +0,0 @@ -issues: - exclude: - # we need to exclude the following two issues to allow the span, ctx := ... pattern - - ineffectual assignment to `ctx` - - this value of `ctx` is never used - exclude-rules: - - path: _test\.go - linters: - - errcheck \ No newline at end of file diff --git a/components/ee/ws-scheduler/BUILD.yaml b/components/ee/ws-scheduler/BUILD.yaml deleted file mode 100644 index da2350d1c9d827..00000000000000 --- a/components/ee/ws-scheduler/BUILD.yaml +++ /dev/null @@ -1,55 +0,0 @@ -packages: - - name: app - type: go - srcs: - - "**/*.go" - - "go.mod" - - "go.sum" - deps: - - components/common-go:lib - - components/content-service-api/go:lib - - components/ws-manager-api/go:lib - env: - - CGO_ENABLED=0 - - GOOS=linux - config: - packaging: app - buildCommand: ["go", "build", "-trimpath", "-ldflags", "-buildid= -w -s -X 'github.com/gitpod-io/gitpod/ws-scheduler/cmd.Version=commit-${__git_commit}'"] - - name: docker - type: docker - deps: - - :app - argdeps: - - imageRepoBase - config: - buildArgs: - VERSION: ${version} - dockerfile: leeway.Dockerfile - metadata: - helm-component: wsScheduler - image: - - ${imageRepoBase}/ws-scheduler:${version} - - ${imageRepoBase}/ws-scheduler:commit-${__git_commit} - - name: lib - type: go - srcs: - - "**/*.go" - - "go.mod" - - "go.sum" - deps: - - components/common-go:lib - - components/content-service-api/go:lib - - components/ws-manager-api/go:lib - env: - - CGO_ENABLED=0 - - GOOS=linux - config: - packaging: library -scripts: - - name: telepresence - script: | - tmpdir=$(mktemp -d) - telepresence --swap-deployment ws-scheduler \ - --method vpn-tcp \ - --mount $tmpdir \ - --run go run -race main.go run -v --config $tmpdir/config/config.json --kubeconfig ~/.kube/config diff --git a/components/ee/ws-scheduler/OWNERS b/components/ee/ws-scheduler/OWNERS deleted file mode 100644 index cd8b31399c625f..00000000000000 --- a/components/ee/ws-scheduler/OWNERS +++ /dev/null @@ -1,9 +0,0 @@ - -options: - no_parent_owners: true - -approvers: - - engineering-workspace - -labels: - - "team: workspace" \ No newline at end of file diff --git a/components/ee/ws-scheduler/cmd/root.go b/components/ee/ws-scheduler/cmd/root.go deleted file mode 100644 index 285b1a84b9434e..00000000000000 --- a/components/ee/ws-scheduler/cmd/root.go +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright (c) 2020 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package cmd - -import ( - "encoding/json" - "fmt" - "os" - - "github.com/spf13/cobra" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/rest" - "k8s.io/client-go/tools/clientcmd" - - wsk8s "github.com/gitpod-io/gitpod/common-go/kubernetes" - "github.com/gitpod-io/gitpod/common-go/log" - "github.com/gitpod-io/gitpod/common-go/tracing" - "github.com/gitpod-io/gitpod/ws-scheduler/pkg/scaler" - "github.com/gitpod-io/gitpod/ws-scheduler/pkg/scheduler" -) - -var ( - // ServiceName is the name we use for tracing/logging - ServiceName = "ws-scheduler" - // Version of this service - set during build - Version = "" -) - -var cfgFile string -var kubeconfig string -var jsonLog bool -var verbose bool - -// rootCmd represents the base command when called without any subcommands -var rootCmd = &cobra.Command{ - Use: "ws-scheduler", - Short: "ws-scheduler schedules workspace pods to nodes", - PersistentPreRun: func(cmd *cobra.Command, args []string) { - log.Init(ServiceName, Version, jsonLog, verbose) - }, -} - -// Execute adds all child commands to the root command and sets flags appropriately. -// This is called by main.main(). It only needs to happen once to the rootCmd. -func Execute() { - closer := tracing.Init(ServiceName) - if closer != nil { - defer closer.Close() - } - - if err := rootCmd.Execute(); err != nil { - fmt.Println(err) - os.Exit(1) - } -} - -func init() { - rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.kedgei.yaml)") - rootCmd.PersistentFlags().BoolVarP(&jsonLog, "json-log", "j", true, "produce JSON log output on verbose level") - rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "Enable verbose JSON logging") - - rootCmd.PersistentFlags().StringVar(&kubeconfig, "kubeconfig", "", "path to the kubeconfig file to use (defaults to in-cluster config)") -} - -func getConfig() *config { - ctnt, err := os.ReadFile(cfgFile) - if err != nil { - log.WithError(err).Error("cannot read configuration. Maybe missing --config?") - os.Exit(1) - } - - var cfg config - err = json.Unmarshal(ctnt, &cfg) - if err != nil { - log.WithError(err).Error("cannot read configuration. Maybe missing --config?") - os.Exit(1) - } - - return &cfg -} - -type config struct { - Scheduler scheduler.Configuration `json:"scheduler"` - Scaler struct { - Enabled bool `json:"enabled"` - Driver scaler.WorkspaceManagerPrescaleDriverConfig `json:"driver"` - Controller scaler.ControllerConfig `json:"controller"` - } - Prometheus struct { - Addr string `json:"addr"` - } `json:"prometheus"` - PProf struct { - Addr string `json:"addr"` - } `json:"pprof"` -} - -func newClientSet() (*kubernetes.Clientset, error) { - if kubeconfig != "" { - res, err := clientcmd.BuildConfigFromFlags("", kubeconfig) - if err != nil { - return nil, err - } - res.RateLimiter = &wsk8s.UnlimitedRateLimiter{} - return kubernetes.NewForConfig(res) - } - - k8s, err := rest.InClusterConfig() - if err != nil { - return nil, err - } - k8s.RateLimiter = &wsk8s.UnlimitedRateLimiter{} - return kubernetes.NewForConfig(k8s) -} diff --git a/components/ee/ws-scheduler/cmd/run.go b/components/ee/ws-scheduler/cmd/run.go deleted file mode 100644 index b175d41572084c..00000000000000 --- a/components/ee/ws-scheduler/cmd/run.go +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright (c) 2020 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package cmd - -import ( - "context" - "net/http" - "os" - "os/signal" - "syscall" - - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promhttp" - "github.com/spf13/cobra" - - common_grpc "github.com/gitpod-io/gitpod/common-go/grpc" - "github.com/gitpod-io/gitpod/common-go/log" - "github.com/gitpod-io/gitpod/common-go/pprof" - "github.com/gitpod-io/gitpod/ws-scheduler/pkg/scaler" - sched "github.com/gitpod-io/gitpod/ws-scheduler/pkg/scheduler" - schedMetrics "github.com/gitpod-io/gitpod/ws-scheduler/pkg/scheduler/metrics" -) - -var runCmd = &cobra.Command{ - Use: "run", - Short: "Starts listening to the kubernetes api and schedule detected pods", - - Run: func(cmd *cobra.Command, args []string) { - config := getConfig() - - err := config.Scheduler.Validate() - if err != nil { - log.WithError(err).Fatal("invalid configuration") - } - - clientSet, err := newClientSet() - if err != nil { - log.WithError(err).Fatal("cannot connect to Kubernetes") - } - log.Info("connected to Kubernetes") - - reg := prometheus.NewRegistry() - if config.Prometheus.Addr != "" { - prometheus.WrapRegistererWithPrefix("gitpod_ws_scheduler_", reg).MustRegister(schedMetrics.AllMetrics...) - reg.MustRegister(common_grpc.ClientMetrics()) - - handler := http.NewServeMux() - handler.Handle("/metrics", promhttp.HandlerFor(reg, promhttp.HandlerOpts{})) - - go func() { - err := http.ListenAndServe(config.Prometheus.Addr, handler) - if err != nil { - log.WithError(err).Error("Prometheus metrics server failed") - } - }() - log.WithField("addr", config.Prometheus.Addr).Info("started Prometheus metrics server") - } - - if config.PProf.Addr != "" { - go pprof.Serve(config.PProf.Addr) - } - - scheduler, err := sched.NewScheduler(config.Scheduler, clientSet) - if err != nil { - log.WithError(err).Fatal("cannot create scheduler") - } - schedulerCtx, cancelScheduler := context.WithCancel(context.Background()) - go func() { - err = scheduler.Run(schedulerCtx) - if err != nil { - cancelScheduler() - log.WithError(err).Fatal("cannot start scheduler") - } - }() - defer func() { - log.Info("ws-scheduler interrupted; shutting down...") - cancelScheduler() - scheduler.WaitForShutdown() - log.Info("ws-scheduler shut down") - }() - - if config.Scaler.Enabled { - controller, err := scaler.NewController(config.Scaler.Controller) - if err != nil { - log.WithError(err).Fatal("cannot create scaler controller") - } - driver, err := scaler.NewWorkspaceManagerPrescaleDriver(config.Scaler.Driver, controller) - if err != nil { - log.WithError(err).Fatal("cannot create scaler driver") - } - err = driver.RegisterMetrics(prometheus.WrapRegistererWithPrefix("gitpod_ws_scaler_", reg)) - if err != nil { - log.WithError(err).Fatal("cannot register metrics") - } - - go driver.Run() - defer driver.Stop() - log.WithField("controller", config.Scaler.Controller.Kind).Info("started scaler") - } - - log.Info("🗓️ ws-scheduler is up and running. Stop with SIGINT or CTRL+C") - - // Run until we're told to stop - sigChan := make(chan os.Signal, 1) - signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM) - <-sigChan - - // Defers from above executed here - }, -} - -func init() { - rootCmd.AddCommand(runCmd) -} diff --git a/components/ee/ws-scheduler/cmd/test-cluster-scaleup.go b/components/ee/ws-scheduler/cmd/test-cluster-scaleup.go deleted file mode 100644 index df8a4ebb597081..00000000000000 --- a/components/ee/ws-scheduler/cmd/test-cluster-scaleup.go +++ /dev/null @@ -1,326 +0,0 @@ -// Copyright (c) 2020 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package cmd - -import ( - "context" - "fmt" - "os" - "os/signal" - "syscall" - "time" - - "github.com/spf13/cobra" - "golang.org/x/xerrors" - corev1 "k8s.io/api/core/v1" - res "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/client-go/kubernetes" - - "github.com/gitpod-io/gitpod/common-go/log" - "github.com/gitpod-io/gitpod/ws-scheduler/pkg/scheduler" -) - -var testPodIdentifier map[string]string = map[string]string{ - "component": "test-cluster-scaleup", -} -var workspaceNodeIdentifier map[string]string = map[string]string{ - "gitpod.io/workload_workspace": "true", -} - -const testNamespace = "default" -const workspaceSizeBytes = int64(4 * 1024 * 1024 * 1024) - -// I tested this on staging.us-east4. To get a valid kubeconfig in gitpod: -// 1. gcloud auth login -// 2. yarn gp install-contexts -// 3. kubectl config use-context staging.us-east4 - -// testClusterScaleupCmd represents the testClusterScaleup command -var testClusterScaleupCmd = &cobra.Command{ - Use: "cluster-scaleup", - Short: "Generates and goes through a complex cluster scaleup scenario and test invariants on the way", - Args: cobra.ExactArgs(0), - Run: func(cmd *cobra.Command, args []string) { - clientSet, err := newClientSet() - if err != nil { - log.WithError(err).Fatal("cannot connect to Kubernetes") - } - log.Info("connected to Kubernetes") - - sigChan := make(chan os.Signal, 1) - stopChan := make(chan struct{}, 1) - signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM) - go func() { - <-sigChan - log.Warnf("Received signal, quitting!") - stopChan <- struct{}{} - }() - - err = playScaleupScenario(clientSet, stopChan) - if err != nil { - log.WithError(err).Fatal("error while playing scenario") - } - }, -} - -func playScaleupScenario(clientSet *kubernetes.Clientset, stopChan chan struct{}) (err error) { - defer cleanup(clientSet) - log.Infof("Starting scenario scaleup...") - - // 1. start as much workspace-like nodes necessary to just fill all current nodes - // Wait until pods are running, check state - log.Infof("Step 1: Starting...") - state, err := buildCurrentState(clientSet) - if err != nil { - return err - } - - slotsToFill := calcEmptySlots(scheduler.NodeMapToList(state.Nodes)) - log.Infof("Starting %d filler pods...", slotsToFill) - err = startTestPods(clientSet, slotsToFill, "filler") - if err != nil { - return err - } - - log.Infof("Waiting for pods to become scheduled...") - err = waitUntilAllTestPodsAreScheduled(clientSet, stopChan) - if err != nil { - return err - } - log.Infof("All filler pods are scheduled.") - - // Verify expected state: All nodes are full - stateFilled, err := buildCurrentState(clientSet) - if err != nil { - return err - } - slotsLeft := calcEmptySlots(scheduler.NodeMapToList(stateFilled.Nodes)) - if slotsLeft != 0 { - return xerrors.Errorf("Expected all nodes to be full, but had %d free slots left!", slotsLeft) - } - filledNodes := len(stateFilled.Nodes) - log.Infof("All %d nodes are full", len(stateFilled.Nodes)) - log.Infof("Step 1: Done.") - - // Interrupted? - select { - case <-stopChan: - return xerrors.Errorf("cancelled") - default: - } - - // 2. Add additional nodes that will cause OutOfMemory errors because: - // - there's no space left on the nodes - // - they will be created - and thus scheduled - in a very short timeframe - log.Infof("Step 2: Starting...") - - // 2.1 All nodes are still full - stateOverflow, err := buildCurrentState(clientSet) - if err != nil { - return err - } - - slotsLeftAfterOverflow := calcEmptySlots(scheduler.NodeMapToList(stateOverflow.Nodes)) - if slotsLeftAfterOverflow != 0 { - return xerrors.Errorf("Expected all nodes to be more than full, but had %d free slots left!", slotsLeftAfterOverflow) - } - log.Infof("All %d nodes are still full", len(stateFilled.Nodes)) - - // 2.2 Still the same number of nodes (no scaleup yet!) - nodesAfterOverflow := len(stateOverflow.Nodes) - if nodesAfterOverflow != filledNodes { - return xerrors.Errorf("We're interrupted by a scaleup! (were %d nodes, are %d now) Please try again", filledNodes, nodesAfterOverflow) - } - log.Infof("We were not interrupted by a scaleup") - - // 2.3 Start OOM pods - oomPodCount := 4 - log.Infof("Starting %d oom pods...", oomPodCount) - err = startTestPods(clientSet, oomPodCount, "oom") - if err != nil { - return err - } - - log.Infof("Waiting for pods to become scheduled...") - err = waitUntilAllTestPodsAreScheduled(clientSet, stopChan) - if err != nil { - return err - } - log.Infof("All oom pods are scheduled.") - - // 2.3 No OutOfMemory - for _, p := range stateOverflow.Pods { - if p.Status.Phase == corev1.PodFailed && p.Status.Reason == "OutOfMemory" { - return xerrors.Errorf("OutOfMemory error: %s", p.Name) - } - } - log.Infof("No OutOfMemory error detected") - - log.Infof("Step 2: Done.") - return nil -} - -func waitUntilAllTestPodsAreScheduled(clientSet *kubernetes.Clientset, stopChan chan struct{}) error { - for { - select { - case <-time.After(2 * time.Second): - pods, err := clientSet.CoreV1().Pods("").List(context.Background(), metav1.ListOptions{ - LabelSelector: labels.SelectorFromSet(testPodIdentifier).String(), - }) - if err != nil { - return err - } - - allNodesRunning := true - for _, p := range pods.Items { - if p.Status.Phase == corev1.PodFailed { - return xerrors.Errorf("Pod %s failed: %s", p.Name, p.Status.Reason) - } - - podIsScheduled := false - for _, c := range p.Status.Conditions { - if c.Type == corev1.PodScheduled && c.Status == "True" { - podIsScheduled = true - break - } - } - allNodesRunning = allNodesRunning && podIsScheduled - } - if allNodesRunning { - return nil - } - continue - case <-time.After(1 * time.Minute): - return xerrors.Errorf("timeout: pods are not running yet!") - case <-stopChan: - return xerrors.Errorf("interrupted") - } - } -} - -func buildCurrentState(clientSet *kubernetes.Clientset) (*scheduler.State, error) { - allWorkspaceNodes, err := clientSet.CoreV1().Nodes().List(context.Background(), metav1.ListOptions{ - LabelSelector: labels.SelectorFromSet(workspaceNodeIdentifier).String(), - }) - if err != nil { - log.WithError(err).Fatal("cannot list nodes") - return nil, err - } - potentialNodes := make([]*corev1.Node, 0) - for i := 0; i < len(allWorkspaceNodes.Items); i++ { - if allWorkspaceNodes.Items[i].Spec.Unschedulable { - continue - } - potentialNodes = append(potentialNodes, &allWorkspaceNodes.Items[i]) - } - - allPods, err := clientSet.CoreV1().Pods("").List(context.Background(), metav1.ListOptions{}) - if err != nil { - log.WithError(err).Fatal("cannot list pods") - return nil, err - } - - pods := make([]*corev1.Pod, len(allPods.Items)) - for i := range allPods.Items { - pods[i] = &allPods.Items[i] - } - - ramSafetyBuffer := res.MustParse("0Mi") - state := scheduler.ComputeState(potentialNodes, pods, nil, &ramSafetyBuffer, true, testNamespace) - return state, nil -} - -func startTestPods(clientSet *kubernetes.Clientset, count int, suffix string) error { - for i := 1; i <= count; i++ { - err := startTestPod(clientSet, i, suffix) - if err != nil { - return err - } - } - return nil -} - -func startTestPod(clientSet *kubernetes.Clientset, nr int, suffix string) error { - root := int64(0) - boolTrue := true - pod := corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("test-pod-%s-%d", suffix, nr), - Labels: testPodIdentifier, - }, - Spec: corev1.PodSpec{ - ServiceAccountName: "workspace-privileged", - SchedulerName: "workspace-scheduler", - Affinity: &corev1.Affinity{ - NodeAffinity: &corev1.NodeAffinity{ - RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{ - NodeSelectorTerms: []corev1.NodeSelectorTerm{ - { - MatchExpressions: []corev1.NodeSelectorRequirement{ - { - Key: "gitpod.io/workload_workspace", - Operator: corev1.NodeSelectorOpIn, - Values: []string{"true"}, - }, - }, - }, - }, - }, - }, - }, - Containers: []corev1.Container{ - { - Name: "main", - Image: "alpine:latest", - Command: []string{"bash", "-c", "while true; do sleep 2; echo 'sleeping...'; done"}, - Resources: corev1.ResourceRequirements{ - Requests: corev1.ResourceList{ - "memory": res.MustParse(fmt.Sprintf("%d", workspaceSizeBytes)), - }, - }, - SecurityContext: &corev1.SecurityContext{ - Privileged: &boolTrue, - RunAsUser: &root, - RunAsGroup: &root, - AllowPrivilegeEscalation: &boolTrue, - }, - }, - }, - }, - } - _, err := clientSet.CoreV1().Pods(testNamespace).Create(context.Background(), &pod, metav1.CreateOptions{}) - return err -} - -func calcEmptySlots(nodes []*scheduler.Node) int { - var slots int - for _, n := range nodes { - availBytes := n.RAM.Available.Value() - if availBytes > 0 { - freeSlots := int(availBytes / workspaceSizeBytes) - slots += freeSlots - } - } - return slots -} - -func cleanup(clientSet *kubernetes.Clientset) { - foreground := metav1.DeletePropagationForeground - err := clientSet.CoreV1().Pods(testNamespace).DeleteCollection(context.Background(), metav1.DeleteOptions{ - PropagationPolicy: &foreground, - }, metav1.ListOptions{ - LabelSelector: labels.SelectorFromSet(testPodIdentifier).String(), - }) - if err != nil { - log.WithError(err).Debug("Error while deleting test pods") - } - log.Infof("Cleanup done.") -} - -func init() { - testCmd.AddCommand(testClusterScaleupCmd) -} diff --git a/components/ee/ws-scheduler/cmd/test-scheduling-pressure.go b/components/ee/ws-scheduler/cmd/test-scheduling-pressure.go deleted file mode 100644 index baf76b7140448c..00000000000000 --- a/components/ee/ws-scheduler/cmd/test-scheduling-pressure.go +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright (c) 2020 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package cmd - -import ( - "context" - "fmt" - "os" - "os/signal" - "sync" - "syscall" - - "github.com/spf13/cobra" - corev1 "k8s.io/api/core/v1" - res "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/client-go/kubernetes" - - "github.com/gitpod-io/gitpod/common-go/log" -) - -// Easiest way to execute this: -// kubectl exec -it ws-scheduler-... -- sh -// cd app -// ./ws-scheduler test generate-scheduling-pressure --namespace=staging-gpl-fix-ws-scheduler --size=0.01 --pod-count=10 - -var pressureTestPodLabels labels.Set = map[string]string{ - "component": "test-pressure", -} - -// testSchedulingPressureCmd generates some load for the scheduler -var testSchedulingPressureCmd = &cobra.Command{ - Use: "generate-scheduling-pressure", - Short: "Generates scheduling pressure on the workspace-scheduler", - Args: cobra.RangeArgs(0, 3), - Run: func(cmd *cobra.Command, args []string) { - podNamespace, _ := cmd.Flags().GetString("namespace") - podCount, _ := cmd.Flags().GetInt("pod-count") - podSizeInGb, _ := cmd.Flags().GetFloat32("size") - - clientSet, err := newClientSet() - if err != nil { - log.WithError(err).Fatal("cannot connect to Kubernetes") - } - log.Info("connected to Kubernetes") - - sigChan := make(chan os.Signal, 1) - stopChan := make(chan struct{}, 1) - signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM) - go func() { - <-sigChan - log.Debug("received signal, quitting.") - stopChan <- struct{}{} - }() - - log.Infof("starting pods with (%s, %d, %f)...", podNamespace, podCount, podSizeInGb) - err = generateSchedulingPressure(clientSet, podNamespace, podCount, podSizeInGb) - if err != nil { - log.WithError(err).Error("error while generating scheduling pressure") - } - log.Info("done starting pods.") - - log.Info("will delete all pods on Ctrl-C") - <-stopChan - - cleanupPressureTest(clientSet, podNamespace, pressureTestPodLabels) - }, -} - -func generateSchedulingPressure(clientSet *kubernetes.Clientset, podNamespace string, podCount int, podSizeInGb float32) error { - var wg sync.WaitGroup - for p := 0; p < podCount; p++ { - name := fmt.Sprintf("pressure-pod-%d", p) - - wg.Add(1) - // for some reason the k8s master is extremely slow with creating pods. The only thing that helped was to call - // it in a goroutine: Although there still is the initial delay the actual creation happens in parallel. - go func() { - err := createPod(clientSet, "workspace-scheduler", podNamespace, name, podSizeInGb) - if err != nil { - log.WithError(err).Errorf("Done starting pod: %s", name) - } else { - log.Debugf("Done starting pod: %s", name) - } - wg.Done() - }() - } - wg.Wait() - - return nil -} - -func createPod(clientSet *kubernetes.Clientset, scheduler string, namespace string, name string, ramInGb float32) error { - boolTrue := true - boolFalse := false - gitpodUser := int64(33333) - pod := corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - Labels: pressureTestPodLabels, - }, - Spec: corev1.PodSpec{ - ServiceAccountName: "workspace", - SchedulerName: scheduler, - Affinity: &corev1.Affinity{ - NodeAffinity: &corev1.NodeAffinity{ - RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{ - NodeSelectorTerms: []corev1.NodeSelectorTerm{ - { - MatchExpressions: []corev1.NodeSelectorRequirement{ - { - Key: "gitpod.io/workload_workspace", - Operator: corev1.NodeSelectorOpIn, - Values: []string{"true"}, - }, - }, - }, - }, - }, - }, - }, - SecurityContext: &corev1.PodSecurityContext{ - RunAsUser: &gitpodUser, - RunAsNonRoot: &boolTrue, - }, - Containers: []corev1.Container{ - { - Name: "main", - Image: "eu.gcr.io/gitpod-dev/workspace-images:7e01b3299b178278c88c5a4606bdeed09059e94e8a7a193b249606028cfd13dd", - Command: []string{"bash", "-c", "while true; do sleep 2; echo 'sleeping...'; done"}, - Resources: corev1.ResourceRequirements{ - Requests: corev1.ResourceList{ - "memory": res.MustParse(fmt.Sprintf("%d", int(ramInGb*1024*1024*1024))), - }, - }, - SecurityContext: &corev1.SecurityContext{ - AllowPrivilegeEscalation: &boolFalse, - RunAsUser: &gitpodUser, - Privileged: &boolFalse, - RunAsNonRoot: &boolTrue, - }, - }, - }, - }, - } - _, err := clientSet.CoreV1().Pods(namespace).Create(context.Background(), &pod, metav1.CreateOptions{}) - return err -} -func cleanupPressureTest(clientSet *kubernetes.Clientset, namespace string, selectorLabels labels.Set) { - foreground := metav1.DeletePropagationForeground - err := clientSet.CoreV1().Pods(namespace).DeleteCollection(context.Background(), metav1.DeleteOptions{ - PropagationPolicy: &foreground, - }, metav1.ListOptions{ - LabelSelector: labels.SelectorFromSet(selectorLabels).String(), - }) - if err != nil { - log.WithError(err).Debug("error while deleting test pods") - } - log.Infof("cleanup done.") -} - -func init() { - testCmd.AddCommand(testSchedulingPressureCmd) - - testSchedulingPressureCmd.Flags().String("namespace", "default", "The namespace the pods are created in") - testSchedulingPressureCmd.Flags().Float32("size", 0.05, "The size of a single pod (RAM in GB)") - testSchedulingPressureCmd.Flags().Int("pod-count", 150, "The number of pods to create") -} diff --git a/components/ee/ws-scheduler/cmd/test.go b/components/ee/ws-scheduler/cmd/test.go deleted file mode 100644 index 60ae18eca68b61..00000000000000 --- a/components/ee/ws-scheduler/cmd/test.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) 2020 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package cmd - -import ( - "github.com/spf13/cobra" -) - -// testCmd represents the test command -var testCmd = &cobra.Command{ - Use: "test", - Short: "Subsumes manually triggered integration tests", - Args: cobra.ExactArgs(1), -} - -func init() { - rootCmd.AddCommand(testCmd) -} diff --git a/components/ee/ws-scheduler/example-config.json b/components/ee/ws-scheduler/example-config.json deleted file mode 100644 index 0474e5754e5d85..00000000000000 --- a/components/ee/ws-scheduler/example-config.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "scheduler": { - "schedulerName": "workspace-scheduler", - "namespace": "staging-gpl-reschedule", - "nodeLabelSelector": { - "gitpod.io/workload_workspace": "true" - }, - "strategyName": "DensityAndExperience", - "densityAndExperienceConfig": { - "workspaceFreshPeriodSeconds": 120, - "nodeFreshWorkspaceLimit": 2 - } - }, - "scaler": { - "namespace": "staging-gpl-reschedule", - "scalingPeriod": "60s", - "bufferRuntime": "5s", - "slotFactor": 6, - "bufferFactor": 1, - "nodeLabelSelector": { - "gitpod.io/workload_workspace": "true" - }, - "schedulerName": "workspace-scheduler", - "stage": "devstaging", - "pullSecrets": ["eu.gcr.io-gitpod"] - } -} \ No newline at end of file diff --git a/components/ee/ws-scheduler/go.mod b/components/ee/ws-scheduler/go.mod deleted file mode 100644 index bebb260b1a9aab..00000000000000 --- a/components/ee/ws-scheduler/go.mod +++ /dev/null @@ -1,128 +0,0 @@ -module github.com/gitpod-io/gitpod/ws-scheduler - -go 1.17 - -require ( - github.com/docker/distribution v2.7.1+incompatible - github.com/gitpod-io/gitpod/common-go v0.0.0-00010101000000-000000000000 - github.com/gitpod-io/gitpod/content-service/api v0.0.0-00010101000000-000000000000 - github.com/gitpod-io/gitpod/ws-manager/api v0.0.0-00010101000000-000000000000 - github.com/go-ozzo/ozzo-validation v3.6.0+incompatible - github.com/golang/mock v1.6.0 - github.com/google/go-cmp v0.5.6 - github.com/google/uuid v1.1.2 - github.com/opentracing/opentracing-go v1.2.0 - github.com/prometheus/client_golang v1.11.0 - github.com/sirupsen/logrus v1.8.1 - github.com/spf13/cobra v1.1.3 - golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac - golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 - google.golang.org/grpc v1.39.1 - google.golang.org/protobuf v1.27.1 - k8s.io/api v0.22.2 - k8s.io/apimachinery v0.22.2 - k8s.io/client-go v0.22.2 - k8s.io/component-helpers v0.22.2 -) - -require ( - cloud.google.com/go v0.54.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.1.1 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/evanphx/json-patch v4.11.0+incompatible // indirect - github.com/go-logr/logr v0.4.0 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/gofuzz v1.1.0 // indirect - github.com/googleapis/gnostic v0.5.5 // indirect - github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect - github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect - github.com/imdario/mergo v0.3.5 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/json-iterator/go v1.1.11 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.1 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.1 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.26.0 // indirect - github.com/prometheus/procfs v0.6.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/uber/jaeger-client-go v2.29.1+incompatible // indirect - github.com/uber/jaeger-lib v2.4.1+incompatible // indirect - go.uber.org/atomic v1.8.0 // indirect - golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 // indirect - golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d // indirect - golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 // indirect - golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d // indirect - golang.org/x/text v0.3.6 // indirect - google.golang.org/appengine v1.6.5 // indirect - google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect - k8s.io/klog/v2 v2.9.0 // indirect - k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e // indirect - k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.1.2 // indirect - sigs.k8s.io/yaml v1.2.0 // indirect -) - -replace github.com/gitpod-io/gitpod/common-go => ../../common-go // leeway - -replace github.com/gitpod-io/gitpod/content-service/api => ../../content-service-api/go // leeway - -replace github.com/gitpod-io/gitpod/ws-manager/api => ../../ws-manager-api/go // leeway - -replace k8s.io/api => k8s.io/api v0.22.2 // leeway indirect from components/common-go:lib - -replace k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.22.2 // leeway indirect from components/common-go:lib - -replace k8s.io/apimachinery => k8s.io/apimachinery v0.22.2 // leeway indirect from components/common-go:lib - -replace k8s.io/apiserver => k8s.io/apiserver v0.22.2 // leeway indirect from components/common-go:lib - -replace k8s.io/cli-runtime => k8s.io/cli-runtime v0.22.2 // leeway indirect from components/common-go:lib - -replace k8s.io/client-go => k8s.io/client-go v0.22.2 // leeway indirect from components/common-go:lib - -replace k8s.io/cloud-provider => k8s.io/cloud-provider v0.22.2 // leeway indirect from components/common-go:lib - -replace k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.22.2 // leeway indirect from components/common-go:lib - -replace k8s.io/code-generator => k8s.io/code-generator v0.22.2 // leeway indirect from components/common-go:lib - -replace k8s.io/component-base => k8s.io/component-base v0.22.2 // leeway indirect from components/common-go:lib - -replace k8s.io/cri-api => k8s.io/cri-api v0.22.2 // leeway indirect from components/common-go:lib - -replace k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.22.2 // leeway indirect from components/common-go:lib - -replace k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.22.2 // leeway indirect from components/common-go:lib - -replace k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.22.2 // leeway indirect from components/common-go:lib - -replace k8s.io/kube-proxy => k8s.io/kube-proxy v0.22.2 // leeway indirect from components/common-go:lib - -replace k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.22.2 // leeway indirect from components/common-go:lib - -replace k8s.io/kubelet => k8s.io/kubelet v0.22.2 // leeway indirect from components/common-go:lib - -replace k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.22.2 // leeway indirect from components/common-go:lib - -replace k8s.io/metrics => k8s.io/metrics v0.22.2 // leeway indirect from components/common-go:lib - -replace k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.22.2 // leeway indirect from components/common-go:lib - -replace k8s.io/component-helpers => k8s.io/component-helpers v0.22.2 // leeway indirect from components/common-go:lib - -replace k8s.io/controller-manager => k8s.io/controller-manager v0.22.2 // leeway indirect from components/common-go:lib - -replace k8s.io/kubectl => k8s.io/kubectl v0.22.2 // leeway indirect from components/common-go:lib - -replace k8s.io/mount-utils => k8s.io/mount-utils v0.22.2 // leeway indirect from components/common-go:lib - -replace k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.22.2 // leeway indirect from components/common-go:lib diff --git a/components/ee/ws-scheduler/go.sum b/components/ee/ws-scheduler/go.sum deleted file mode 100644 index 6d46772f98309c..00000000000000 --- a/components/ee/ws-scheduler/go.sum +++ /dev/null @@ -1,690 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0 h1:3ithwDMr7/3vpAMXiH+ZQnYbuIsh+OPhUPMFC9enmn0= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/HdrHistogram/hdrhistogram-go v1.1.0 h1:6dpdDPTRoo78HxAJ6T1HfMiKSnqhgRRqzCuPshRkQ7I= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v4.11.0+incompatible h1:glyUF9yIYtMHzn8xaKw5rMhdWcwsYV8dZHIq5567/xs= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-ozzo/ozzo-validation v3.6.0+incompatible h1:msy24VGS42fKO9K1vLz82/GeYW1cILu7Nuuj1N3BBkE= -github.com/go-ozzo/ozzo-validation v3.6.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= -github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/uber/jaeger-client-go v2.29.1+incompatible h1:R9ec3zO3sGpzs0abd43Y+fBZRJ9uiH6lXyR/+u6brW4= -github.com/uber/jaeger-client-go v2.29.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= -github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.8.0 h1:CUhrE4N1rqSE6FM9ecihEjRkLQu8cDfgDyoOs83mEY4= -go.uber.org/atomic v1.8.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 h1:ADo5wSpq2gqaCGQWzk7S5vd//0iyyLeAratkEoG5dLE= -golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 h1:RqytpXGR1iVNX7psjB3ff8y7sNFinVFvkx1c8SjBkio= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154 h1:bFFRpT+e8JJVY7lMMfvezL1ZIwqiwmPl2bsE2yx4HqM= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.39.1 h1:f37vZbBVTiJ6jKG5mWz8ySOBxNqy6ViPgyhSdVnxF3E= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.22.2 h1:M8ZzAD0V6725Fjg53fKeTJxGsJvRbk4TEm/fexHMtfw= -k8s.io/api v0.22.2/go.mod h1:y3ydYpLJAaDI+BbSe2xmGcqxiWHmWjkEeIbiwHvnPR8= -k8s.io/apimachinery v0.22.2 h1:ejz6y/zNma8clPVfNDLnPbleBo6MpoFy/HBiBqCouVk= -k8s.io/apimachinery v0.22.2/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= -k8s.io/client-go v0.22.2 h1:DaSQgs02aCC1QcwUdkKZWOeaVsQjYvWv8ZazcZ6JcHc= -k8s.io/client-go v0.22.2/go.mod h1:sAlhrkVDf50ZHx6z4K0S40wISNTarf1r800F+RlCF6U= -k8s.io/component-helpers v0.22.2 h1:guQ9oYclE5LMydWFfAFA+u7SQgQzz2g+YgpJ5QooSyY= -k8s.io/component-helpers v0.22.2/go.mod h1:+N61JAR9aKYSWbnLA88YcFr9K/6ISYvRNybX7QW7Rs8= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.9.0 h1:D7HV+n1V57XeZ0m6tdRkfknthUaM06VFbWldOFh8kzM= -k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e h1:KLHHjkdQFomZy8+06csTWZ0m1343QqxZhR2LJ1OxCYM= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a h1:8dYfu/Fc9Gz2rNJKB9IQRGgQOh2clmRzNIPPY1xLY5g= -k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/components/ee/ws-scheduler/leeway.Dockerfile b/components/ee/ws-scheduler/leeway.Dockerfile deleted file mode 100644 index 20310ebf0412f2..00000000000000 --- a/components/ee/ws-scheduler/leeway.Dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright (c) 2020 Gitpod GmbH. All rights reserved. -# Licensed under the Gitpod Enterprise Source Code License, -# See License.enterprise.txt in the project root folder. - -FROM alpine:3.15 - -# Ensure latest packages are present, like security updates. -RUN apk upgrade --no-cache \ - && apk add --no-cache ca-certificates - -COPY components-ee-ws-scheduler--app/ws-scheduler /app/ws-scheduler - -ARG __GIT_COMMIT -ARG VERSION - -ENV GITPOD_BUILD_GIT_COMMIT=${__GIT_COMMIT} -ENV GITPOD_BUILD_VERSION=${VERSION} -ENTRYPOINT [ "/app/ws-scheduler" ] -CMD [ "-v", "help" ] \ No newline at end of file diff --git a/components/ee/ws-scheduler/main.go b/components/ee/ws-scheduler/main.go deleted file mode 100644 index f45754440a14bc..00000000000000 --- a/components/ee/ws-scheduler/main.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) 2020 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package main - -import ( - _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" - - "github.com/gitpod-io/gitpod/ws-scheduler/cmd" -) - -func main() { - cmd.Execute() -} diff --git a/components/ee/ws-scheduler/pkg/scaler/controller.go b/components/ee/ws-scheduler/pkg/scaler/controller.go deleted file mode 100644 index 8dff9dcc75e33b..00000000000000 --- a/components/ee/ws-scheduler/pkg/scaler/controller.go +++ /dev/null @@ -1,270 +0,0 @@ -// Copyright (c) 2020 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package scaler - -import ( - "context" - "encoding/json" - "sort" - "strings" - "time" - - "golang.org/x/xerrors" -) - -// WorkspaceCount contains the current counts of running workspaces by type. -type WorkspaceCount struct { - Regular int - Ghost int -} - -// Controller encapsulates prescaling strategies -type Controller interface { - // Control starts this controller which is expected to run until the - // context is canceled. Ths workspaceCount channel provides updates whenever the - // curent, regular workspace count changes. - // - // Writing to the returned ghost count channel will reserve as many workspace - // slots as was written, i.e. `ghostCount <- 5` will a total of five slots. - // - // Beware: controllers MUST read from workspaceCount. If they fail to do so, they'll block the scaler. - // - // When the context is canceled and the controller stops, the slotCount channel must be closed. - Control(ctx context.Context, workspaceCount <-chan WorkspaceCount) (ghostCount <-chan int) -} - -// ControllerConfig configures the controller -type ControllerConfig struct { - Kind ControllerType `json:"kind"` - - Constant struct { - Setpoint int `json:"setpoint"` - } `json:"constant"` - SwitchedConstant struct { - DefaultSetpoint int `json:"default"` - Setpoints []SwitchedSetpoint `json:"setpoints"` - } `json:"switchedConstant"` -} - -// ControllerType names a kind of controller -type ControllerType string - -const ( - // ControllerConstantTarget creates a FixedSlotCount controller - ControllerConstantTarget ControllerType = "constant" - - // ControllerSwitchedConstantTargets switches setpoints over time - ControllerSwitchedConstantTargets ControllerType = "switchedConstant" -) - -// NewController produces a new controller from configuration -func NewController(c ControllerConfig) (Controller, error) { - switch c.Kind { - case ControllerConstantTarget: - return &ConstantSetpointController{Target: c.Constant.Setpoint}, nil - case ControllerSwitchedConstantTargets: - return NewSwitchedSetpointController(c.SwitchedConstant.DefaultSetpoint, c.SwitchedConstant.Setpoints) - default: - return nil, xerrors.Errorf("unknown controller kind: %v", c.Kind) - } -} - -// ConstantSetpointController maintains a steadily fixed number of ghost workspaces -type ConstantSetpointController struct { - Target int -} - -// Control starts this controller -func (f *ConstantSetpointController) Control(ctx context.Context, workspaceCount <-chan WorkspaceCount) (ghostCount <-chan int) { - res := make(chan int) - go func() { - defer close(res) - for { - select { - case <-ctx.Done(): - return - case <-workspaceCount: - res <- f.Target - } - } - }() - return res -} - -// TimeOfDay is a time during the day. It unmarshals from JSON as hh:mm:ss string. -type TimeOfDay time.Time - -// MarshalJSON converts the TimeOfDay into a string -func (t TimeOfDay) MarshalJSON() ([]byte, error) { - str := time.Time(t).String() - res, err := time.Parse("2006-01-02 15:04:05 -0700 MST", str) - if err != nil { - return nil, err - } - - return json.Marshal(res.Format("15:04:05")) -} - -// UnmarshalJSON unmarshales a time of day -func (t *TimeOfDay) UnmarshalJSON(data []byte) error { - input := strings.Trim(string(data), "\"") - res, err := time.Parse("15:04:05", input) - if err != nil { - return err - } - *t = TimeOfDay(res) - return nil -} - -// SwitchedSetpoint is a setpoint valid from a particular time in the day -type SwitchedSetpoint struct { - Time TimeOfDay `json:"time"` - Setpoint int `json:"setpoint"` -} - -// NewSwitchedSetpointController creates a new SwitchedSetpointController -func NewSwitchedSetpointController(defaultSetpoint int, setpoints []SwitchedSetpoint) (*SwitchedSetpointController, error) { - if defaultSetpoint < 0 { - return nil, xerrors.Errorf("defaultSetpoint must be >= 0") - } - - sort.Slice(setpoints, func(i, j int) bool { return time.Time(setpoints[i].Time).Before(time.Time(setpoints[j].Time)) }) - return &SwitchedSetpointController{ - DefaultSetpoint: defaultSetpoint, - Setpoints: setpoints, - time: realtime, - }, nil -} - -// SwitchedSetpointController is like the ConstantSetpointController but with different -// setpoints throughout the day. -type SwitchedSetpointController struct { - DefaultSetpoint int - Setpoints []SwitchedSetpoint - - time timer -} - -// Control starts this controller -func (c *SwitchedSetpointController) Control(ctx context.Context, workspaceCount <-chan WorkspaceCount) (ghostCount <-chan int) { - res := make(chan int, 100) - - setpoint := c.DefaultSetpoint - if csp := c.findSwitchpoint(c.time.Now()); csp != nil { - setpoint = csp.Setpoint - } - - tick, stop := c.time.NewTicker(1 * time.Minute) - go func() { - defer stop() - defer close(res) - for { - select { - case <-ctx.Done(): - return - case t := <-tick: - var nsp int - if csp := c.findSwitchpoint(t); csp != nil { - nsp = csp.Setpoint - } else { - nsp = c.DefaultSetpoint - } - setpoint = nsp - res <- setpoint - case <-workspaceCount: - res <- setpoint - } - } - }() - return res -} - -func (c *SwitchedSetpointController) findSwitchpoint(t time.Time) *SwitchedSetpoint { - if len(c.Setpoints) == 0 { - return nil - } - - tod := time.Date(0, 1, 1, t.Hour(), t.Minute(), t.Second(), t.Nanosecond(), t.Location()) - for i, sp := range c.Setpoints { - spt := time.Time(sp.Time) - if tod.Equal(spt) { - return &sp - } - - // c.Setpoints is sorted ascending in NewSwitchedSetpointController - if tod.After(spt) { - continue - } - if i == 0 { - return nil - } - - return &c.Setpoints[i-1] - } - - return &c.Setpoints[len(c.Setpoints)-1] -} - -// SetpointOverTime is a function that determines the number of ghost workspaces over time. -type SetpointOverTime func(t time.Time) (setpoint int) - -// NewTimedFunctionController produces a new timed function controller -func NewTimedFunctionController(f SetpointOverTime, resolution time.Duration) *TimedFunctionController { - return &TimedFunctionController{ - F: f, - Resolution: resolution, - time: realtime, - } -} - -// TimedFunctionController sample a function over time to set a total amount of ghost workspaces -// that ought to be present at that time. -type TimedFunctionController struct { - F func(t time.Time) (setpoint int) - Resolution time.Duration - - time timer -} - -// Control starts this controller -func (c *TimedFunctionController) Control(ctx context.Context, workspaceCount <-chan WorkspaceCount) (ghostDelta <-chan int) { - res := make(chan int) - tick, stop := c.time.NewTicker(c.Resolution) - go func() { - target := 0 - defer close(res) - defer stop() - for { - select { - case <-ctx.Done(): - return - case t := <-tick: - target = c.F(t) - res <- target - case <-workspaceCount: - res <- target - } - } - }() - return res -} - -// SetpointInTime is a sample produced by RenderTimedFunctionController -type SetpointInTime struct { - T time.Time - Setpoint int -} - -// RenderSetpointOverTime renders the behaviour of a SetpointOverTime function -func RenderSetpointOverTime(p SetpointOverTime, start, end time.Time, resolution time.Duration) []SetpointInTime { - var res []SetpointInTime - for t := start; t.Before(end); t = t.Add(resolution) { - res = append(res, SetpointInTime{ - T: t, - Setpoint: p(t), - }) - } - return res -} diff --git a/components/ee/ws-scheduler/pkg/scaler/controller_test.go b/components/ee/ws-scheduler/pkg/scaler/controller_test.go deleted file mode 100644 index d80e14750fc2c9..00000000000000 --- a/components/ee/ws-scheduler/pkg/scaler/controller_test.go +++ /dev/null @@ -1,288 +0,0 @@ -// Copyright (c) 2020 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package scaler - -import ( - "context" - "encoding/json" - "fmt" - "testing" - "time" - - "github.com/google/go-cmp/cmp" -) - -func TestConstantSetpointController(t *testing.T) { - type Step struct { - Input int - Expected int - } - tests := []struct { - Name string - Target int - Steps []Step - }{ - { - Name: "0 target", - Target: 0, - Steps: []Step{ - {0, 0}, - {10, 0}, - }, - }, - { - Name: "10 target", - Target: 10, - Steps: []Step{ - {0, 10}, - {10, 10}, - {5, 10}, - }, - }, - } - - for _, test := range tests { - t.Run(test.Name, func(t *testing.T) { - c := &ConstantSetpointController{Target: test.Target} - inc := make(chan WorkspaceCount) - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - out := c.Control(ctx, inc) - for i, s := range test.Steps { - t.Run(fmt.Sprintf("step_%03d", i), func(t *testing.T) { - inc <- WorkspaceCount{Ghost: s.Input} - act := <-out - - if diff := cmp.Diff(s.Expected, act); diff != "" { - t.Errorf("unexpected result (-want +got):\n%s", diff) - } - }) - } - }) - } -} - -func TestTimedFunctionController(t *testing.T) { - type Step struct { - Time time.Time - Target int - } - tests := []struct { - Name string - F SetpointOverTime - Steps []Step - }{ - { - Name: "linear", - F: func(t time.Time) (setpoint int) { - return int(t.Sub(time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC)).Seconds()) - }, - Steps: []Step{ - {Time: time.Date(2020, 1, 1, 5, 0, 0, 0, time.UTC), Target: 18000}, - {Time: time.Date(2020, 1, 1, 6, 0, 0, 0, time.UTC), Target: 21600}, - {Time: time.Date(2020, 1, 1, 7, 0, 0, 0, time.UTC), Target: 25200}, - {Time: time.Date(2020, 1, 1, 8, 0, 0, 0, time.UTC), Target: 28800}, - }, - }, - } - - for _, test := range tests { - t.Run(test.Name, func(t *testing.T) { - faketime := newFaketime() - c := &TimedFunctionController{ - F: test.F, - time: faketime, - } - inc := make(chan WorkspaceCount) - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - tchan := c.Control(ctx, inc) - - if !faketime.NewTickerCalled { - t.Fatal("NewTicker was not called") - } - - for i, s := range test.Steps { - t.Run(fmt.Sprintf("step_%03d", i), func(t *testing.T) { - faketime.Tick <- s.Time - act := <-tchan - - if diff := cmp.Diff(s.Target, act); diff != "" { - t.Errorf("unexpected result (-want +got):\n%s", diff) - } - }) - } - }) - } -} - -func TestSwitchedSetpointController(t *testing.T) { - p := func(tod string) TimeOfDay { - res, err := time.Parse("15:04:05", tod) - if err != nil { - t.Fatal(err) - } - return TimeOfDay(res) - } - - type Step struct { - Time TimeOfDay - Target int - } - tests := []struct { - Name string - DefaultSetpoint int - Setpoints []SwitchedSetpoint - Steps []Step - }{ - { - Name: "basic switchover", - DefaultSetpoint: 2, - Setpoints: []SwitchedSetpoint{ - {Time: p("08:00:00"), Setpoint: 10}, - {Time: p("12:00:00"), Setpoint: 5}, - {Time: p("18:00:00"), Setpoint: 1}, - }, - Steps: []Step{ - {Time: p("05:00:00"), Target: 2}, - {Time: p("09:00:00"), Target: 10}, - {Time: p("10:00:00"), Target: 10}, - {Time: p("12:00:00"), Target: 5}, - {Time: p("13:00:00"), Target: 5}, - {Time: p("19:00:00"), Target: 1}, - }, - }, - { - Name: "next day", - DefaultSetpoint: 2, - Setpoints: []SwitchedSetpoint{ - {Time: p("08:00:00"), Setpoint: 10}, - }, - Steps: []Step{ - {Time: p("05:00:00"), Target: 2}, - {Time: p("09:00:00"), Target: 10}, - {Time: p("05:00:00"), Target: 2}, - }, - }, - } - - for _, test := range tests { - t.Run(test.Name, func(t *testing.T) { - c, err := NewSwitchedSetpointController(test.DefaultSetpoint, test.Setpoints) - if err != nil { - t.Fatal(err) - } - - faketime := newFaketime() - c.time = faketime - faketime.ProvideNow = func() time.Time { return time.Time(p("00:00:00")) } - - inc := make(chan WorkspaceCount) - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - schan := c.Control(ctx, inc) - - if !faketime.NewTickerCalled { - t.Fatal("NewTicker was not called") - } - - for i, s := range test.Steps { - t.Run(fmt.Sprintf("step_%03d_%s", i, time.Time(s.Time).String()), func(t *testing.T) { - faketime.Tick <- time.Time(s.Time) - act := <-schan - - if diff := cmp.Diff(s.Target, act); diff != "" { - t.Errorf("unexpected result (-want +got):\n%s", diff) - } - }) - } - }) - } -} - -func TestTimeOfDayMarshalJSON(t *testing.T) { - tests := []struct { - Input time.Time - Expectation string - Error string - }{ - {time.Date(0, 1, 1, 0, 0, 0, 0, time.UTC), "00:00:00", ""}, - {time.Date(0, 1, 1, 23, 59, 59, 0, time.UTC), "23:59:59", ""}, - {time.Date(0, 1, 1, 12, 0, 0, 0, time.UTC), "12:00:00", ""}, - } - - for _, test := range tests { - t.Run(test.Expectation, func(t *testing.T) { - input := TimeOfDay(test.Input) - b, err := json.Marshal(input) - - var errmsg string - if err != nil { - errmsg = err.Error() - } - if errmsg != test.Error { - t.Fatalf("unepxected error: want %v, got %v", test.Error, errmsg) - return - } - if err != nil { - return - } - - e, err := json.Marshal(test.Expectation) - if err != nil { - t.Fatal(err.Error()) - return - } - - marshalled := string(b) - expectation := string(e) - - if marshalled != expectation { - t.Fatalf("unexpected result: want %v, got %v", expectation, marshalled) - return - } - }) - } -} - -func TestTimeOfDayUnmarshalJSON(t *testing.T) { - tests := []struct { - Input string - Expectation time.Time - Error string - }{ - {"00:00:00", time.Date(0, 1, 1, 0, 0, 0, 0, time.UTC), ""}, - {"23:59:59", time.Date(0, 1, 1, 23, 59, 59, 0, time.UTC), ""}, - {"12:00:00", time.Date(0, 1, 1, 12, 0, 0, 0, time.UTC), ""}, - {"24:00:00", time.Date(0, 1, 1, 0, 0, 0, 0, time.UTC), "parsing time \"24:00:00\": hour out of range"}, - } - - for _, test := range tests { - t.Run(test.Input, func(t *testing.T) { - var act TimeOfDay - err := json.Unmarshal([]byte(fmt.Sprintf("\"%s\"", test.Input)), &act) - - var errmsg string - if err != nil { - errmsg = err.Error() - } - if errmsg != test.Error { - t.Fatalf("unepxected error: want %v, got %v", test.Error, errmsg) - return - } - if err != nil { - return - } - - if time.Time(act) != test.Expectation { - t.Fatalf("unepxected result: want %v, got %v", test.Expectation.String(), time.Time(act).String()) - return - } - }) - } -} diff --git a/components/ee/ws-scheduler/pkg/scaler/driver.go b/components/ee/ws-scheduler/pkg/scaler/driver.go deleted file mode 100644 index 33ac9b41ca32c7..00000000000000 --- a/components/ee/ws-scheduler/pkg/scaler/driver.go +++ /dev/null @@ -1,450 +0,0 @@ -// Copyright (c) 2020 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package scaler - -import ( - "context" - "sort" - "sync" - "time" - - "github.com/docker/distribution/reference" - "github.com/google/uuid" - "github.com/prometheus/client_golang/prometheus" - "golang.org/x/xerrors" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/status" - - common_grpc "github.com/gitpod-io/gitpod/common-go/grpc" - "github.com/gitpod-io/gitpod/common-go/log" - "github.com/gitpod-io/gitpod/common-go/namegen" - "github.com/gitpod-io/gitpod/common-go/util" - csapi "github.com/gitpod-io/gitpod/content-service/api" - "github.com/gitpod-io/gitpod/ws-manager/api" -) - -const ( - // DefaultGhostOwner is the UID of the default owner for ghost workspaces - DefaultGhostOwner = "00000000-0000-0000-0000-000000000000" -) - -// WorkspaceManagerPrescaleDriverConfig configures a ws-manager based prescale driver -type WorkspaceManagerPrescaleDriverConfig struct { - WsManager WorkspaceManagerConfig `json:"wsman"` - GhostOwner string `json:"ghostOwner"` - WorkspaceImage string `json:"workspaceImage"` - IDEImage string `json:"ideImage"` - SupervisorImage string `json:"supervisorImage"` - FeatureFlags []api.WorkspaceFeatureFlag `json:"featureFlags"` - - MaxGhostWorkspaces int `json:"maxGhostWorkspaces"` - SchedulerInterval util.Duration `json:"schedulerInterval"` - - Renewal struct { - Interval util.Duration `json:"interval"` - Percentage int `json:"percentage"` - } `json:"renewal"` -} - -type WorkspaceManagerConfig struct { - Addr string `json:"addr"` - TLS *struct { - CA string `json:"ca"` - Certificate string `json:"crt"` - PrivateKey string `json:"key"` - } `json:"tls"` -} - -// NewWorkspaceManagerPrescaleDriver creates a new WorkspaceManagerPrescale -func NewWorkspaceManagerPrescaleDriver(config WorkspaceManagerPrescaleDriverConfig, controller Controller) (*WorkspaceManagerPrescaleDriver, error) { - if config.GhostOwner == "" { - config.GhostOwner = DefaultGhostOwner - } - if config.Renewal.Percentage < 0 && 100 < config.Renewal.Percentage { - return nil, xerrors.Errorf("renewal.percentage must be between 0 and 100 (inclusive)") - } - if config.SchedulerInterval <= 0 { - return nil, xerrors.Errorf("schedulerInterval must be greater than zero") - } - imgRef, err := reference.ParseNormalizedNamed(config.WorkspaceImage) - if err != nil { - return nil, xerrors.Errorf("cannot parse workspaceImage") - } - config.WorkspaceImage = imgRef.String() - - grpcOpts := common_grpc.DefaultClientOptions() - if config.WsManager.TLS != nil { - tlsConfig, err := common_grpc.ClientAuthTLSConfig( - config.WsManager.TLS.CA, config.WsManager.TLS.Certificate, config.WsManager.TLS.PrivateKey, - common_grpc.WithSetRootCAs(true), - ) - if err != nil { - log.WithField("config", config.WsManager.TLS).Error("Cannot load ws-manager certs - this is a configuration issue.") - return nil, xerrors.Errorf("cannot load ws-manager certs: %w", err) - } - - grpcOpts = append(grpcOpts, grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig))) - } else { - grpcOpts = append(grpcOpts, grpc.WithInsecure()) - } - - conn, err := grpc.Dial(config.WsManager.Addr, grpcOpts...) - if err != nil { - return nil, xerrors.Errorf("cannot connect to ws-manager: %w", err) - } - return &WorkspaceManagerPrescaleDriver{ - Config: config, - Client: api.NewWorkspaceManagerClient(conn), - conn: conn, - Controller: controller, - time: realtime, - stop: make(chan struct{}), - }, nil -} - -// WorkspaceManagerPrescaleDriver implements a prescale driver using ws-manager's ghost pods -type WorkspaceManagerPrescaleDriver struct { - Config WorkspaceManagerPrescaleDriverConfig - - Client api.WorkspaceManagerClient - conn *grpc.ClientConn - - Controller Controller - - time timer - metrics *metrics - - stop chan struct{} - once sync.Once -} - -type workspaceStatus struct { - Count WorkspaceCount - DeletionCandidates []string -} - -// RegisterMetrics registers prometheus metrics for this driver -func (wspd *WorkspaceManagerPrescaleDriver) RegisterMetrics(reg prometheus.Registerer) error { - wspd.metrics = newMetrics() - return wspd.metrics.Register(reg) -} - -// Run runs the prescale driver until Stop() is called -func (wspd *WorkspaceManagerPrescaleDriver) Run() { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - statusChan := make(chan workspaceStatus) - go func() { - for { - wasAvailable, err := wspd.maintainWorkspaceStatus(ctx, statusChan) - if err == context.Canceled { - return - } - if s, ok := status.FromError(err); ok && s.Code() == codes.Unavailable { - if wasAvailable { - log.WithError(err).Error("ws-manager is unavailable") - } - } else if err != nil { - log.WithError(err).Error("cannot maintain workspace count") - } - - // We want to wait here because otherwise we might bombard ws-manager with - // GetWorkspace calls. - time.Sleep(10 * time.Second) - } - }() - - var renewal <-chan time.Time - if wspd.Config.Renewal.Percentage > 0 && wspd.Config.Renewal.Interval > 0 { - tc, stop := wspd.time.NewTicker(time.Duration(wspd.Config.Renewal.Interval)) - defer stop() - renewal = tc - - log.WithField("percentage", wspd.Config.Renewal.Percentage).WithField("interval", wspd.Config.Renewal.Interval.String()).Debug("enabled ghost workspace renewal") - } - scheduleGhosts, stopSchedulingGhosts := wspd.time.NewTicker(time.Duration(wspd.Config.SchedulerInterval)) - defer stopSchedulingGhosts() - - var ( - counts = make(chan WorkspaceCount, 100) - status workspaceStatus - startingGhosts = make(map[string]time.Time) - setpoint int - ) - - canStartGhost := func() bool { - if status.Count.Ghost >= wspd.Config.MaxGhostWorkspaces { - log.WithField("limit", wspd.Config.MaxGhostWorkspaces).Warn("max number of ghost workspace reached") - return false - } - return true - } - registerStartingGhost := func(id string) { - startingGhosts[id] = wspd.time.Now() - status.Count.Ghost++ - } - - cchan := wspd.Controller.Control(ctx, counts) - for { - select { - case <-ctx.Done(): - return - case status = <-statusChan: - // we've just made contact with the real world and received that actual - // status from Kubernetes. We use this real-world-view to update our own - // state, e.g. updating deletion candidates or incorporating starting ghosts - // which aren't seen by Kubernetes yet. - for _, id := range status.DeletionCandidates { - delete(startingGhosts, id) - } - status.Count.Ghost += len(startingGhosts) - counts <- status.Count - wspd.metrics.OnGhostCountChange(status.Count.Ghost) - log.WithField("counts", status.Count).Debug("status update") - case <-renewal: - if len(status.DeletionCandidates) == 0 { - // no deletion candidates means there's nothing to renew - continue - } - d := int(float64(len(status.DeletionCandidates)) * float64(wspd.Config.Renewal.Percentage) * 0.01) - if d == 0 { - // we have deletion candidates, but the percentage was so low that it wasn't enough for a single - // candidate to be selected. If we left it at that, we might never renew anything, hence forcing - // the renewal of at least one candidate. - d = 1 - } - if d > len(status.DeletionCandidates) { - d = len(status.DeletionCandidates) - } - // we're only deleting ghosts here, not starting any. In the next scheduling interval, we'll restart - // the neccesary ghosts. - err := wspd.stopGhostWorkspaces(ctx, status.DeletionCandidates[:d]) - if err != nil { - log.WithError(err).Error("cannot stop ghost workspaces during renewal") - continue - } - log.WithField("delta", d).WithField("ghostCount", status.Count.Ghost).Debug("deleted ghost workspaces for renewal") - case setpoint = <-cchan: - // we've already set the new setpoint - wait for scheduleGhosts to act on it. - wspd.metrics.OnSetpointChange(setpoint) - case <-scheduleGhosts: - d := setpoint - status.Count.Ghost - - var err error - if d < 0 { - d *= -1 - if d > len(status.DeletionCandidates) { - d = len(status.DeletionCandidates) - } - err = wspd.stopGhostWorkspaces(ctx, status.DeletionCandidates[:d]) - } else if d > 0 { - err = wspd.startGhostWorkspaces(ctx, d, canStartGhost, registerStartingGhost) - } else { - continue - } - if err != nil { - log.WithError(err).Error("failed to realise ghost workspace delta") - continue - } - log.WithField("setpoint", setpoint).WithField("delta", d).Debug("(de)scheduled ghost workspaces") - } - } -} - -func (wspd *WorkspaceManagerPrescaleDriver) startGhostWorkspaces(ctx context.Context, count int, canStartGhost func() bool, registerStartingGhost func(id string)) (err error) { - ctx, cancel := context.WithTimeout(ctx, 15*time.Second) - defer cancel() - - for i := 0; i < count; i++ { - if !canStartGhost() { - return nil - } - - instanceUUID, err := uuid.NewRandom() - if err != nil { - return err - } - instanceID := instanceUUID.String() - metaID, err := namegen.GenerateWorkspaceID() - if err != nil { - return err - } - - _, err = wspd.Client.StartWorkspace(ctx, &api.StartWorkspaceRequest{ - Type: api.WorkspaceType_GHOST, - Id: instanceID, - Metadata: &api.WorkspaceMetadata{ - MetaId: metaID, - Owner: wspd.Config.GhostOwner, - }, - ServicePrefix: instanceID, - Spec: &api.StartWorkspaceSpec{ - Admission: api.AdmissionLevel_ADMIT_OWNER_ONLY, - Timeout: "60m", - CheckoutLocation: "none", - FeatureFlags: wspd.Config.FeatureFlags, - Git: &api.GitSpec{ - Email: "none@gitpod.io", - Username: "gitpod-ghost", - }, - DeprecatedIdeImage: wspd.Config.IDEImage, - IdeImage: &api.IDEImage{ - WebRef: wspd.Config.IDEImage, - SupervisorRef: wspd.Config.SupervisorImage, - }, - Initializer: &csapi.WorkspaceInitializer{ - Spec: &csapi.WorkspaceInitializer_Empty{ - Empty: &csapi.EmptyInitializer{}, - }, - }, - WorkspaceLocation: "none", - WorkspaceImage: wspd.Config.WorkspaceImage, - }, - }) - if err != nil { - return err - } - registerStartingGhost(instanceID) - } - - return nil -} - -func (wspd *WorkspaceManagerPrescaleDriver) stopGhostWorkspaces(ctx context.Context, ids []string) (err error) { - defer func() { - if err != nil { - err = xerrors.Errorf("cannot stop ghosts: %w", err) - } - }() - - for _, id := range ids { - _, err := wspd.Client.StopWorkspace(ctx, &api.StopWorkspaceRequest{Id: id, Policy: api.StopWorkspacePolicy_NORMALLY}) - if status.Code(err) == codes.NotFound { - continue - } - if err != nil { - return err - } - } - - return nil -} - -func (wspd *WorkspaceManagerPrescaleDriver) maintainWorkspaceStatus(ctx context.Context, counts chan<- workspaceStatus) (wasAvailable bool, err error) { - type workspaceState struct { - Started time.Time - Type api.WorkspaceType - } - - wss, err := wspd.Client.GetWorkspaces(ctx, &api.GetWorkspacesRequest{}) - if err != nil { - return - } - wasAvailable = true - - state := make(map[string]workspaceState) - produceStatus := func() workspaceStatus { - var res workspaceStatus - res.DeletionCandidates = make([]string, 0, len(state)) - for id, s := range state { - switch s.Type { - case api.WorkspaceType_GHOST: - res.DeletionCandidates = append(res.DeletionCandidates, id) - res.Count.Ghost++ - case api.WorkspaceType_REGULAR: - res.Count.Regular++ - } - } - - sort.Slice(res.DeletionCandidates, func(i, j int) bool { - var ( - ti = state[res.DeletionCandidates[i]].Started - tj = state[res.DeletionCandidates[j]].Started - ) - return ti.Before(tj) - }) - return res - } - - for _, s := range wss.Status { - var startedAt time.Time - err := s.Metadata.StartedAt.CheckValid() - if err != nil { - log.WithError(err).WithFields(log.OWI(s.Metadata.Owner, s.Metadata.MetaId, s.Id)).Warn("cannot convert startedAt timestamp") - startedAt = time.Now() - } else { - startedAt = s.Metadata.StartedAt.AsTime() - } - - state[s.Id] = workspaceState{ - Started: startedAt, - Type: s.Spec.Type, - } - } - select { - case <-ctx.Done(): - return wasAvailable, ctx.Err() - case counts <- produceStatus(): - } - - sub, err := wspd.Client.Subscribe(ctx, &api.SubscribeRequest{}) - if err != nil { - return wasAvailable, err - } - for { - resp, err := sub.Recv() - if err != nil { - return wasAvailable, err - } - s := resp.GetStatus() - if s == nil { - continue - } - - _, known := state[s.Id] - if known && s.Phase == api.WorkspacePhase_STOPPED { - delete(state, s.Id) - } else if !known && s.Phase == api.WorkspacePhase_PENDING { - var startedAt time.Time - err := s.Metadata.StartedAt.CheckValid() - if err != nil { - log.WithError(err).WithFields(log.OWI(s.Metadata.Owner, s.Metadata.MetaId, s.Id)).Warn("cannot convert startedAt timestamp") - startedAt = time.Now() - } else { - startedAt = s.Metadata.StartedAt.AsTime() - } - - state[s.Id] = workspaceState{ - Started: startedAt, - Type: s.Spec.Type, - } - state[s.Id] = workspaceState{ - Started: startedAt, - Type: s.Spec.Type, - } - } else { - continue - } - - select { - case <-ctx.Done(): - return wasAvailable, ctx.Err() - case counts <- produceStatus(): - } - } -} - -// Stop stops the driver -func (wspd *WorkspaceManagerPrescaleDriver) Stop() { - wspd.once.Do(func() { - close(wspd.stop) - if wspd.conn != nil { - wspd.conn.Close() - } - }) -} diff --git a/components/ee/ws-scheduler/pkg/scaler/driver_test.go b/components/ee/ws-scheduler/pkg/scaler/driver_test.go deleted file mode 100644 index d307313689206d..00000000000000 --- a/components/ee/ws-scheduler/pkg/scaler/driver_test.go +++ /dev/null @@ -1,319 +0,0 @@ -// Copyright (c) 2020 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package scaler - -import ( - "context" - "testing" - "time" - - "github.com/golang/mock/gomock" - "github.com/google/go-cmp/cmp" - "github.com/sirupsen/logrus" - "google.golang.org/protobuf/types/known/timestamppb" - - "github.com/gitpod-io/gitpod/common-go/log" - "github.com/gitpod-io/gitpod/common-go/util" - "github.com/gitpod-io/gitpod/ws-manager/api" - wsmock "github.com/gitpod-io/gitpod/ws-manager/api/mock" -) - -func TestWorkspaceManagerPrescaleDriverRenewal(t *testing.T) { - tests := []struct { - Name string - Workspaces []*api.WorkspaceStatus - RenewalPercentage int - ExpectedDeletions []string - }{ - { - Name: "no ghosts", - Workspaces: []*api.WorkspaceStatus{ - {Id: "w1", Metadata: &api.WorkspaceMetadata{StartedAt: timestamppb.Now()}, Phase: api.WorkspacePhase_RUNNING, Spec: &api.WorkspaceSpec{Type: api.WorkspaceType_REGULAR}}, - }, - RenewalPercentage: 100, - }, - { - Name: "one ghost", - Workspaces: []*api.WorkspaceStatus{ - ghostWorkspace("g1"), - }, - RenewalPercentage: 100, - ExpectedDeletions: []string{"g1"}, - }, - { - Name: "mixed ghost regular", - Workspaces: []*api.WorkspaceStatus{ - ghostWorkspace("g1"), - {Id: "w1", Metadata: &api.WorkspaceMetadata{StartedAt: timestamppb.Now()}, Phase: api.WorkspacePhase_RUNNING, Spec: &api.WorkspaceSpec{Type: api.WorkspaceType_REGULAR}}, - }, - RenewalPercentage: 100, - ExpectedDeletions: []string{"g1"}, - }, - { - Name: "renew half", - Workspaces: []*api.WorkspaceStatus{ - ghostWorkspace("g1"), - ghostWorkspace("g2"), - {Id: "w1", Metadata: &api.WorkspaceMetadata{StartedAt: timestamppb.Now()}, Phase: api.WorkspacePhase_RUNNING, Spec: &api.WorkspaceSpec{Type: api.WorkspaceType_REGULAR}}, - }, - RenewalPercentage: 50, - ExpectedDeletions: []string{"g1"}, - }, - } - - log.Log.Logger.SetLevel(logrus.FatalLevel) - for _, test := range tests { - t.Run(test.Name, func(t *testing.T) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - - statusUp := make(chan struct{}, 100) - wsman := wsmock.NewMockWorkspaceManagerClient(ctrl) - wsman.EXPECT().GetWorkspaces(gomock.Any(), gomock.Any(), gomock.Any()).Do(func(a, b interface{}, _ ...interface{}) { statusUp <- struct{}{} }).Return(&api.GetWorkspacesResponse{ - Status: test.Workspaces, - }, nil) - wsman.EXPECT().Subscribe(gomock.Any(), gomock.Any()).DoAndReturn(func(ctx context.Context, _ interface{}, _ ...interface{}) (api.WorkspaceManager_SubscribeClient, error) { - sub := wsmock.NewMockWorkspaceManager_SubscribeClient(ctrl) - sub.EXPECT().Recv().Do(func() { <-ctx.Done() }) - return sub, nil - }).AnyTimes() - - delchan := make(chan string) - wsman.EXPECT().StopWorkspace(gomock.Any(), gomock.Any()).Do(func(ctx context.Context, req *api.StopWorkspaceRequest, _ ...interface{}) (*api.StopWorkspaceResponse, error) { - delchan <- req.Id - return &api.StopWorkspaceResponse{}, nil - }).AnyTimes() - - renewalTicker := make(chan time.Time) - defer close(renewalTicker) - deadTicker := make(chan time.Time) - defer close(deadTicker) - faketime := multiFakeTime{ - ProvideTicker: func(d time.Duration) (<-chan time.Time, func()) { - if d == 42*time.Minute { - return renewalTicker, func() {} - } - return deadTicker, func() {} - }, - ProvideNow: time.Now, - } - - var ( - stopChan = make(chan struct{}) - controller = &testController{ - StatusUpdate: make(chan WorkspaceCount), - Res: make(chan int), - } - ) - - var config WorkspaceManagerPrescaleDriverConfig - config.Renewal.Percentage = test.RenewalPercentage - config.Renewal.Interval = util.Duration(42 * time.Minute) - driver := &WorkspaceManagerPrescaleDriver{ - Config: config, - conn: nil, - stop: stopChan, - Client: wsman, - Controller: controller, - time: faketime, - } - go driver.Run() - defer driver.Stop() - - <-statusUp - count := <-controller.StatusUpdate - // At this point the initial workspace status has propagated through driver. - // We know this because our test controller has seen a status update. - - // Let's trigger the renewal - renewalTicker <- time.Now() - - var deletions []string - for range test.ExpectedDeletions { - deletions = append(deletions, <-delchan) - } - if diff := cmp.Diff(test.ExpectedDeletions, deletions); diff != "" { - t.Errorf("unexpected deletions (-want +got):\n%s", diff) - } - - // When we can write to the controller's result channel again, the drivers main loop - // is unblocked, hence the renewal is done. - controller.Res <- count.Ghost - }) - } -} - -func ghostWorkspace(name string) *api.WorkspaceStatus { - return &api.WorkspaceStatus{ - Id: name, - Metadata: &api.WorkspaceMetadata{ - StartedAt: timestamppb.Now(), - }, - Phase: api.WorkspacePhase_RUNNING, - Spec: &api.WorkspaceSpec{ - Type: api.WorkspaceType_GHOST, - }, - } -} - -func TestWorkspaceManagerPrescaleDriverControl(t *testing.T) { - tests := []struct { - Name string - Workspaces []*api.WorkspaceStatus - Setpoint int - MaxGhostWorkspaces int - ExpectedStarts int - ExpectedStops int - }{ - { - Name: "start 10", - MaxGhostWorkspaces: 10, - Setpoint: 10, - ExpectedStarts: 10, - }, - { - Name: "MaxGhostWorkspaces 5, start 10", - MaxGhostWorkspaces: 5, - Setpoint: 10, - ExpectedStarts: 5, - }, - { - Name: "stop 5", - Workspaces: []*api.WorkspaceStatus{ - ghostWorkspace("g1"), - ghostWorkspace("g2"), - ghostWorkspace("g3"), - ghostWorkspace("g4"), - ghostWorkspace("g5"), - ghostWorkspace("g6"), - ghostWorkspace("g7"), - ghostWorkspace("g8"), - ghostWorkspace("g9"), - ghostWorkspace("g10"), - }, - MaxGhostWorkspaces: 10, - Setpoint: 5, - ExpectedStops: 5, - }, - } - - log.Log.Logger.SetLevel(logrus.FatalLevel) - for _, test := range tests { - t.Run(test.Name, func(t *testing.T) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - - statusUp := make(chan struct{}, 100) - wsman := wsmock.NewMockWorkspaceManagerClient(ctrl) - wsman.EXPECT().GetWorkspaces(gomock.Any(), gomock.Any()).Do(func(a, b interface{}, _ ...interface{}) { statusUp <- struct{}{} }).Return(&api.GetWorkspacesResponse{ - Status: test.Workspaces, - }, nil) - wsman.EXPECT().Subscribe(gomock.Any(), gomock.Any()).DoAndReturn(func(ctx context.Context, _ interface{}, _ ...interface{}) (api.WorkspaceManager_SubscribeClient, error) { - sub := wsmock.NewMockWorkspaceManager_SubscribeClient(ctrl) - sub.EXPECT().Recv().Do(func() { <-ctx.Done() }) - return sub, nil - }).AnyTimes() - - var starts int - wsman.EXPECT().StartWorkspace(gomock.Any(), gomock.Any()).Do(func(ctx context.Context, req *api.StartWorkspaceRequest, _ ...interface{}) (*api.StartWorkspaceResponse, error) { - starts++ - return &api.StartWorkspaceResponse{}, nil - }).AnyTimes() - - var stops int - wsman.EXPECT().StopWorkspace(gomock.Any(), gomock.Any()).Do(func(ctx context.Context, req *api.StopWorkspaceRequest, _ ...interface{}) (*api.StopWorkspaceResponse, error) { - stops++ - return &api.StopWorkspaceResponse{}, nil - }).AnyTimes() - - scheduleTicker := make(chan time.Time) - defer close(scheduleTicker) - deadTicker := make(chan time.Time) - defer close(deadTicker) - faketime := multiFakeTime{ - ProvideTicker: func(d time.Duration) (<-chan time.Time, func()) { - if d == 42*time.Minute { - return scheduleTicker, func() {} - } - return deadTicker, func() {} - }, - ProvideNow: time.Now, - } - - var ( - stopChan = make(chan struct{}) - controller = &testController{ - StatusUpdate: make(chan WorkspaceCount), - Res: make(chan int), - } - ) - - var config WorkspaceManagerPrescaleDriverConfig - config.MaxGhostWorkspaces = test.MaxGhostWorkspaces - config.SchedulerInterval = util.Duration(42 * time.Minute) - driver := &WorkspaceManagerPrescaleDriver{ - Config: config, - conn: nil, - stop: stopChan, - Client: wsman, - Controller: controller, - time: faketime, - } - go driver.Run() - defer driver.Stop() - - <-statusUp - <-controller.StatusUpdate - // At this point the initial workspace status has propagated through driver. - // We know this because our test controller has seen a status update. - - // Emit a new setpoint - controller.Res <- test.Setpoint - - // Let's trigger the scheduling - scheduleTicker <- time.Now() - - // If we can write a new setpoint the scheduling must be done - controller.Res <- test.Setpoint - - if diff := cmp.Diff(test.ExpectedStarts, starts); diff != "" { - t.Errorf("unexpected starts (-want +got):\n%s", diff) - } - if diff := cmp.Diff(test.ExpectedStops, stops); diff != "" { - t.Errorf("unexpected stops (-want +got):\n%s", diff) - } - }) - } -} - -type multiFakeTime struct { - ProvideTicker func(d time.Duration) (<-chan time.Time, func()) - ProvideNow func() time.Time -} - -func (t multiFakeTime) NewTicker(d time.Duration) (<-chan time.Time, func()) { - return t.ProvideTicker(d) -} - -func (t multiFakeTime) Now() time.Time { - return t.ProvideNow() -} - -type testController struct { - StatusUpdate chan WorkspaceCount - Res chan int -} - -func (c *testController) Control(ctx context.Context, workspaceCount <-chan WorkspaceCount) (ghostCount <-chan int) { - go func() { - select { - case <-ctx.Done(): - return - case cnt := <-workspaceCount: - c.StatusUpdate <- cnt - } - }() - return c.Res -} diff --git a/components/ee/ws-scheduler/pkg/scaler/metrics.go b/components/ee/ws-scheduler/pkg/scaler/metrics.go deleted file mode 100644 index e6660f78c3c840..00000000000000 --- a/components/ee/ws-scheduler/pkg/scaler/metrics.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) 2020 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package scaler - -import "github.com/prometheus/client_golang/prometheus" - -type metrics struct { - setpointGauge prometheus.Gauge - ghostCountGauge prometheus.Gauge -} - -func newMetrics() *metrics { - return &metrics{ - setpointGauge: prometheus.NewGauge(prometheus.GaugeOpts{ - Name: "driver_setpoint", - Help: "setpoint of the scaler driver", - }), - ghostCountGauge: prometheus.NewGauge(prometheus.GaugeOpts{ - Name: "ghost_count", - Help: "current number of Ghost workspaces scaler is aware of", - }), - } -} - -// Register registers all metrics scaler can export -func (m *metrics) Register(reg prometheus.Registerer) error { - if m == nil { - return nil - } - - collectors := []prometheus.Collector{ - m.setpointGauge, - m.ghostCountGauge, - } - for _, c := range collectors { - err := reg.Register(c) - if err != nil { - return err - } - } - - return nil -} - -func (m *metrics) OnSetpointChange(v int) { - if m == nil { - return - } - m.setpointGauge.Set(float64(v)) -} - -func (m *metrics) OnGhostCountChange(v int) { - if m == nil { - return - } - m.ghostCountGauge.Set(float64(v)) -} diff --git a/components/ee/ws-scheduler/pkg/scaler/time.go b/components/ee/ws-scheduler/pkg/scaler/time.go deleted file mode 100644 index ef32c48e881e75..00000000000000 --- a/components/ee/ws-scheduler/pkg/scaler/time.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2020 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package scaler - -import "time" - -// Time encapsulates the timing functions that driver and controller need. -// We introduce this interface to allow for testing. -type timer interface { - // NewTicker creates a new time.Ticker - NewTicker(resolution time.Duration) (c <-chan time.Time, stop func()) - // Now() returns the current time - Now() time.Time -} - -// realtime is the actual real-world time -var realtime timer = stdlib{} - -type stdlib struct{} - -// NewTicker creates a new time.Ticker -func (stdlib) NewTicker(d time.Duration) (c <-chan time.Time, stop func()) { - t := time.NewTicker(d) - return t.C, t.Stop -} - -// Now() returns the current time -func (stdlib) Now() time.Time { - return time.Now() -} - -type faketime struct { - Tick chan time.Time - ProvideNow func() time.Time - NewTickerCalled bool -} - -func newFaketime() *faketime { - return &faketime{ - Tick: make(chan time.Time), - ProvideNow: time.Now, - } -} - -// NewTicker creates a new time.Ticker -func (f *faketime) NewTicker(d time.Duration) (c <-chan time.Time, stop func()) { - f.NewTickerCalled = true - return f.Tick, func() { close(f.Tick) } -} - -// Now() returns the current time -func (f *faketime) Now() time.Time { - return time.Now() -} diff --git a/components/ee/ws-scheduler/pkg/scheduler/config.go b/components/ee/ws-scheduler/pkg/scheduler/config.go deleted file mode 100644 index 13384ac963a662..00000000000000 --- a/components/ee/ws-scheduler/pkg/scheduler/config.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) 2020 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package scheduler - -import ( - validation "github.com/go-ozzo/ozzo-validation" -) - -// Configuration is the configuration of ws-scheduler -type Configuration struct { - // SchedulerName is the name of this scheduler - pods need to have the scheduler name configured to be scheduled by us - SchedulerName string `json:"schedulerName"` - // Namespace we listen for pods to schedule in - // Technically, the pods namespace is irrelevant to the scheduler: it does not assign namespaces nor does it operate on namespaced objects. - // This only for being able to deploy multiple schedulers into the same cluster without having them interfer with each other. - Namespace string `json:"namespace"` - // NodeLabelSelector is the selector thrown at Kubernetes to return the nodes that are meant for scheduling workspaces on - NodeLabelSelector map[string]string `json:"nodeLabelSelector"` - // StrategyName is the name of the strategy to use - StrategyName StrategyName `json:"strategyName"` - // DensityAndExperienceConfig is the (optional) config for the DensityAndExperience strategy - DensityAndExperienceConfig *DensityAndExperienceConfig `json:"densityAndExperienceConfig,omitempty"` - // RAMSafetyBuffer reduces the amount of available RAM per node and is meant to make sure we do not overbook nodes - RAMSafetyBuffer string `json:"ramSafetyBuffer,omitempty"` - // RateLimit configures the scheduling rate limit. Optional to ease deployment problems. - RateLimit *RateLimitConfig `json:"rateLimit,omitempty"` -} - -// DensityAndExperienceConfig is the config for the DensityAndExperience strategy -type DensityAndExperienceConfig struct { - WorkspaceFreshPeriodSeconds int `json:"workspaceFreshPeriodSeconds"` - NodeFreshWorkspaceLimit int `json:"nodeFreshWorkspaceLimit"` -} - -type RateLimitConfig struct { - MaxRPS uint `json:"maxRPS"` -} - -// DefaultDensityAndExperienceConfig creates the config with default values -func DefaultDensityAndExperienceConfig() *DensityAndExperienceConfig { - return &DensityAndExperienceConfig{ - WorkspaceFreshPeriodSeconds: 120, - NodeFreshWorkspaceLimit: 2, - } -} - -// Validate validates the configuration to catch issues during startup and not at runtime -func (c *Configuration) Validate() error { - err := validation.ValidateStruct(c) - return err -} diff --git a/components/ee/ws-scheduler/pkg/scheduler/internal/kubernetes.go b/components/ee/ws-scheduler/pkg/scheduler/internal/kubernetes.go deleted file mode 100644 index eb05f1f4c211ef..00000000000000 --- a/components/ee/ws-scheduler/pkg/scheduler/internal/kubernetes.go +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright (c) 2020 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package internal - -import ( - "golang.org/x/xerrors" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/selection" -) - -// The following is copied from github.com/kubernetes/kubernetes because it's not part of the public API and we need it - -// github.com/kubernetes/kubernetes/pkg/scheduler/algorithm/predicates/predicates.go - -// NodeMatchesNodeSelectorTerms checks if a node's labels satisfy a list of node selector terms, -// terms are ORed, and an empty list of terms will match nothing. -func NodeMatchesNodeSelectorTerms(node *corev1.Node, nodeSelectorTerms []corev1.NodeSelectorTerm) bool { - nodeFields := map[string]string{} - for k, f := range nodeFieldSelectorKeys { - nodeFields[k] = f(node) - } - return matchNodeSelectorTerms(nodeSelectorTerms, labels.Set(node.Labels), fields.Set(nodeFields)) -} - -// github.com/kubernetes/kubernetes/pkg/scheduler/algorithm/types.go - -// nodeFieldSelectorKeys copied from algorithm/types.go -var nodeFieldSelectorKeys = map[string]func(*corev1.Node) string{ - "metadata.name": func(n *corev1.Node) string { return n.Name }, -} - -// github.com/kubernetes/kubernetes/pkg/apis/core/v1/helper/helpers.go - -// matchNodeSelectorTerms checks whether the node labels and fields match node selector terms in ORed; -// nil or empty term matches no objects. -func matchNodeSelectorTerms( - nodeSelectorTerms []corev1.NodeSelectorTerm, - nodeLabels labels.Set, - nodeFields fields.Set, -) bool { - for _, req := range nodeSelectorTerms { - // nil or empty term selects no objects - if len(req.MatchExpressions) == 0 && len(req.MatchFields) == 0 { - continue - } - - if len(req.MatchExpressions) != 0 { - labelSelector, err := nodeSelectorRequirementsAsSelector(req.MatchExpressions) - if err != nil || !labelSelector.Matches(nodeLabels) { - continue - } - } - - if len(req.MatchFields) != 0 { - fieldSelector, err := nodeSelectorRequirementsAsFieldSelector(req.MatchFields) - if err != nil || !fieldSelector.Matches(nodeFields) { - continue - } - } - - return true - } - - return false -} - -// nodeSelectorRequirementsAsSelector converts the []NodeSelectorRequirement api type into a struct that implements -// labels.Selector. -func nodeSelectorRequirementsAsSelector(nsm []corev1.NodeSelectorRequirement) (labels.Selector, error) { - if len(nsm) == 0 { - return labels.Nothing(), nil - } - selector := labels.NewSelector() - for _, expr := range nsm { - var op selection.Operator - switch expr.Operator { - case corev1.NodeSelectorOpIn: - op = selection.In - case corev1.NodeSelectorOpNotIn: - op = selection.NotIn - case corev1.NodeSelectorOpExists: - op = selection.Exists - case corev1.NodeSelectorOpDoesNotExist: - op = selection.DoesNotExist - case corev1.NodeSelectorOpGt: - op = selection.GreaterThan - case corev1.NodeSelectorOpLt: - op = selection.LessThan - default: - return nil, xerrors.Errorf("%q is not a valid node selector operator", expr.Operator) - } - r, err := labels.NewRequirement(expr.Key, op, expr.Values) - if err != nil { - return nil, err - } - selector = selector.Add(*r) - } - return selector, nil -} - -// nodeSelectorRequirementsAsFieldSelector converts the []NodeSelectorRequirement core type into a struct that implements -// fields.Selector. -func nodeSelectorRequirementsAsFieldSelector(nsm []corev1.NodeSelectorRequirement) (fields.Selector, error) { - if len(nsm) == 0 { - return fields.Nothing(), nil - } - - selectors := []fields.Selector{} - for _, expr := range nsm { - switch expr.Operator { - case corev1.NodeSelectorOpIn: - if len(expr.Values) != 1 { - return nil, xerrors.Errorf("unexpected number of value (%d) for node field selector operator %q", - len(expr.Values), expr.Operator) - } - selectors = append(selectors, fields.OneTermEqualSelector(expr.Key, expr.Values[0])) - - case corev1.NodeSelectorOpNotIn: - if len(expr.Values) != 1 { - return nil, xerrors.Errorf("unexpected number of value (%d) for node field selector operator %q", - len(expr.Values), expr.Operator) - } - selectors = append(selectors, fields.OneTermNotEqualSelector(expr.Key, expr.Values[0])) - - default: - return nil, xerrors.Errorf("%q is not a valid node field selector operator", expr.Operator) - } - } - - return fields.AndSelectors(selectors...), nil -} diff --git a/components/ee/ws-scheduler/pkg/scheduler/metrics/metric-recorder.go b/components/ee/ws-scheduler/pkg/scheduler/metrics/metric-recorder.go deleted file mode 100644 index 3b966a01a6e118..00000000000000 --- a/components/ee/ws-scheduler/pkg/scheduler/metrics/metric-recorder.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2020 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package metrics - -import ( - "github.com/prometheus/client_golang/prometheus" -) - -type MetricRecorder interface { - Inc() - Dec() - Clear() -} - -type PendingPodsRecorder struct { - recorder prometheus.Gauge -} - -func NewActivePodsRecorder() *PendingPodsRecorder { - return &PendingPodsRecorder{ - recorder: PendingPods.WithLabelValues("active"), - } -} - -func NewBackoffPodsRecorder() *PendingPodsRecorder { - return &PendingPodsRecorder{ - recorder: PendingPods.WithLabelValues("backoff"), - } -} - -func (r *PendingPodsRecorder) Inc() { - r.recorder.Inc() -} - -func (r *PendingPodsRecorder) Dec() { - r.recorder.Dec() -} - -func (r *PendingPodsRecorder) Clear() { - r.recorder.Set(float64(0)) -} diff --git a/components/ee/ws-scheduler/pkg/scheduler/metrics/metrics.go b/components/ee/ws-scheduler/pkg/scheduler/metrics/metrics.go deleted file mode 100644 index 26b78a978845b7..00000000000000 --- a/components/ee/ws-scheduler/pkg/scheduler/metrics/metrics.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright (c) 2020 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package metrics - -import ( - "time" - - "github.com/prometheus/client_golang/prometheus" -) - -// All the histogram based metrics have 1ms as size for the smallest bucket. -var ( - ScheduleAttempts = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Name: "schedule_attempts_total", - Help: "Number of attempts to schedule pods, by the result. 'unschedulable' means a pod could not be scheduled, while 'error' means an internal scheduler problem.", - }, []string{"result", "workspaceType"}) - E2eSchedulingLatency = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ - Name: "e2e_scheduling_duration_seconds", - Help: "E2e scheduling latency in seconds (scheduling algorithm + binding)", - Buckets: prometheus.ExponentialBuckets(0.001, 2, 15), - }, []string{"result", "workspaceType"}) - BindingLatency = prometheus.NewHistogram( - prometheus.HistogramOpts{ - Name: "binding_duration_seconds", - Help: "Binding latency in seconds", - Buckets: prometheus.ExponentialBuckets(0.001, 2, 15), - }, - ) - PreemptionAttempts = prometheus.NewCounter( - prometheus.CounterOpts{ - Name: "preemption_attempts_total", - Help: "Total preemption attempts in the cluster till now", - }) - PendingPods = prometheus.NewGaugeVec( - prometheus.GaugeOpts{ - Name: "pending_pods", - Help: "Number of pending pods, by the queue type. 'active' means number of pods in activeQ; 'backoff' means number of pods in backoffQ.", - }, []string{"queue"}) - PodSchedulingDuration = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ - Name: "pod_scheduling_duration_seconds", - Help: "E2e latency for a pod being scheduled which may include multiple scheduling attempts.", - // last bucket: [~16m, Inf). - Buckets: prometheus.ExponentialBuckets(0.5, 2, 11), - }, - []string{"workspaceType"}) - - PodSchedulingAttempts = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ - Name: "pod_scheduling_attempts", - Help: "Number of attempts to successfully schedule a pod.", - Buckets: prometheus.ExponentialBuckets(1, 2, 5), - }, - []string{"workspaceType"}) - - AllMetrics = []prometheus.Collector{ - ScheduleAttempts, - E2eSchedulingLatency, - BindingLatency, - PreemptionAttempts, - PendingPods, - PodSchedulingDuration, - PodSchedulingAttempts, - } -) - -var ( - scheduledResult = "scheduled" - unschedulableResult = "unschedulable" - errorResult = "error" -) - -// PodScheduled can records a successful scheduling attempt and the duration -// since `start`. -func PodScheduled(workspaceType string, duration float64) { - observeScheduleAttemptAndLatency(scheduledResult, workspaceType, duration) -} - -// PodUnschedulable can records a scheduling attempt for an unschedulable pod -// and the duration since `start`. -func PodUnschedulable(workspaceType string, duration float64) { - observeScheduleAttemptAndLatency(unschedulableResult, workspaceType, duration) -} - -// PodScheduleError can records a scheduling attempt that had an error and the -// duration since `start`. -func PodScheduleError(workspaceType string, duration float64) { - observeScheduleAttemptAndLatency(errorResult, workspaceType, duration) -} - -func observeScheduleAttemptAndLatency(result, workspaceType string, duration float64) { - E2eSchedulingLatency.WithLabelValues(result, workspaceType).Observe(duration) - ScheduleAttempts.WithLabelValues(result, workspaceType).Inc() -} - -// SinceInSeconds gets the time since the specified start in seconds. -func SinceInSeconds(start time.Time) float64 { - return time.Since(start).Seconds() -} diff --git a/components/ee/ws-scheduler/pkg/scheduler/priority-queue.go b/components/ee/ws-scheduler/pkg/scheduler/priority-queue.go deleted file mode 100644 index 3219811995a23c..00000000000000 --- a/components/ee/ws-scheduler/pkg/scheduler/priority-queue.go +++ /dev/null @@ -1,325 +0,0 @@ -// Copyright (c) 2020 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package scheduler - -import ( - "sort" - "sync" - "time" - - metrics "github.com/gitpod-io/gitpod/ws-scheduler/pkg/scheduler/metrics" - - corev1 "k8s.io/api/core/v1" -) - -// The following code is heavily inspired by the k8s implementation at https://github.com/kubernetes/kubernetes/blob/8f15f7cf5ef288f997f6be037bf489c1f5479e28/pkg/scheduler/internal/queue/scheduling_queue.go. -// We do not go with that one because: -// - allthough well encapsulated there are some private things we'd like to fine-tune (timings, add a -// MakeAllActive method, ...) which would require us to 1. copy it into this repo and 2. modify it. -// - the k8s impl is bigger and more complex than we need it to be -// - we now more about our workload so which allow us to speed things up (e.g., MakeAllActive) -// Instead we roll our own version here. - -type QueuedPodInfo struct { - Pod *corev1.Pod - // The time pod added to the scheduling queue. - Timestamp time.Time - // Number of schedule attempts before successfully scheduled. - // It's used to record the # attempts metric. - Attempts int - // The time when the pod is added to the queue for the first time. The pod may be added - // back to the queue multiple times before it's successfully scheduled. - // It shouldn't be updated once initialized. It's used to record the e2e scheduling - // latency for a pod. - InitialAttemptTimestamp time.Time -} - -func (pi *QueuedPodInfo) key() string { - return key(pi.Pod) -} - -func key(pod *corev1.Pod) string { - return pod.Namespace + "/" + pod.Name -} - -type LessFunc = func(item1, item2 *QueuedPodInfo) bool - -type PriorityQueue struct { - lessFunc LessFunc - initialBackoff time.Duration - maximumBackoff time.Duration - - stop chan struct{} - closed bool - - lock *sync.RWMutex - cond sync.Cond - - activeQueue *podInfoQueue - backoffPool map[string]*QueuedPodInfo - backoffMetrics metrics.MetricRecorder -} - -func NewPriorityQueue(lessFunc LessFunc, initialBackoff time.Duration, maximumBackoff time.Duration) *PriorityQueue { - lock := &sync.RWMutex{} - return &PriorityQueue{ - lessFunc: lessFunc, - initialBackoff: initialBackoff, - maximumBackoff: maximumBackoff, - - stop: make(chan struct{}), - - lock: lock, - cond: *sync.NewCond(lock), - - activeQueue: newPodInfoQueue(lessFunc, metrics.NewActivePodsRecorder()), - backoffPool: make(map[string]*QueuedPodInfo), - backoffMetrics: metrics.NewBackoffPodsRecorder(), - } -} - -func (q *PriorityQueue) Run() { - // with AddUnschedulable pods get into the backoffPool. This makes sure they get back into the activeQueue after - // their backoff is done. - go func(q *PriorityQueue) { - ticker := time.NewTicker(1 * time.Second) - for { - select { - case <-ticker.C: - q.moveCompletedBackoffToActive() - case <-q.stop: - return - } - } - }(q) -} - -func (q *PriorityQueue) Add(pod *corev1.Pod) { - q.lock.Lock() - defer q.lock.Unlock() - - pi := q.newQueuedPodInfo(pod) - key := pi.key() - if q.activeQueue.contains(key) { - return - } - if _, exists := q.backoffPool[key]; exists { - return - } - q.activeQueue.insert(pi) - q.cond.Broadcast() // make sure pop gets notified -} - -func (q *PriorityQueue) AddUnschedulable(pi *QueuedPodInfo) { - q.lock.Lock() - defer q.lock.Unlock() - - key := pi.key() - if q.activeQueue.contains(key) { - return - } - if _, exists := q.backoffPool[key]; exists { - return - } - - // refresh the timestamp since the pod is re-added. - pi.Timestamp = time.Now() - - q.backoffPool[key] = pi - q.backoffMetrics.Inc() -} - -func (q *PriorityQueue) Delete(pod *corev1.Pod) { - q.lock.Lock() - defer q.lock.Unlock() - - key := key(pod) - q.activeQueue.delete(key) - delete(q.backoffPool, key) -} - -// Pop returns the QueuedPodInfo with the highest prio (blocking if none available) -func (q *PriorityQueue) Pop() (pi *QueuedPodInfo, wasClosed bool) { - q.lock.Lock() - defer q.lock.Unlock() - - for q.activeQueue.len() == 0 { - if q.closed { - return nil, true - } - q.cond.Wait() - } - - pi = q.activeQueue.pop() - pi.Attempts++ - return pi, false -} - -func (q *PriorityQueue) MoveAllToActive() { - q.lock.Lock() - defer q.lock.Unlock() - - for k, pi := range q.backoffPool { - delete(q.backoffPool, k) - q.backoffMetrics.Dec() - q.activeQueue.insert(pi) - } - q.cond.Broadcast() -} - -func (q *PriorityQueue) moveCompletedBackoffToActive() { - q.lock.Lock() - defer q.lock.Unlock() - - for k, pi := range q.backoffPool { - backoffTime := q.getBackoffTime(pi) - if backoffTime.After(time.Now()) { - continue - } - delete(q.backoffPool, k) - q.backoffMetrics.Dec() - q.activeQueue.insert(pi) - } - q.cond.Broadcast() -} - -func (q *PriorityQueue) Close() { - q.lock.Lock() - defer q.lock.Unlock() - - close(q.stop) - q.closed = true - q.cond.Broadcast() -} - -func (p *PriorityQueue) newQueuedPodInfo(pod *corev1.Pod) *QueuedPodInfo { - now := time.Now() - return &QueuedPodInfo{ - Pod: pod, - Timestamp: now, - InitialAttemptTimestamp: now, - } -} - -func (p *PriorityQueue) getBackoffTime(podInfo *QueuedPodInfo) time.Time { - duration := p.calculateBackoffDuration(podInfo) - backoffTime := podInfo.Timestamp.Add(duration) - return backoffTime -} - -func (p *PriorityQueue) calculateBackoffDuration(podInfo *QueuedPodInfo) time.Duration { - duration := p.initialBackoff - for i := 1; i < podInfo.Attempts; i++ { - duration = duration * 2 - if duration > p.maximumBackoff { - return p.maximumBackoff - } - } - return duration -} - -// podInfoQueue is a queue of QueuedPodInfo ordered by the given LessFunc. -// It is _not_ synchronized and relies on users to do this. -// This is _not_ optimized, and currently is: -// - insert: O(n*log(n)) -// - delete: O(n) -// - pop: O(1) -type podInfoQueue struct { - lessFunc LessFunc - // ordered list of keys, the last item is HEAD! - queue []*item - items map[string]*item - - metrics metrics.MetricRecorder -} - -type item struct { - key string - pi *QueuedPodInfo - // the index into queue - index int -} - -func newPodInfoQueue(lessFunc LessFunc, metrics metrics.MetricRecorder) *podInfoQueue { - return &podInfoQueue{ - lessFunc: lessFunc, - queue: make([]*item, 0), - items: make(map[string]*item), - metrics: metrics, - } -} - -func (q *podInfoQueue) insert(pi *QueuedPodInfo) { - item := &item{ - key: pi.key(), - pi: pi, - index: 0, - } - q.items[item.key] = item - q.queue = append(q.queue, item) - sort.Sort(sortItems{ - lessFunc: q.lessFunc, - queue: q.queue, - }) - - q.metrics.Inc() -} - -func (q *podInfoQueue) pop() *QueuedPodInfo { - len := len(q.queue) - if len == 0 { - return nil - } - item := q.queue[len-1] - q.queue = q.queue[:len-1] - delete(q.items, item.key) - - q.metrics.Dec() - return item.pi -} - -func (q *podInfoQueue) contains(key string) bool { - _, exists := q.items[key] - return exists -} - -func (q *podInfoQueue) delete(key string) bool { - item, exists := q.items[key] - if !exists { - return false - } - delete(q.items, key) - - // delete from queue and update indexes - i := item.index - q.queue = append(q.queue[:i], q.queue[i+1:]...) - for ; i < len(q.queue); i++ { - q.queue[i].index = i - } - - q.metrics.Dec() - return true -} - -func (q *podInfoQueue) len() int { - return len(q.queue) -} - -type sortItems struct { - lessFunc LessFunc - queue []*item -} - -func (s sortItems) Len() int { - return len(s.queue) -} -func (s sortItems) Less(i, j int) bool { - return s.lessFunc(s.queue[i].pi, s.queue[j].pi) -} -func (s sortItems) Swap(i, j int) { - s.queue[i], s.queue[j] = s.queue[j], s.queue[i] - s.queue[i].index = i - s.queue[j].index = j -} diff --git a/components/ee/ws-scheduler/pkg/scheduler/priority-queue_test.go b/components/ee/ws-scheduler/pkg/scheduler/priority-queue_test.go deleted file mode 100644 index 2cf45b6a299e2d..00000000000000 --- a/components/ee/ws-scheduler/pkg/scheduler/priority-queue_test.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (c) 2020 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package scheduler_test - -import ( - "testing" - "time" - - sched "github.com/gitpod-io/gitpod/ws-scheduler/pkg/scheduler" - - corev1 "k8s.io/api/core/v1" -) - -func TestOrderByPodPriority(t *testing.T) { - - tests := []struct { - Desc string - QueuedPods []*corev1.Pod - Expected []string - }{ - { - Desc: "prefer older workspace", - QueuedPods: []*corev1.Pod{ - createWorkspacePod("ws1", "1Gi", "1Gi", "", "10s"), - createWorkspacePod("ws2", "1Gi", "1Gi", "", "100s"), - }, - Expected: []string{ - "ws2", - "ws1", - }, - }, - { - Desc: "always prefer workspaces over ghosts", - QueuedPods: []*corev1.Pod{ - createGhostPod("ghost1", "1Gi", "1Gi", "", "10s"), - createWorkspacePod("ws1", "1Gi", "1Gi", "", "100s"), - createWorkspacePod("ws2", "1Gi", "1Gi", "", "110s"), - }, - Expected: []string{ - "ws2", - "ws1", - "ghost1", - }, - }, - } - - for _, test := range tests { - t.Run(test.Desc, func(t *testing.T) { - q := sched.NewPriorityQueue(sched.SortByPriority, 1*time.Second, 1*time.Second) - for _, p := range test.QueuedPods { - q.Add(p) - } - q.Close() - - for _, expected := range test.Expected { - act, wasClosed := q.Pop() - if wasClosed { - t.Errorf("queue already empty, but still expected pod '%s'", expected) - } - if act.Pod.Name != expected { - t.Errorf("expected pod '%s' but got '%s'!", expected, act.Pod.Name) - } - } - }) - } -} diff --git a/components/ee/ws-scheduler/pkg/scheduler/scheduler.go b/components/ee/ws-scheduler/pkg/scheduler/scheduler.go deleted file mode 100644 index 245be09de5a697..00000000000000 --- a/components/ee/ws-scheduler/pkg/scheduler/scheduler.go +++ /dev/null @@ -1,921 +0,0 @@ -// Copyright (c) 2020 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package scheduler - -// Helpful material: -// https://github.com/banzaicloud/random-scheduler/blob/v0.2/cmd/scheduler/main.go -// https://github.com/kubernetes/kubernetes/blob/master/pkg/scheduler/scheduler.go -// https://borismattijssen.github.io/articles/kubernetes-informers-controllers-reflectors-stores - -import ( - "context" - "fmt" - "net/http" - "strings" - "sync" - "time" - - "github.com/opentracing/opentracing-go" - tracelog "github.com/opentracing/opentracing-go/log" - "github.com/sirupsen/logrus" - "golang.org/x/time/rate" - "golang.org/x/xerrors" - corev1 "k8s.io/api/core/v1" - k8serr "k8s.io/apimachinery/pkg/api/errors" - res "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/client-go/informers" - infov1 "k8s.io/client-go/informers/core/v1" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/tools/cache" - v1helper "k8s.io/component-helpers/scheduling/corev1" - - wsk8s "github.com/gitpod-io/gitpod/common-go/kubernetes" - "github.com/gitpod-io/gitpod/common-go/log" - "github.com/gitpod-io/gitpod/common-go/tracing" - k8sinternal "github.com/gitpod-io/gitpod/ws-scheduler/pkg/scheduler/internal" - metrics "github.com/gitpod-io/gitpod/ws-scheduler/pkg/scheduler/metrics" -) - -const ( - // the time a failed scheduling attempt has to wait before it is re-tried initially - queueInitialBackoff = 1 * time.Second - - // the time a failed scheduling attempt has to wait before it is re-tried (at most). - // Note: - // - external event like "a pod got deleted" or "a new node appeared" cancel any backoff - // - this is our safety-net that ensures we're not missing anything - queueMaximumBackoff = 10 * time.Second - - // priorityOffsetRegularWorkspace ensures that regular workspaces are preferred over all other workspace types and - // non-workspace pods. - priorityOffsetRegularWorkspace = 100000 - - // priorityOffsetNonRegularWorkspace ensures non-regular workspaces are preferred over non-workspaces pods, but do - // not compete with regular workspaces - priorityOffsetNonRegularWorkspace = 1000 - - // resyncPeriod is the time that the informers will look back when after reconnecting. In essence it's the time - // that we expect to ever be disconnected from Kubernetes. - resyncPeriod = 5 * time.Minute - - // This value serves as safety-buffer to make sure we do not overbook nodes. - // Test have shown that we tend to do that, allthough we currently are not able to understand why that is the case. - // It seems that "available RAM" calculation is slightly off between kubernetes master and scheduler - defaultRAMSafetyBuffer = "512Mi" - - // The value of pod.Status.Reason in case of an Out-Of-Memory error (in lower case) - reasonOutOfMemory = "outofmemory" -) - -type SchedulingResult = string - -const ( - resultBound SchedulingResult = "bound" - resultAlreadyBound SchedulingResult = "alreadyBound" - resultDeletedGhost SchedulingResult = "deletedGhost" - resultUnschedulableNoResources SchedulingResult = "unschedulableNoResources" - resultUnschedulableGhost SchedulingResult = "unschedulableGhost" -) - -type BindPodToNodeFunc func(ctx context.Context, pod *corev1.Pod, nodeName string, createEventFn CreateEventFunc) error -type CreateEventFunc func(ctx context.Context, namespace string, event *corev1.Event, opts metav1.CreateOptions) error - -// Scheduler tries to pack workspaces as closely as possible while trying to keep -// an even load across nodes. -type Scheduler struct { - Config Configuration - Clientset kubernetes.Interface - RAMSafetyBuffer res.Quantity - - strategy Strategy - queue *PriorityQueue - localSlotCache *localSlotCache - rateLimiter *rate.Limiter - - pods infov1.PodInformer - nodes infov1.NodeInformer - - didShutdown chan bool -} - -// NewScheduler creates a new scheduler -func NewScheduler(config Configuration, clientset kubernetes.Interface) (*Scheduler, error) { - ramSafetyBuffer, err := res.ParseQuantity(config.RAMSafetyBuffer) - if err != nil { - ramSafetyBuffer, err = res.ParseQuantity(defaultRAMSafetyBuffer) - if err != nil { - return nil, xerrors.Errorf("unable to parse RAMSafetBuffer") - } - } - - strategy, err := CreateStrategy(config.StrategyName, config) - if err != nil { - return nil, xerrors.Errorf("cannot create strategy: %w", err) - } - queue := NewPriorityQueue(SortByPriority, queueInitialBackoff, queueMaximumBackoff) - localSlotCache := newLocalSlotCache() - var rateLimiter *rate.Limiter - if config.RateLimit != nil { - burst := int(1) // we only ever draw 1 token at a time so we just make sure it's > 0 - rateLimiter = rate.NewLimiter(rate.Limit(config.RateLimit.MaxRPS), burst) - } - - return &Scheduler{ - Config: config, - Clientset: clientset, - RAMSafetyBuffer: ramSafetyBuffer, - - strategy: strategy, - queue: queue, - localSlotCache: localSlotCache, - rateLimiter: rateLimiter, - - didShutdown: make(chan bool, 1), - }, nil -} - -// Run starts the scheduler - this function returns once we're connected to Kubernetes proper -func (s *Scheduler) Run(ctx context.Context) error { - s.queue.Run() // starts the goroutines maintaining the queue - - stopInformer := s.startInformer(ctx) - log.Info("informers are warmed up and workers are running - let them come") - // Now that the informers are up and running, we can start our workers who rely on the node/pod informers being warmed up - - // Start the actual scheduling loop. This is the only caller of schedulePod to ensure it's atomicity - go func() { - bindPodToNode := s.bindPodToNode - createEvent := func(ctx context.Context, namespace string, event *corev1.Event, opts metav1.CreateOptions) error { - _, err := s.Clientset.CoreV1().Events(namespace).Create(ctx, event, opts) - return err - } - - for { - if s.rateLimiter != nil { - err := s.rateLimiter.Wait(ctx) - if err != nil { - log.WithError(err).Error("error while rate limiting") - return - } - } - - pi, wasClosed := s.queue.Pop() - if wasClosed { - log.Debug("scheduler queue closed - exiting") - return - } - pod := pi.Pod - _, err := s.schedulePod(ctx, pi, bindPodToNode, createEvent) - if err != nil { - log.WithError(err).WithField("pod", pod.Name).Error("unable to schedule pod") - } - } - }() - - // Things are all up and running - let's wait for someone to shut us down. - <-ctx.Done() - log.Debug("scheduler was asked to shut down") - // The order in which we shut down is important: - // 1. prevent more pods to get queued - close(stopInformer) - - // 2. stop scheduling queue - s.queue.Close() - - // 3. tell the world that we've shut down - s.didShutdown <- true - log.Debug("scheduler did shut down") - - return nil -} - -func (s *Scheduler) startInformer(ctx context.Context) (stopInformerQueue chan struct{}) { - // Informers replicate state to a Kubernetes client. We'll use them so we don't have to query the K8S master - // every time we want to schedule a pod, and so that we don't have to maintain our own watcher. - factory := informers.NewSharedInformerFactoryWithOptions(s.Clientset, resyncPeriod) - - s.nodes = factory.Core().V1().Nodes() - s.nodes.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { - node, ok := obj.(*corev1.Node) - if !ok { - log.Error("node informer received non-node event - this should never happen") - return - } - - log.WithField("node", node.Name).Info("new node added to the pool") - - // trigger a fresh re-try for all waiting pods - s.queue.MoveAllToActive() - }, - }) - - s.pods = factory.Core().V1().Pods() - s.pods.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { - pod, ok := obj.(*corev1.Pod) - if !ok { - log.Error("pod informer received non-pod event - this should never happen") - return - } - - if !s.isPendingPodWeHaveToSchedule(pod) { - return - } - - // add to queue - s.queue.Add(pod) - }, - UpdateFunc: func(oldObj interface{}, newObj interface{}) { - pod, ok := newObj.(*corev1.Pod) - if !ok { - log.Error("pod informer received non-pod event - this should never happen") - return - } - - // If we see a pod that has been scheduled successfully: Delete from local scheduled_store to avoid leaking memory - // Note: We _might_ delete entries from localSlotCache too early here, leading to 'OutOfMemory'. - // This might happen if a pod has been scheduled (phase=="pending" && nodeName!=""), we removed it, and the - // scheduler cannot take that info into account because we just removed. - // But we cannot implement an exception for that case, because it leads to leaking localSlotCache entries, - // because some pods are removed in the "pending" phase directly. - if pod.Spec.NodeName != "" { - s.deleteFromQueue(pod) - } - - if pod.Status.Phase == corev1.PodFailed && - strings.ToLower(pod.Status.Reason) == reasonOutOfMemory { - // This is a ws-scheduler error and fails the pod: Be as loud about it as possible! - err := xerrors.Errorf("OutOfMemory: too many pods on the same node") - msg := "OutOfMemory: due to a scheduling error too many pods are assigned to the same node" - log.WithField("pod", pod.Name).WithField("node", pod.Spec.NodeName).WithError(err).Errorf(msg) - } - }, - DeleteFunc: func(delObj interface{}) { - pod, ok := delObj.(*corev1.Pod) - if !ok { - log.Error("pod informer received non-pod event - this should never happen") - return - } - - // make double-sure that we release all resources from local caches - s.deleteFromQueue(pod) - - // re-trigger scheduling for all pods as there might now be enough space - s.queue.MoveAllToActive() - }, - }) - - stopInformerQueue = make(chan struct{}) - go factory.Start(stopInformerQueue) - - // Informers are up and running - wait for them to have their caches populated - s.waitForCacheSync(ctx) - - return -} - -// deleteFromQueue removes the referenced pod from all temporary storage so we do not leak memory -func (s *Scheduler) deleteFromQueue(pod *corev1.Pod) { - s.localSlotCache.freeSlot(pod.Name) - s.queue.Delete(pod) -} - -// WaitForShutdown waits for the scheduler to shut down -func (s *Scheduler) WaitForShutdown() { - <-s.didShutdown -} - -// schedulePod is the central method here, it orchestrates the actual scheduling of a pod onto a node. -// It's expected to be atomic as there's a single goroutine working through the schedulingQueue calling this. -// -// Some interaction with the k8s plane is extracted into functions to allow testing -func (s *Scheduler) schedulePod(ctx context.Context, pi *QueuedPodInfo, bindPodToNodeFn BindPodToNodeFunc, createEventFn CreateEventFunc) (res SchedulingResult, err error) { - start := time.Now() - - pod := pi.Pod - traceID := pod.Annotations[wsk8s.TraceIDAnnotation] - spanCtx := tracing.FromTraceID(traceID) - var span opentracing.Span - if spanCtx == nil { - span, ctx = tracing.FromContext(ctx, "schedulePod") - } else { - span = opentracing.StartSpan("schedulePod", opentracing.FollowsFrom(spanCtx)) - ctx = opentracing.ContextWithSpan(ctx, span) - } - flds := wsk8s.GetOWIFromObject(&pod.ObjectMeta) - flds["attempt"] = pi.Attempts - flds["name"] = pod.Name - workspaceType := wsk8s.GetWorkspaceType(pod) - flds["workspaceType"] = workspaceType - tracing.ApplyOWI(span, flds) - defer tracing.FinishSpan(span, &err) - - log.WithFields(flds).Debug("scheduling pod") - - // if the pod is known to have already been scheduled (locally): drop. - if s.localSlotCache.hasAlreadyBeenScheduled(pod.Name) { - span.LogFields(tracelog.String("schedulingResult", "alreadyScheduled")) - log.WithFields(flds).Debugf("pod has already been scheduled, dropping.") - return resultAlreadyBound, nil - } - - // do a clean-slate scheduling here, even for a repeated attempt, to guarantee elasticity: - // with a new decision very run: - // 1. the code stays simpler - // 2. we can not run into situations where we stick to now suboptimal decisions made on outdated state - isGhostReplacing := wsk8s.IsNonGhostWorkspace(pod) - nodeName, state, err := s.selectNodeForPod(ctx, pod, !isGhostReplacing) - if nodeName == "" { - // make sure we actually revisit this request later - s.queue.AddUnschedulable(pi) - - // we did not find any suitable node for the pod, mark the pod as unschedulable - isError := false - var errMsg string - if err != nil { - errMsg = fmt.Sprintf("no suitable node found: %s", err) - isError = true - } else { - errMsg = "no suitable node found" - } - err = s.recordSchedulingFailure(ctx, pod, err, corev1.PodReasonUnschedulable, errMsg, createEventFn) - if err != nil { - metrics.PodScheduleError(workspaceType, metrics.SinceInSeconds(start)) - return "", xerrors.Errorf("cannot record scheduling failure: %w", err) - } - - // metrics - if isError { - metrics.PodScheduleError(workspaceType, metrics.SinceInSeconds(start)) - } else { - metrics.PodUnschedulable(workspaceType, metrics.SinceInSeconds(start)) - } - - return resultUnschedulableNoResources, nil - } - // log.WithFields(flds).Debug(DebugStringNodes(state.SortNodesByAvailableRAM(SortDesc)...)) - - // check if this workspace needs to replace a ghost, and if yes, which one - var ghostToDelete string - if isGhostReplacing { - var unschedulable bool - reservedSlots := s.localSlotCache.getReservedSlotsOnNode(nodeName) - ghostToDelete, unschedulable = state.FindSpareGhostToDelete(nodeName, pod, s.Config.Namespace, &s.RAMSafetyBuffer, reservedSlots) - - log.WithFields(flds).WithField("ghostToDelete", ghostToDelete).WithField("unschedulable", unschedulable).Debug("ghostToDelete") - span.LogFields(tracelog.String("ghostToDelete", ghostToDelete), tracelog.Bool("unschedulable", unschedulable)) - - if unschedulable { - // this is more of a safety measure as it should never happen: If we do not fit on a node nor cannot find a - // spare ghost to delete on the node, we should have never been scheduled to it in the first place. - node := state.Nodes[nodeName] - log.WithFields(flds).Warn("pod unschedulable despite being scheduled to this node") - - // IF this happens we want as much data as possible - rgs := make([]string, 0, len(reservedSlots)) - for k := range reservedSlots { - rgs = append(rgs, k) - } - log.WithFields(flds).Warnf("reservedSlots: %s", strings.Join(rgs, ", ")) - log.WithFields(flds).Warnf(DebugStringPodsOnNodes(node)) - - // drop scheduling request for now - but make sure we revisit it later - s.queue.AddUnschedulable(pi) - metrics.PodUnschedulable(workspaceType, metrics.SinceInSeconds(start)) - return resultUnschedulableGhost, nil - } - } - - // reserve the slot, even before the actual scheduling has happened. - // We persists this info between scheduling runs (as long as the pod is in the queue). - // We just need to make sure we release the slot in case the scheduling fails! - // - // Note: For this "early reservation" to work properly we rely on the fact that pods for which - // "isGhostReplacing" == true always have a higher priority than ghosts! - s.localSlotCache.reserveSlot(pod, nodeName, ghostToDelete) - defer func() { - if err != nil { - // make _sure_ we release the slot - but only in the error case - s.localSlotCache.freeSlot(pod.Name) - } - }() - - // if this is a workspace that replaces a ghost: delete that ghost to make room for a workspace in a later scheduling round - if ghostToDelete != "" { - // only delete the ghost and park the scheduling request for later - s.queue.AddUnschedulable(pi) - - err = s.deleteGhostWorkspace(ctx, pod.Name, ghostToDelete) - if err != nil { - log.WithFields(flds).WithField("ghost", ghostToDelete).WithError(err).Error("error deleting ghost") - } - - // metrics - metrics.PreemptionAttempts.Inc() - metrics.PodUnschedulable(workspaceType, metrics.SinceInSeconds(start)) - - return resultDeletedGhost, err - } - - // bind the pod to the node - err = bindPodToNodeFn(ctx, pod, nodeName, createEventFn) - if err != nil { - errStr := err.Error() - if strings.Contains(errStr, "is already assigned to node") { - // pod has already been scheduled: This can happen and is good - fine with us - log.WithFields(flds).Debugf("pod already bound - fine with me") - return - } else if strings.Contains(errStr, "is being deleted") { - // pod has been deleted before we could schedule it - fine with us - isGhost := wsk8s.IsGhostWorkspace(pod) - log.WithFields(flds).WithField("isGhost", isGhost).Debugf("pod already terminated - fine with me") - return - } - - log.WithFields(flds).WithError(err).Error("cannot bind pod") - metrics.PodScheduleError(workspaceType, metrics.SinceInSeconds(start)) - return - } - - // we're done! - log.WithFields(flds).Debugf("bound to node: %s", nodeName) - s.localSlotCache.markAsScheduled(pod, nodeName, ghostToDelete) - - // metrics - metrics.PodScheduled(workspaceType, metrics.SinceInSeconds(start)) - metrics.PodSchedulingAttempts.WithLabelValues(workspaceType).Observe(float64(pi.Attempts)) - metrics.PodSchedulingDuration.WithLabelValues(workspaceType).Observe(metrics.SinceInSeconds(pi.InitialAttemptTimestamp)) - - return resultBound, nil -} - -func (s *Scheduler) selectNodeForPod(ctx context.Context, pod *corev1.Pod, ghostsVisible bool) (node string, state *State, err error) { - span, ctx := tracing.FromContext(ctx, "selectNodeForPod") - // We deliberately DO NOT add the err to tracing here. If things actually fail the caller will trace the error. - // If we did trace the error here we'd just spam our traces with false positives. - defer tracing.FinishSpan(span, &err) - - state, err = s.buildState(ctx, pod, ghostsVisible) - if err != nil { - return "", nil, xerrors.Errorf("unable to build state: %w", err) - } - if len(state.Nodes) == 0 { - return "", nil, xerrors.Errorf("zero nodes available") - } - node, err = s.strategy.Select(state, pod) - if err != nil { - span.LogKV("no-node", err.Error()) - return "", nil, err - } - - span.LogKV("node", DebugStringNodes(state.Nodes[node])) - span.LogKV("ghostsVisible", ghostsVisible) - return -} - -// Builds a state for all nodes we can schedule the given pod on -func (s *Scheduler) buildState(ctx context.Context, pod *corev1.Pod, ghostsVisible bool) (state *State, err error) { - span, ctx := tracing.FromContext(ctx, "buildState") - defer tracing.FinishSpan(span, &err) - - potentialNodes, err := s.gatherPotentialNodesFor(ctx, pod) - if err != nil { - return nil, err - } - - // We need to take into account _all_ pods in _all_ namespaces to accurately calculate available RAM per node - // NOTE: .Pods("") - in contrast to omitting it and calling .Lister().List(...) directly - means: - // List from _all_ namespaces !!! - allPods, podsErr := s.pods.Lister().Pods(metav1.NamespaceAll).List(labels.Everything()) - if podsErr != nil { - return nil, xerrors.Errorf("cannot list all pods: %w", podsErr) - } - - state = ComputeState(potentialNodes, allPods, s.localSlotCache.getListOfBindings(pod.Name), &s.RAMSafetyBuffer, ghostsVisible, s.Config.Namespace) - - // The required node services is basically PodAffinity light. They limit the nodes we can schedule - // workspace pods to based on other pods running on that node. We do this because we require that - // ws-daemon and registry-facade run on the node. - // - // Alternatively, we could have implemented PodAffinity in ws-scheduler, but that's conceptually - // much heavier and more difficult to handle. - // - // TODO(cw): if we ever implement PodAffinity, use that instead of requiredNodeServices. - if rs, ok := pod.Annotations[wsk8s.RequiredNodeServicesAnnotation]; ok { - req := strings.Split(rs, ",") - state.FilterNodes(func(n *Node) bool { - for _, requiredService := range req { - if _, present := n.Services[requiredService]; !present { - return false - } - } - return true - }) - } - - return state, nil -} - -// gatherPotentialNodesFor filters the nodes we consider to schedule the given pod on -func (s *Scheduler) gatherPotentialNodesFor(ctx context.Context, pod *corev1.Pod) ([]*corev1.Node, error) { - // labels.Set.Merge was added but IDK how to update only k8s.io/apimachinery/pkg/labels only - filterLabels := labels.Set{} - // filter 1: NodeLabelSelector - for k, v := range s.Config.NodeLabelSelector { - filterLabels[k] = v - } - // filter 2: NodeSelector (potentially overrides filter 1) - for k, v := range pod.Spec.NodeSelector { - filterLabels[k] = v - } - - prefilteredNodes, nodesErr := s.nodes.Lister().List(labels.SelectorFromSet(labels.Set(filterLabels))) - if nodesErr != nil { - return nil, xerrors.Errorf("cannot list all nodes: %w", nodesErr) - } - - potentialNodes := make([]*corev1.Node, 0) - for _, node := range prefilteredNodes { - // filter 3: cordoned nodes - if node.Spec.Unschedulable { - continue - } - // filter: 4: our own diskpressure signal coming from ws-daemon. - // This is not part of the label selector as labelSets cannot negate - // labels. Otherwise !gitpod.io/diskPressure would be a valid selector. - if _, fullDisk := node.Labels[wsk8s.GitpodDiskPressureLabel]; fullDisk { - continue - } - - // filter 5: Node affinity - affinity := pod.Spec.Affinity - if affinity != nil && affinity.NodeAffinity != nil { - nodeSelector := affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution - if nodeSelector != nil && !k8sinternal.NodeMatchesNodeSelectorTerms(node, nodeSelector.NodeSelectorTerms) { - continue - } - } - - // filter 6: taints and tolerations - filterPredicate := func(t *corev1.Taint) bool { - // PodToleratesNodeTaints is only interested in NoSchedule and NoExecute taints. - return t.Effect == corev1.TaintEffectNoSchedule || t.Effect == corev1.TaintEffectNoExecute - } - - _, untolerated := v1helper.FindMatchingUntoleratedTaint(node.Spec.Taints, pod.Spec.Tolerations, filterPredicate) - if untolerated { - continue - } - - potentialNodes = append(potentialNodes, node) - } - - return potentialNodes, nil -} - -func (s *Scheduler) bindPodToNode(ctx context.Context, pod *corev1.Pod, nodeName string, createEventsFn CreateEventFunc) (err error) { - //nolint:ineffassign - span, ctx := tracing.FromContext(ctx, "bindPodToNode") - defer tracing.FinishSpan(span, nil) // let caller decide whether this is an actual error or not - span.LogKV("nodeName", nodeName, "podName", pod.Name) - - binding := &corev1.Binding{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: pod.Namespace, - Name: pod.Name, - UID: pod.UID, - }, - Target: corev1.ObjectReference{ - Kind: "Node", - Name: nodeName, - }, - } - - start := time.Now() - err = s.Clientset.CoreV1().Pods(pod.Namespace).Bind(ctx, binding, metav1.CreateOptions{}) - if err != nil { - return xerrors.Errorf("cannot bind pod %s to %s: %w", pod.Name, nodeName, err) - } - span.LogKV("event", "binding created") - - // The default Kubernetes scheduler publishes an event upon successful scheduling. - // This is not really neccesary for the scheduling itself, but helps to debug things. - message := fmt.Sprintf("Placed pod [%s/%s] on %s\n", pod.Namespace, pod.Name, nodeName) - timestamp := time.Now().UTC() - err = createEventsFn(ctx, pod.Namespace, &corev1.Event{ - Count: 1, - Message: message, - Reason: "Scheduled", - LastTimestamp: metav1.NewTime(timestamp), - FirstTimestamp: metav1.NewTime(timestamp), - Type: corev1.EventTypeNormal, - Source: corev1.EventSource{ - Component: s.Config.SchedulerName, - }, - InvolvedObject: corev1.ObjectReference{ - Kind: "Pod", - Name: pod.Name, - Namespace: pod.Namespace, - UID: pod.UID, - }, - ObjectMeta: metav1.ObjectMeta{ - GenerateName: fmt.Sprintf("%s - scheduled", pod.Name), - }, - }, metav1.CreateOptions{}) - if err != nil { - return xerrors.Errorf("cannot emit event for pod %s: %w", pod.Name, err) - } - span.LogKV("event", "event created") - - metrics.BindingLatency.Observe(metrics.SinceInSeconds(start)) - return nil -} - -func (s *Scheduler) waitForCacheSync(ctx context.Context) bool { - span, ctx := tracing.FromContext(ctx, "waitForCacheSync") - defer tracing.FinishSpan(span, nil) - - stopCh := make(chan struct{}) - done := make(chan bool) - - go func() { - done <- cache.WaitForCacheSync(stopCh, - s.pods.Informer().HasSynced, - s.nodes.Informer().HasSynced, - ) - }() - - select { - case <-ctx.Done(): - close(stopCh) - return false - case r := <-done: - return r - } -} - -func (s *Scheduler) recordSchedulingFailure(ctx context.Context, pod *corev1.Pod, failureErr error, reason string, message string, createEventFn CreateEventFunc) (err error) { - //nolint:ineffassign - span, ctx := tracing.FromContext(ctx, "recordSchedulingFailure") - defer tracing.FinishSpan(span, &err) - - // It's important to not spam the pod with "PodScheduled: false" conditions, because this seems to result - // in sudden and uncontrolled cluster scaleup - for _, c := range pod.Status.Conditions { - if c.Type == corev1.PodScheduled && c.Status == corev1.ConditionFalse { - log.WithField("pod", pod.Name).Trace("No need to record scheduling failure again") - return nil - } - } - - log.WithFields(logrus.Fields{ - "pod": pod.Name, - "reason": reason, - "message": message, - }).WithError(failureErr).Warnf("scheduling a pod failed: %s", reason) - - timestamp := time.Now().UTC() - err = createEventFn(ctx, pod.Namespace, &corev1.Event{ - Count: 1, - Message: message, - Reason: "FailedScheduling", - LastTimestamp: metav1.NewTime(timestamp), - FirstTimestamp: metav1.NewTime(timestamp), - Type: corev1.EventTypeWarning, - Source: corev1.EventSource{ - Component: s.Config.SchedulerName, - }, - InvolvedObject: corev1.ObjectReference{ - Kind: "Pod", - Name: pod.Name, - Namespace: pod.Namespace, - UID: pod.UID, - }, - ObjectMeta: metav1.ObjectMeta{ - GenerateName: pod.Name + "-", - }, - }, metav1.CreateOptions{}) - if err != nil { - log.WithField("pod", pod.Name).WithError(err).Warn("cannot record scheduling failure event") - } - - // we were unable to schedule the pod which we need to mark appropriately. Retrieve the pod first prior to trying and modifying it - // Note: Do _not_ retry.RetryOnConflict here as: - // - this is on the hot path of the single-thread scheduler - // - retry would block other pods from being scheduled - // - the pod is picked up again anyway - updatedPod, err := s.Clientset.CoreV1().Pods(pod.Namespace).Get(ctx, pod.Name, metav1.GetOptions{}) - if err != nil { - log.WithField("pod", pod.Name).WithError(err).Warn("cannot get updated pod - subsequent pod modifications may break") - } else { - pod = updatedPod - } - - failedCondition := corev1.PodCondition{ - Type: corev1.PodScheduled, - Status: corev1.ConditionFalse, - Reason: reason, - Message: failureErr.Error(), - } - pod.Status.Conditions = append(pod.Status.Conditions, failedCondition) - _, err = s.Clientset.CoreV1().Pods(pod.Namespace).UpdateStatus(ctx, pod, metav1.UpdateOptions{}) - if err != nil { - log.WithError(err).Warn("cannot mark pod as unscheduled - will try again") - return xerrors.Errorf("cannot mark pod as unscheduled: %w", err) - } - - return nil -} - -func (s *Scheduler) isPendingPodWeHaveToSchedule(pod *corev1.Pod) bool { - // do not schedule "Terminated" pods (corev1.PodPending is _not_ suitable!) - return pod.Status.Phase != corev1.PodSucceeded && - pod.Status.Phase != corev1.PodFailed && - // Only schedule un-scheduled pods (corev1.PodPending is _not_ suitable!) - pod.Spec.NodeName == "" && - // Only schedule pods we ought to schedule - pod.Spec.SchedulerName == s.Config.SchedulerName && - // Namespace is used as selector to restrict reach - pod.ObjectMeta.Namespace == s.Config.Namespace -} - -// deleteGhostWorkspace tries to delete a ghost workspace to make room for the given pod -func (s *Scheduler) deleteGhostWorkspace(ctx context.Context, podName string, ghostName string) (err error) { - span, ctx := tracing.FromContext(ctx, "deleteGhostWorkspace") - defer tracing.FinishSpan(span, &err) - - // gracePeriod is the time until kubernetes sends SIG_KILL to the root process - // ctxDeleteTimeout is the time until we stop waiting for the deletion request to return - // Ensure that: - // - ctxDeleteTimeout > gracePeriod: So the container has actually time to quit properly - // - ctxDeleteTimeout to be not too long: To ensure scheduling is not to slow - gracePeriod := 10 * time.Second - ctxDeleteTimeout := gracePeriod + (5 * time.Second) - deleteCtx, cancelDeleteCtx := context.WithTimeout(ctx, ctxDeleteTimeout) - defer cancelDeleteCtx() - - gracePeriodSeconds := int64(gracePeriod.Seconds()) - foreground := metav1.DeletePropagationForeground - err = s.Clientset.CoreV1().Pods(s.Config.Namespace).Delete(deleteCtx, ghostName, metav1.DeleteOptions{ - GracePeriodSeconds: &gracePeriodSeconds, - PropagationPolicy: &foreground, - }) - if err != nil { - if isKubernetesObjNotFoundError(err) { - log.WithField("podName", podName).WithField("ghost", ghostName).Debug("ghost workspace already gone") - return nil - } - - return err - } - - log.WithField("podName", podName).WithField("ghost", ghostName).Debug("deleted ghost workspace") - return nil -} - -// true means: pi1 is inserted _before_ pi2 -// podPriority means: the higher the better -func SortByPriority(pi1, pi2 *QueuedPodInfo) bool { - now := time.Now() - p1 := podPriority(pi1.Pod, now) - p2 := podPriority(pi2.Pod, now) - return p1 < p2 -} - -// podPriority calculates the priority a pod gets in our scheduling queue. -// We favor, in decreasing order: -// - regular workspaces -// - all other workspace types (including prebuilds, ghosts, probes) -// - all other pods -func podPriority(pod *corev1.Pod, now time.Time) int64 { - age := now.Unix() - pod.CreationTimestamp.Unix() - if wsk8s.IsRegularWorkspace(pod) { - return age + priorityOffsetRegularWorkspace - } - - if wsk8s.IsWorkspace(pod) { - return age + priorityOffsetNonRegularWorkspace - } - - return age -} - -func isKubernetesObjNotFoundError(err error) bool { - if err, ok := err.(*k8serr.StatusError); ok { - return err.ErrStatus.Code == http.StatusNotFound - } - return false -} - -// localSlotCache stores whether we already are scheduling a Pod and is necessary to bridge the gap between: -// 1. We reserved a slot on a node -// 2. We successfully create a binding with the Kubernets API -// 3. The change is reflected in the results we get from s.pods.Lister().List() -// Without it, we sometimes end up with pods being assigned the same last slot on a node, leading -// to workspace startup failures. -// -// (We're not sure why there is gap in the first place: Kubernetes should be consistent, as etcd is -// consistent (per Object type, here Pod). Maybe because of the GCloud multi-master setup..?) -type localSlotCache struct { - slots map[string]*Slot - mu sync.RWMutex -} - -// Slot is used to describe a "place" on a single node that we already scheduled/are trying to schedule a workspace on. -type Slot struct { - Binding *Binding - ReservedGhost string - - // whether: - // - true: the pod has already been bound and we're just waiting for the update from k8s master, or - // - false: the slot has been reserved, and we're still waiting for the binding to happen - Bound bool -} - -// markAsScheduled marks a certain slot as already scheduled -func (c *localSlotCache) markAsScheduled(pod *corev1.Pod, nodeName string, ghostToReplace string) { - c.mu.Lock() - defer c.mu.Unlock() - - // note: potentially overwriting - c.slots[pod.Name] = &Slot{ - Binding: &Binding{ - Pod: pod, - NodeName: nodeName, - }, - Bound: true, - ReservedGhost: ghostToReplace, - } -} - -// reserveSlot marks a certain slot as already scheduled -func (c *localSlotCache) reserveSlot(pod *corev1.Pod, nodeName string, ghostToReplace string) { - c.mu.Lock() - defer c.mu.Unlock() - - c.slots[pod.Name] = &Slot{ - Binding: &Binding{ - Pod: pod, - NodeName: nodeName, - }, - Bound: false, - ReservedGhost: ghostToReplace, - } -} - -func (c *localSlotCache) hasAlreadyBeenScheduled(podName string) bool { - c.mu.RLock() - defer c.mu.RUnlock() - - s, present := c.slots[podName] - return present && s.Bound -} - -func (c *localSlotCache) freeSlot(podName string) { - c.mu.Lock() - defer c.mu.Unlock() - - delete(c.slots, podName) -} - -// getListOfBindings returns the list of assumed bindings - either reserved or bound (already sent to k8s but not yet -// reflected in updates on the pod) -func (c *localSlotCache) getListOfBindings(podName string) []*Binding { - c.mu.RLock() - defer c.mu.RUnlock() - - bs := make([]*Binding, 0, len(c.slots)) - for _, s := range c.slots { - if s.Binding.Pod.Name == podName && !s.Bound { - // do _not_ include previously reserved slots for ourselves that we now want to update! - continue - } - bs = append(bs, s.Binding) - } - return bs -} - -func (c *localSlotCache) getReservedSlotsOnNode(nodeName string) map[string]*Slot { - c.mu.RLock() - defer c.mu.RUnlock() - - reservedSlots := make(map[string]*Slot, len(c.slots)) - for _, s := range c.slots { - if s.Binding.NodeName != nodeName { - continue - } - reservedSlots[s.ReservedGhost] = s - } - return reservedSlots -} - -func newLocalSlotCache() *localSlotCache { - return &localSlotCache{ - slots: make(map[string]*Slot), - } -} diff --git a/components/ee/ws-scheduler/pkg/scheduler/scheduler_scheduling_test.go b/components/ee/ws-scheduler/pkg/scheduler/scheduler_scheduling_test.go deleted file mode 100644 index 1b023186471fae..00000000000000 --- a/components/ee/ws-scheduler/pkg/scheduler/scheduler_scheduling_test.go +++ /dev/null @@ -1,623 +0,0 @@ -// Copyright (c) 2021 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package scheduler - -import ( - "context" - "strings" - "testing" - "time" - - wsk8s "github.com/gitpod-io/gitpod/common-go/kubernetes" - "golang.org/x/xerrors" - - corev1 "k8s.io/api/core/v1" - res "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/types" - fakek8s "k8s.io/client-go/kubernetes/fake" - testingk8s "k8s.io/client-go/testing" -) - -var ( - testBaseTime = time.Date(2020, 01, 01, 01, 01, 0, 0, time.UTC) - testNamespace = "default" -) - -type ExpectedSchedulingResult struct { - Result SchedulingResult - DeletedGhost string - DelayGhostDeletion bool -} -type Expectation = map[string]ExpectedSchedulingResult - -func TestSchedulePod(t *testing.T) { - tests := []struct { - Desc string - Nodes []*corev1.Node - AssignedPods []*corev1.Pod - QueuedPods []*corev1.Pod - Expectations []Expectation - }{ - { - Desc: "schedule all pods in one cycle", - Nodes: []*corev1.Node{ - createTNode("node1", "10000Mi"), - }, - AssignedPods: []*corev1.Pod{ - createWorkspacePod("ws0", "2000Mi", "node1", corev1.PodRunning, "100s"), - }, - QueuedPods: []*corev1.Pod{ - createWorkspacePod("ws1", "2000Mi", "", corev1.PodPending, "10s"), - createWorkspacePod("ws2", "2000Mi", "", corev1.PodPending, "8s"), - }, - Expectations: []Expectation{ - { - "ws1": { - Result: resultBound, - }, - "ws2": { - Result: resultBound, - }, - }, - }, - }, - { - Desc: "schedule two pods in two cycles", - Nodes: []*corev1.Node{ - createTNode("node1", "11000Mi"), - }, - AssignedPods: []*corev1.Pod{ - createWorkspacePod("ws0", "2000Mi", "node1", corev1.PodRunning, "100s"), - createGhostPod("ghost1", "2000Mi", "node1", corev1.PodRunning, "101s"), - createGhostPod("ghost2", "2000Mi", "node1", corev1.PodRunning, "102s"), - createGhostPod("ghost3", "2000Mi", "node1", corev1.PodRunning, "103s"), - }, - QueuedPods: []*corev1.Pod{ - createWorkspacePod("ws1", "2000Mi", "", corev1.PodPending, "10s"), - createWorkspacePod("ws2", "2000Mi", "", corev1.PodPending, "8s"), - }, - Expectations: []Expectation{ - { - "ws1": { - Result: resultBound, - }, - "ws2": { - Result: resultDeletedGhost, - DeletedGhost: "ghost3", - }, - }, - { - "ws2": { - Result: resultBound, - }, - }, - }, - }, - { - Desc: "replace exactly all ghosts on node", - Nodes: []*corev1.Node{ - createTNode("node1", "11000Mi"), - }, - AssignedPods: []*corev1.Pod{ - createGhostPod("ghost1", "2000Mi", "node1", corev1.PodRunning, "101s"), - createGhostPod("ghost2", "2000Mi", "node1", corev1.PodRunning, "102s"), - createGhostPod("ghost3", "2000Mi", "node1", corev1.PodRunning, "103s"), - createGhostPod("ghost4", "2000Mi", "node1", corev1.PodRunning, "104s"), - createGhostPod("ghost5", "2000Mi", "node1", corev1.PodRunning, "105s"), - }, - QueuedPods: []*corev1.Pod{ - createWorkspacePod("ws1", "2000Mi", "", corev1.PodPending, "11s"), - createWorkspacePod("ws2", "2000Mi", "", corev1.PodPending, "12s"), - createWorkspacePod("ws3", "2000Mi", "", corev1.PodPending, "13s"), - createWorkspacePod("ws4", "2000Mi", "", corev1.PodPending, "14s"), - createWorkspacePod("ws5", "2000Mi", "", corev1.PodPending, "15s"), - }, - Expectations: []Expectation{ - { - "ws5": { - Result: resultDeletedGhost, - DeletedGhost: "ghost5", - }, - "ws4": { - Result: resultDeletedGhost, - DeletedGhost: "ghost4", - }, - "ws3": { - Result: resultDeletedGhost, - DeletedGhost: "ghost3", - }, - "ws2": { - Result: resultDeletedGhost, - DeletedGhost: "ghost2", - }, - "ws1": { - Result: resultDeletedGhost, - DeletedGhost: "ghost1", - }, - }, - }, - }, - { - Desc: "replace all ghosts, but still not enough space", - Nodes: []*corev1.Node{ - createTNode("node1", "11000Mi"), - }, - AssignedPods: []*corev1.Pod{ - createWorkspacePod("ws0", "2000Mi", "node1", corev1.PodRunning, "100s"), - createGhostPod("ghost1", "2000Mi", "node1", corev1.PodRunning, "101s"), - createGhostPod("ghost2", "2000Mi", "node1", corev1.PodRunning, "102s"), - createGhostPod("ghost3", "2000Mi", "node1", corev1.PodRunning, "103s"), - createGhostPod("ghost4", "2000Mi", "node1", corev1.PodRunning, "104s"), - }, - QueuedPods: []*corev1.Pod{ - createWorkspacePod("ws1", "2000Mi", "", corev1.PodPending, "11s"), - createWorkspacePod("ws2", "2000Mi", "", corev1.PodPending, "12s"), - createWorkspacePod("ws3", "2000Mi", "", corev1.PodPending, "13s"), - createWorkspacePod("ws4", "2000Mi", "", corev1.PodPending, "14s"), - createWorkspacePod("ws5", "2000Mi", "", corev1.PodPending, "15s"), - }, - Expectations: []map[string]ExpectedSchedulingResult{ - { - "ws5": { - Result: resultDeletedGhost, - DeletedGhost: "ghost4", - }, - "ws4": { - Result: resultDeletedGhost, - DeletedGhost: "ghost3", - }, - "ws3": { - Result: resultDeletedGhost, - DeletedGhost: "ghost2", - }, - "ws2": { - Result: resultDeletedGhost, - DeletedGhost: "ghost1", - }, - "ws1": { - Result: resultUnschedulableNoResources, - }, - }, - { - "ws5": { - Result: resultBound, - }, - "ws4": { - Result: resultBound, - }, - "ws3": { - Result: resultBound, - }, - "ws2": { - Result: resultBound, - }, - "ws1": { - Result: resultUnschedulableNoResources, - }, - }, - }, - }, - { - Desc: "replace all ghosts, but still not enough space - two nodes", - Nodes: []*corev1.Node{ - createTNode("node1", "11000Mi"), - createTNode("node2", "11000Mi"), - }, - AssignedPods: []*corev1.Pod{ - createWorkspacePod("ws00", "2000Mi", "node1", corev1.PodRunning, "100s"), - createWorkspacePod("ws01", "2000Mi", "node1", corev1.PodRunning, "101s"), - createGhostPod("ghost01", "2000Mi", "node1", corev1.PodRunning, "102s"), - createGhostPod("ghost02", "2000Mi", "node1", corev1.PodRunning, "103s"), - createGhostPod("ghost03", "2000Mi", "node1", corev1.PodRunning, "104s"), - createWorkspacePod("ws10", "2000Mi", "node2", corev1.PodRunning, "100s"), - createGhostPod("ghost11", "2000Mi", "node2", corev1.PodRunning, "101s"), - createGhostPod("ghost12", "2000Mi", "node2", corev1.PodRunning, "102s"), - createGhostPod("ghost13", "2000Mi", "node2", corev1.PodRunning, "103s"), - createGhostPod("ghost14", "2000Mi", "node2", corev1.PodRunning, "104s"), - }, - QueuedPods: []*corev1.Pod{ - createWorkspacePod("ws0", "2000Mi", "", corev1.PodPending, "10s"), - createWorkspacePod("ws1", "2000Mi", "", corev1.PodPending, "11s"), - createWorkspacePod("ws2", "2000Mi", "", corev1.PodPending, "12s"), - createWorkspacePod("ws3", "2000Mi", "", corev1.PodPending, "13s"), - createWorkspacePod("ws4", "2000Mi", "", corev1.PodPending, "14s"), - createWorkspacePod("ws5", "2000Mi", "", corev1.PodPending, "15s"), - createWorkspacePod("ws6", "2000Mi", "", corev1.PodPending, "16s"), - createWorkspacePod("ws7", "2000Mi", "", corev1.PodPending, "17s"), - }, - Expectations: []map[string]ExpectedSchedulingResult{ - { - "ws7": { - Result: resultDeletedGhost, - DeletedGhost: "ghost03", - }, - "ws6": { - Result: resultDeletedGhost, - DeletedGhost: "ghost02", - }, - "ws5": { - Result: resultDeletedGhost, - DeletedGhost: "ghost01", - }, - "ws4": { - Result: resultDeletedGhost, - DeletedGhost: "ghost14", - }, - "ws3": { - Result: resultDeletedGhost, - DeletedGhost: "ghost13", - }, - "ws2": { - Result: resultDeletedGhost, - DeletedGhost: "ghost12", - }, - "ws1": { - Result: resultDeletedGhost, - DeletedGhost: "ghost11", - }, - "ws0": { - Result: resultUnschedulableNoResources, - }, - }, - { - "ws7": { - Result: resultBound, - }, - "ws6": { - Result: resultBound, - }, - "ws5": { - Result: resultBound, - }, - "ws4": { - Result: resultBound, - }, - "ws3": { - Result: resultBound, - }, - "ws2": { - Result: resultBound, - }, - "ws1": { - Result: resultBound, - }, - "ws0": { - Result: resultUnschedulableNoResources, - }, - }, - }, - }, - { - Desc: "replace all ghosts, but still not enough space - delayed delete", - Nodes: []*corev1.Node{ - createTNode("node1", "11000Mi"), - }, - AssignedPods: []*corev1.Pod{ - createWorkspacePod("ws0", "2000Mi", "node1", corev1.PodRunning, "100s"), - createGhostPod("ghost1", "2000Mi", "node1", corev1.PodRunning, "101s"), - createGhostPod("ghost2", "2000Mi", "node1", corev1.PodRunning, "102s"), - createGhostPod("ghost3", "2000Mi", "node1", corev1.PodRunning, "103s"), - createGhostPod("ghost4", "2000Mi", "node1", corev1.PodRunning, "104s"), - }, - QueuedPods: []*corev1.Pod{ - createWorkspacePod("ws1", "2000Mi", "", corev1.PodPending, "11s"), - createWorkspacePod("ws2", "2000Mi", "", corev1.PodPending, "12s"), - createWorkspacePod("ws3", "2000Mi", "", corev1.PodPending, "13s"), - createWorkspacePod("ws4", "2000Mi", "", corev1.PodPending, "14s"), - createWorkspacePod("ws5", "2000Mi", "", corev1.PodPending, "15s"), - }, - Expectations: []map[string]ExpectedSchedulingResult{ - { - "ws5": { - Result: resultDeletedGhost, - DeletedGhost: "ghost4", - }, - "ws4": { - Result: resultDeletedGhost, - DeletedGhost: "ghost3", - DelayGhostDeletion: true, - }, - "ws3": { - Result: resultDeletedGhost, - DeletedGhost: "ghost2", - }, - "ws2": { - Result: resultDeletedGhost, - DeletedGhost: "ghost1", - }, - "ws1": { - Result: resultUnschedulableNoResources, - }, - }, - { - "ws5": { - Result: resultBound, - }, - "ws4": { - Result: resultDeletedGhost, - DeletedGhost: "ghost3", - }, - "ws3": { - Result: resultBound, - }, - "ws2": { - Result: resultBound, - }, - "ws1": { - Result: resultUnschedulableNoResources, - }, - }, - }, - }, - } - for _, test := range tests { - t.Run(test.Desc, func(t *testing.T) { - // preparation - var objs []runtime.Object - for _, n := range test.Nodes { - objs = append(objs, n) - } - for _, p := range test.AssignedPods { - objs = append(objs, p) - } - for _, qp := range test.QueuedPods { - objs = append(objs, qp) - } - - client := fakek8s.NewSimpleClientset(objs...) - // we want to make sure all Pod.Delete operation happen when we want them to happen - lockDeletes := true - delayDeletes := false - delayedDeletes := make(map[string]bool) - deletes := make(map[string]bool) - lockStepDeleteReactor := func(action testingk8s.Action) (handled bool, ret runtime.Object, err error) { - if !lockDeletes { - return false, nil, nil - } - - name := action.(testingk8s.DeleteAction).GetName() - if delayDeletes { - delayedDeletes[name] = true - } else { - deletes[name] = true - } - return true, nil, nil - } - client.PrependReactor("delete", "pods", lockStepDeleteReactor) - - scheduler, err := NewScheduler(Configuration{ - Namespace: testNamespace, - SchedulerName: "test-ws-scheduler", - StrategyName: "DensityAndExperience", - DensityAndExperienceConfig: &DensityAndExperienceConfig{ - WorkspaceFreshPeriodSeconds: 120, - NodeFreshWorkspaceLimit: 2, - }, - }, client) - if err != nil { - t.Errorf("unexpected error: %+q", err) - return - } - ctx, cancel := context.WithCancel(context.Background()) - scheduler.startInformer(ctx) - - bindPodToNode := func(ctx context.Context, pod *corev1.Pod, nodeName string, createEventFn CreateEventFunc) error { - // fake the effect of a binding here so we can test against it later - for _, p := range test.QueuedPods { - if p.Name != pod.Name { - continue - } - p.Spec.NodeName = nodeName - return nil - } - return xerrors.Errorf("could not find pod to bind: %s", pod.Name) - } - createEvent := func(ctx context.Context, namespace string, event *corev1.Event, opts metav1.CreateOptions) error { - // drop all events as they are not needed for functionality and the fake clienset does not support them - return nil - } - - for _, qp := range test.QueuedPods { - scheduler.queue.Add(qp) - } - - // actually run the test - for _, expectation := range test.Expectations { - cycleCtx, cancelCycleCtx := context.WithTimeout(ctx, 10*time.Second) - - for i := 0; i < len(expectation); i++ { - pi, wasClosed := scheduler.queue.Pop() - if wasClosed { - t.Fatalf("queue was closed but still expected pods!") - } - exp, present := expectation[pi.Pod.Name] - if !present { - t.Fatalf("missing testdata: no expectation for pod '%s'!", pi.Pod.Name) - } - delayDeletes = exp.DelayGhostDeletion - - t.Logf("scheduling: %s", pi.Pod.Name) - result, err := scheduler.schedulePod(cycleCtx, pi, bindPodToNode, createEvent) - if err != nil { - t.Fatal(err) - } - if result != exp.Result { - t.Fatalf("'%s': expected result '%s', got '%s'!", pi.Pod.Name, exp.Result, result) - } - } - - // perform all deletes and make sure they're done - lockDeletes = false - for podToDelete := range deletes { - err = client.CoreV1().Pods(testNamespace).Delete(cycleCtx, podToDelete, metav1.DeleteOptions{}) - if err != nil { - t.Fatal(err) - } - } - deletes = delayedDeletes - delayedDeletes = make(map[string]bool) - lockDeletes = true - waitForAllGhostToBeDeleted(t, cycleCtx, client, expectation) - - // compare result - for podName, exp := range expectation { - qp := findPod(podName, test.QueuedPods) - if qp == nil { - t.Fatalf("inconsistent test data: ") - } - - if exp.Result == resultBound { - if qp.Spec.NodeName == "" { - t.Fatalf("expected pod '%s' to be bound but it wasn't!", qp.Name) - } - } else if exp.Result == resultDeletedGhost { - if qp.Spec.NodeName != "" { - t.Fatalf("expected pod '%s' to be unbound but it was bound to '%s'!", qp.Name, qp.Spec.NodeName) - } - } - if exp.DeletedGhost != "" && !exp.DelayGhostDeletion { - _, err := client.CoreV1().Pods(testNamespace).Get(cycleCtx, exp.DeletedGhost, metav1.GetOptions{}) - if err == nil { - t.Fatalf("expected ghost '%s' to be deleted for '%s' but was still present", exp.DeletedGhost, qp.Name) - } - if !strings.HasSuffix(err.Error(), "not found") { - t.Fatal(err) - } - } - } - - // make sure this round is "done" and we get a defined state for the next cycle - scheduler.queue.MoveAllToActive() - cancelCycleCtx() - } - - // cleanup - cancel() - scheduler.queue.Close() - }) - } -} - -func waitForAllGhostToBeDeleted(t *testing.T, ctx context.Context, client *fakek8s.Clientset, expectation Expectation) { - toDelete := map[string]bool{} - for _, exp := range expectation { - if exp.DeletedGhost == "" || - exp.DelayGhostDeletion { - continue - } - toDelete[exp.DeletedGhost] = true - } - if len(toDelete) == 0 { - return - } - - allDeletedChan := make(chan struct{}, 1) - go func() { - defer close(allDeletedChan) - - ticker := time.NewTicker(1 * time.Second) - for { - select { - case <-ticker.C: - list, err := client.CoreV1().Pods(testNamespace).List(ctx, metav1.ListOptions{ - LabelSelector: "workspaceType=ghost", - }) - if err != nil { - t.Error(err) - return - } - - for _, p := range list.Items { - if _, exists := toDelete[p.Name]; exists { - continue - } - } - return - case <-ctx.Done(): - t.Error("cycle context timed out while waiting for ghost to be deleted") - return - } - } - }() - - <-allDeletedChan -} - -func findPod(name string, queued []*corev1.Pod) *corev1.Pod { - for _, q := range queued { - if q.Name == name { - return q - } - } - return nil -} - -func createTNode(name string, ram string) *corev1.Node { - return &corev1.Node{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - }, - Status: corev1.NodeStatus{ - Allocatable: corev1.ResourceList{ - corev1.ResourceMemory: res.MustParse(ram), - }, - }, - } -} - -func createWorkspacePod(name string, ram string, nodeName string, phase corev1.PodPhase, age string) *corev1.Pod { - return createTPod(name, ram, nodeName, phase, age, map[string]string{ - "component": "workspace", - wsk8s.TypeLabel: "regular", - }) -} - -func createGhostPod(name string, ram string, nodeName string, phase corev1.PodPhase, age string) *corev1.Pod { - return createTPod(name, ram, nodeName, phase, age, map[string]string{ - "component": "workspace", - "headless": "true", - wsk8s.TypeLabel: "ghost", - }) -} - -func createTPod(name string, ram string, nodeName string, phase corev1.PodPhase, ageStr string, labels map[string]string) *corev1.Pod { - creationTimestamp := testBaseTime.Add(-MustParseDuration(ageStr)) - return &corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: testNamespace, - CreationTimestamp: metav1.NewTime(creationTimestamp), - UID: types.UID(name), - Labels: labels, - }, - Spec: corev1.PodSpec{ - NodeName: nodeName, - Containers: []corev1.Container{ - { - Name: "workspace", - Image: testWorkspaceImage, - Resources: corev1.ResourceRequirements{ - Requests: corev1.ResourceList{ - corev1.ResourceMemory: res.MustParse(ram), - }, - }, - }, - }, - }, - Status: corev1.PodStatus{ - Phase: phase, - }, - } -} - -func MustParseDuration(str string) time.Duration { - dur, err := time.ParseDuration(str) - if err != nil { - panic("duration does not parse") - } - return dur -} diff --git a/components/ee/ws-scheduler/pkg/scheduler/scheduler_test.go b/components/ee/ws-scheduler/pkg/scheduler/scheduler_test.go deleted file mode 100644 index 34b72fdda68984..00000000000000 --- a/components/ee/ws-scheduler/pkg/scheduler/scheduler_test.go +++ /dev/null @@ -1,419 +0,0 @@ -// Copyright (c) 2020 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package scheduler - -import ( - "context" - "sort" - "testing" - "time" - - "github.com/google/go-cmp/cmp" - "github.com/sirupsen/logrus" - corev1 "k8s.io/api/core/v1" - res "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - fakek8s "k8s.io/client-go/kubernetes/fake" - - wsk8s "github.com/gitpod-io/gitpod/common-go/kubernetes" - "github.com/gitpod-io/gitpod/common-go/log" -) - -var ( - testWorkspaceImage = "gitpod/workspace-full" - perssureToleranceSeconds int64 = 30 -) - -func TestGatherPotentialNodesFor(t *testing.T) { - log.Log.Logger.SetLevel(logrus.WarnLevel) - - tests := []struct { - Desc string - Nodes []*corev1.Node - Pod *corev1.Pod - CandidateNodes []string - }{ - { - Desc: "same effect toleration", - Nodes: []*corev1.Node{ - createNode("n1", []corev1.Taint{{Effect: corev1.TaintEffectNoSchedule, Key: "DiskPressure", Value: "true"}}), - createNode("n2", nil), - }, - Pod: createPod("foo", []corev1.Toleration{{Key: "DiskPressure", Effect: corev1.TaintEffectNoSchedule, Value: "true"}}), - CandidateNodes: []string{"n1", "n2"}, - }, - { - Desc: "other effect toleration", - Nodes: []*corev1.Node{ - createNode("n1", []corev1.Taint{{Key: "DiskPressure", Value: "true"}}), - createNode("n2", nil), - }, - Pod: createPod("foo", []corev1.Toleration{{Key: "DiskPressure", Effect: corev1.TaintEffectNoExecute, Value: "true"}}), - CandidateNodes: []string{"n1", "n2"}, - }, - { - Desc: "untolerated", - Nodes: []*corev1.Node{ - createNode("n1", []corev1.Taint{{Effect: corev1.TaintEffectNoSchedule, Key: "node.kubernetes.io/disk-pressure", Value: "true"}}), - createNode("n2", nil), - }, - Pod: createPod("foo", []corev1.Toleration{ - { - Key: "node.kubernetes.io/disk-pressure", - Operator: "Exists", - Effect: "NoExecute", - // Tolarate Indefinitely - }, - { - Key: "node.kubernetes.io/memory-pressure", - Operator: "Exists", - Effect: "NoExecute", - // Tolarate Indefinitely - }, - { - Key: "node.kubernetes.io/network-unavailable", - Operator: "Exists", - Effect: "NoExecute", - TolerationSeconds: &perssureToleranceSeconds, - }, - }), - CandidateNodes: []string{"n2"}, - }, - } - - for _, test := range tests { - t.Run(test.Desc, func(t *testing.T) { - var objs []runtime.Object - for _, n := range test.Nodes { - objs = append(objs, n) - } - objs = append(objs, test.Pod) - - client := fakek8s.NewSimpleClientset(objs...) - scheduler, err := NewScheduler(Configuration{ - Namespace: testNamespace, - SchedulerName: "test-ws-scheduler", - StrategyName: "DensityAndExperience", - DensityAndExperienceConfig: &DensityAndExperienceConfig{ - WorkspaceFreshPeriodSeconds: 120, - NodeFreshWorkspaceLimit: 2, - }, - }, client) - if err != nil { - t.Errorf("unexpected error: %+q", err) - return - } - - ctx, cancel := context.WithCancel(context.Background()) - scheduler.startInformer(ctx) - - candidates, err := scheduler.gatherPotentialNodesFor(context.Background(), test.Pod) - cancel() - - if err != nil { - t.Errorf("unexpected error: %+q", err) - return - } - - cn := make([]string, len(candidates)) - for i, c := range candidates { - cn[i] = c.Name - } - sort.Slice(cn, func(i, j int) bool { return cn[i] < cn[j] }) - sort.Slice(test.CandidateNodes, func(i, j int) bool { return test.CandidateNodes[i] < test.CandidateNodes[j] }) - - if diff := cmp.Diff(test.CandidateNodes, cn); diff != "" { - t.Errorf("unexpected candidate nodes (-want +got):\n%s", diff) - } - }) - } -} - -func TestRequiredServices(t *testing.T) { - tests := []struct { - Desc string - Nodes []*corev1.Node - Pods []*corev1.Pod - TargetPod *corev1.Pod - Expectation []string - }{ - { - Desc: "node with service", - Nodes: []*corev1.Node{ - createNode("node1", nil), - }, - Pods: []*corev1.Pod{ - createPod("some-pod", nil), - createPod("some-other-pod", nil), - modifyPod(createPod("service", nil), func(p *corev1.Pod) { - p.Labels = map[string]string{ - wsk8s.GitpodNodeServiceLabel: "service", - } - p.Spec.NodeName = "node1" - }), - }, - TargetPod: modifyPod(createPod("target-pod", nil), func(p *corev1.Pod) { - p.Annotations = map[string]string{ - wsk8s.RequiredNodeServicesAnnotation: "service", - } - }), - Expectation: []string{"node1"}, - }, - { - Desc: "node without service", - Nodes: []*corev1.Node{ - createNode("node1", nil), - }, - Pods: []*corev1.Pod{ - createPod("some-pod", nil), - createPod("some-other-pod", nil), - }, - TargetPod: modifyPod(createPod("target-pod", nil), func(p *corev1.Pod) { - p.Annotations = map[string]string{ - wsk8s.RequiredNodeServicesAnnotation: "service", - } - }), - }, - { - Desc: "two nodes with service", - Nodes: []*corev1.Node{ - createNode("node1", nil), - createNode("node2", nil), - }, - Pods: []*corev1.Pod{ - createPod("some-pod", nil), - createPod("some-other-pod", nil), - modifyPod(createPod("service", nil), func(p *corev1.Pod) { - p.Labels = map[string]string{ - wsk8s.GitpodNodeServiceLabel: "service", - } - p.Spec.NodeName = "node2" - }), - }, - TargetPod: modifyPod(createPod("target-pod", nil), func(p *corev1.Pod) { - p.Annotations = map[string]string{ - wsk8s.RequiredNodeServicesAnnotation: "service", - } - }), - Expectation: []string{"node2"}, - }, - { - Desc: "require two services - no node", - Nodes: []*corev1.Node{ - createNode("node1", nil), - createNode("node2", nil), - }, - Pods: []*corev1.Pod{ - createPod("some-pod", nil), - createPod("some-other-pod", nil), - modifyPod(createPod("service", nil), func(p *corev1.Pod) { - p.Labels = map[string]string{ - wsk8s.GitpodNodeServiceLabel: "service", - } - p.Spec.NodeName = "node2" - }), - }, - TargetPod: modifyPod(createPod("target-pod", nil), func(p *corev1.Pod) { - p.Annotations = map[string]string{ - wsk8s.RequiredNodeServicesAnnotation: "service,another", - } - }), - }, - { - Desc: "require two services - no node complete", - Nodes: []*corev1.Node{ - createNode("node1", nil), - createNode("node2", nil), - }, - Pods: []*corev1.Pod{ - createPod("some-pod", nil), - createPod("some-other-pod", nil), - modifyPod(createPod("service", nil), func(p *corev1.Pod) { - p.Labels = map[string]string{ - wsk8s.GitpodNodeServiceLabel: "service", - } - p.Spec.NodeName = "node1" - }), - modifyPod(createPod("another", nil), func(p *corev1.Pod) { - p.Labels = map[string]string{ - wsk8s.GitpodNodeServiceLabel: "another", - } - p.Spec.NodeName = "node2" - }), - }, - TargetPod: modifyPod(createPod("target-pod", nil), func(p *corev1.Pod) { - p.Annotations = map[string]string{ - wsk8s.RequiredNodeServicesAnnotation: "service,another", - } - }), - }, - { - Desc: "require two services - positive", - Nodes: []*corev1.Node{ - createNode("node1", nil), - createNode("node2", nil), - }, - Pods: []*corev1.Pod{ - createPod("some-pod", nil), - createPod("some-other-pod", nil), - modifyPod(createPod("service", nil), func(p *corev1.Pod) { - p.Labels = map[string]string{ - wsk8s.GitpodNodeServiceLabel: "service", - } - p.Spec.NodeName = "node2" - }), - modifyPod(createPod("another", nil), func(p *corev1.Pod) { - p.Labels = map[string]string{ - wsk8s.GitpodNodeServiceLabel: "another", - } - p.Spec.NodeName = "node2" - }), - }, - TargetPod: modifyPod(createPod("target-pod", nil), func(p *corev1.Pod) { - p.Annotations = map[string]string{ - wsk8s.RequiredNodeServicesAnnotation: "service,another", - } - }), - Expectation: []string{"node2"}, - }, - { - Desc: "require two services - negative, because on is not RUNNING yet", - Nodes: []*corev1.Node{ - createNode("node1", nil), - createNode("node2", nil), - }, - Pods: []*corev1.Pod{ - createPod("some-pod", nil), - createPod("some-other-pod", nil), - modifyPod(createPod("service", nil), func(p *corev1.Pod) { - p.Labels = map[string]string{ - wsk8s.GitpodNodeServiceLabel: "service", - } - p.Spec.NodeName = "node2" - }), - modifyPod(createPod("another", nil), func(p *corev1.Pod) { - p.Labels = map[string]string{ - wsk8s.GitpodNodeServiceLabel: "another", - } - p.Spec.NodeName = "node2" - p.Status.Phase = corev1.PodPending - }), - }, - TargetPod: modifyPod(createPod("target-pod", nil), func(p *corev1.Pod) { - p.Annotations = map[string]string{ - wsk8s.RequiredNodeServicesAnnotation: "service,another", - } - }), - Expectation: nil, - }, - } - - for _, test := range tests { - t.Run(test.Desc, func(t *testing.T) { - var objs []runtime.Object - for _, n := range test.Nodes { - objs = append(objs, n) - } - for _, p := range test.Pods { - objs = append(objs, p) - } - - client := fakek8s.NewSimpleClientset(objs...) - scheduler, err := NewScheduler(Configuration{ - Namespace: testNamespace, - SchedulerName: "test-ws-scheduler", - StrategyName: "DensityAndExperience", - DensityAndExperienceConfig: &DensityAndExperienceConfig{ - WorkspaceFreshPeriodSeconds: 120, - NodeFreshWorkspaceLimit: 2, - }, - }, client) - if err != nil { - t.Errorf("unexpected error: %+q", err) - return - } - - ctx, cancel := context.WithCancel(context.Background()) - scheduler.startInformer(ctx) - - state, err := scheduler.buildState(ctx, test.TargetPod, wsk8s.IsNonGhostWorkspace(test.TargetPod)) - cancel() - if err != nil { - t.Fatal(err) - } - - var act []string - for _, n := range state.Nodes { - act = append(act, n.Node.Name) - } - sort.Slice(act, func(i, j int) bool { return act[i] < act[j] }) - - if diff := cmp.Diff(test.Expectation, act); diff != "" { - t.Errorf("unexpected state (-want +got):\n%s", diff) - } - }) - } -} - -func createNode(name string, taints []corev1.Taint) *corev1.Node { - return &corev1.Node{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - }, - Status: corev1.NodeStatus{ - Allocatable: corev1.ResourceList{ - corev1.ResourceMemory: res.MustParse("10Gi"), - }, - Images: []corev1.ContainerImage{ - {Names: []string{testWorkspaceImage}}, - }, - }, - Spec: corev1.NodeSpec{ - Taints: taints, - }, - } -} - -func createPod(name string, tolerations []corev1.Toleration) *corev1.Pod { - return &corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - CreationTimestamp: metav1.NewTime(time.Now()), - }, - Status: corev1.PodStatus{ - Conditions: []corev1.PodCondition{ - { - Type: corev1.ContainersReady, - Status: corev1.ConditionTrue, - }, - { - Type: corev1.PodReady, - Status: corev1.ConditionTrue, - }, - }, - Phase: corev1.PodRunning, - }, - Spec: corev1.PodSpec{ - Containers: []corev1.Container{ - { - Name: "workspace", - Image: testWorkspaceImage, - Resources: corev1.ResourceRequirements{ - Requests: corev1.ResourceList{ - corev1.ResourceMemory: res.MustParse("1Gi"), - }, - }, - }, - }, - Tolerations: tolerations, - }, - } -} - -func modifyPod(p *corev1.Pod, m func(p *corev1.Pod)) *corev1.Pod { - m(p) - return p -} diff --git a/components/ee/ws-scheduler/pkg/scheduler/state.go b/components/ee/ws-scheduler/pkg/scheduler/state.go deleted file mode 100644 index 6077707f291035..00000000000000 --- a/components/ee/ws-scheduler/pkg/scheduler/state.go +++ /dev/null @@ -1,483 +0,0 @@ -// Copyright (c) 2020 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package scheduler - -import ( - "fmt" - "sort" - "strings" - - corev1 "k8s.io/api/core/v1" - res "k8s.io/apimachinery/pkg/api/resource" - - wsk8s "github.com/gitpod-io/gitpod/common-go/kubernetes" -) - -// State holds all nodes -type State struct { - Nodes map[string]*Node - Pods map[string]*corev1.Pod - Bindings []*Binding -} - -// Node models a k8s node -type Node struct { - Node *corev1.Node - // contains all pods that are not in Ghosts - Pods []*corev1.Pod - // contains all ghost workspaces from our namespace - Ghosts []*corev1.Pod - - RAM ResourceUsage - EphemeralStorage ResourceUsage - - Services map[string]struct{} - - // The number of pods on a node is limited by the resources available and by the kubelet. - PodSlots PodSlots -} - -type PodSlots struct { - // Total number of pod slots on this node. - Total int64 - - // Available pod slots - Available int64 -} - -func (p PodSlots) DebugStringResourceUsage() string { - return fmt.Sprintf("pods scheduled %d, capacity %d, avail %d", p.Total-p.Available, p.Total, p.Available) -} - -// Binding models a k8s binding pod -> node -type Binding struct { - Pod *corev1.Pod - NodeName string -} - -// ResourceUsage models various quantities of a resource on a given node -type ResourceUsage struct { - // Total quantity of resource available on this machine, used or not. - Total *res.Quantity - - // Quantity available/free on the node in total. - // This figure is: total - (headlessWorkspaces + regularWorkspaces + allOtherPods) - Available *res.Quantity - - // Resource used by ghost workspaces - UsedGhost *res.Quantity - - // Resource used by all headless workspaces - UsedHeadless *res.Quantity - - // Resource used by all regular workspaces - UsedRegular *res.Quantity - - // Resource used by non-workspace pods - UsedOther *res.Quantity -} - -func newResourceUsage(total *res.Quantity) ResourceUsage { - tc := total.DeepCopy() - return ResourceUsage{ - Total: &tc, - Available: res.NewQuantity(0, res.BinarySI), - UsedGhost: res.NewQuantity(0, res.BinarySI), - UsedHeadless: res.NewQuantity(0, res.BinarySI), - UsedOther: res.NewQuantity(0, res.BinarySI), - UsedRegular: res.NewQuantity(0, res.BinarySI), - } -} - -func (r *ResourceUsage) updateAvailable(ghostsAreVisible bool) { - tc := r.Total.DeepCopy() - r.Available = &tc - if ghostsAreVisible { - r.Available.Sub(*r.UsedGhost) - } - r.Available.Sub(*r.UsedHeadless) - r.Available.Sub(*r.UsedOther) - r.Available.Sub(*r.UsedRegular) -} - -func (r *ResourceUsage) DeepCopy() *ResourceUsage { - copy := func(qty *res.Quantity) *res.Quantity { - cpy := qty.DeepCopy() - return &cpy - } - return &ResourceUsage{ - Total: copy(r.Total), - Available: copy(r.Available), - UsedGhost: copy(r.UsedGhost), - UsedHeadless: copy(r.UsedHeadless), - UsedOther: copy(r.UsedOther), - UsedRegular: copy(r.UsedRegular), - } -} - -func (n *Node) copy() *Node { - return &Node{ - Node: n.Node, - Pods: n.Pods, - Ghosts: n.Ghosts, - Services: n.Services, - RAM: *n.RAM.DeepCopy(), - EphemeralStorage: *n.EphemeralStorage.DeepCopy(), - PodSlots: PodSlots{ - Total: n.PodSlots.Total, - Available: n.PodSlots.Available, - }, - } -} - -// ComputeState builds a new state based on the current world view -func ComputeState(nodes []*corev1.Node, pods []*corev1.Pod, bindings []*Binding, ramSafetyBuffer *res.Quantity, ghostsAreVisible bool, namespace string) *State { - type podAndNode struct { - pod *corev1.Pod - nodeName string - } - var ( - nds = make(map[string]*Node) - pds = make(map[string]*corev1.Pod) - podToNode = make(map[string]*podAndNode) - ) - - // We need a unique assignment of pod to node, as no pod can be scheduled on two nodes - // at the same time. Also, we assume that our bindings are more accurate/up to date than - // the pods, hence given them precedence when it comes to computing this assignment. - for _, p := range pods { - pds[p.Name] = p - - if p.Spec.NodeName == "" { - continue - } - podToNode[p.Name] = &podAndNode{ - pod: p, - nodeName: p.Spec.NodeName, - } - } - for _, b := range bindings { - if _, exists := pds[b.Pod.Name]; !exists { - // We've found a binding for a pod that we don't yet see in the list of pods. - // This can happen if we're listing faster than the Pod informer updates. - pds[b.Pod.Name] = b.Pod - } - - podToNode[b.Pod.Name] = &podAndNode{ - pod: b.Pod, - nodeName: b.NodeName, - } - } - - // With a unique pod to node assignment, we can invert that relationship and compute - // which node has which pods. If we did this right away, we might assign the same pod - // to multiple nodes. - type ntp struct { - pods map[string]struct{} - } - nodeToPod := make(map[string]*ntp, len(nodes)) - for _, n := range nodes { - nds[n.Name] = &Node{ - Node: n, - } - nodeToPod[n.Name] = &ntp{ - pods: make(map[string]struct{}), - } - } - for podName, podAndNode := range podToNode { - ntp, ok := nodeToPod[podAndNode.nodeName] - if !ok { - continue - } - ntp.pods[podName] = struct{}{} - } - - for nodeName, node := range nds { - ntp := nodeToPod[nodeName] - assignedPods := ntp.pods - node.Pods = make([]*corev1.Pod, 0, len(assignedPods)) - node.Ghosts = make([]*corev1.Pod, 0, len(assignedPods)) - for pn := range assignedPods { - pod := pds[pn] - if isGhostWorkspace(pod, namespace) { - node.Ghosts = append(node.Ghosts, pod) - } else { - node.Pods = append(node.Pods, pod) - } - } - node.update(namespace, ramSafetyBuffer, ghostsAreVisible) - } - - return &State{ - Nodes: nds, - Pods: pds, - Bindings: bindings, - } -} - -func (n *Node) update(namespace string, ramSafetyBuffer *res.Quantity, ghostsAreVisible bool) { - n.PodSlots.Total = n.Node.Status.Capacity.Pods().Value() - n.PodSlots.Available = n.PodSlots.Total - allocatableRAMWithSafetyBuffer := n.Node.Status.Allocatable.Memory().DeepCopy() - allocatableRAMWithSafetyBuffer.Sub(*ramSafetyBuffer) - n.RAM = newResourceUsage(&allocatableRAMWithSafetyBuffer) - n.EphemeralStorage = newResourceUsage(n.Node.Status.Allocatable.StorageEphemeral()) - n.Services = make(map[string]struct{}) - - var assignedPods []*corev1.Pod - assignedPods = append(assignedPods, n.Pods...) - assignedPods = append(assignedPods, n.Ghosts...) - for _, pod := range assignedPods { - n.PodSlots.Available-- - - service, ok := pod.ObjectMeta.Labels[wsk8s.GitpodNodeServiceLabel] - if ok { - var ( - containersReady bool - podReady bool - podRunning bool - ) - for _, c := range pod.Status.Conditions { - if c.Type == corev1.ContainersReady { - containersReady = c.Status == corev1.ConditionTrue - } - if c.Type == corev1.PodReady { - podReady = c.Status == corev1.ConditionTrue - } - } - podRunning = pod.Status.Phase == corev1.PodRunning - - // we're checking podReady AND containersReady to be sure we're not missing sth - if !(podReady && containersReady && podRunning) { - continue - } - n.Services[service] = struct{}{} - } - - var ram, eph *res.Quantity - if isGhostWorkspace(pod, namespace) { - ram = n.RAM.UsedGhost - eph = n.EphemeralStorage.UsedGhost - } else if wsk8s.IsHeadlessWorkspace(pod) { - ram = n.RAM.UsedHeadless - eph = n.EphemeralStorage.UsedHeadless - } else if wsk8s.IsRegularWorkspace(pod) { - ram = n.RAM.UsedRegular - eph = n.EphemeralStorage.UsedRegular - } else { - ram = n.RAM.UsedOther - eph = n.EphemeralStorage.UsedOther - } - ram.Add(podRAMRequest(pod)) - eph.Add(podEphemeralStorageRequest(pod)) - } - n.RAM.updateAvailable(ghostsAreVisible) - n.EphemeralStorage.updateAvailable(ghostsAreVisible) -} - -// we only handle ghost workspaces as "ghost" if they are from our namespace! -func isGhostWorkspace(p *corev1.Pod, namespace string) bool { - return p.Namespace == namespace && - wsk8s.IsGhostWorkspace(p) -} - -// FilterNodes removes all nodes for which the predicate does not return true -func (s *State) FilterNodes(predicate func(*Node) (include bool)) { - var goner []string - for k, n := range s.Nodes { - if predicate(n) { - continue - } - goner = append(goner, k) - } - - for _, k := range goner { - delete(s.Nodes, k) - } -} - -// SortOrder configures the order in which something is sorted -type SortOrder int - -const ( - // SortAsc means things are sorted in ascending order - SortAsc SortOrder = iota - // SortDesc means things are sorted in descending order - SortDesc -) - -// SortNodesByUsedRegularWorkspaceRAM sorts the node list of this state by the amount of RAM used -// by regular workspaces on each node. -func (s *State) SortNodesByUsedRegularWorkspaceRAM(order SortOrder) []*Node { - nodes := NodeMapToList(s.Nodes) - sort.Slice(nodes, func(i, j int) bool { - ni, nj := nodes[i], nodes[j] - if order == SortAsc { - ni, nj = nodes[j], nodes[i] - } - - cmp := ni.RAM.UsedRegular.AsDec().Cmp(nj.RAM.UsedRegular.AsDec()) - if cmp == 0 { - if ni.Node.Name < nj.Node.Name { - cmp = 1 - } else { - cmp = -1 - } - } - return cmp > 0 - }) - return nodes -} - -// SortNodesByAvailableRAM returns the list of nodes from state sorted by .RAM.Available -func (s *State) SortNodesByAvailableRAM(order SortOrder) []*Node { - nodes := NodeMapToList(s.Nodes) - sort.Slice(nodes, func(i, j int) bool { - if order == SortAsc { - return nodes[i].RAM.Available.AsDec().Cmp(nodes[j].RAM.Available.AsDec()) <= 0 - } - - return nodes[i].RAM.Available.AsDec().Cmp(nodes[j].RAM.Available.AsDec()) > 0 - }) - return nodes -} - -// FindSpareGhostToDelete returns a ghost to delete if that is necessary to fit the pod onto the node -func (s *State) FindSpareGhostToDelete(nodeName string, pod *corev1.Pod, namespace string, ramSafetyBuffer *res.Quantity, reservedSlots map[string]*Slot) (ghostToDelete string, unscheduleable bool) { - node, ok := s.Nodes[nodeName] - if !ok { - return "", false - } - if len(node.Ghosts) == 0 { - return "", false - } - - // check if there already is enough space even with ghosts - ghostsVisible := true - nodeWithGhostsVisible := node.copy() - // make sure we do not see double (ghost + workspace that is meant to replace it), so remove all reserved - // (not-yet-bound) workspaces - for _, g := range nodeWithGhostsVisible.Ghosts { - slot, exists := reservedSlots[g.Name] - if !exists || slot.Bound { - continue - } - // remove the pod that's only here because of a "reserved slot" - for i, p := range nodeWithGhostsVisible.Pods { - if p.Name == slot.Binding.Pod.Name { - // wipe node.Pods[i] in O(1) - lastIndex := len(nodeWithGhostsVisible.Pods) - 1 - nodeWithGhostsVisible.Pods[i] = nodeWithGhostsVisible.Pods[lastIndex] - nodeWithGhostsVisible.Pods = nodeWithGhostsVisible.Pods[:lastIndex] - break - } - } - } - nodeWithGhostsVisible.update(namespace, ramSafetyBuffer, ghostsVisible) - if FitsOnNode(pod, nodeWithGhostsVisible) { - // the pod fits onto the node (even with ghosts) we do not need to delete a ghost at all - return "", false - } - - // make sure every pod-to-schedule deletes a new ghost - candidates := make([]*corev1.Pod, 0, len(node.Ghosts)) - for _, g := range node.Ghosts { - if slot, reserved := reservedSlots[g.Name]; reserved { - // make sure we do not exclude our reserved ghost as target slot - if slot.Binding.Pod.Name != pod.Name { - continue - } - } - candidates = append(candidates, g) - } - if len(candidates) == 0 { - // all candidates are already reserved: unscheduleable - return "", true - } - - // return the oldest ghost (for good measure) - sort.Slice(candidates, func(i, j int) bool { - return candidates[i].ObjectMeta.CreationTimestamp.Time.Before(candidates[j].ObjectMeta.CreationTimestamp.Time) - }) - return candidates[0].Name, false -} - -// podRAMRequest calculates the amount of RAM requested by all containers of the given pod -func podRAMRequest(pod *corev1.Pod) res.Quantity { - requestedRAM := res.NewQuantity(0, res.BinarySI) - for _, c := range pod.Spec.Containers { - requestedRAM.Add(*c.Resources.Requests.Memory()) - } - return *requestedRAM -} - -// podEphemeralStorageRequest calculates the amount of ephemeral storage requested by all containers of the given pod -func podEphemeralStorageRequest(pod *corev1.Pod) res.Quantity { - requestedEphStorage := res.NewQuantity(0, res.BinarySI) - for _, c := range pod.Spec.Containers { - requestedEphStorage.Add(*c.Resources.Requests.StorageEphemeral()) - } - return *requestedEphStorage -} - -// NodeMapToList returns a slice of entry of the map -func NodeMapToList(m map[string]*Node) []*Node { - nodes := make([]*Node, 0, len(m)) - for _, n := range m { - nodes = append(nodes, n) - } - return nodes -} - -// DebugStringResourceUsage returns a debug string describing the used resources -func (r *ResourceUsage) DebugStringResourceUsage() string { - usedRegularGibs := toMiString(r.UsedRegular) - usedGhostGibs := toMiString(r.UsedGhost) - usedHeadlessGibs := toMiString(r.UsedHeadless) - usedOtherGibs := toMiString(r.UsedOther) - totalGibs := toMiString(r.Total) - availableGibs := toMiString(r.Available) - - return fmt.Sprintf("used %s(r)+%s(g)+%s(h)+%s(o) of %s, avail %s Mi", usedRegularGibs, usedGhostGibs, usedHeadlessGibs, usedOtherGibs, totalGibs, availableGibs) -} - -func toMiString(q *res.Quantity) string { - cv, _ := q.AsScale(res.Mega) // we don't care about sub-meg precision because it is for displaying only - var out []byte - out, _ = cv.AsCanonicalBytes(out) // we already know the exponent as we set scale above - return string(out) -} - -// DebugStringNodes prints available RAM per node as string for debug purposes -func DebugStringNodes(nodes ...*Node) string { - lines := make([]string, 0, len(nodes)*3) - for _, node := range nodes { - lines = append(lines, fmt.Sprintf("- %s:", node.Node.Name)) - lines = append(lines, fmt.Sprintf(" RAM: %s", node.RAM.DebugStringResourceUsage())) - lines = append(lines, fmt.Sprintf(" Eph. Storage: %s", node.EphemeralStorage.DebugStringResourceUsage())) - lines = append(lines, fmt.Sprintf(" Pods: %s", node.PodSlots.DebugStringResourceUsage())) - } - return strings.Join(lines, "\n") -} - -// DebugStringNodes prints available RAM per node as string for debug purposes -func DebugStringPodsOnNodes(nodes ...*Node) string { - lines := make([]string, 0, len(nodes)*3) - for _, node := range nodes { - lines = append(lines, fmt.Sprintf("- %s:", node.Node.Name)) - pds := make([]string, 0, len(node.Pods)) - for _, p := range node.Pods { - pds = append(pds, p.Name) - } - lines = append(lines, fmt.Sprintf(" pods: %s", strings.Join(pds, ", "))) - - gs := make([]string, 0, len(node.Ghosts)) - for _, g := range node.Ghosts { - gs = append(gs, g.Name) - } - lines = append(lines, fmt.Sprintf(" ghosts: %s", strings.Join(gs, ", "))) - } - return strings.Join(lines, "\n") -} diff --git a/components/ee/ws-scheduler/pkg/scheduler/state_test.go b/components/ee/ws-scheduler/pkg/scheduler/state_test.go deleted file mode 100644 index ad1187006d200f..00000000000000 --- a/components/ee/ws-scheduler/pkg/scheduler/state_test.go +++ /dev/null @@ -1,258 +0,0 @@ -// Copyright (c) 2020 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package scheduler_test - -import ( - "sort" - "testing" - - corev1 "k8s.io/api/core/v1" - res "k8s.io/apimachinery/pkg/api/resource" - - sched "github.com/gitpod-io/gitpod/ws-scheduler/pkg/scheduler" - "github.com/google/go-cmp/cmp" -) - -func TestState(t *testing.T) { - defaultNodeSet := func() []*corev1.Node { - return []*corev1.Node{ - createNode("node1", "10000Mi", "0Mi", false, 100), - createNode("node2", "10000Mi", "0Mi", false, 100), - createNode("node3", "10000Mi", "0Mi", true, 100), - } - } - - tests := []struct { - Desc string - RAMSafetyBuffer string - Nodes []*corev1.Node - Pods []*corev1.Pod - Bindings []*sched.Binding - GhostsInvisible bool - Expectation string - }{ - { - Desc: "no pods", - RAMSafetyBuffer: "512Mi", - Nodes: defaultNodeSet(), - Expectation: `- node1: - RAM: used 0(r)+0(g)+0(h)+0(o) of 9949, avail 9949 Mi - Eph. Storage: used 0(r)+0(g)+0(h)+0(o) of 0, avail 0 Mi - Pods: pods scheduled 0, capacity 100, avail 100 -- node2: - RAM: used 0(r)+0(g)+0(h)+0(o) of 9949, avail 9949 Mi - Eph. Storage: used 0(r)+0(g)+0(h)+0(o) of 0, avail 0 Mi - Pods: pods scheduled 0, capacity 100, avail 100 -- node3: - RAM: used 0(r)+0(g)+0(h)+0(o) of 9949, avail 9949 Mi - Eph. Storage: used 0(r)+0(g)+0(h)+0(o) of 0, avail 0 Mi - Pods: pods scheduled 0, capacity 100, avail 100`, - }, - { - Desc: "other pods only", - RAMSafetyBuffer: "512Mi", - Nodes: defaultNodeSet(), - Pods: []*corev1.Pod{ - createNonWorkspacePod("existingPod1", "1500Mi", "0Mi", "node1", "10s"), - createNonWorkspacePod("existingPod2", "1000Mi", "0Mi", "node2", "10s"), - }, - Expectation: `- node1: - RAM: used 0(r)+0(g)+0(h)+1573(o) of 9949, avail 8377 Mi - Eph. Storage: used 0(r)+0(g)+0(h)+0(o) of 0, avail 0 Mi - Pods: pods scheduled 1, capacity 100, avail 99 -- node2: - RAM: used 0(r)+0(g)+0(h)+1049(o) of 9949, avail 8901 Mi - Eph. Storage: used 0(r)+0(g)+0(h)+0(o) of 0, avail 0 Mi - Pods: pods scheduled 1, capacity 100, avail 99 -- node3: - RAM: used 0(r)+0(g)+0(h)+0(o) of 9949, avail 9949 Mi - Eph. Storage: used 0(r)+0(g)+0(h)+0(o) of 0, avail 0 Mi - Pods: pods scheduled 0, capacity 100, avail 100`, - }, - { - Desc: "some headless pods", - RAMSafetyBuffer: "512Mi", - Nodes: defaultNodeSet(), - Pods: []*corev1.Pod{ - createNonWorkspacePod("existingPod1", "1500Mi", "0Mi", "node1", "10s"), - createNonWorkspacePod("existingPod2", "1000Mi", "0Mi", "node2", "10s"), - createHeadlessWorkspacePod("hp1", "1000Mi", "0Mi", "node2", "10s"), - createHeadlessWorkspacePod("hp2", "2220Mi", "0Mi", "node2", "10s"), - }, - Expectation: `- node1: - RAM: used 0(r)+0(g)+0(h)+1573(o) of 9949, avail 8377 Mi - Eph. Storage: used 0(r)+0(g)+0(h)+0(o) of 0, avail 0 Mi - Pods: pods scheduled 1, capacity 100, avail 99 -- node2: - RAM: used 0(r)+0(g)+3377(h)+1049(o) of 9949, avail 5524 Mi - Eph. Storage: used 0(r)+0(g)+0(h)+0(o) of 0, avail 0 Mi - Pods: pods scheduled 3, capacity 100, avail 97 -- node3: - RAM: used 0(r)+0(g)+0(h)+0(o) of 9949, avail 9949 Mi - Eph. Storage: used 0(r)+0(g)+0(h)+0(o) of 0, avail 0 Mi - Pods: pods scheduled 0, capacity 100, avail 100`, - }, - { - Desc: "some regular pods", - RAMSafetyBuffer: "512Mi", - Nodes: defaultNodeSet(), - Pods: []*corev1.Pod{ - createNonWorkspacePod("existingPod1", "1500Mi", "0Mi", "node1", "10s"), - createNonWorkspacePod("existingPod2", "1000Mi", "0Mi", "node2", "10s"), - createWorkspacePod("hp1", "1000Mi", "0Mi", "node1", "10s"), - createWorkspacePod("hp2", "3440Mi", "0Mi", "node1", "10s"), - }, - Expectation: `- node1: - RAM: used 4656(r)+0(g)+0(h)+1573(o) of 9949, avail 3721 Mi - Eph. Storage: used 0(r)+0(g)+0(h)+0(o) of 0, avail 0 Mi - Pods: pods scheduled 3, capacity 100, avail 97 -- node2: - RAM: used 0(r)+0(g)+0(h)+1049(o) of 9949, avail 8901 Mi - Eph. Storage: used 0(r)+0(g)+0(h)+0(o) of 0, avail 0 Mi - Pods: pods scheduled 1, capacity 100, avail 99 -- node3: - RAM: used 0(r)+0(g)+0(h)+0(o) of 9949, avail 9949 Mi - Eph. Storage: used 0(r)+0(g)+0(h)+0(o) of 0, avail 0 Mi - Pods: pods scheduled 0, capacity 100, avail 100`, - }, - { - Desc: "some regular pods with ", - RAMSafetyBuffer: "512Mi", - Nodes: []*corev1.Node{ - createNode("node1", "10000Mi", "20000Mi", false, 100), - createNode("node2", "10000Mi", "10000Mi", false, 100), - createNode("node3", "10000Mi", "10000Mi", true, 100), - }, - Pods: []*corev1.Pod{ - createNonWorkspacePod("existingPod1", "1500Mi", "5000Mi", "node1", "10s"), - createNonWorkspacePod("existingPod2", "1000Mi", "2000Mi", "node2", "10s"), - createWorkspacePod("hp1", "1000Mi", "5000Mi", "node1", "10s"), - createWorkspacePod("hp2", "3440Mi", "5000Mi", "node1", "10s"), - }, - Expectation: `- node1: - RAM: used 4656(r)+0(g)+0(h)+1573(o) of 9949, avail 3721 Mi - Eph. Storage: used 10486(r)+0(g)+0(h)+5243(o) of 20972, avail 5243 Mi - Pods: pods scheduled 3, capacity 100, avail 97 -- node2: - RAM: used 0(r)+0(g)+0(h)+1049(o) of 9949, avail 8901 Mi - Eph. Storage: used 0(r)+0(g)+0(h)+2098(o) of 10486, avail 8389 Mi - Pods: pods scheduled 1, capacity 100, avail 99 -- node3: - RAM: used 0(r)+0(g)+0(h)+0(o) of 9949, avail 9949 Mi - Eph. Storage: used 0(r)+0(g)+0(h)+0(o) of 10486, avail 10486 Mi - Pods: pods scheduled 0, capacity 100, avail 100`, - }, - { - Desc: "bound but not listed", - RAMSafetyBuffer: "512Mi", - Nodes: []*corev1.Node{ - createNode("node1", "10000Mi", "20000Mi", false, 100), - }, - Bindings: []*sched.Binding{ - { - Pod: createWorkspacePod("hp1", "1000Mi", "5000Mi", "node1", "10s"), - NodeName: "node1", - }, - }, - Expectation: `- node1: - RAM: used 1049(r)+0(g)+0(h)+0(o) of 9949, avail 8901 Mi - Eph. Storage: used 5243(r)+0(g)+0(h)+0(o) of 20972, avail 15729 Mi - Pods: pods scheduled 1, capacity 100, avail 99`, - }, - { - Desc: "some pods and ghosts on nodes (ghosts VISIBLE)", - RAMSafetyBuffer: "512Mi", - Nodes: []*corev1.Node{ - createNode("node1", "10000Mi", "20000Mi", false, 100), - createNode("node2", "10000Mi", "10000Mi", false, 100), - createNode("node3", "10000Mi", "10000Mi", true, 100), - }, - Pods: []*corev1.Pod{ - createNonWorkspacePod("existingPod1", "1500Mi", "500Mi", "node1", "10s"), - createNonWorkspacePod("existingPod2", "1000Mi", "200Mi", "node2", "10s"), - createWorkspacePod("hp1", "1000Mi", "100Mi", "node1", "10s"), - createWorkspacePod("hp2", "3440Mi", "100Mi", "node1", "10s"), - createGhostPod("ghost1", "1500Mi", "100Mi", "node1", "10s"), - createGhostPod("ghost2", "1500Mi", "100Mi", "node2", "10s"), - }, - GhostsInvisible: false, - Expectation: `- node1: - RAM: used 4656(r)+1573(g)+0(h)+1573(o) of 9949, avail 2148 Mi - Eph. Storage: used 210(r)+105(g)+0(h)+525(o) of 20972, avail 20133 Mi - Pods: pods scheduled 4, capacity 100, avail 96 -- node2: - RAM: used 0(r)+1573(g)+0(h)+1049(o) of 9949, avail 7328 Mi - Eph. Storage: used 0(r)+105(g)+0(h)+210(o) of 10486, avail 10172 Mi - Pods: pods scheduled 2, capacity 100, avail 98 -- node3: - RAM: used 0(r)+0(g)+0(h)+0(o) of 9949, avail 9949 Mi - Eph. Storage: used 0(r)+0(g)+0(h)+0(o) of 10486, avail 10486 Mi - Pods: pods scheduled 0, capacity 100, avail 100`, - }, - { - Desc: "some pods and ghosts on nodes (ghosts INVISIBLE)", - RAMSafetyBuffer: "512Mi", - Nodes: []*corev1.Node{ - createNode("node1", "10000Mi", "20000Mi", false, 100), - createNode("node2", "10000Mi", "10000Mi", false, 100), - createNode("node3", "10000Mi", "10000Mi", true, 100), - }, - Pods: []*corev1.Pod{ - createNonWorkspacePod("existingPod1", "1500Mi", "500Mi", "node1", "10s"), - createNonWorkspacePod("existingPod2", "1000Mi", "200Mi", "node2", "10s"), - createWorkspacePod("hp1", "1000Mi", "100Mi", "node1", "10s"), - createWorkspacePod("hp2", "3440Mi", "100Mi", "node1", "10s"), - createGhostPod("ghost1", "1500Mi", "100Mi", "node1", "10s"), - createGhostPod("ghost2", "1500Mi", "100Mi", "node2", "10s"), - }, - GhostsInvisible: true, - Expectation: `- node1: - RAM: used 4656(r)+1573(g)+0(h)+1573(o) of 9949, avail 3721 Mi - Eph. Storage: used 210(r)+105(g)+0(h)+525(o) of 20972, avail 20238 Mi - Pods: pods scheduled 4, capacity 100, avail 96 -- node2: - RAM: used 0(r)+1573(g)+0(h)+1049(o) of 9949, avail 8901 Mi - Eph. Storage: used 0(r)+105(g)+0(h)+210(o) of 10486, avail 10277 Mi - Pods: pods scheduled 2, capacity 100, avail 98 -- node3: - RAM: used 0(r)+0(g)+0(h)+0(o) of 9949, avail 9949 Mi - Eph. Storage: used 0(r)+0(g)+0(h)+0(o) of 10486, avail 10486 Mi - Pods: pods scheduled 0, capacity 100, avail 100`, - }, - { - Desc: "out of pods", - RAMSafetyBuffer: "512Mi", - Nodes: []*corev1.Node{ - createNode("node1", "10000Mi", "20000Mi", false, 1), - }, - Pods: []*corev1.Pod{ - createNonWorkspacePod("existingPod1", "1500Mi", "500Mi", "node1", "10s"), - }, - GhostsInvisible: true, - Expectation: `- node1: - RAM: used 0(r)+0(g)+0(h)+1573(o) of 9949, avail 8377 Mi - Eph. Storage: used 0(r)+0(g)+0(h)+525(o) of 20972, avail 20448 Mi - Pods: pods scheduled 1, capacity 1, avail 0`, - }, - } - - for _, test := range tests { - t.Run(test.Desc, func(t *testing.T) { - ramSafetyBuffer := res.MustParse(test.RAMSafetyBuffer) - state := sched.ComputeState(test.Nodes, test.Pods, test.Bindings, &ramSafetyBuffer, !test.GhostsInvisible, defaultTestNamespace) - - nodes := state.SortNodesByAvailableRAM(sched.SortAsc) - // in some tests the RAM sort order is not stable as nodes have the same amount of RAM. - // This would intermittently break tests. We instead sort by name. - sort.Slice(nodes, func(i, j int) bool { return nodes[i].Node.Name < nodes[j].Node.Name }) - - actual := sched.DebugStringNodes(nodes...) - - if diff := cmp.Diff(test.Expectation, actual); diff != "" { - t.Errorf("unexpected candidate nodes (-want +got):\n%s", diff) - } - }) - } -} diff --git a/components/ee/ws-scheduler/pkg/scheduler/strategy.go b/components/ee/ws-scheduler/pkg/scheduler/strategy.go deleted file mode 100644 index 507a8d12226988..00000000000000 --- a/components/ee/ws-scheduler/pkg/scheduler/strategy.go +++ /dev/null @@ -1,329 +0,0 @@ -// Copyright (c) 2020 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package scheduler - -import ( - "math" - "sort" - "time" - - "golang.org/x/xerrors" - corev1 "k8s.io/api/core/v1" - - wsk8s "github.com/gitpod-io/gitpod/common-go/kubernetes" - "github.com/gitpod-io/gitpod/common-go/log" -) - -// StrategyName is the type that identifies strategies -type StrategyName string - -const ( - // StrategyEvenLoadSpots identifies the EvenLoadSpots schedule strategy - StrategyEvenLoadSpots StrategyName = "EvenLoadSpots" - // StrategyEvenLoad identifies the EvenLoad schedule strategy - StrategyEvenLoad StrategyName = "EvenLoad" - // StrategyDensityAndExperience identifies the DensityAndExperience schedule strategy - StrategyDensityAndExperience StrategyName = "DensityAndExperience" -) - -const ( - errorNoNodeWithEnoughResourcesAvailable = "No node with enough resources available!\nRAM requested: %s\nEph. Storage requested: %s\nNodes:\n%s" -) - -// Strategy is the interface that make the actual scheduling interchangable -type Strategy interface { - // Selects a node for the given Pod based on the current State - // ("", err) => PodReasonUnschedulable, err contains explanaition - // (, nil) => successful scheduling - Select(state *State, pod *corev1.Pod) (nodeName string, err error) -} - -// CreateStrategy creates a Strategy for the given name -func CreateStrategy(name StrategyName, config Configuration) (Strategy, error) { - switch name { - case StrategyEvenLoadSpots: - return &EvenLoadSpots{}, nil - case StrategyEvenLoad: - return &EvenLoad{}, nil - case StrategyDensityAndExperience: - var strategyConfig = config.DensityAndExperienceConfig - if strategyConfig == nil { - strategyConfig = DefaultDensityAndExperienceConfig() - } - return &DensityAndExperience{ - Config: *strategyConfig, - }, nil - default: - return nil, xerrors.Errorf("unable to match Strategy name '%s'!", name) - } -} - -// EvenLoadSpots scheduling: Assigns pods to the node least used node -type EvenLoadSpots struct { -} - -// Select will assign pods to the node with the least ressources used -func (e *EvenLoadSpots) Select(state *State, pod *corev1.Pod) (string, error) { - type candidateNode struct { - Node *Node - SpotsAvailable int - } - - allNodes := state.Nodes - availableNodes := make([]candidateNode, 0) - for _, n := range allNodes { - req := podRAMRequest(pod) - spotsAvailable := int(n.Node.Status.Allocatable.Memory().Value() / req.Value()) - if int64(spotsAvailable) > n.PodSlots.Available { - spotsAvailable = int(n.PodSlots.Available) - } - if spotsAvailable == 0 { - continue - } - - availableNodes = append(availableNodes, candidateNode{n, spotsAvailable}) - } - - if len(availableNodes) == 0 { - return "", xerrors.Errorf("no node available") - } - - // Sorting for multiple criteria using this kind of less function is a bit tricky. The important thing - // is to maintain the correct "order" within a sorting condition, i.e. ascending "if i < j { return true }" - // and for descending "if i > j { return false }". - sort.Slice(availableNodes, func(i, j int) bool { - ni := availableNodes[i] - nj := availableNodes[j] - - // Sort ascending by spots available. - // We want to pack on to nodes who have the most workspaces already, so that we pack densely. - if ni.SpotsAvailable < nj.SpotsAvailable { - return true - } - - // sort ascending by RAM use - if ni.Node.Node.Status.Allocatable.Memory().Cmp(*nj.Node.Node.Status.Allocatable.Memory()) > 0 { - return false - } - - return false - }) - return availableNodes[0].Node.Node.Name, nil -} - -// EvenLoad scheduling: Assigns pods to the node least used node -type EvenLoad struct { -} - -// Select will assign pods to the node with the least ressources used -func (e *EvenLoad) Select(state *State, pod *corev1.Pod) (string, error) { - sortedNodes := state.SortNodesByAvailableRAM(SortDesc) - - if len(sortedNodes) == 0 { - requestedRAM := podRAMRequest(pod) - requestedEphStorage := podEphemeralStorageRequest(pod) - debugStr := DebugStringNodes(sortedNodes...) - return "", xerrors.Errorf(errorNoNodeWithEnoughResourcesAvailable, requestedRAM.String(), requestedEphStorage.String(), debugStr) - } - - candidate := sortedNodes[0] - if !FitsOnNode(pod, candidate) { - requestedRAM := podRAMRequest(pod) - requestedEphStorage := podEphemeralStorageRequest(pod) - debugStr := DebugStringNodes(sortedNodes...) - return "", xerrors.Errorf(errorNoNodeWithEnoughResourcesAvailable, requestedRAM.String(), requestedEphStorage.String(), debugStr) - } - - return candidate.Node.Name, nil -} - -// DensityAndExperience is a strategy that aims to reach high workspace/node density while maintaining the best possible user experience -// by adding constraints like "do not schedule too much fresh pods on one node (if possible)" -type DensityAndExperience struct { - Config DensityAndExperienceConfig -} - -// Select for DensityAndExperience works as follows: -// - try to assign to fullest node -// - exception: -// - other nodes are available -// AND the fullest node has other workspace started within the last X seconds (to avoid slowing down startup) -// - Bonus points: if there are multiple preferred nodes available (because they are full to Y% and thus regarded as equal): schedule to the node which already has the workspace image (present in node.Status.Images) -func (s *DensityAndExperience) Select(state *State, pod *corev1.Pod) (string, error) { - sortedNodes := state.SortNodesByUsedRegularWorkspaceRAM(SortDesc) - - var candidates []*Node - for _, node := range sortedNodes { - if !FitsOnNode(pod, node) { - continue - } - candidates = append(candidates, node) - } - - if len(candidates) == 0 { - requestedRAM := podRAMRequest(pod) - requestedEphStorage := podEphemeralStorageRequest(pod) - debugStr := DebugStringNodes(sortedNodes...) - return "", xerrors.Errorf(errorNoNodeWithEnoughResourcesAvailable, requestedRAM.String(), requestedEphStorage.String(), debugStr) - } - - // From this point on we're safe: Choosing any of the candidates would work. - defaultCandidate := candidates[0] - // Now we're only concerned with the user experience - but only for non-headless workspaces! - // Headless workspaces just mustn't break the user experience of non-headless ones. Hence we - // want to schedule headless workspaces as far away from regular ones as we can. - if wsk8s.IsHeadlessWorkspace(pod) { - // We try and find the least utilised node that still has regular workspaces on it. - // This way we place the headless workspace "on the other end" of the cluster, but - // don't prevent scale-down. - for i := len(candidates) - 1; i >= 0; i-- { - if regularWorkspaceCount(state, candidates[i]) > 0 { - return candidates[i].Node.Name, nil - } - } - - // In case we didn't find a non-empty node, we'll place this headless workspace on the - // same default candidate as we would for regular workspaces. This way we prevent cluster - // "fragmentation" on either end of the pool. If we used candidates[len(candidates)-1] we - // run the risk of keeping a node alive just for prebuilds, as headless workspaces don't - // count into the regular workspace count. - return defaultCandidate.Node.Name, nil - } - - // For user workspaces, we want to: - // - try to not schedule too many fresh workspaces onto the same node - candidatesWoFreshWorkspaces := make([]*Node, 0) - for _, node := range candidates { - if freshWorkspaceCount(state, node, s.Config.WorkspaceFreshPeriodSeconds) < s.Config.NodeFreshWorkspaceLimit { - candidatesWoFreshWorkspaces = append(candidatesWoFreshWorkspaces, node) - } - } - - if len(candidatesWoFreshWorkspaces) == 0 { - // Not nice: Let's log to be able to identify these cases - log.Debugf("Scheduling on node which already has a recent workspace") - return defaultCandidate.Node.Name, nil - } - - // Now we have a list of workspaces sorted by density, those with fresh workspaces excluded. - // It would be awesome if we preferred the node which already has the image we need. - // For that to not break our density-first approach we have to somehow classify our nodes and - // make sure we are not going to do much worser than without. E.g., just because of a cached - // an image, we do not want to keep an empty node alive - { - candidate := defaultCandidate - candidatesClass := classifyNode(state, candidate) - for _, nextCandidate := range candidates[1:] { - // Take candidate if it's a match... - if hasNeededImage(candidate, pod) { - // Yeah, ideal case! - return candidate.Node.Name, nil - } - - // ...or nextCandidate would worsen things - nextCandidatesClass := classifyNode(state, nextCandidate) - if nextCandidatesClass < candidatesClass { - // We do not want to worsen things: Just stick with the default choice - break - } - candidate = nextCandidate - candidatesClass = nextCandidatesClass - } - } - - return defaultCandidate.Node.Name, nil -} - -// FitsOnNode checks if a pod can be scheduled to a node -func FitsOnNode(pod *corev1.Pod, node *Node) bool { - ramReq := podRAMRequest(pod) - ephStorageReq := podEphemeralStorageRequest(pod) - - if ramReq.Cmp(*node.RAM.Available) > 0 { - // out of RAM - return false - } - - if ephStorageReq.CmpInt64(0) != 0 && ephStorageReq.Cmp(*node.EphemeralStorage.Available) > 0 { - // out of ephemeral storage - return false - } - - if node.PodSlots.Available == 0 { - // out of pod slots - return false - } - - return true -} - -func freshWorkspaceCount(state *State, node *Node, freshSeconds int) int { - var count int - for _, p := range node.Pods { - if !wsk8s.IsWorkspace(p) { - continue - } - if time.Since(p.ObjectMeta.CreationTimestamp.Time).Seconds() < float64(freshSeconds) { - count = count + 1 - } - } - return count -} - -func hasNeededImage(node *Node, pod *corev1.Pod) bool { - var imageName = "" - for _, container := range pod.Spec.Containers { - if container.Name == "workspace" { - imageName = container.Image - } - } - if imageName == "" { - log.Warnf("unable to get workspace image name from pod: %s", pod.Name) - return false - } - - for _, image := range node.Node.Status.Images { - for _, name := range image.Names { - if name == imageName { - return true - } - } - } - return false -} - -func classifyNode(state *State, node *Node) int { - if regularWorkspaceCount(state, node) == 0 { - // This makes sure that nodes without workspaces are actually observed as being "empty" which might not be the - // case due to other services running on that node. - return 0 - } - - used := float64(node.RAM.UsedRegular.Value()) - total := float64(node.RAM.Total.Value()) - result := int(math.Floor((used / total) * 10)) - if result >= 7 { - result = 7 - } - return result -} - -// regularRorkspaceCount counts the number of workspaces on the node. -// The returned count will not include headless workspaces. E.g. if a node has only headless -// workspaces running on it we'd return zero. -func regularWorkspaceCount(state *State, node *Node) int { - var count int - for _, p := range node.Pods { - if !wsk8s.IsWorkspace(p) { - continue - } - if wsk8s.IsHeadlessWorkspace(p) { - continue - } - - count = count + 1 - } - return count -} diff --git a/components/ee/ws-scheduler/pkg/scheduler/strategy_test.go b/components/ee/ws-scheduler/pkg/scheduler/strategy_test.go deleted file mode 100644 index 72f500fe1cd825..00000000000000 --- a/components/ee/ws-scheduler/pkg/scheduler/strategy_test.go +++ /dev/null @@ -1,463 +0,0 @@ -// Copyright (c) 2020 Gitpod GmbH. All rights reserved. -// Licensed under the Gitpod Enterprise Source Code License, -// See License.enterprise.txt in the project root folder. - -package scheduler_test - -import ( - "testing" - "time" - - corev1 "k8s.io/api/core/v1" - res "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - wsk8s "github.com/gitpod-io/gitpod/common-go/kubernetes" - sched "github.com/gitpod-io/gitpod/ws-scheduler/pkg/scheduler" - "github.com/google/go-cmp/cmp" -) - -const ( - defaultTestNamespace = "default" -) - -var ( - testBaseTime = time.Date(2020, 01, 01, 01, 01, 0, 0, time.UTC) - testWorkspaceImage = "gitpod/workspace-full" -) - -func TestDensityAndExperience(t *testing.T) { - type Expectation struct { - Node string - Error string - GhostReplaced string - } - - tests := []struct { - Desc string - Broken string - RAMSafetyBuffer string - Nodes []*corev1.Node - Pods []*corev1.Pod - ScheduledPod *corev1.Pod - Expectation Expectation - }{ - { - Desc: "no node", - RAMSafetyBuffer: "512Mi", - ScheduledPod: &corev1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "testpod"}}, - Expectation: Expectation{Error: `No node with enough resources available! -RAM requested: 0 -Eph. Storage requested: 0 -Nodes: -`}, - }, - { - Desc: "no node with enough RAM", - RAMSafetyBuffer: "512Mi", - Nodes: []*corev1.Node{createNode("node1", "10000Mi", "0Mi", false, 100)}, - Pods: []*corev1.Pod{createNonWorkspacePod("existingPod1", "8000Mi", "0Mi", "node1", "10s")}, - ScheduledPod: createWorkspacePod("pod", "6000Mi", "0Mi", "", "1000s"), - Expectation: Expectation{Error: `No node with enough resources available! -RAM requested: 6000Mi -Eph. Storage requested: 0 -Nodes: -- node1: - RAM: used 0(r)+0(g)+0(h)+8389(o) of 9949, avail 1561 Mi - Eph. Storage: used 0(r)+0(g)+0(h)+0(o) of 0, avail 0 Mi - Pods: pods scheduled 1, capacity 100, avail 99`}, - }, - { - Desc: "single empty node", - RAMSafetyBuffer: "512Mi", - Nodes: []*corev1.Node{createNode("node1", "10000Mi", "0Mi", false, 100)}, - ScheduledPod: createWorkspacePod("pod", "6000Mi", "0Mi", "", "1000s"), - Expectation: Expectation{Node: "node1"}, - }, - { - Desc: "two nodes, one full", - RAMSafetyBuffer: "512Mi", - Nodes: []*corev1.Node{ - createNode("node1", "10000Mi", "0Mi", false, 100), - createNode("node2", "10000Mi", "0Mi", false, 100), - }, - Pods: []*corev1.Pod{createNonWorkspacePod("existingPod1", "8000Mi", "0Mi", "node1", "10s")}, - ScheduledPod: createWorkspacePod("pod", "6000Mi", "0Mi", "", "1000s"), - Expectation: Expectation{Node: "node2"}, - }, - { - Desc: "two nodes, prefer density", - RAMSafetyBuffer: "512Mi", - Nodes: []*corev1.Node{ - createNode("node1", "10000Mi", "0Mi", false, 100), - createNode("node2", "10000Mi", "0Mi", false, 100), - }, - Pods: []*corev1.Pod{createWorkspacePod("existingPod1", "1000Mi", "0Mi", "node1", "10s")}, - ScheduledPod: createWorkspacePod("pod", "6000Mi", "0Mi", "", "1000s"), - Expectation: Expectation{Node: "node1"}, - }, - { - Desc: "three nodes, prefer with image", - RAMSafetyBuffer: "512Mi", - Nodes: []*corev1.Node{ - createNode("node1", "10000Mi", "0Mi", false, 100), - createNode("node2", "10000Mi", "0Mi", true, 100), - createNode("node3", "10000Mi", "0Mi", false, 100), - }, - Pods: []*corev1.Pod{ - createWorkspacePod("existingPod1", "1500Mi", "0Mi", "node1", "10s"), - createWorkspacePod("existingPod2", "1000Mi", "0Mi", "node2", "10s"), - }, - ScheduledPod: createWorkspacePod("pod", "6000Mi", "0Mi", "", "1000s"), - Expectation: Expectation{Node: "node2"}, - }, - { - Desc: "three nodes, prefer with image in class", - RAMSafetyBuffer: "512Mi", - Nodes: []*corev1.Node{ - createNode("node1", "10000Mi", "0Mi", false, 100), - createNode("node2", "10000Mi", "0Mi", false, 100), - createNode("node3", "10000Mi", "0Mi", true, 100), - }, - Pods: []*corev1.Pod{ - createWorkspacePod("existingPod1", "1500Mi", "0Mi", "node1", "10s"), - createWorkspacePod("existingPod2", "1000Mi", "0Mi", "node2", "10s"), - }, - ScheduledPod: createWorkspacePod("pod", "6000Mi", "0Mi", "", "1000s"), - Expectation: Expectation{Node: "node1"}, - }, - { - // We musn't place headless pods on nodes without regular workspaces - Desc: "three nodes, place headless pod", - RAMSafetyBuffer: "512Mi", - Nodes: []*corev1.Node{ - createNode("node1", "10000Mi", "0Mi", false, 100), - createNode("node2", "10000Mi", "0Mi", true, 100), - createNode("node3", "10000Mi", "0Mi", true, 100), - }, - Pods: []*corev1.Pod{ - createWorkspacePod("existingPod1", "1500Mi", "0Mi", "node1", "10s"), - createWorkspacePod("existingPod2", "1000Mi", "0Mi", "node2", "10s"), - createHeadlessWorkspacePod("hpod", "500Mi", "0Mi", "node3", "1000s"), - }, - ScheduledPod: createHeadlessWorkspacePod("pod", "6000Mi", "0Mi", "", "1000s"), - Expectation: Expectation{Node: "node2"}, - }, - { - Desc: "three empty nodes, place headless pod", - RAMSafetyBuffer: "512Mi", - Nodes: []*corev1.Node{ - createNode("node1", "10000Mi", "0Mi", false, 100), - createNode("node2", "10000Mi", "0Mi", true, 100), - createNode("node3", "10000Mi", "0Mi", true, 100), - }, - ScheduledPod: createHeadlessWorkspacePod("pod", "6000Mi", "0Mi", "", "1000s"), - Expectation: Expectation{Node: "node1"}, - }, - { - Desc: "filter full nodes, headless workspaces", - RAMSafetyBuffer: "512Mi", - Nodes: []*corev1.Node{ - createNode("node1", "10000Mi", "0Mi", false, 100), - createNode("node2", "10000Mi", "0Mi", false, 100), - }, - Pods: []*corev1.Pod{ - createHeadlessWorkspacePod("existingPod1", "4000Mi", "0Mi", "node1", "10s"), - createWorkspacePod("existingPod2", "4000Mi", "0Mi", "node1", "10s"), - }, - ScheduledPod: createWorkspacePod("pod", "4000Mi", "0Mi", "", "10s"), - Expectation: Expectation{Node: "node2"}, - }, - { - // Should choose node1 because it has more free RAM but chooses 2 because node1's pod capacity is depleted - Desc: "respect node's pod capacity", - RAMSafetyBuffer: "512Mi", - Nodes: []*corev1.Node{ - createNode("node1", "10000Mi", "0Mi", false, 0), - createNode("node2", "10000Mi", "0Mi", false, 100), - }, - Pods: []*corev1.Pod{ - createWorkspacePod("existingPod1", "4000Mi", "0Mi", "node2", "10s"), - }, - ScheduledPod: createWorkspacePod("new pod", "4000Mi", "0Mi", "node1", "10s"), - Expectation: Expectation{Node: "node2"}, - }, - { - // Should choose node1 because it has more free RAM but chooses 2 because node1's ephemeral storage is depleted - Desc: "respect node's ephemeral storage", - RAMSafetyBuffer: "512Mi", - Nodes: []*corev1.Node{ - createNode("node1", "10000Mi", "3000Mi", false, 100), - createNode("node2", "10000Mi", "15000Mi", false, 100), - }, - Pods: []*corev1.Pod{ - createWorkspacePod("existingPod1", "4000Mi", "5000Mi", "node2", "10s"), - }, - ScheduledPod: createWorkspacePod("new pod", "4000Mi", "5000Mi", "node1", "10s"), - Expectation: Expectation{Node: "node2"}, - }, - { - // Throws an error because both nodes have enough RAM but not enough ephemeral storage - Desc: "enough RAM but no more ephemeral storage", - RAMSafetyBuffer: "512Mi", - Nodes: []*corev1.Node{ - createNode("node1", "10000Mi", "3000Mi", false, 100), - createNode("node2", "10000Mi", "7000Mi", false, 100), - }, - Pods: []*corev1.Pod{ - createWorkspacePod("existingPod1", "4000Mi", "5000Mi", "node2", "10s"), - }, - ScheduledPod: createWorkspacePod("new pod", "4000Mi", "5000Mi", "node1", "10s"), - Expectation: Expectation{Error: `No node with enough resources available! -RAM requested: 4000Mi -Eph. Storage requested: 5000Mi -Nodes: -- node2: - RAM: used 4195(r)+0(g)+0(h)+0(o) of 9949, avail 5755 Mi - Eph. Storage: used 5243(r)+0(g)+0(h)+0(o) of 7341, avail 2098 Mi - Pods: pods scheduled 1, capacity 100, avail 99 -- node1: - RAM: used 0(r)+0(g)+0(h)+0(o) of 9949, avail 9949 Mi - Eph. Storage: used 0(r)+0(g)+0(h)+0(o) of 3146, avail 3146 Mi - Pods: pods scheduled 0, capacity 100, avail 100`}, - }, - { - // Should prefer 1 and 2 over 3, but 1 has not enough pod slots and 2 not enough ephemeral storage - Desc: "filter nodes without enough pod slots and ephemeral storage", - RAMSafetyBuffer: "512Mi", - Nodes: []*corev1.Node{ - createNode("node1", "20000Mi", "10000Mi", false, 0), - createNode("node2", "20000Mi", "10000Mi", false, 100), - createNode("node3", "20000Mi", "10000Mi", false, 100), - }, - Pods: []*corev1.Pod{ - createWorkspacePod("existingPod1", "4000Mi", "5000Mi", "node2", "10s"), - createWorkspacePod("existingPod2", "4000Mi", "5000Mi", "node2", "10s"), - createWorkspacePod("existingPod3", "4000Mi", "5000Mi", "node3", "10s"), - }, - ScheduledPod: createWorkspacePod("new pod", "4000Mi", "5000Mi", "node1", "10s"), - Expectation: Expectation{Node: "node3"}, - }, - { - // Schedules on 1 because node2 is more dense but full already - Desc: "schedule ghost by density", - RAMSafetyBuffer: "512Mi", - Nodes: []*corev1.Node{ - createNode("node1", "10000Mi", "10000Mi", false, 100), - createNode("node2", "10000Mi", "10000Mi", false, 100), - }, - Pods: []*corev1.Pod{ - createWorkspacePod("existingPod1", "4000Mi", "5000Mi", "node2", "10s"), - createGhostPod("ghost1", "4000Mi", "5000Mi", "node2", "10s"), - }, - ScheduledPod: createGhostPod("new ghost", "4000Mi", "5000Mi", "", "10s"), - Expectation: Expectation{Node: "node1"}, - }, - { - // Should schedule to 2 because of density and it does ignore the ghost that blocks its slot - Desc: "schedule workspace by density, ignoring ghost", - RAMSafetyBuffer: "512Mi", - Nodes: []*corev1.Node{ - createNode("node1", "10000Mi", "10000Mi", false, 100), - createNode("node2", "10000Mi", "10000Mi", false, 100), - }, - Pods: []*corev1.Pod{ - createWorkspacePod("existingPod1", "4000Mi", "5000Mi", "node2", "10s"), - createGhostPod("ghost1", "4000Mi", "5000Mi", "node2", "10s"), - }, - ScheduledPod: createWorkspacePod("new workspace", "4000Mi", "5000Mi", "", "10s"), - Expectation: Expectation{Node: "node2", GhostReplaced: "ghost1"}, - }, - { - // Should schedule to 2 because of density and it ignores ghosts. - // Should delete ghost2 because probes replace ghosts, and ghost2 is the oldest one - Desc: "schedule probe and replace pod", - RAMSafetyBuffer: "512Mi", - Nodes: []*corev1.Node{ - createNode("node1", "10000Mi", "10000Mi", false, 100), - createNode("node2", "10000Mi", "10000Mi", false, 100), - }, - Pods: []*corev1.Pod{ - createWorkspacePod("workspace1", "3000Mi", "3000Mi", "node2", "10s"), - createGhostPod("ghost1", "3000Mi", "3000Mi", "node2", "8s"), - createGhostPod("ghost2", "3000Mi", "3000Mi", "node2", "10s"), - }, - ScheduledPod: createProbePod("workspace2", "3000Mi", "3000Mi", "", "10s"), - Expectation: Expectation{Node: "node2", GhostReplaced: "ghost2"}, - }, - } - - for _, test := range tests { - t.Run(test.Desc, func(t *testing.T) { - if test.Broken != "" { - t.Skip(test.Broken) - } - - ramSafetyBuffer := res.MustParse(test.RAMSafetyBuffer) - ghostsVisible := !wsk8s.IsNonGhostWorkspace(test.ScheduledPod) - state := sched.ComputeState(test.Nodes, test.Pods, nil, &ramSafetyBuffer, ghostsVisible, defaultTestNamespace) - - densityAndExperienceConfig := sched.DefaultDensityAndExperienceConfig() - strategy, err := sched.CreateStrategy(sched.StrategyDensityAndExperience, sched.Configuration{ - DensityAndExperienceConfig: densityAndExperienceConfig, - }) - if err != nil { - t.Errorf("cannot create strategy: %v", err) - return - } - - node, err := strategy.Select(state, test.ScheduledPod) - - var act Expectation - act.Node = node - if err != nil { - act.Error = err.Error() - } - act.GhostReplaced, _ = state.FindSpareGhostToDelete(node, test.ScheduledPod, defaultTestNamespace, &ramSafetyBuffer, make(map[string]*sched.Slot)) - - if diff := cmp.Diff(test.Expectation, act); diff != "" { - t.Errorf("unexpected TestDensityAndExperience result (-want +got):\n%s", diff) - } - }) - } -} - -func createNode(name string, ram string, ephemeralStorage string, withImage bool, podCapacity int64) *corev1.Node { - images := make([]corev1.ContainerImage, 0) - if withImage { - images = append(images, corev1.ContainerImage{ - Names: []string{testWorkspaceImage}, - }) - } - return &corev1.Node{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - }, - Status: corev1.NodeStatus{ - Allocatable: corev1.ResourceList{ - corev1.ResourceMemory: res.MustParse(ram), - corev1.ResourceEphemeralStorage: res.MustParse(ephemeralStorage), - }, - Images: images, - Capacity: corev1.ResourceList{ - corev1.ResourcePods: *res.NewQuantity(podCapacity, res.BinarySI), - }, - }, - } -} - -func createNonWorkspacePod(name string, ram string, ephemeralStorage string, nodeName string, age string) *corev1.Pod { - return createPod(name, ram, ephemeralStorage, nodeName, age, map[string]string{}) -} - -func createHeadlessWorkspacePod(name string, ram string, ephemeralStorage string, nodeName string, age string) *corev1.Pod { - return createPod(name, ram, ephemeralStorage, nodeName, age, map[string]string{ - "component": "workspace", - "headless": "true", - }) -} - -func createWorkspacePod(name string, ram string, ephemeralStorage string, nodeName string, age string) *corev1.Pod { - return createPod(name, ram, ephemeralStorage, nodeName, age, map[string]string{ - "component": "workspace", - wsk8s.TypeLabel: "regular", - }) -} - -func createGhostPod(name string, ram string, ephemeralStorage string, nodeName string, age string) *corev1.Pod { - return createPod(name, ram, ephemeralStorage, nodeName, age, map[string]string{ - "component": "workspace", - "headless": "true", - wsk8s.TypeLabel: "ghost", - }) -} - -func createProbePod(name string, ram string, ephemeralStorage string, nodeName string, age string) *corev1.Pod { - return createPod(name, ram, ephemeralStorage, nodeName, age, map[string]string{ - "component": "workspace", - "headless": "true", - wsk8s.TypeLabel: "probe", - }) -} - -func createPod(name string, ram string, ephemeralStorage string, nodeName string, ageStr string, labels map[string]string) *corev1.Pod { - creationTimestamp := testBaseTime.Add(-MustParseDuration(ageStr)) - return &corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: defaultTestNamespace, - CreationTimestamp: metav1.NewTime(creationTimestamp), - Labels: labels, - }, - Spec: corev1.PodSpec{ - NodeName: nodeName, - Containers: []corev1.Container{ - { - Name: "workspace", - Image: testWorkspaceImage, - Resources: corev1.ResourceRequirements{ - Requests: corev1.ResourceList{ - corev1.ResourceMemory: res.MustParse(ram), - corev1.ResourceEphemeralStorage: res.MustParse(ephemeralStorage), - }, - }, - }, - }, - }, - } -} - -func MustParseDuration(str string) time.Duration { - dur, err := time.ParseDuration(str) - if err != nil { - panic("duration does not parse") - } - return dur -} - -func TestFitsOnNode(t *testing.T) { - tests := []struct { - Name string - Pod *corev1.Pod - Node *corev1.Node - Expecation bool - }{ - { - Name: "happy path", - Pod: createPod("pod", "100Mi", "0Mi", "", "0s", nil), - Node: createNode("node1", "10000Mi", "0Mi", false, 100), - Expecation: true, - }, - { - Name: "out of pods", - Pod: createPod("pod", "100Mi", "0Mi", "", "0s", nil), - Node: createNode("node1", "10000Mi", "0Mi", false, 0), - Expecation: false, - }, - { - Name: "out of ram", - Pod: createPod("pod", "100Mi", "0Mi", "", "0s", nil), - Node: createNode("node1", "10Mi", "0Mi", false, 100), - Expecation: false, - }, - { - Name: "out of ephemeral storage", - Pod: createPod("pod", "100Mi", "10Mi", "", "0s", nil), - Node: createNode("node1", "10000Mi", "0Mi", false, 0), - Expecation: false, - }, - } - - ramSafetyBuffer := res.MustParse("0Mi") - for _, test := range tests { - - t.Run(test.Name, func(t *testing.T) { - state := sched.ComputeState([]*corev1.Node{test.Node}, nil, nil, &ramSafetyBuffer, true, defaultTestNamespace) - - act := sched.FitsOnNode(test.Pod, state.Nodes[test.Node.Name]) - if diff := cmp.Diff(test.Expecation, act); diff != "" { - t.Errorf("unexpected FitsOnNode() result (-want +got):\n%s", diff) - } - }) - } -} diff --git a/components/gitpod-cli/go.mod b/components/gitpod-cli/go.mod index d2369443c0b156..d184bf6fed0ae5 100644 --- a/components/gitpod-cli/go.mod +++ b/components/gitpod-cli/go.mod @@ -22,6 +22,8 @@ require ( gopkg.in/yaml.v2 v2.4.0 ) +require github.com/sourcegraph/jsonrpc2 v0.0.0-20200429184054-15c2290dcb37 + require ( github.com/alecthomas/gometalinter v2.0.11+incompatible // indirect github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf // indirect @@ -39,7 +41,6 @@ require ( github.com/mattn/go-colorable v0.0.9 // indirect github.com/mattn/go-isatty v0.0.4 // indirect github.com/pelletier/go-toml v1.2.0 // indirect - github.com/sourcegraph/jsonrpc2 v0.0.0-20200429184054-15c2290dcb37 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/tsenart/deadcode v0.0.0-20160724212837-210d2dc333e9 // indirect golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect diff --git a/components/image-builder-bob/go.mod b/components/image-builder-bob/go.mod index c86f63a6e02c4b..0f08e45a059b2c 100644 --- a/components/image-builder-bob/go.mod +++ b/components/image-builder-bob/go.mod @@ -19,6 +19,7 @@ require ( github.com/containerd/containerd v1.5.5 github.com/docker/distribution v2.7.1+incompatible github.com/hashicorp/go-retryablehttp v0.7.0 + github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 github.com/sirupsen/logrus v1.8.1 ) diff --git a/components/installation-telemetry/go.sum b/components/installation-telemetry/go.sum index b635f17453e973..2c13ff284fa97b 100644 --- a/components/installation-telemetry/go.sum +++ b/components/installation-telemetry/go.sum @@ -49,30 +49,22 @@ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -101,9 +93,6 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -115,13 +104,9 @@ github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go. github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -129,21 +114,12 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-test/deep v1.0.5/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -192,7 +168,6 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -212,17 +187,11 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= @@ -254,27 +223,21 @@ github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOn github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -286,8 +249,6 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -309,33 +270,17 @@ github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eI github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -344,33 +289,25 @@ github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSg github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/segmentio/backo-go v0.0.0-20200129164019-23eae7c10bd3/go.mod h1:9/Rh6yILuLysoQnZ2oNooD2g7aBnvM7r/fNVxRNWfBc= github.com/segmentio/backo-go v1.0.0 h1:kbOAtGJY2DqOR0jfRkYEorx/b18RgtepGtY3+Cpe6qA= github.com/segmentio/backo-go v1.0.0/go.mod h1:kJ9mm9YmoWSkk+oQ+5Cj8DEoRCX2JT6As4kEtIIOp1M= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -380,11 +317,9 @@ github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU github.com/spf13/cobra v1.3.0 h1:R7cSvGu+Vv+qX0gW5R/85dx2kmmJT5z5NM8ifdYjdn0= github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -396,8 +331,6 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/uber/jaeger-client-go v2.29.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c h1:3lbZUMbMiGUW/LMkfsEABsc5zNT9+b1CvsJx47JzJ8g= github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c/go.mod h1:UrdRz5enIKZ63MEE3IF9l2/ebyx59GyGgPi+tICQdmM= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -416,12 +349,8 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.8.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -433,10 +362,7 @@ golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= @@ -446,7 +372,6 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -475,7 +400,6 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -489,7 +413,6 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -501,7 +424,6 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -516,7 +438,6 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -549,7 +470,6 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -562,17 +482,13 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -586,10 +502,7 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -597,7 +510,6 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -608,7 +520,6 @@ golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -635,11 +546,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -696,10 +604,6 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -760,7 +664,6 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -771,7 +674,6 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -849,24 +751,18 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/segmentio/analytics-go.v3 v3.1.0 h1:UzxH1uaGZRpMKDhJyBz0pexz6yUoBU3x8bJsRk/HV6U= gopkg.in/segmentio/analytics-go.v3 v3.1.0/go.mod h1:4QqqlTlSSpVlWA9/9nDcPw+FkM2yv1NQoYjUbL9/JAw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -876,16 +772,6 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.22.2/go.mod h1:y3ydYpLJAaDI+BbSe2xmGcqxiWHmWjkEeIbiwHvnPR8= -k8s.io/apimachinery v0.22.2/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/components/ws-manager-api/go/config/config.go b/components/ws-manager-api/go/config/config.go index 49a51e95f3d080..ab34ac4c7b4108 100644 --- a/components/ws-manager-api/go/config/config.go +++ b/components/ws-manager-api/go/config/config.go @@ -62,8 +62,6 @@ type ServiceConfiguration struct { type Configuration struct { // Namespace is the kubernetes namespace the workspace manager operates in Namespace string `json:"namespace"` - // SchedulerName is the name of the workspace scheduler all pods are created with - SchedulerName string `json:"schedulerName"` // SeccompProfile names the seccomp profile workspaces will use SeccompProfile string `json:"seccompProfile"` // Container configures all three workspace containers @@ -107,8 +105,6 @@ type Configuration struct { RegistryFacadeHost string `json:"registryFacadeHost"` // Cluster host under which workspaces are served, e.g. ws-eu11.gitpod.io WorkspaceClusterHost string `json:"workspaceClusterHost"` - // EnforceWorkspaceNodeAffinity makes ws-manager add node affinity to all workspace pods - EnforceWorkspaceNodeAffinity bool `json:"enforceWorkspaceNodeAffinity"` } // AllContainerConfiguration contains the configuration for all container in a workspace pod diff --git a/components/ws-manager/BUILD.yaml b/components/ws-manager/BUILD.yaml index 41fbea9b22bf00..70d4fcf49e92ea 100644 --- a/components/ws-manager/BUILD.yaml +++ b/components/ws-manager/BUILD.yaml @@ -63,7 +63,7 @@ packages: # - ["pwd"] # - ["kubectl", "create", "namespace", "wsman-integration-${__pkg_version}"] # - ["sh", "-c", "cp $HOME/.kube/config kubeconfig"] - # - ["sh", "-c", 'kubectl get node -l gitpod.io/workload_workspace --no-headers -o custom-columns=":metadata.name" | xargs kubectl patch node --patch ''{"metadata":{"labels":{"gitpod.io/theia.wsman-test": "available"}}}'''] + # - ["sh", "-c", 'kubectl get node -l gitpod.io/workload_workspace_regular --no-headers -o custom-columns=":metadata.name" | xargs kubectl patch node --patch ''{"metadata":{"labels":{"gitpod.io/theia.wsman-test": "available"}}}'''] # - ["kubectl", "--kubeconfig", "kubeconfig", "config", "set-context", "--current", "--namespace", "wsman-integration-${__pkg_version}"] # - ["components-ws-manager--app/ws-manager", "--kubeconfig", "kubeconfig", "integration-test", "patch-nodes", "-l", "gitpod.io/jenkins_agent"] # - ["sh", "-c", "./components-ws-manager--app/ws-manager --kubeconfig kubeconfig integration-test objs chart--helm/gitpod | kubectl --kubeconfig kubeconfig apply -f -"] diff --git a/components/ws-manager/config-schema.json b/components/ws-manager/config-schema.json index 63e163d64a46e4..56edd57b7ee94a 100644 --- a/components/ws-manager/config-schema.json +++ b/components/ws-manager/config-schema.json @@ -39,7 +39,6 @@ "Configuration": { "required": [ "namespace", - "schedulerName", "container", "timeouts", "initProbe", @@ -81,9 +80,6 @@ "reconnectionInterval": { "type": "string" }, - "schedulerName": { - "type": "string" - }, "theiaHostPath": { "type": "string" }, diff --git a/components/ws-manager/example-config.json b/components/ws-manager/example-config.json index c309fd0103f976..59fde3ad08ce61 100644 --- a/components/ws-manager/example-config.json +++ b/components/ws-manager/example-config.json @@ -2,7 +2,6 @@ "$schema": "./config-schema.json", "manager": { "namespace": "default", - "workspaceSchedulerName": "default-scheduler", "container": { "workspace": { "image": "csweichel/noop:latest", diff --git a/components/ws-manager/pkg/manager/create.go b/components/ws-manager/pkg/manager/create.go index a6ce50d7c176e0..a0127bf260fd0b 100644 --- a/components/ws-manager/pkg/manager/create.go +++ b/components/ws-manager/pkg/manager/create.go @@ -349,24 +349,22 @@ func (m *Manager) createDefiniteWorkspacePod(startContext *startWorkspaceContext if startContext.Headless { workloadType = "headless" } - var affinity *corev1.Affinity - if m.Config.EnforceWorkspaceNodeAffinity { - affinity = &corev1.Affinity{ - NodeAffinity: &corev1.NodeAffinity{ - RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{ - NodeSelectorTerms: []corev1.NodeSelectorTerm{ - { - MatchExpressions: []corev1.NodeSelectorRequirement{ - { - Key: "gitpod.io/workload_workspace_" + workloadType, - Operator: corev1.NodeSelectorOpExists, - }, + + affinity := &corev1.Affinity{ + NodeAffinity: &corev1.NodeAffinity{ + RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{ + NodeSelectorTerms: []corev1.NodeSelectorTerm{ + { + MatchExpressions: []corev1.NodeSelectorRequirement{ + { + Key: "gitpod.io/workload_workspace_" + workloadType, + Operator: corev1.NodeSelectorOpExists, }, }, }, }, }, - } + }, } pod := corev1.Pod{ @@ -381,7 +379,6 @@ func (m *Manager) createDefiniteWorkspacePod(startContext *startWorkspaceContext Hostname: req.Metadata.MetaId, AutomountServiceAccountToken: &boolFalse, ServiceAccountName: "workspace", - SchedulerName: m.Config.SchedulerName, EnableServiceLinks: &boolFalse, Affinity: affinity, Containers: []corev1.Container{ diff --git a/components/ws-manager/pkg/manager/create_test.go b/components/ws-manager/pkg/manager/create_test.go index 1f5b00532d147d..5c6732f42238d0 100644 --- a/components/ws-manager/pkg/manager/create_test.go +++ b/components/ws-manager/pkg/manager/create_test.go @@ -46,9 +46,6 @@ func TestCreateDefiniteWorkspacePod(t *testing.T) { fixture := input.(*fixture) mgmtCfg := forTestingOnlyManagerConfig() - if fixture.EnforceAffinity { - mgmtCfg.EnforceWorkspaceNodeAffinity = true - } if fixture.ResourceRequests != nil { var ( cont = mgmtCfg.Container diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_admission.golden b/components/ws-manager/pkg/manager/testdata/cdwp_admission.golden index e8e55a9197f455..8d2c5b4d8de5fa 100644 --- a/components/ws-manager/pkg/manager/testdata/cdwp_admission.golden +++ b/components/ws-manager/pkg/manager/testdata/cdwp_admission.golden @@ -208,7 +208,22 @@ "serviceAccountName": "workspace", "automountServiceAccountToken": false, "hostname": "foobar", - "schedulerName": "workspace-scheduler", + "affinity": { + "nodeAffinity": { + "requiredDuringSchedulingIgnoredDuringExecution": { + "nodeSelectorTerms": [ + { + "matchExpressions": [ + { + "key": "gitpod.io/workload_workspace_regular", + "operator": "Exists" + } + ] + } + ] + } + } + }, "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_affinity.golden b/components/ws-manager/pkg/manager/testdata/cdwp_affinity.golden index a03d57102fc727..482a67b73be3f3 100644 --- a/components/ws-manager/pkg/manager/testdata/cdwp_affinity.golden +++ b/components/ws-manager/pkg/manager/testdata/cdwp_affinity.golden @@ -220,7 +220,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_empty_resource_req.golden b/components/ws-manager/pkg/manager/testdata/cdwp_empty_resource_req.golden index 3e0dc01763d032..e84edc4806cae6 100644 --- a/components/ws-manager/pkg/manager/testdata/cdwp_empty_resource_req.golden +++ b/components/ws-manager/pkg/manager/testdata/cdwp_empty_resource_req.golden @@ -202,7 +202,22 @@ "serviceAccountName": "workspace", "automountServiceAccountToken": false, "hostname": "foobar", - "schedulerName": "workspace-scheduler", + "affinity": { + "nodeAffinity": { + "requiredDuringSchedulingIgnoredDuringExecution": { + "nodeSelectorTerms": [ + { + "matchExpressions": [ + { + "key": "gitpod.io/workload_workspace_regular", + "operator": "Exists" + } + ] + } + ] + } + } + }, "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_envvars.golden b/components/ws-manager/pkg/manager/testdata/cdwp_envvars.golden index 28d0eb80b62ce5..0d982021482d66 100644 --- a/components/ws-manager/pkg/manager/testdata/cdwp_envvars.golden +++ b/components/ws-manager/pkg/manager/testdata/cdwp_envvars.golden @@ -237,7 +237,22 @@ "serviceAccountName": "workspace", "automountServiceAccountToken": false, "hostname": "foobar", - "schedulerName": "workspace-scheduler", + "affinity": { + "nodeAffinity": { + "requiredDuringSchedulingIgnoredDuringExecution": { + "nodeSelectorTerms": [ + { + "matchExpressions": [ + { + "key": "gitpod.io/workload_workspace_regular", + "operator": "Exists" + } + ] + } + ] + } + } + }, "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_fixedresources.golden b/components/ws-manager/pkg/manager/testdata/cdwp_fixedresources.golden index 474f886c2656a9..a316e004006d46 100644 --- a/components/ws-manager/pkg/manager/testdata/cdwp_fixedresources.golden +++ b/components/ws-manager/pkg/manager/testdata/cdwp_fixedresources.golden @@ -205,7 +205,22 @@ "serviceAccountName": "workspace", "automountServiceAccountToken": false, "hostname": "foobar", - "schedulerName": "workspace-scheduler", + "affinity": { + "nodeAffinity": { + "requiredDuringSchedulingIgnoredDuringExecution": { + "nodeSelectorTerms": [ + { + "matchExpressions": [ + { + "key": "gitpod.io/workload_workspace_regular", + "operator": "Exists" + } + ] + } + ] + } + } + }, "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_fullworkspacebackup.golden b/components/ws-manager/pkg/manager/testdata/cdwp_fullworkspacebackup.golden index 9e02cd00c59c40..d7975f7653ea53 100644 --- a/components/ws-manager/pkg/manager/testdata/cdwp_fullworkspacebackup.golden +++ b/components/ws-manager/pkg/manager/testdata/cdwp_fullworkspacebackup.golden @@ -194,7 +194,22 @@ "serviceAccountName": "workspace", "automountServiceAccountToken": false, "hostname": "foobar", - "schedulerName": "workspace-scheduler", + "affinity": { + "nodeAffinity": { + "requiredDuringSchedulingIgnoredDuringExecution": { + "nodeSelectorTerms": [ + { + "matchExpressions": [ + { + "key": "gitpod.io/workload_workspace_regular", + "operator": "Exists" + } + ] + } + ] + } + } + }, "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_ghost.golden b/components/ws-manager/pkg/manager/testdata/cdwp_ghost.golden index 23caabe86a5fbd..9feda0f8297fe3 100644 --- a/components/ws-manager/pkg/manager/testdata/cdwp_ghost.golden +++ b/components/ws-manager/pkg/manager/testdata/cdwp_ghost.golden @@ -196,7 +196,22 @@ "serviceAccountName": "workspace", "automountServiceAccountToken": false, "hostname": "foobar", - "schedulerName": "workspace-scheduler", + "affinity": { + "nodeAffinity": { + "requiredDuringSchedulingIgnoredDuringExecution": { + "nodeSelectorTerms": [ + { + "matchExpressions": [ + { + "key": "gitpod.io/workload_workspace_headless", + "operator": "Exists" + } + ] + } + ] + } + } + }, "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_imagebuild.golden b/components/ws-manager/pkg/manager/testdata/cdwp_imagebuild.golden index ea3ec014ce6563..7901a3db3f39a6 100644 --- a/components/ws-manager/pkg/manager/testdata/cdwp_imagebuild.golden +++ b/components/ws-manager/pkg/manager/testdata/cdwp_imagebuild.golden @@ -226,7 +226,22 @@ "serviceAccountName": "workspace", "automountServiceAccountToken": false, "hostname": "foobar", - "schedulerName": "workspace-scheduler", + "affinity": { + "nodeAffinity": { + "requiredDuringSchedulingIgnoredDuringExecution": { + "nodeSelectorTerms": [ + { + "matchExpressions": [ + { + "key": "gitpod.io/workload_workspace_headless", + "operator": "Exists" + } + ] + } + ] + } + } + }, "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_imagebuild_template.golden b/components/ws-manager/pkg/manager/testdata/cdwp_imagebuild_template.golden index aaf043f9759859..3899fd0fdab460 100644 --- a/components/ws-manager/pkg/manager/testdata/cdwp_imagebuild_template.golden +++ b/components/ws-manager/pkg/manager/testdata/cdwp_imagebuild_template.golden @@ -245,6 +245,10 @@ "nodeSelectorTerms": [ { "matchExpressions": [ + { + "key": "gitpod.io/workload_workspace_headless", + "operator": "Exists" + }, { "key": "gitpod.io/workload_imagebuild", "operator": "In", @@ -258,7 +262,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_no_ideimage.golden b/components/ws-manager/pkg/manager/testdata/cdwp_no_ideimage.golden index dd90fb0bc9ce94..4359c5e3a4f5c2 100644 --- a/components/ws-manager/pkg/manager/testdata/cdwp_no_ideimage.golden +++ b/components/ws-manager/pkg/manager/testdata/cdwp_no_ideimage.golden @@ -202,7 +202,22 @@ "serviceAccountName": "workspace", "automountServiceAccountToken": false, "hostname": "foobar", - "schedulerName": "workspace-scheduler", + "affinity": { + "nodeAffinity": { + "requiredDuringSchedulingIgnoredDuringExecution": { + "nodeSelectorTerms": [ + { + "matchExpressions": [ + { + "key": "gitpod.io/workload_workspace_regular", + "operator": "Exists" + } + ] + } + ] + } + } + }, "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_prebuild.golden b/components/ws-manager/pkg/manager/testdata/cdwp_prebuild.golden index 13dd9882160109..6e06b56c07d704 100644 --- a/components/ws-manager/pkg/manager/testdata/cdwp_prebuild.golden +++ b/components/ws-manager/pkg/manager/testdata/cdwp_prebuild.golden @@ -208,7 +208,22 @@ "serviceAccountName": "workspace", "automountServiceAccountToken": false, "hostname": "foobar", - "schedulerName": "workspace-scheduler", + "affinity": { + "nodeAffinity": { + "requiredDuringSchedulingIgnoredDuringExecution": { + "nodeSelectorTerms": [ + { + "matchExpressions": [ + { + "key": "gitpod.io/workload_workspace_headless", + "operator": "Exists" + } + ] + } + ] + } + } + }, "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_prebuild_template.golden b/components/ws-manager/pkg/manager/testdata/cdwp_prebuild_template.golden index b51d2c28e3e0ff..e3d66ed0b567b1 100644 --- a/components/ws-manager/pkg/manager/testdata/cdwp_prebuild_template.golden +++ b/components/ws-manager/pkg/manager/testdata/cdwp_prebuild_template.golden @@ -227,6 +227,10 @@ "nodeSelectorTerms": [ { "matchExpressions": [ + { + "key": "gitpod.io/workload_workspace_headless", + "operator": "Exists" + }, { "key": "gitpod.io/workload_prebuild", "operator": "In", @@ -240,7 +244,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_prebuild_template_override_resources.golden b/components/ws-manager/pkg/manager/testdata/cdwp_prebuild_template_override_resources.golden index dd03e9265c5728..1a349e962ea6ac 100644 --- a/components/ws-manager/pkg/manager/testdata/cdwp_prebuild_template_override_resources.golden +++ b/components/ws-manager/pkg/manager/testdata/cdwp_prebuild_template_override_resources.golden @@ -227,6 +227,10 @@ "nodeSelectorTerms": [ { "matchExpressions": [ + { + "key": "gitpod.io/workload_workspace_headless", + "operator": "Exists" + }, { "key": "gitpod.io/workload_prebuild", "operator": "In", @@ -240,7 +244,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_probe.golden b/components/ws-manager/pkg/manager/testdata/cdwp_probe.golden index 9bb4a501208e61..4767b2f8917c88 100644 --- a/components/ws-manager/pkg/manager/testdata/cdwp_probe.golden +++ b/components/ws-manager/pkg/manager/testdata/cdwp_probe.golden @@ -208,7 +208,22 @@ "serviceAccountName": "workspace", "automountServiceAccountToken": false, "hostname": "foobar", - "schedulerName": "workspace-scheduler", + "affinity": { + "nodeAffinity": { + "requiredDuringSchedulingIgnoredDuringExecution": { + "nodeSelectorTerms": [ + { + "matchExpressions": [ + { + "key": "gitpod.io/workload_workspace_headless", + "operator": "Exists" + } + ] + } + ] + } + } + }, "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_readinessprobe.golden b/components/ws-manager/pkg/manager/testdata/cdwp_readinessprobe.golden index 7345d1bc26dfee..6ff9b6af0a544a 100644 --- a/components/ws-manager/pkg/manager/testdata/cdwp_readinessprobe.golden +++ b/components/ws-manager/pkg/manager/testdata/cdwp_readinessprobe.golden @@ -204,7 +204,22 @@ "serviceAccountName": "workspace", "automountServiceAccountToken": false, "hostname": "foobar", - "schedulerName": "workspace-scheduler", + "affinity": { + "nodeAffinity": { + "requiredDuringSchedulingIgnoredDuringExecution": { + "nodeSelectorTerms": [ + { + "matchExpressions": [ + { + "key": "gitpod.io/workload_workspace_regular", + "operator": "Exists" + } + ] + } + ] + } + } + }, "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_tasks.golden b/components/ws-manager/pkg/manager/testdata/cdwp_tasks.golden index 831f5ee5c0075b..9c96e658ebf249 100644 --- a/components/ws-manager/pkg/manager/testdata/cdwp_tasks.golden +++ b/components/ws-manager/pkg/manager/testdata/cdwp_tasks.golden @@ -208,7 +208,22 @@ "serviceAccountName": "workspace", "automountServiceAccountToken": false, "hostname": "foobar", - "schedulerName": "workspace-scheduler", + "affinity": { + "nodeAffinity": { + "requiredDuringSchedulingIgnoredDuringExecution": { + "nodeSelectorTerms": [ + { + "matchExpressions": [ + { + "key": "gitpod.io/workload_workspace_regular", + "operator": "Exists" + } + ] + } + ] + } + } + }, "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_template.golden b/components/ws-manager/pkg/manager/testdata/cdwp_template.golden index ced850747f794d..08ee50ac6456d9 100644 --- a/components/ws-manager/pkg/manager/testdata/cdwp_template.golden +++ b/components/ws-manager/pkg/manager/testdata/cdwp_template.golden @@ -224,7 +224,11 @@ { "matchExpressions": [ { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", + "operator": "Exists" + }, + { + "key": "gitpod.io/workload_workspace_regular", "operator": "In", "values": [ "true" @@ -236,7 +240,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_template.json b/components/ws-manager/pkg/manager/testdata/cdwp_template.json index 900c6ee326ea2a..c169652c375545 100644 --- a/components/ws-manager/pkg/manager/testdata/cdwp_template.json +++ b/components/ws-manager/pkg/manager/testdata/cdwp_template.json @@ -23,7 +23,7 @@ { "matchExpressions": [ { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "In", "values": [ "true" diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_timeout.golden b/components/ws-manager/pkg/manager/testdata/cdwp_timeout.golden index 4f496c5386804f..ac9c53a0b37d9a 100644 --- a/components/ws-manager/pkg/manager/testdata/cdwp_timeout.golden +++ b/components/ws-manager/pkg/manager/testdata/cdwp_timeout.golden @@ -209,7 +209,22 @@ "serviceAccountName": "workspace", "automountServiceAccountToken": false, "hostname": "foobar", - "schedulerName": "workspace-scheduler", + "affinity": { + "nodeAffinity": { + "requiredDuringSchedulingIgnoredDuringExecution": { + "nodeSelectorTerms": [ + { + "matchExpressions": [ + { + "key": "gitpod.io/workload_workspace_regular", + "operator": "Exists" + } + ] + } + ] + } + } + }, "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_userns.golden b/components/ws-manager/pkg/manager/testdata/cdwp_userns.golden index 46b1d7406d7f24..d152da25c59523 100644 --- a/components/ws-manager/pkg/manager/testdata/cdwp_userns.golden +++ b/components/ws-manager/pkg/manager/testdata/cdwp_userns.golden @@ -204,7 +204,22 @@ "serviceAccountName": "workspace", "automountServiceAccountToken": false, "hostname": "foobar", - "schedulerName": "workspace-scheduler", + "affinity": { + "nodeAffinity": { + "requiredDuringSchedulingIgnoredDuringExecution": { + "nodeSelectorTerms": [ + { + "matchExpressions": [ + { + "key": "gitpod.io/workload_workspace_regular", + "operator": "Exists" + } + ] + } + ] + } + } + }, "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_with_ephemeral_storage.golden b/components/ws-manager/pkg/manager/testdata/cdwp_with_ephemeral_storage.golden index 53603018498252..8658709a2b4bc0 100644 --- a/components/ws-manager/pkg/manager/testdata/cdwp_with_ephemeral_storage.golden +++ b/components/ws-manager/pkg/manager/testdata/cdwp_with_ephemeral_storage.golden @@ -223,7 +223,22 @@ "serviceAccountName": "workspace", "automountServiceAccountToken": false, "hostname": "foobar", - "schedulerName": "workspace-scheduler", + "affinity": { + "nodeAffinity": { + "requiredDuringSchedulingIgnoredDuringExecution": { + "nodeSelectorTerms": [ + { + "matchExpressions": [ + { + "key": "gitpod.io/workload_workspace_headless", + "operator": "Exists" + } + ] + } + ] + } + } + }, "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_withaffinity_regular.golden b/components/ws-manager/pkg/manager/testdata/cdwp_withaffinity_regular.golden index 6ac5ff1f06a4fd..68d12bb9e043af 100644 --- a/components/ws-manager/pkg/manager/testdata/cdwp_withaffinity_regular.golden +++ b/components/ws-manager/pkg/manager/testdata/cdwp_withaffinity_regular.golden @@ -220,7 +220,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_withaffinityheadless.golden b/components/ws-manager/pkg/manager/testdata/cdwp_withaffinityheadless.golden index 75f95a38f291d5..7901a3db3f39a6 100644 --- a/components/ws-manager/pkg/manager/testdata/cdwp_withaffinityheadless.golden +++ b/components/ws-manager/pkg/manager/testdata/cdwp_withaffinityheadless.golden @@ -242,7 +242,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/getWorkspaces_podOnly.json b/components/ws-manager/pkg/manager/testdata/getWorkspaces_podOnly.json index f42ceb32fbbba9..64a86e7b468cb8 100644 --- a/components/ws-manager/pkg/manager/testdata/getWorkspaces_podOnly.json +++ b/components/ws-manager/pkg/manager/testdata/getWorkspaces_podOnly.json @@ -53,7 +53,7 @@ "operator": "Exists" }, { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "In", "values": [ "true" @@ -213,7 +213,6 @@ "nodeName": "gke-staging--gitpod--workspace-pool-1-f122a8ea-bb2l", "priority": 0, "restartPolicy": "Always", - "schedulerName": "workspace-scheduler", "securityContext": { "fsGroup": 1, "supplementalGroups": [ diff --git a/components/ws-manager/pkg/manager/testdata/status_brokenScheduler_UNKNOWN00.json b/components/ws-manager/pkg/manager/testdata/status_brokenScheduler_UNKNOWN00.json index cb87dfe84e80b0..241c3ae8b73dbc 100644 --- a/components/ws-manager/pkg/manager/testdata/status_brokenScheduler_UNKNOWN00.json +++ b/components/ws-manager/pkg/manager/testdata/status_brokenScheduler_UNKNOWN00.json @@ -214,7 +214,7 @@ { "matchExpressions": [ { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "In", "values": [ "true" @@ -226,7 +226,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/not-ready", diff --git a/components/ws-manager/pkg/manager/testdata/status_cannotPull_004_CREATING00.json b/components/ws-manager/pkg/manager/testdata/status_cannotPull_004_CREATING00.json index 9d3e7e7f8b8fb5..6a43717320d6ee 100644 --- a/components/ws-manager/pkg/manager/testdata/status_cannotPull_004_CREATING00.json +++ b/components/ws-manager/pkg/manager/testdata/status_cannotPull_004_CREATING00.json @@ -783,7 +783,6 @@ 1 ] }, - "schedulerName": "workspace-scheduler", "dnsPolicy": "None", "affinity": { "nodeAffinity": { @@ -793,7 +792,7 @@ "matchExpressions": [ { "operator": "Exists", - "key": "gitpod.io/workload_workspace" + "key": "gitpod.io/workload_workspace_regular" } ] } @@ -990,8 +989,7 @@ }, "f:type": {} }, - "apiVersion": "v1", - "manager": "ws-scheduler" + "apiVersion": "v1" } ], "name": "ws-5031df46-db5e-43ae-91bd-1448305c001d - scheduledw7nkv", diff --git a/components/ws-manager/pkg/manager/testdata/status_cannotPull_005_STOPPED00.json b/components/ws-manager/pkg/manager/testdata/status_cannotPull_005_STOPPED00.json index c89fc24f7ede92..c03ecf63a6fa01 100644 --- a/components/ws-manager/pkg/manager/testdata/status_cannotPull_005_STOPPED00.json +++ b/components/ws-manager/pkg/manager/testdata/status_cannotPull_005_STOPPED00.json @@ -653,7 +653,6 @@ "terminationGracePeriodSeconds": 30, "automountServiceAccountToken": false, "serviceAccountName": "workspace", - "schedulerName": "workspace-scheduler", "restartPolicy": "Never", "enableServiceLinks": false, "priority": 0, @@ -676,7 +675,7 @@ { "matchExpressions": [ { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "Exists" } ] @@ -782,7 +781,6 @@ "managedFields": [ { "time": "2021-08-19T11:14:44Z", - "manager": "ws-scheduler", "fieldsType": "FieldsV1", "fieldsV1": { "f:type": {}, diff --git a/components/ws-manager/pkg/manager/testdata/status_containerd4214_STOPPING00.json b/components/ws-manager/pkg/manager/testdata/status_containerd4214_STOPPING00.json index 17d14eb80b09fd..58830bf7b76af4 100644 --- a/components/ws-manager/pkg/manager/testdata/status_containerd4214_STOPPING00.json +++ b/components/ws-manager/pkg/manager/testdata/status_containerd4214_STOPPING00.json @@ -274,7 +274,7 @@ { "matchExpressions": [ { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "Exists" } ] @@ -283,7 +283,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/status_contentInitFailed_005_STOPPED00.json b/components/ws-manager/pkg/manager/testdata/status_contentInitFailed_005_STOPPED00.json index a1be7c70b9403d..65dd685eea4e98 100644 --- a/components/ws-manager/pkg/manager/testdata/status_contentInitFailed_005_STOPPED00.json +++ b/components/ws-manager/pkg/manager/testdata/status_contentInitFailed_005_STOPPED00.json @@ -611,7 +611,6 @@ } ], "nodeName": "gke-gp-prod-ws-us15-us--headless-pool-64a87cf8-bw7v", - "schedulerName": "workspace-scheduler", "serviceAccount": "workspace", "enableServiceLinks": false, "dnsPolicy": "None", @@ -764,7 +763,6 @@ { "fieldsType": "FieldsV1", "apiVersion": "v1", - "manager": "ws-scheduler", "fieldsV1": { "f:involvedObject": { "f:namespace": {}, diff --git a/components/ws-manager/pkg/manager/testdata/status_degenerate_noContainers.json b/components/ws-manager/pkg/manager/testdata/status_degenerate_noContainers.json index 199d06ad2d26ac..a1b3f1b604a885 100644 --- a/components/ws-manager/pkg/manager/testdata/status_degenerate_noContainers.json +++ b/components/ws-manager/pkg/manager/testdata/status_degenerate_noContainers.json @@ -50,7 +50,6 @@ "serviceAccount": "default", "nodeName": "minikube", "securityContext": {}, - "schedulerName": "default-scheduler", "tolerations": [ { "key": "node.kubernetes.io/not-ready", diff --git a/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED01.json b/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED01.json index 5c90c441decf12..7b5fcbdc072198 100644 --- a/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED01.json +++ b/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED01.json @@ -244,7 +244,7 @@ { "matchExpressions": [ { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "Exists" } ] @@ -253,7 +253,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED02.json b/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED02.json index 9954245356f94e..1596340faa173d 100644 --- a/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED02.json +++ b/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED02.json @@ -244,7 +244,7 @@ { "matchExpressions": [ { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "Exists" } ] @@ -253,7 +253,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED03.json b/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED03.json index 2a52ebe756148b..8559626d28e7ea 100644 --- a/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED03.json +++ b/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED03.json @@ -245,7 +245,7 @@ { "matchExpressions": [ { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "Exists" } ] @@ -254,7 +254,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPING01.json b/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPING01.json index fdc7a7cc5d81f6..2c5237f715fe46 100644 --- a/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPING01.json +++ b/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPING01.json @@ -248,7 +248,7 @@ { "matchExpressions": [ { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "Exists" } ] @@ -257,7 +257,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPING02.json b/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPING02.json index 2236fb98a01554..5bcdcae5fa9dde 100644 --- a/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPING02.json +++ b/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPING02.json @@ -247,7 +247,7 @@ { "matchExpressions": [ { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "Exists" } ] @@ -256,7 +256,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/status_errimgpull_CREATING01.json b/components/ws-manager/pkg/manager/testdata/status_errimgpull_CREATING01.json index 69d6e67da54460..d0bd3edba65fc1 100644 --- a/components/ws-manager/pkg/manager/testdata/status_errimgpull_CREATING01.json +++ b/components/ws-manager/pkg/manager/testdata/status_errimgpull_CREATING01.json @@ -219,7 +219,7 @@ "operator": "Exists" }, { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "In", "values": [ "true" @@ -231,7 +231,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/status_failedBeforeStopping_explicitFail.json b/components/ws-manager/pkg/manager/testdata/status_failedBeforeStopping_explicitFail.json index db9b9935c5940b..278d2197c8f0b3 100644 --- a/components/ws-manager/pkg/manager/testdata/status_failedBeforeStopping_explicitFail.json +++ b/components/ws-manager/pkg/manager/testdata/status_failedBeforeStopping_explicitFail.json @@ -213,7 +213,7 @@ { "matchExpressions": [ { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "In", "values": [ "true" diff --git a/components/ws-manager/pkg/manager/testdata/status_failedLogs_RUNNING00.json b/components/ws-manager/pkg/manager/testdata/status_failedLogs_RUNNING00.json index 58d812fd04f40b..5df84e11838f10 100644 --- a/components/ws-manager/pkg/manager/testdata/status_failedLogs_RUNNING00.json +++ b/components/ws-manager/pkg/manager/testdata/status_failedLogs_RUNNING00.json @@ -231,7 +231,7 @@ "operator": "Exists" }, { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "Exists" } ] @@ -240,7 +240,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/status_failedPending_evicted_UNKNOWN01.json b/components/ws-manager/pkg/manager/testdata/status_failedPending_evicted_UNKNOWN01.json index bf1a391eb1e258..8064533dacbe17 100644 --- a/components/ws-manager/pkg/manager/testdata/status_failedPending_evicted_UNKNOWN01.json +++ b/components/ws-manager/pkg/manager/testdata/status_failedPending_evicted_UNKNOWN01.json @@ -148,7 +148,7 @@ "operator": "Exists" }, { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "In", "values": [ "true" @@ -160,7 +160,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/not-ready", diff --git a/components/ws-manager/pkg/manager/testdata/status_failedPending_evicted_UNKNOWN02.json b/components/ws-manager/pkg/manager/testdata/status_failedPending_evicted_UNKNOWN02.json index 2aa61ff428a986..5869cc8bf9a916 100644 --- a/components/ws-manager/pkg/manager/testdata/status_failedPending_evicted_UNKNOWN02.json +++ b/components/ws-manager/pkg/manager/testdata/status_failedPending_evicted_UNKNOWN02.json @@ -153,7 +153,7 @@ "operator": "Exists" }, { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "In", "values": [ "true" @@ -165,7 +165,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/not-ready", diff --git a/components/ws-manager/pkg/manager/testdata/status_failedWorkspaceMount_PENDING00.json b/components/ws-manager/pkg/manager/testdata/status_failedWorkspaceMount_PENDING00.json index cc638fd66a7abd..8e3eff4cd05c54 100644 --- a/components/ws-manager/pkg/manager/testdata/status_failedWorkspaceMount_PENDING00.json +++ b/components/ws-manager/pkg/manager/testdata/status_failedWorkspaceMount_PENDING00.json @@ -210,7 +210,7 @@ { "matchExpressions": [ { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "In", "values": [ "true" diff --git a/components/ws-manager/pkg/manager/testdata/status_firstUserActivity_RUNNING.json b/components/ws-manager/pkg/manager/testdata/status_firstUserActivity_RUNNING.json index 181c419bf98b5c..46fc0cf2190c58 100644 --- a/components/ws-manager/pkg/manager/testdata/status_firstUserActivity_RUNNING.json +++ b/components/ws-manager/pkg/manager/testdata/status_firstUserActivity_RUNNING.json @@ -146,7 +146,7 @@ "operator": "Exists" }, { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "In", "values": [ "true" @@ -158,7 +158,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/status_headlessTaskFailed_STOPPING00.json b/components/ws-manager/pkg/manager/testdata/status_headlessTaskFailed_STOPPING00.json index e65bec653b6186..84faec6ef70885 100644 --- a/components/ws-manager/pkg/manager/testdata/status_headlessTaskFailed_STOPPING00.json +++ b/components/ws-manager/pkg/manager/testdata/status_headlessTaskFailed_STOPPING00.json @@ -626,7 +626,7 @@ { "matchExpressions": [ { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "Exists" } ] @@ -635,7 +635,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", @@ -862,7 +861,6 @@ "creationTimestamp": "2021-07-27T18:29:06Z", "managedFields": [ { - "manager": "ws-scheduler", "operation": "Update", "apiVersion": "v1", "time": "2021-07-27T18:29:06Z", diff --git a/components/ws-manager/pkg/manager/testdata/status_headless_STOPPING00.json b/components/ws-manager/pkg/manager/testdata/status_headless_STOPPING00.json index df4f5f4c5da4aa..30c1d949466b98 100644 --- a/components/ws-manager/pkg/manager/testdata/status_headless_STOPPING00.json +++ b/components/ws-manager/pkg/manager/testdata/status_headless_STOPPING00.json @@ -1 +1 @@ -{"pod":{"kind":"Pod","apiVersion":"v1","metadata":{"name":"imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","namespace":"staging-cw-imgbuilder-mk3-rebase","selfLink":"/api/v1/namespaces/staging-cw-imgbuilder-mk3-rebase/pods/imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","uid":"a87d12cb-d5ef-4dad-a1fa-44284e994f07","resourceVersion":"237707407","creationTimestamp":"2021-07-21T16:02:45Z","labels":{"app":"gitpod","component":"workspace","gitpod.io/networkpolicy":"default","gpwsman":"true","headless":"true","metaID":"0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","owner":"image-builder","workspaceID":"0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","workspaceType":"imagebuild"},"annotations":{"cluster-autoscaler.kubernetes.io/safe-to-evict":"false","cni.projectcalico.org/podIP":"","cni.projectcalico.org/podIPs":"","container.apparmor.security.beta.kubernetes.io/workspace":"unconfined","gitpod.io/annotation.baseref":"eu.gcr.io/gitpod-core-dev/registry/base-images:d04c64d5d108632a1768e4af9c3a8a3e6a87c96d2566fb1b0d1aec2fd630e8bd","gitpod.io/annotation.ref":"eu.gcr.io/gitpod-core-dev/registry/workspace-images:a277dab62e839192eb320da283d4e8488a2b2f46fceb4677a7d571431e239aa5","gitpod.io/nodeName":"gke-dev-workload-1-49d27f81-8s5c","gitpod.io/requiredNodeServices":"ws-daemon,registry-facade","gitpod/admission":"admit_owner_only","gitpod/contentInitializer":"[redacted]","gitpod/customTimeout":"1h0m0s","gitpod/id":"0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","gitpod/imageSpec":"Cl5ldS5nY3IuaW8vZ2l0cG9kLWNvcmUtZGV2L2J1aWxkL2ltYWdlLWJ1aWxkZXItbWszL2JvYjoyY2Y3NDc4NjdmZjgwNGVlMGVkYzBhMjYwN2NiOGNhMDYyNDIwODNhEl5ldS5nY3IuaW8vZ2l0cG9kLWNvcmUtZGV2L2J1aWxkL2ltYWdlLWJ1aWxkZXItbWszL2JvYjoyY2Y3NDc4NjdmZjgwNGVlMGVkYzBhMjYwN2NiOGNhMDYyNDIwODNh","gitpod/never-ready":"true","gitpod/ownerToken":"osZStmqg3TI0NrkLe3edax9bYCknXWtr","gitpod/servicePrefix":"0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","gitpod/url":"https://0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b.ws-dev.cw-imgbuilder-mk3-rebase.staging.gitpod-dev.com","kubernetes.io/psp":"staging-cw-imgbuilder-mk3-rebase-ns-workspace","prometheus.io/path":"/metrics","prometheus.io/port":"23000","prometheus.io/scrape":"true","seccomp.security.alpha.kubernetes.io/pod":"localhost/workspace_default_cw-imgbuilder-mk3-rebase.100.json"},"finalizers":["gitpod.io/finalizer"],"managedFields":[{"manager":"calico","operation":"Update","apiVersion":"v1","time":"2021-07-21T16:02:46Z","fieldsType":"FieldsV1","fieldsV1":{"f:metadata":{"f:annotations":{"f:cni.projectcalico.org/podIP":{},"f:cni.projectcalico.org/podIPs":{}}}}},{"manager":"ws-manager","operation":"Update","apiVersion":"v1","time":"2021-07-21T16:03:04Z","fieldsType":"FieldsV1","fieldsV1":{"f:metadata":{"f:annotations":{".":{},"f:cluster-autoscaler.kubernetes.io/safe-to-evict":{},"f:container.apparmor.security.beta.kubernetes.io/workspace":{},"f:gitpod.io/annotation.baseref":{},"f:gitpod.io/annotation.ref":{},"f:gitpod.io/nodeName":{},"f:gitpod.io/requiredNodeServices":{},"f:gitpod/admission":{},"f:gitpod/contentInitializer":{},"f:gitpod/customTimeout":{},"f:gitpod/id":{},"f:gitpod/imageSpec":{},"f:gitpod/never-ready":{},"f:gitpod/ownerToken":{},"f:gitpod/servicePrefix":{},"f:gitpod/url":{},"f:prometheus.io/path":{},"f:prometheus.io/port":{},"f:prometheus.io/scrape":{},"f:seccomp.security.alpha.kubernetes.io/pod":{}},"f:finalizers":{".":{},"v:\"gitpod.io/finalizer\"":{}},"f:labels":{".":{},"f:app":{},"f:component":{},"f:gitpod.io/networkpolicy":{},"f:gpwsman":{},"f:headless":{},"f:metaID":{},"f:owner":{},"f:workspaceID":{},"f:workspaceType":{}}},"f:spec":{"f:automountServiceAccountToken":{},"f:containers":{"k:{\"name\":\"workspace\"}":{".":{},"f:command":{},"f:env":{".":{},"k:{\"name\":\"BOB_AUTH_KEY\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"BOB_BASELAYER_AUTH\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"BOB_BASE_REF\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"BOB_BUILD_BASE\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"BOB_CONTEXT_DIR\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"BOB_DOCKERFILE_PATH\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"BOB_WSLAYER_AUTH\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"BOB_TARGET_REF\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"GITPOD_CLI_APITOKEN\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"GITPOD_HEADLESS\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"GITPOD_HOST\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"GITPOD_INSTANCE_ID\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"GITPOD_INTERVAL\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"GITPOD_MEMORY\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"GITPOD_REPO_ROOT\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"GITPOD_TASKS\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"GITPOD_THEIA_PORT\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"GITPOD_WORKSPACE_CLUSTER_HOST\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"GITPOD_WORKSPACE_ID\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"GITPOD_WORKSPACE_URL\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"THEIA_MINI_BROWSER_HOST_PATTERN\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"THEIA_SUPERVISOR_ENDPOINT\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"THEIA_WEBVIEW_EXTERNAL_ENDPOINT\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"THEIA_WORKSPACE_ROOT\"}":{".":{},"f:name":{},"f:value":{}}},"f:image":{},"f:imagePullPolicy":{},"f:name":{},"f:ports":{".":{},"k:{\"containerPort\":23000,\"protocol\":\"TCP\"}":{".":{},"f:containerPort":{},"f:protocol":{}}},"f:readinessProbe":{".":{},"f:failureThreshold":{},"f:httpGet":{".":{},"f:path":{},"f:port":{},"f:scheme":{}},"f:periodSeconds":{},"f:successThreshold":{},"f:timeoutSeconds":{}},"f:resources":{".":{},"f:limits":{".":{},"f:cpu":{},"f:memory":{}},"f:requests":{".":{},"f:cpu":{},"f:ephemeral-storage":{},"f:memory":{}}},"f:securityContext":{".":{},"f:allowPrivilegeEscalation":{},"f:capabilities":{".":{},"f:add":{},"f:drop":{}},"f:privileged":{},"f:readOnlyRootFilesystem":{},"f:runAsGroup":{},"f:runAsNonRoot":{},"f:runAsUser":{}},"f:terminationMessagePath":{},"f:terminationMessagePolicy":{},"f:volumeMounts":{".":{},"k:{\"mountPath\":\"/.workspace\"}":{".":{},"f:mountPath":{},"f:mountPropagation":{},"f:name":{}},"k:{\"mountPath\":\"/workspace\"}":{".":{},"f:mountPath":{},"f:mountPropagation":{},"f:name":{}}}}},"f:dnsConfig":{".":{},"f:nameservers":{}},"f:dnsPolicy":{},"f:enableServiceLinks":{},"f:imagePullSecrets":{".":{},"k:{\"name\":\"gcp-sa-registry-auth\"}":{".":{},"f:name":{}}},"f:restartPolicy":{},"f:schedulerName":{},"f:securityContext":{".":{},"f:fsGroup":{},"f:seccompProfile":{"f:localhostProfile":{},"f:type":{}},"f:supplementalGroups":{}},"f:serviceAccount":{},"f:serviceAccountName":{},"f:terminationGracePeriodSeconds":{},"f:tolerations":{},"f:volumes":{".":{},"k:{\"name\":\"daemon-mount\"}":{".":{},"f:hostPath":{".":{},"f:path":{},"f:type":{}},"f:name":{}},"k:{\"name\":\"vol-this-workspace\"}":{".":{},"f:hostPath":{".":{},"f:path":{},"f:type":{}},"f:name":{}}}}}},{"manager":"kubelet","operation":"Update","apiVersion":"v1","time":"2021-07-21T16:08:00Z","fieldsType":"FieldsV1","fieldsV1":{"f:status":{"f:conditions":{"k:{\"type\":\"ContainersReady\"}":{".":{},"f:lastProbeTime":{},"f:lastTransitionTime":{},"f:reason":{},"f:status":{},"f:type":{}},"k:{\"type\":\"Initialized\"}":{".":{},"f:lastProbeTime":{},"f:lastTransitionTime":{},"f:reason":{},"f:status":{},"f:type":{}},"k:{\"type\":\"Ready\"}":{".":{},"f:lastProbeTime":{},"f:lastTransitionTime":{},"f:reason":{},"f:status":{},"f:type":{}}},"f:containerStatuses":{},"f:hostIP":{},"f:phase":{},"f:podIP":{},"f:podIPs":{".":{},"k:{\"ip\":\"10.60.22.132\"}":{".":{},"f:ip":{}}},"f:startTime":{}}}}]},"spec":{"volumes":[{"name":"vol-this-workspace","hostPath":{"path":"/mnt/disks/ssd0/workspaces/0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","type":"DirectoryOrCreate"}},{"name":"daemon-mount","hostPath":{"path":"/mnt/disks/ssd0/workspaces/0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b-daemon","type":"DirectoryOrCreate"}}],"containers":[{"name":"workspace","image":"reg.cw-imgbuilder-mk3-rebase.staging.gitpod-dev.com:30815/remote/0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","command":["/.supervisor/workspacekit","ring0"],"ports":[{"containerPort":23000,"protocol":"TCP"}],"env":[{"name":"GITPOD_REPO_ROOT","value":"/workspace"},{"name":"GITPOD_CLI_APITOKEN","value":"TUf744QntqioSRIrnIVpic9CpLnKQCbj"},{"name":"GITPOD_WORKSPACE_ID","value":"0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b"},{"name":"GITPOD_INSTANCE_ID","value":"0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b"},{"name":"GITPOD_THEIA_PORT","value":"23000"},{"name":"THEIA_WORKSPACE_ROOT","value":"/workspace/workspace"},{"name":"GITPOD_HOST","value":"https://cw-imgbuilder-mk3-rebase.staging.gitpod-dev.com"},{"name":"GITPOD_WORKSPACE_URL","value":"https://0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b.ws-dev.cw-imgbuilder-mk3-rebase.staging.gitpod-dev.com"},{"name":"GITPOD_WORKSPACE_CLUSTER_HOST","value":"ws-dev.cw-imgbuilder-mk3-rebase.staging.gitpod-dev.com"},{"name":"THEIA_SUPERVISOR_ENDPOINT","value":":22999"},{"name":"THEIA_WEBVIEW_EXTERNAL_ENDPOINT","value":"webview-{{hostname}}"},{"name":"THEIA_MINI_BROWSER_HOST_PATTERN","value":"browser-{{hostname}}"},{"name":"BOB_TARGET_REF","value":"eu.gcr.io/gitpod-core-dev/registry/workspace-images:a277dab62e839192eb320da283d4e8488a2b2f46fceb4677a7d571431e239aa5"},{"name":"BOB_BASE_REF","value":"eu.gcr.io/gitpod-core-dev/registry/base-images:d04c64d5d108632a1768e4af9c3a8a3e6a87c96d2566fb1b0d1aec2fd630e8bd"},{"name":"BOB_BUILD_BASE","value":"true"},{"name":"BOB_BASELAYER_AUTH","value":"bI9gBDvDtwGZby8T1Wd3HdjrKz0HH4Kcrdyxtij1"},{"name":"BOB_WSLAYER_AUTH","value":"PetXlerz2kjoa7FPdWuqdaC6o48qmFNCSUlx/DY+VvEh56pB85zB/0xcM2N4haYk3Umoa9OAJvu33AuB9GakbIOxHtF7IqgQUFRD+p2+yM80mWtHcTn13wVrpo2diIH91Ne58Qr+qz8l6q2sXKg/U4YJr0x4kIg1110iKD1r1GklhvlaQuIudUTQdY264ama2FQcrJjpnqaQIYIO4cOhc2lI9y34MGqwSlFfzuqjcKLpt2/XW+CwZxH2h5JKcgmZjcUyClA/GcC1mgJX3b4eqgsravlTloRvMti8IgWK8s4xiOU9qFEFCWcGIXwdj16Abtn5GoWDNFyHFF5Ojss7QzTEx395QnMgLEVxZrkscJc0Afn+ewKXF3oceoIuWe0GmgvbRnzuUv9ftnc7BPWgNq0HXr8J3RBBcnlXSQlcECljq8TW6vtkSDKrOnPeTSLZ12jj+PtmVwDvPCRYevo6TSIluyt6EEpm1aKV9Rt6VuGAFNFZfRLlKx0UivOUzgcUUN0UJ6itBsQKW97o/8sax03PTvcHbP+CtvYYwGXKqF3nO3SQs0eiDhqi0IV4/TvzjvsLm5UFC+VqEzahRMm7fhvoKdmPMBu0kGiFE3bZK4w7s3vWoliWnHS27Mg8GawGySOp1Y8cy15B07Y6tyRcxwJ3dRxYulvEm8w4+9RgGor1w8ScMqZ/GugXhHOUVfDjomTqDhooDLWw7VB3JKqCLlOcZ42cdheHWnEyLtFhDMisESukMfT99cq95L5ZIARTqS2gpcRDro/iiumvwe6Hr+gNtuz/NCA0dKPgst5vLZYzcjJvcHzOSR88iqnottSeuX2NVU5FoqNaMqURcXXvp9oXkrAJ8JILDmE+cMhna+pKK+nbFa7NE8zzvGoxUnZNbPUzu2FT7AXyMPKr5mWOBwQY9Jb7OxQXoqAtCBoAT6pKgan/BkaC02o3kwgt50aYWt0bmdl2/JPoF01+bhbmbIGK6I/B/oOMU5VMXTfHIKg4Q5LJX540JxQB6g4z7wR8eAHLQ3F6GyXcV69xZX64veKXvx3NhZ75lcwjzC9mtUvoXzftM3lsTFwQGlBrzC6wKPGotQJh7dRH8HYKuUdjm/z0xElVKaaNHtMkQ6yNGNQ1lQZpdGDYQwqxMXHd61zolL3JVwovDPax3tNn69mfeAnhnKJ4MQHi+804EO80NrLMJNHxbETdcaE6M/meprmmlsd8Z0ZxSrAcbU4pqNoeSEfC5U2W6DWhP5jiagqml/d7wq2rh8CV1wAct/FLLX/nWC9BejZ2caTTennh3bNpaTfDHDL35+a7+24k74SAw8Py1CsRGqm8LyfwbQEgw4Lihe8k24DA5R3nB+pSFcze4SQhFBWNFK8ZS9MHYWPKEi3ptvCoeTs+fkXuhqDy3pIlkVPJNrP9eCQES7+INgFAUmQ3yuB1YZeev6bjz5mGV+XIV2P12ngz4+y/tTL75+y2QEDC2FWO9rgMC27Q/4WZo+PUIEyf7tLHsOKvvPCJrRIQzBNFCSRg4I6j2A9cK84l6NFKPQhfkzttv8YdsNWClflaDuf5Te3PKPh2pozWmFIeYlufgNFZ7TIEziwFzp9p9emI1O0pVaDlQ0hKeK67GJTNXh5vzYCwBbMSLQECMmClinYHYYS7fMzfmlRwsvKIdeHf2yjCbN8dBhQx7AuLvyiHVNmrBDhPlmB8wbzvAAz8ODz4OiNisXbOJq0+nmok5Jdf1tfuJOnfdKeVwDVRrDkTqUP0W53a34pBdHWctD70o/fVmxxqzJ7R1I6U3YuCYJkTlvvEjCqCbNPKseNBfEAVy/FYpKYj0A7IgILtbVi5SCSPnEAkOnZD1x2yrH0bUhQoBpJ38Je69pkVOnZwpyPvgJFWfKun8WRgdQMzIYA6SrBqRItKOAN7Fd1YHMys8BaJZbwQo7ZuEsnAYwKIS563dc67clKsjbUJ+VkiXeRyUaZiubHweu6vgouSPi8kvZ5aNx98oj+vGUQpoJK1yhZH/siAiPBmf5JIm9qzDM64Y99Biai7Mw4eICCz0qHk4kboS2n1cHePk780o2mpXifVtuc7RK2Rr9UbxQ2PiygFNYZh7mPWc0qCJm/81b/rOP7UQDJuBbNw9U0EslW7uS3Fvl80kvO43SgWxXJTykMJJ3vr94WyAoNagV2e3AB+qCvsCWkn4o7Mwb6EmbobvHBuOHEJVeA4P030B+KCpSLNxwnmZdxJG7NdTjTxXakYV2AEGQLGQuUuYtkMLBBoeQUInNwpJvwslcQCXGn4naVQjCerwip/vMOKaW+vHYhdl8zlg30tjx+oUuyx86LNcv3sNpZapvJvo9UoyfMxmwVv4X/GGkB73v1bRJbH5BJ5+5v+phLvYRMc3rsrSk76Us1hKVyKAfK14m4T+RqAprplf8k1crdaniOnebFRJCWg0QujgS+2EUBpIoAZu184zTirARHs2ip9WikVLXD3gqY2dIbrsCsiNLjTAR/pf8Og9e/VjYfszM56de9q9tNBcNM15oA1w60UwSLlyLNIZR8Uum75UICOEGVimsS73P6rFFsmlvIK8Tr+uVsgt8IKhJsyVArrCVGx3cwaVKMNp2XXNfzEUTy6r86pPXvqQEfKhiDgRkf79HLjx0BxVFgpxjMNHUdgsARTK2ElIAsO/sh/WbsvsHByfQZeTR7iDgxxfJQzA1xpnltctQp95tPWbsj2HlzI9rr95/jAUASJcyMA9cWfN5NZWrgkxP//Prc7pMHsmjCNh0PbSVyPTdRWqdxjZXqMPdm0PNQXWEjtkE5R5830JtqhLLToHBHpbCVbmHTUllkFOYnzob9YkrHYdhez/66VDJGNhms2aVi3bu4X2sjo4f8rbP+1dxdi8n/vRf3zaEAW3vy2fASfwvmPN7yFH9Y4mxiezSNdH16y+c2/NOlM8cgGLA1WJX1liFGvFzDNHsjYRX4sHLlx+zuUf/YBqBTGPzxNZz8GOx/7LZhg3ilcqfDl4fChqEDDvSrsXLX88Hv+1St0FpRikIKimUHUx5X0ClVihAkRamm1M9lR9NsxVV6DEGC6JeWmAls/DD+cEUybS+JwQItLz+lbi5kMTibJale+pl5pFg/eNNZQkTPE1GoEf85JZ6moOp6fwqAhBLLCYzcWTYGHKYdknPkvfopB5HFMQi/biBdvbg7N3cYpH/DpfHs2bNAlI8xTn0lxi6ABuie7o4XPpKt1m2eQw3VGYK5n8b22e2aVjIilOwUQmfrdBX2QuOxLg1OVJGAYJkOjmBaAM14bTMaMGSJo0t60EuFydwaiQ9nYVecjploe8I4RCjYLBskzQICb8XlEeSCIThqKiFaaEis"},{"name":"BOB_DOCKERFILE_PATH","value":"/workspace/.gitpod.dockerfile"},{"name":"BOB_CONTEXT_DIR","value":"/workspace"},{"name":"BOB_AUTH_KEY","value":"GR9u6Y6MnUp4BxDZmSFvwaciqkNOqpQ1"},{"name":"GITPOD_TASKS","value":"[{\"name\": \"build\", \"init\": \"sudo -E /app/bob build\"}]"},{"name":"GITPOD_INTERVAL","value":"30000"},{"name":"GITPOD_MEMORY","value":"2415"},{"name":"GITPOD_HEADLESS","value":"true"}],"resources":{"limits":{"cpu":"5","memory":"12Gi"},"requests":{"cpu":"1m","ephemeral-storage":"5Gi","memory":"2304Mi"}},"volumeMounts":[{"name":"vol-this-workspace","mountPath":"/workspace","mountPropagation":"HostToContainer"},{"name":"daemon-mount","mountPath":"/.workspace","mountPropagation":"HostToContainer"}],"readinessProbe":{"httpGet":{"path":"/_supervisor/v1/status/content/wait/true","port":22999,"scheme":"HTTP"},"timeoutSeconds":1,"periodSeconds":1,"successThreshold":1,"failureThreshold":600},"terminationMessagePath":"/dev/termination-log","terminationMessagePolicy":"File","imagePullPolicy":"IfNotPresent","securityContext":{"capabilities":{"add":["AUDIT_WRITE","FSETID","KILL","NET_BIND_SERVICE","SYS_PTRACE"],"drop":["SETPCAP","CHOWN","NET_RAW","DAC_OVERRIDE","FOWNER","SYS_CHROOT","SETFCAP","SETUID","SETGID"]},"privileged":false,"runAsUser":33333,"runAsGroup":33333,"runAsNonRoot":true,"readOnlyRootFilesystem":false,"allowPrivilegeEscalation":true}}],"restartPolicy":"Never","terminationGracePeriodSeconds":30,"dnsPolicy":"None","serviceAccountName":"workspace","serviceAccount":"workspace","automountServiceAccountToken":false,"nodeName":"gke-dev-workload-1-49d27f81-8s5c","securityContext":{"supplementalGroups":[1],"fsGroup":1,"seccompProfile":{"type":"Localhost","localhostProfile":"workspace_default_cw-imgbuilder-mk3-rebase.100.json"}},"imagePullSecrets":[{"name":"gcp-sa-registry-auth"}],"schedulerName":"workspace-scheduler","tolerations":[{"key":"node.kubernetes.io/disk-pressure","operator":"Exists","effect":"NoExecute"},{"key":"node.kubernetes.io/memory-pressure","operator":"Exists","effect":"NoExecute"},{"key":"node.kubernetes.io/network-unavailable","operator":"Exists","effect":"NoExecute","tolerationSeconds":30},{"key":"node.kubernetes.io/not-ready","operator":"Exists","effect":"NoExecute","tolerationSeconds":300},{"key":"node.kubernetes.io/unreachable","operator":"Exists","effect":"NoExecute","tolerationSeconds":300}],"priority":0,"dnsConfig":{"nameservers":["1.1.1.1","8.8.8.8"]},"enableServiceLinks":false,"preemptionPolicy":"PreemptLowerPriority"},"status":{"phase":"Succeeded","conditions":[{"type":"Initialized","status":"True","lastProbeTime":null,"lastTransitionTime":"2021-07-21T16:02:45Z","reason":"PodCompleted"},{"type":"Ready","status":"False","lastProbeTime":null,"lastTransitionTime":"2021-07-21T16:08:00Z","reason":"PodCompleted"},{"type":"ContainersReady","status":"False","lastProbeTime":null,"lastTransitionTime":"2021-07-21T16:08:00Z","reason":"PodCompleted"},{"type":"PodScheduled","status":"True","lastProbeTime":null,"lastTransitionTime":"2021-07-21T16:02:45Z"}],"hostIP":"10.132.0.17","podIP":"10.60.22.132","podIPs":[{"ip":"10.60.22.132"}],"startTime":"2021-07-21T16:02:45Z","containerStatuses":[{"name":"workspace","state":{"terminated":{"exitCode":0,"reason":"Completed","startedAt":"2021-07-21T16:03:04Z","finishedAt":"2021-07-21T16:07:59Z","containerID":"containerd://b1a0fe3f35a826fbf8fee1518f2ccb7c75f818b4ea9cc17bb22586c18aaa1410"}},"lastState":{},"ready":false,"restartCount":0,"image":"reg.cw-imgbuilder-mk3-rebase.staging.gitpod-dev.com:30815/remote/0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b:latest","imageID":"reg.cw-imgbuilder-mk3-rebase.staging.gitpod-dev.com:30815/remote/0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b@sha256:d86c7d32f939aa04b1092968a624ffe697c9c35268be230169070a2a52d4bda9","containerID":"containerd://b1a0fe3f35a826fbf8fee1518f2ccb7c75f818b4ea9cc17bb22586c18aaa1410","started":false}],"qosClass":"Burstable"}},"theiaService":{"kind":"Service","apiVersion":"v1","metadata":{"name":"ws-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b-theia","namespace":"staging-cw-imgbuilder-mk3-rebase","selfLink":"/api/v1/namespaces/staging-cw-imgbuilder-mk3-rebase/services/ws-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b-theia","uid":"cdb765b1-60ee-4bf9-9e5e-c8e635c719df","resourceVersion":"237704855","creationTimestamp":"2021-07-21T16:02:45Z","labels":{"app":"gitpod","component":"workspace","gpwsman":"true","headless":"true","metaID":"0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","owner":"image-builder","workspaceID":"0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","workspaceType":"imagebuild"},"managedFields":[{"manager":"ws-manager","operation":"Update","apiVersion":"v1","time":"2021-07-21T16:02:45Z","fieldsType":"FieldsV1","fieldsV1":{"f:metadata":{"f:labels":{".":{},"f:app":{},"f:component":{},"f:gpwsman":{},"f:headless":{},"f:metaID":{},"f:owner":{},"f:workspaceID":{},"f:workspaceType":{}}},"f:spec":{"f:ports":{".":{},"k:{\"port\":22999,\"protocol\":\"TCP\"}":{".":{},"f:name":{},"f:port":{},"f:protocol":{},"f:targetPort":{}},"k:{\"port\":23000,\"protocol\":\"TCP\"}":{".":{},"f:name":{},"f:port":{},"f:protocol":{},"f:targetPort":{}}},"f:selector":{".":{},"f:app":{},"f:component":{},"f:gpwsman":{},"f:headless":{},"f:metaID":{},"f:owner":{},"f:workspaceID":{},"f:workspaceType":{}},"f:sessionAffinity":{},"f:type":{}}}}]},"spec":{"ports":[{"name":"ide","protocol":"TCP","port":23000,"targetPort":23000},{"name":"supervisor","protocol":"TCP","port":22999,"targetPort":22999}],"selector":{"app":"gitpod","component":"workspace","gpwsman":"true","headless":"true","metaID":"0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","owner":"image-builder","workspaceID":"0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","workspaceType":"imagebuild"},"clusterIP":"10.63.242.92","type":"ClusterIP","sessionAffinity":"None"},"status":{"loadBalancer":{}}},"events":[{"metadata":{"name":"imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b - scrdhnl","generateName":"imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b - scheduled","namespace":"staging-cw-imgbuilder-mk3-rebase","selfLink":"/api/v1/namespaces/staging-cw-imgbuilder-mk3-rebase/events/imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b%20-%20scrdhnl","uid":"b09f5f40-c5a1-49c4-abb4-c12889a4c151","resourceVersion":"14681306","creationTimestamp":"2021-07-21T16:02:45Z","managedFields":[{"manager":"ws-scheduler","operation":"Update","apiVersion":"v1","time":"2021-07-21T16:02:45Z","fieldsType":"FieldsV1","fieldsV1":{"f:count":{},"f:firstTimestamp":{},"f:involvedObject":{"f:kind":{},"f:name":{},"f:namespace":{},"f:uid":{}},"f:lastTimestamp":{},"f:message":{},"f:metadata":{"f:generateName":{}},"f:reason":{},"f:source":{"f:component":{}},"f:type":{}}}]},"involvedObject":{"kind":"Pod","namespace":"staging-cw-imgbuilder-mk3-rebase","name":"imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","uid":"a87d12cb-d5ef-4dad-a1fa-44284e994f07"},"reason":"Scheduled","message":"Placed pod [staging-cw-imgbuilder-mk3-rebase/imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b] on gke-dev-workload-1-49d27f81-8s5c\n","source":{"component":"workspace-scheduler"},"firstTimestamp":"2021-07-21T16:02:45Z","lastTimestamp":"2021-07-21T16:02:45Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b.1693d9cd60f7517f","namespace":"staging-cw-imgbuilder-mk3-rebase","selfLink":"/api/v1/namespaces/staging-cw-imgbuilder-mk3-rebase/events/imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b.1693d9cd60f7517f","uid":"4aadb7e6-0974-4245-bacf-733a3de21487","resourceVersion":"14681307","creationTimestamp":"2021-07-21T16:02:46Z","managedFields":[{"manager":"kubelet","operation":"Update","apiVersion":"v1","time":"2021-07-21T16:02:46Z","fieldsType":"FieldsV1","fieldsV1":{"f:count":{},"f:firstTimestamp":{},"f:involvedObject":{"f:apiVersion":{},"f:fieldPath":{},"f:kind":{},"f:name":{},"f:namespace":{},"f:resourceVersion":{},"f:uid":{}},"f:lastTimestamp":{},"f:message":{},"f:reason":{},"f:source":{"f:component":{},"f:host":{}},"f:type":{}}}]},"involvedObject":{"kind":"Pod","namespace":"staging-cw-imgbuilder-mk3-rebase","name":"imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","uid":"a87d12cb-d5ef-4dad-a1fa-44284e994f07","apiVersion":"v1","resourceVersion":"237704853","fieldPath":"spec.containers{workspace}"},"reason":"Pulling","message":"Pulling image \"reg.cw-imgbuilder-mk3-rebase.staging.gitpod-dev.com:30815/remote/0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b\"","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-8s5c"},"firstTimestamp":"2021-07-21T16:02:46Z","lastTimestamp":"2021-07-21T16:02:46Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b.1693d9d0efea9977","namespace":"staging-cw-imgbuilder-mk3-rebase","selfLink":"/api/v1/namespaces/staging-cw-imgbuilder-mk3-rebase/events/imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b.1693d9d0efea9977","uid":"1914f2c6-0da1-4efc-bcd4-561c33c44f87","resourceVersion":"14681308","creationTimestamp":"2021-07-21T16:03:01Z","managedFields":[{"manager":"kubelet","operation":"Update","apiVersion":"v1","time":"2021-07-21T16:03:01Z","fieldsType":"FieldsV1","fieldsV1":{"f:count":{},"f:firstTimestamp":{},"f:involvedObject":{"f:apiVersion":{},"f:fieldPath":{},"f:kind":{},"f:name":{},"f:namespace":{},"f:resourceVersion":{},"f:uid":{}},"f:lastTimestamp":{},"f:message":{},"f:reason":{},"f:source":{"f:component":{},"f:host":{}},"f:type":{}}}]},"involvedObject":{"kind":"Pod","namespace":"staging-cw-imgbuilder-mk3-rebase","name":"imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","uid":"a87d12cb-d5ef-4dad-a1fa-44284e994f07","apiVersion":"v1","resourceVersion":"237704853","fieldPath":"spec.containers{workspace}"},"reason":"Pulled","message":"Successfully pulled image \"reg.cw-imgbuilder-mk3-rebase.staging.gitpod-dev.com:30815/remote/0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b\" in 15.283188815s","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-8s5c"},"firstTimestamp":"2021-07-21T16:03:01Z","lastTimestamp":"2021-07-21T16:03:01Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b.1693d9d162cf7143","namespace":"staging-cw-imgbuilder-mk3-rebase","selfLink":"/api/v1/namespaces/staging-cw-imgbuilder-mk3-rebase/events/imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b.1693d9d162cf7143","uid":"2abb038a-e90b-44f1-85fd-5b4d61a8e307","resourceVersion":"14681309","creationTimestamp":"2021-07-21T16:03:03Z","managedFields":[{"manager":"kubelet","operation":"Update","apiVersion":"v1","time":"2021-07-21T16:03:03Z","fieldsType":"FieldsV1","fieldsV1":{"f:count":{},"f:firstTimestamp":{},"f:involvedObject":{"f:apiVersion":{},"f:fieldPath":{},"f:kind":{},"f:name":{},"f:namespace":{},"f:resourceVersion":{},"f:uid":{}},"f:lastTimestamp":{},"f:message":{},"f:reason":{},"f:source":{"f:component":{},"f:host":{}},"f:type":{}}}]},"involvedObject":{"kind":"Pod","namespace":"staging-cw-imgbuilder-mk3-rebase","name":"imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","uid":"a87d12cb-d5ef-4dad-a1fa-44284e994f07","apiVersion":"v1","resourceVersion":"237704853","fieldPath":"spec.containers{workspace}"},"reason":"Created","message":"Created container workspace","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-8s5c"},"firstTimestamp":"2021-07-21T16:03:03Z","lastTimestamp":"2021-07-21T16:03:03Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b.1693d9d17488b910","namespace":"staging-cw-imgbuilder-mk3-rebase","selfLink":"/api/v1/namespaces/staging-cw-imgbuilder-mk3-rebase/events/imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b.1693d9d17488b910","uid":"0f2b6737-f1c8-4956-b834-5cd51f342d41","resourceVersion":"14681310","creationTimestamp":"2021-07-21T16:03:04Z","managedFields":[{"manager":"kubelet","operation":"Update","apiVersion":"v1","time":"2021-07-21T16:03:04Z","fieldsType":"FieldsV1","fieldsV1":{"f:count":{},"f:firstTimestamp":{},"f:involvedObject":{"f:apiVersion":{},"f:fieldPath":{},"f:kind":{},"f:name":{},"f:namespace":{},"f:resourceVersion":{},"f:uid":{}},"f:lastTimestamp":{},"f:message":{},"f:reason":{},"f:source":{"f:component":{},"f:host":{}},"f:type":{}}}]},"involvedObject":{"kind":"Pod","namespace":"staging-cw-imgbuilder-mk3-rebase","name":"imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","uid":"a87d12cb-d5ef-4dad-a1fa-44284e994f07","apiVersion":"v1","resourceVersion":"237704853","fieldPath":"spec.containers{workspace}"},"reason":"Started","message":"Started container workspace","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-8s5c"},"firstTimestamp":"2021-07-21T16:03:04Z","lastTimestamp":"2021-07-21T16:03:04Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""}]} \ No newline at end of file +{"pod":{"kind":"Pod","apiVersion":"v1","metadata":{"name":"imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","namespace":"staging-cw-imgbuilder-mk3-rebase","selfLink":"/api/v1/namespaces/staging-cw-imgbuilder-mk3-rebase/pods/imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","uid":"a87d12cb-d5ef-4dad-a1fa-44284e994f07","resourceVersion":"237707407","creationTimestamp":"2021-07-21T16:02:45Z","labels":{"app":"gitpod","component":"workspace","gitpod.io/networkpolicy":"default","gpwsman":"true","headless":"true","metaID":"0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","owner":"image-builder","workspaceID":"0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","workspaceType":"imagebuild"},"annotations":{"cluster-autoscaler.kubernetes.io/safe-to-evict":"false","cni.projectcalico.org/podIP":"","cni.projectcalico.org/podIPs":"","container.apparmor.security.beta.kubernetes.io/workspace":"unconfined","gitpod.io/annotation.baseref":"eu.gcr.io/gitpod-core-dev/registry/base-images:d04c64d5d108632a1768e4af9c3a8a3e6a87c96d2566fb1b0d1aec2fd630e8bd","gitpod.io/annotation.ref":"eu.gcr.io/gitpod-core-dev/registry/workspace-images:a277dab62e839192eb320da283d4e8488a2b2f46fceb4677a7d571431e239aa5","gitpod.io/nodeName":"gke-dev-workload-1-49d27f81-8s5c","gitpod.io/requiredNodeServices":"ws-daemon,registry-facade","gitpod/admission":"admit_owner_only","gitpod/contentInitializer":"[redacted]","gitpod/customTimeout":"1h0m0s","gitpod/id":"0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","gitpod/imageSpec":"Cl5ldS5nY3IuaW8vZ2l0cG9kLWNvcmUtZGV2L2J1aWxkL2ltYWdlLWJ1aWxkZXItbWszL2JvYjoyY2Y3NDc4NjdmZjgwNGVlMGVkYzBhMjYwN2NiOGNhMDYyNDIwODNhEl5ldS5nY3IuaW8vZ2l0cG9kLWNvcmUtZGV2L2J1aWxkL2ltYWdlLWJ1aWxkZXItbWszL2JvYjoyY2Y3NDc4NjdmZjgwNGVlMGVkYzBhMjYwN2NiOGNhMDYyNDIwODNh","gitpod/never-ready":"true","gitpod/ownerToken":"osZStmqg3TI0NrkLe3edax9bYCknXWtr","gitpod/servicePrefix":"0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","gitpod/url":"https://0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b.ws-dev.cw-imgbuilder-mk3-rebase.staging.gitpod-dev.com","kubernetes.io/psp":"staging-cw-imgbuilder-mk3-rebase-ns-workspace","prometheus.io/path":"/metrics","prometheus.io/port":"23000","prometheus.io/scrape":"true","seccomp.security.alpha.kubernetes.io/pod":"localhost/workspace_default_cw-imgbuilder-mk3-rebase.100.json"},"finalizers":["gitpod.io/finalizer"],"managedFields":[{"manager":"calico","operation":"Update","apiVersion":"v1","time":"2021-07-21T16:02:46Z","fieldsType":"FieldsV1","fieldsV1":{"f:metadata":{"f:annotations":{"f:cni.projectcalico.org/podIP":{},"f:cni.projectcalico.org/podIPs":{}}}}},{"manager":"ws-manager","operation":"Update","apiVersion":"v1","time":"2021-07-21T16:03:04Z","fieldsType":"FieldsV1","fieldsV1":{"f:metadata":{"f:annotations":{".":{},"f:cluster-autoscaler.kubernetes.io/safe-to-evict":{},"f:container.apparmor.security.beta.kubernetes.io/workspace":{},"f:gitpod.io/annotation.baseref":{},"f:gitpod.io/annotation.ref":{},"f:gitpod.io/nodeName":{},"f:gitpod.io/requiredNodeServices":{},"f:gitpod/admission":{},"f:gitpod/contentInitializer":{},"f:gitpod/customTimeout":{},"f:gitpod/id":{},"f:gitpod/imageSpec":{},"f:gitpod/never-ready":{},"f:gitpod/ownerToken":{},"f:gitpod/servicePrefix":{},"f:gitpod/url":{},"f:prometheus.io/path":{},"f:prometheus.io/port":{},"f:prometheus.io/scrape":{},"f:seccomp.security.alpha.kubernetes.io/pod":{}},"f:finalizers":{".":{},"v:\"gitpod.io/finalizer\"":{}},"f:labels":{".":{},"f:app":{},"f:component":{},"f:gitpod.io/networkpolicy":{},"f:gpwsman":{},"f:headless":{},"f:metaID":{},"f:owner":{},"f:workspaceID":{},"f:workspaceType":{}}},"f:spec":{"f:automountServiceAccountToken":{},"f:containers":{"k:{\"name\":\"workspace\"}":{".":{},"f:command":{},"f:env":{".":{},"k:{\"name\":\"BOB_AUTH_KEY\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"BOB_BASELAYER_AUTH\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"BOB_BASE_REF\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"BOB_BUILD_BASE\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"BOB_CONTEXT_DIR\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"BOB_DOCKERFILE_PATH\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"BOB_WSLAYER_AUTH\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"BOB_TARGET_REF\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"GITPOD_CLI_APITOKEN\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"GITPOD_HEADLESS\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"GITPOD_HOST\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"GITPOD_INSTANCE_ID\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"GITPOD_INTERVAL\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"GITPOD_MEMORY\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"GITPOD_REPO_ROOT\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"GITPOD_TASKS\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"GITPOD_THEIA_PORT\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"GITPOD_WORKSPACE_CLUSTER_HOST\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"GITPOD_WORKSPACE_ID\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"GITPOD_WORKSPACE_URL\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"THEIA_MINI_BROWSER_HOST_PATTERN\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"THEIA_SUPERVISOR_ENDPOINT\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"THEIA_WEBVIEW_EXTERNAL_ENDPOINT\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"THEIA_WORKSPACE_ROOT\"}":{".":{},"f:name":{},"f:value":{}}},"f:image":{},"f:imagePullPolicy":{},"f:name":{},"f:ports":{".":{},"k:{\"containerPort\":23000,\"protocol\":\"TCP\"}":{".":{},"f:containerPort":{},"f:protocol":{}}},"f:readinessProbe":{".":{},"f:failureThreshold":{},"f:httpGet":{".":{},"f:path":{},"f:port":{},"f:scheme":{}},"f:periodSeconds":{},"f:successThreshold":{},"f:timeoutSeconds":{}},"f:resources":{".":{},"f:limits":{".":{},"f:cpu":{},"f:memory":{}},"f:requests":{".":{},"f:cpu":{},"f:ephemeral-storage":{},"f:memory":{}}},"f:securityContext":{".":{},"f:allowPrivilegeEscalation":{},"f:capabilities":{".":{},"f:add":{},"f:drop":{}},"f:privileged":{},"f:readOnlyRootFilesystem":{},"f:runAsGroup":{},"f:runAsNonRoot":{},"f:runAsUser":{}},"f:terminationMessagePath":{},"f:terminationMessagePolicy":{},"f:volumeMounts":{".":{},"k:{\"mountPath\":\"/.workspace\"}":{".":{},"f:mountPath":{},"f:mountPropagation":{},"f:name":{}},"k:{\"mountPath\":\"/workspace\"}":{".":{},"f:mountPath":{},"f:mountPropagation":{},"f:name":{}}}}},"f:dnsConfig":{".":{},"f:nameservers":{}},"f:dnsPolicy":{},"f:enableServiceLinks":{},"f:imagePullSecrets":{".":{},"k:{\"name\":\"gcp-sa-registry-auth\"}":{".":{},"f:name":{}}},"f:restartPolicy":{},"f:schedulerName":{},"f:securityContext":{".":{},"f:fsGroup":{},"f:seccompProfile":{"f:localhostProfile":{},"f:type":{}},"f:supplementalGroups":{}},"f:serviceAccount":{},"f:serviceAccountName":{},"f:terminationGracePeriodSeconds":{},"f:tolerations":{},"f:volumes":{".":{},"k:{\"name\":\"daemon-mount\"}":{".":{},"f:hostPath":{".":{},"f:path":{},"f:type":{}},"f:name":{}},"k:{\"name\":\"vol-this-workspace\"}":{".":{},"f:hostPath":{".":{},"f:path":{},"f:type":{}},"f:name":{}}}}}},{"manager":"kubelet","operation":"Update","apiVersion":"v1","time":"2021-07-21T16:08:00Z","fieldsType":"FieldsV1","fieldsV1":{"f:status":{"f:conditions":{"k:{\"type\":\"ContainersReady\"}":{".":{},"f:lastProbeTime":{},"f:lastTransitionTime":{},"f:reason":{},"f:status":{},"f:type":{}},"k:{\"type\":\"Initialized\"}":{".":{},"f:lastProbeTime":{},"f:lastTransitionTime":{},"f:reason":{},"f:status":{},"f:type":{}},"k:{\"type\":\"Ready\"}":{".":{},"f:lastProbeTime":{},"f:lastTransitionTime":{},"f:reason":{},"f:status":{},"f:type":{}}},"f:containerStatuses":{},"f:hostIP":{},"f:phase":{},"f:podIP":{},"f:podIPs":{".":{},"k:{\"ip\":\"10.60.22.132\"}":{".":{},"f:ip":{}}},"f:startTime":{}}}}]},"spec":{"volumes":[{"name":"vol-this-workspace","hostPath":{"path":"/mnt/disks/ssd0/workspaces/0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","type":"DirectoryOrCreate"}},{"name":"daemon-mount","hostPath":{"path":"/mnt/disks/ssd0/workspaces/0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b-daemon","type":"DirectoryOrCreate"}}],"containers":[{"name":"workspace","image":"reg.cw-imgbuilder-mk3-rebase.staging.gitpod-dev.com:30815/remote/0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","command":["/.supervisor/workspacekit","ring0"],"ports":[{"containerPort":23000,"protocol":"TCP"}],"env":[{"name":"GITPOD_REPO_ROOT","value":"/workspace"},{"name":"GITPOD_CLI_APITOKEN","value":"TUf744QntqioSRIrnIVpic9CpLnKQCbj"},{"name":"GITPOD_WORKSPACE_ID","value":"0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b"},{"name":"GITPOD_INSTANCE_ID","value":"0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b"},{"name":"GITPOD_THEIA_PORT","value":"23000"},{"name":"THEIA_WORKSPACE_ROOT","value":"/workspace/workspace"},{"name":"GITPOD_HOST","value":"https://cw-imgbuilder-mk3-rebase.staging.gitpod-dev.com"},{"name":"GITPOD_WORKSPACE_URL","value":"https://0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b.ws-dev.cw-imgbuilder-mk3-rebase.staging.gitpod-dev.com"},{"name":"GITPOD_WORKSPACE_CLUSTER_HOST","value":"ws-dev.cw-imgbuilder-mk3-rebase.staging.gitpod-dev.com"},{"name":"THEIA_SUPERVISOR_ENDPOINT","value":":22999"},{"name":"THEIA_WEBVIEW_EXTERNAL_ENDPOINT","value":"webview-{{hostname}}"},{"name":"THEIA_MINI_BROWSER_HOST_PATTERN","value":"browser-{{hostname}}"},{"name":"BOB_TARGET_REF","value":"eu.gcr.io/gitpod-core-dev/registry/workspace-images:a277dab62e839192eb320da283d4e8488a2b2f46fceb4677a7d571431e239aa5"},{"name":"BOB_BASE_REF","value":"eu.gcr.io/gitpod-core-dev/registry/base-images:d04c64d5d108632a1768e4af9c3a8a3e6a87c96d2566fb1b0d1aec2fd630e8bd"},{"name":"BOB_BUILD_BASE","value":"true"},{"name":"BOB_BASELAYER_AUTH","value":"bI9gBDvDtwGZby8T1Wd3HdjrKz0HH4Kcrdyxtij1"},{"name":"BOB_WSLAYER_AUTH","value":"PetXlerz2kjoa7FPdWuqdaC6o48qmFNCSUlx/DY+VvEh56pB85zB/0xcM2N4haYk3Umoa9OAJvu33AuB9GakbIOxHtF7IqgQUFRD+p2+yM80mWtHcTn13wVrpo2diIH91Ne58Qr+qz8l6q2sXKg/U4YJr0x4kIg1110iKD1r1GklhvlaQuIudUTQdY264ama2FQcrJjpnqaQIYIO4cOhc2lI9y34MGqwSlFfzuqjcKLpt2/XW+CwZxH2h5JKcgmZjcUyClA/GcC1mgJX3b4eqgsravlTloRvMti8IgWK8s4xiOU9qFEFCWcGIXwdj16Abtn5GoWDNFyHFF5Ojss7QzTEx395QnMgLEVxZrkscJc0Afn+ewKXF3oceoIuWe0GmgvbRnzuUv9ftnc7BPWgNq0HXr8J3RBBcnlXSQlcECljq8TW6vtkSDKrOnPeTSLZ12jj+PtmVwDvPCRYevo6TSIluyt6EEpm1aKV9Rt6VuGAFNFZfRLlKx0UivOUzgcUUN0UJ6itBsQKW97o/8sax03PTvcHbP+CtvYYwGXKqF3nO3SQs0eiDhqi0IV4/TvzjvsLm5UFC+VqEzahRMm7fhvoKdmPMBu0kGiFE3bZK4w7s3vWoliWnHS27Mg8GawGySOp1Y8cy15B07Y6tyRcxwJ3dRxYulvEm8w4+9RgGor1w8ScMqZ/GugXhHOUVfDjomTqDhooDLWw7VB3JKqCLlOcZ42cdheHWnEyLtFhDMisESukMfT99cq95L5ZIARTqS2gpcRDro/iiumvwe6Hr+gNtuz/NCA0dKPgst5vLZYzcjJvcHzOSR88iqnottSeuX2NVU5FoqNaMqURcXXvp9oXkrAJ8JILDmE+cMhna+pKK+nbFa7NE8zzvGoxUnZNbPUzu2FT7AXyMPKr5mWOBwQY9Jb7OxQXoqAtCBoAT6pKgan/BkaC02o3kwgt50aYWt0bmdl2/JPoF01+bhbmbIGK6I/B/oOMU5VMXTfHIKg4Q5LJX540JxQB6g4z7wR8eAHLQ3F6GyXcV69xZX64veKXvx3NhZ75lcwjzC9mtUvoXzftM3lsTFwQGlBrzC6wKPGotQJh7dRH8HYKuUdjm/z0xElVKaaNHtMkQ6yNGNQ1lQZpdGDYQwqxMXHd61zolL3JVwovDPax3tNn69mfeAnhnKJ4MQHi+804EO80NrLMJNHxbETdcaE6M/meprmmlsd8Z0ZxSrAcbU4pqNoeSEfC5U2W6DWhP5jiagqml/d7wq2rh8CV1wAct/FLLX/nWC9BejZ2caTTennh3bNpaTfDHDL35+a7+24k74SAw8Py1CsRGqm8LyfwbQEgw4Lihe8k24DA5R3nB+pSFcze4SQhFBWNFK8ZS9MHYWPKEi3ptvCoeTs+fkXuhqDy3pIlkVPJNrP9eCQES7+INgFAUmQ3yuB1YZeev6bjz5mGV+XIV2P12ngz4+y/tTL75+y2QEDC2FWO9rgMC27Q/4WZo+PUIEyf7tLHsOKvvPCJrRIQzBNFCSRg4I6j2A9cK84l6NFKPQhfkzttv8YdsNWClflaDuf5Te3PKPh2pozWmFIeYlufgNFZ7TIEziwFzp9p9emI1O0pVaDlQ0hKeK67GJTNXh5vzYCwBbMSLQECMmClinYHYYS7fMzfmlRwsvKIdeHf2yjCbN8dBhQx7AuLvyiHVNmrBDhPlmB8wbzvAAz8ODz4OiNisXbOJq0+nmok5Jdf1tfuJOnfdKeVwDVRrDkTqUP0W53a34pBdHWctD70o/fVmxxqzJ7R1I6U3YuCYJkTlvvEjCqCbNPKseNBfEAVy/FYpKYj0A7IgILtbVi5SCSPnEAkOnZD1x2yrH0bUhQoBpJ38Je69pkVOnZwpyPvgJFWfKun8WRgdQMzIYA6SrBqRItKOAN7Fd1YHMys8BaJZbwQo7ZuEsnAYwKIS563dc67clKsjbUJ+VkiXeRyUaZiubHweu6vgouSPi8kvZ5aNx98oj+vGUQpoJK1yhZH/siAiPBmf5JIm9qzDM64Y99Biai7Mw4eICCz0qHk4kboS2n1cHePk780o2mpXifVtuc7RK2Rr9UbxQ2PiygFNYZh7mPWc0qCJm/81b/rOP7UQDJuBbNw9U0EslW7uS3Fvl80kvO43SgWxXJTykMJJ3vr94WyAoNagV2e3AB+qCvsCWkn4o7Mwb6EmbobvHBuOHEJVeA4P030B+KCpSLNxwnmZdxJG7NdTjTxXakYV2AEGQLGQuUuYtkMLBBoeQUInNwpJvwslcQCXGn4naVQjCerwip/vMOKaW+vHYhdl8zlg30tjx+oUuyx86LNcv3sNpZapvJvo9UoyfMxmwVv4X/GGkB73v1bRJbH5BJ5+5v+phLvYRMc3rsrSk76Us1hKVyKAfK14m4T+RqAprplf8k1crdaniOnebFRJCWg0QujgS+2EUBpIoAZu184zTirARHs2ip9WikVLXD3gqY2dIbrsCsiNLjTAR/pf8Og9e/VjYfszM56de9q9tNBcNM15oA1w60UwSLlyLNIZR8Uum75UICOEGVimsS73P6rFFsmlvIK8Tr+uVsgt8IKhJsyVArrCVGx3cwaVKMNp2XXNfzEUTy6r86pPXvqQEfKhiDgRkf79HLjx0BxVFgpxjMNHUdgsARTK2ElIAsO/sh/WbsvsHByfQZeTR7iDgxxfJQzA1xpnltctQp95tPWbsj2HlzI9rr95/jAUASJcyMA9cWfN5NZWrgkxP//Prc7pMHsmjCNh0PbSVyPTdRWqdxjZXqMPdm0PNQXWEjtkE5R5830JtqhLLToHBHpbCVbmHTUllkFOYnzob9YkrHYdhez/66VDJGNhms2aVi3bu4X2sjo4f8rbP+1dxdi8n/vRf3zaEAW3vy2fASfwvmPN7yFH9Y4mxiezSNdH16y+c2/NOlM8cgGLA1WJX1liFGvFzDNHsjYRX4sHLlx+zuUf/YBqBTGPzxNZz8GOx/7LZhg3ilcqfDl4fChqEDDvSrsXLX88Hv+1St0FpRikIKimUHUx5X0ClVihAkRamm1M9lR9NsxVV6DEGC6JeWmAls/DD+cEUybS+JwQItLz+lbi5kMTibJale+pl5pFg/eNNZQkTPE1GoEf85JZ6moOp6fwqAhBLLCYzcWTYGHKYdknPkvfopB5HFMQi/biBdvbg7N3cYpH/DpfHs2bNAlI8xTn0lxi6ABuie7o4XPpKt1m2eQw3VGYK5n8b22e2aVjIilOwUQmfrdBX2QuOxLg1OVJGAYJkOjmBaAM14bTMaMGSJo0t60EuFydwaiQ9nYVecjploe8I4RCjYLBskzQICb8XlEeSCIThqKiFaaEis"},{"name":"BOB_DOCKERFILE_PATH","value":"/workspace/.gitpod.dockerfile"},{"name":"BOB_CONTEXT_DIR","value":"/workspace"},{"name":"BOB_AUTH_KEY","value":"GR9u6Y6MnUp4BxDZmSFvwaciqkNOqpQ1"},{"name":"GITPOD_TASKS","value":"[{\"name\": \"build\", \"init\": \"sudo -E /app/bob build\"}]"},{"name":"GITPOD_INTERVAL","value":"30000"},{"name":"GITPOD_MEMORY","value":"2415"},{"name":"GITPOD_HEADLESS","value":"true"}],"resources":{"limits":{"cpu":"5","memory":"12Gi"},"requests":{"cpu":"1m","ephemeral-storage":"5Gi","memory":"2304Mi"}},"volumeMounts":[{"name":"vol-this-workspace","mountPath":"/workspace","mountPropagation":"HostToContainer"},{"name":"daemon-mount","mountPath":"/.workspace","mountPropagation":"HostToContainer"}],"readinessProbe":{"httpGet":{"path":"/_supervisor/v1/status/content/wait/true","port":22999,"scheme":"HTTP"},"timeoutSeconds":1,"periodSeconds":1,"successThreshold":1,"failureThreshold":600},"terminationMessagePath":"/dev/termination-log","terminationMessagePolicy":"File","imagePullPolicy":"IfNotPresent","securityContext":{"capabilities":{"add":["AUDIT_WRITE","FSETID","KILL","NET_BIND_SERVICE","SYS_PTRACE"],"drop":["SETPCAP","CHOWN","NET_RAW","DAC_OVERRIDE","FOWNER","SYS_CHROOT","SETFCAP","SETUID","SETGID"]},"privileged":false,"runAsUser":33333,"runAsGroup":33333,"runAsNonRoot":true,"readOnlyRootFilesystem":false,"allowPrivilegeEscalation":true}}],"restartPolicy":"Never","terminationGracePeriodSeconds":30,"dnsPolicy":"None","serviceAccountName":"workspace","serviceAccount":"workspace","automountServiceAccountToken":false,"nodeName":"gke-dev-workload-1-49d27f81-8s5c","securityContext":{"supplementalGroups":[1],"fsGroup":1,"seccompProfile":{"type":"Localhost","localhostProfile":"workspace_default_cw-imgbuilder-mk3-rebase.100.json"}},"imagePullSecrets":[{"name":"gcp-sa-registry-auth"}],"tolerations":[{"key":"node.kubernetes.io/disk-pressure","operator":"Exists","effect":"NoExecute"},{"key":"node.kubernetes.io/memory-pressure","operator":"Exists","effect":"NoExecute"},{"key":"node.kubernetes.io/network-unavailable","operator":"Exists","effect":"NoExecute","tolerationSeconds":30},{"key":"node.kubernetes.io/not-ready","operator":"Exists","effect":"NoExecute","tolerationSeconds":300},{"key":"node.kubernetes.io/unreachable","operator":"Exists","effect":"NoExecute","tolerationSeconds":300}],"priority":0,"dnsConfig":{"nameservers":["1.1.1.1","8.8.8.8"]},"enableServiceLinks":false,"preemptionPolicy":"PreemptLowerPriority"},"status":{"phase":"Succeeded","conditions":[{"type":"Initialized","status":"True","lastProbeTime":null,"lastTransitionTime":"2021-07-21T16:02:45Z","reason":"PodCompleted"},{"type":"Ready","status":"False","lastProbeTime":null,"lastTransitionTime":"2021-07-21T16:08:00Z","reason":"PodCompleted"},{"type":"ContainersReady","status":"False","lastProbeTime":null,"lastTransitionTime":"2021-07-21T16:08:00Z","reason":"PodCompleted"},{"type":"PodScheduled","status":"True","lastProbeTime":null,"lastTransitionTime":"2021-07-21T16:02:45Z"}],"hostIP":"10.132.0.17","podIP":"10.60.22.132","podIPs":[{"ip":"10.60.22.132"}],"startTime":"2021-07-21T16:02:45Z","containerStatuses":[{"name":"workspace","state":{"terminated":{"exitCode":0,"reason":"Completed","startedAt":"2021-07-21T16:03:04Z","finishedAt":"2021-07-21T16:07:59Z","containerID":"containerd://b1a0fe3f35a826fbf8fee1518f2ccb7c75f818b4ea9cc17bb22586c18aaa1410"}},"lastState":{},"ready":false,"restartCount":0,"image":"reg.cw-imgbuilder-mk3-rebase.staging.gitpod-dev.com:30815/remote/0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b:latest","imageID":"reg.cw-imgbuilder-mk3-rebase.staging.gitpod-dev.com:30815/remote/0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b@sha256:d86c7d32f939aa04b1092968a624ffe697c9c35268be230169070a2a52d4bda9","containerID":"containerd://b1a0fe3f35a826fbf8fee1518f2ccb7c75f818b4ea9cc17bb22586c18aaa1410","started":false}],"qosClass":"Burstable"}},"theiaService":{"kind":"Service","apiVersion":"v1","metadata":{"name":"ws-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b-theia","namespace":"staging-cw-imgbuilder-mk3-rebase","selfLink":"/api/v1/namespaces/staging-cw-imgbuilder-mk3-rebase/services/ws-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b-theia","uid":"cdb765b1-60ee-4bf9-9e5e-c8e635c719df","resourceVersion":"237704855","creationTimestamp":"2021-07-21T16:02:45Z","labels":{"app":"gitpod","component":"workspace","gpwsman":"true","headless":"true","metaID":"0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","owner":"image-builder","workspaceID":"0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","workspaceType":"imagebuild"},"managedFields":[{"manager":"ws-manager","operation":"Update","apiVersion":"v1","time":"2021-07-21T16:02:45Z","fieldsType":"FieldsV1","fieldsV1":{"f:metadata":{"f:labels":{".":{},"f:app":{},"f:component":{},"f:gpwsman":{},"f:headless":{},"f:metaID":{},"f:owner":{},"f:workspaceID":{},"f:workspaceType":{}}},"f:spec":{"f:ports":{".":{},"k:{\"port\":22999,\"protocol\":\"TCP\"}":{".":{},"f:name":{},"f:port":{},"f:protocol":{},"f:targetPort":{}},"k:{\"port\":23000,\"protocol\":\"TCP\"}":{".":{},"f:name":{},"f:port":{},"f:protocol":{},"f:targetPort":{}}},"f:selector":{".":{},"f:app":{},"f:component":{},"f:gpwsman":{},"f:headless":{},"f:metaID":{},"f:owner":{},"f:workspaceID":{},"f:workspaceType":{}},"f:sessionAffinity":{},"f:type":{}}}}]},"spec":{"ports":[{"name":"ide","protocol":"TCP","port":23000,"targetPort":23000},{"name":"supervisor","protocol":"TCP","port":22999,"targetPort":22999}],"selector":{"app":"gitpod","component":"workspace","gpwsman":"true","headless":"true","metaID":"0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","owner":"image-builder","workspaceID":"0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","workspaceType":"imagebuild"},"clusterIP":"10.63.242.92","type":"ClusterIP","sessionAffinity":"None"},"status":{"loadBalancer":{}}},"events":[{"metadata":{"name":"imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b - scrdhnl","generateName":"imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b - scheduled","namespace":"staging-cw-imgbuilder-mk3-rebase","selfLink":"/api/v1/namespaces/staging-cw-imgbuilder-mk3-rebase/events/imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b%20-%20scrdhnl","uid":"b09f5f40-c5a1-49c4-abb4-c12889a4c151","resourceVersion":"14681306","creationTimestamp":"2021-07-21T16:02:45Z","managedFields":[{"manager":"ws-scheduler","operation":"Update","apiVersion":"v1","time":"2021-07-21T16:02:45Z","fieldsType":"FieldsV1","fieldsV1":{"f:count":{},"f:firstTimestamp":{},"f:involvedObject":{"f:kind":{},"f:name":{},"f:namespace":{},"f:uid":{}},"f:lastTimestamp":{},"f:message":{},"f:metadata":{"f:generateName":{}},"f:reason":{},"f:source":{"f:component":{}},"f:type":{}}}]},"involvedObject":{"kind":"Pod","namespace":"staging-cw-imgbuilder-mk3-rebase","name":"imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","uid":"a87d12cb-d5ef-4dad-a1fa-44284e994f07"},"reason":"Scheduled","message":"Placed pod [staging-cw-imgbuilder-mk3-rebase/imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b] on gke-dev-workload-1-49d27f81-8s5c\n","source":{"component":"workspace-scheduler"},"firstTimestamp":"2021-07-21T16:02:45Z","lastTimestamp":"2021-07-21T16:02:45Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b.1693d9cd60f7517f","namespace":"staging-cw-imgbuilder-mk3-rebase","selfLink":"/api/v1/namespaces/staging-cw-imgbuilder-mk3-rebase/events/imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b.1693d9cd60f7517f","uid":"4aadb7e6-0974-4245-bacf-733a3de21487","resourceVersion":"14681307","creationTimestamp":"2021-07-21T16:02:46Z","managedFields":[{"manager":"kubelet","operation":"Update","apiVersion":"v1","time":"2021-07-21T16:02:46Z","fieldsType":"FieldsV1","fieldsV1":{"f:count":{},"f:firstTimestamp":{},"f:involvedObject":{"f:apiVersion":{},"f:fieldPath":{},"f:kind":{},"f:name":{},"f:namespace":{},"f:resourceVersion":{},"f:uid":{}},"f:lastTimestamp":{},"f:message":{},"f:reason":{},"f:source":{"f:component":{},"f:host":{}},"f:type":{}}}]},"involvedObject":{"kind":"Pod","namespace":"staging-cw-imgbuilder-mk3-rebase","name":"imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","uid":"a87d12cb-d5ef-4dad-a1fa-44284e994f07","apiVersion":"v1","resourceVersion":"237704853","fieldPath":"spec.containers{workspace}"},"reason":"Pulling","message":"Pulling image \"reg.cw-imgbuilder-mk3-rebase.staging.gitpod-dev.com:30815/remote/0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b\"","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-8s5c"},"firstTimestamp":"2021-07-21T16:02:46Z","lastTimestamp":"2021-07-21T16:02:46Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b.1693d9d0efea9977","namespace":"staging-cw-imgbuilder-mk3-rebase","selfLink":"/api/v1/namespaces/staging-cw-imgbuilder-mk3-rebase/events/imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b.1693d9d0efea9977","uid":"1914f2c6-0da1-4efc-bcd4-561c33c44f87","resourceVersion":"14681308","creationTimestamp":"2021-07-21T16:03:01Z","managedFields":[{"manager":"kubelet","operation":"Update","apiVersion":"v1","time":"2021-07-21T16:03:01Z","fieldsType":"FieldsV1","fieldsV1":{"f:count":{},"f:firstTimestamp":{},"f:involvedObject":{"f:apiVersion":{},"f:fieldPath":{},"f:kind":{},"f:name":{},"f:namespace":{},"f:resourceVersion":{},"f:uid":{}},"f:lastTimestamp":{},"f:message":{},"f:reason":{},"f:source":{"f:component":{},"f:host":{}},"f:type":{}}}]},"involvedObject":{"kind":"Pod","namespace":"staging-cw-imgbuilder-mk3-rebase","name":"imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","uid":"a87d12cb-d5ef-4dad-a1fa-44284e994f07","apiVersion":"v1","resourceVersion":"237704853","fieldPath":"spec.containers{workspace}"},"reason":"Pulled","message":"Successfully pulled image \"reg.cw-imgbuilder-mk3-rebase.staging.gitpod-dev.com:30815/remote/0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b\" in 15.283188815s","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-8s5c"},"firstTimestamp":"2021-07-21T16:03:01Z","lastTimestamp":"2021-07-21T16:03:01Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b.1693d9d162cf7143","namespace":"staging-cw-imgbuilder-mk3-rebase","selfLink":"/api/v1/namespaces/staging-cw-imgbuilder-mk3-rebase/events/imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b.1693d9d162cf7143","uid":"2abb038a-e90b-44f1-85fd-5b4d61a8e307","resourceVersion":"14681309","creationTimestamp":"2021-07-21T16:03:03Z","managedFields":[{"manager":"kubelet","operation":"Update","apiVersion":"v1","time":"2021-07-21T16:03:03Z","fieldsType":"FieldsV1","fieldsV1":{"f:count":{},"f:firstTimestamp":{},"f:involvedObject":{"f:apiVersion":{},"f:fieldPath":{},"f:kind":{},"f:name":{},"f:namespace":{},"f:resourceVersion":{},"f:uid":{}},"f:lastTimestamp":{},"f:message":{},"f:reason":{},"f:source":{"f:component":{},"f:host":{}},"f:type":{}}}]},"involvedObject":{"kind":"Pod","namespace":"staging-cw-imgbuilder-mk3-rebase","name":"imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","uid":"a87d12cb-d5ef-4dad-a1fa-44284e994f07","apiVersion":"v1","resourceVersion":"237704853","fieldPath":"spec.containers{workspace}"},"reason":"Created","message":"Created container workspace","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-8s5c"},"firstTimestamp":"2021-07-21T16:03:03Z","lastTimestamp":"2021-07-21T16:03:03Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b.1693d9d17488b910","namespace":"staging-cw-imgbuilder-mk3-rebase","selfLink":"/api/v1/namespaces/staging-cw-imgbuilder-mk3-rebase/events/imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b.1693d9d17488b910","uid":"0f2b6737-f1c8-4956-b834-5cd51f342d41","resourceVersion":"14681310","creationTimestamp":"2021-07-21T16:03:04Z","managedFields":[{"manager":"kubelet","operation":"Update","apiVersion":"v1","time":"2021-07-21T16:03:04Z","fieldsType":"FieldsV1","fieldsV1":{"f:count":{},"f:firstTimestamp":{},"f:involvedObject":{"f:apiVersion":{},"f:fieldPath":{},"f:kind":{},"f:name":{},"f:namespace":{},"f:resourceVersion":{},"f:uid":{}},"f:lastTimestamp":{},"f:message":{},"f:reason":{},"f:source":{"f:component":{},"f:host":{}},"f:type":{}}}]},"involvedObject":{"kind":"Pod","namespace":"staging-cw-imgbuilder-mk3-rebase","name":"imagebuild-0dd5700a790e7ca2-95291c91f6e61c2e-e06ba50b","uid":"a87d12cb-d5ef-4dad-a1fa-44284e994f07","apiVersion":"v1","resourceVersion":"237704853","fieldPath":"spec.containers{workspace}"},"reason":"Started","message":"Started container workspace","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-8s5c"},"firstTimestamp":"2021-07-21T16:03:04Z","lastTimestamp":"2021-07-21T16:03:04Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""}]} \ No newline at end of file diff --git a/components/ws-manager/pkg/manager/testdata/status_ideFailedToStart_005_RUNNING00.json b/components/ws-manager/pkg/manager/testdata/status_ideFailedToStart_005_RUNNING00.json index 5c42d43e2bf96c..d9481fe5930d90 100644 --- a/components/ws-manager/pkg/manager/testdata/status_ideFailedToStart_005_RUNNING00.json +++ b/components/ws-manager/pkg/manager/testdata/status_ideFailedToStart_005_RUNNING00.json @@ -31,8 +31,7 @@ } }, "time": "2021-08-18T17:42:08Z", - "apiVersion": "v1", - "manager": "ws-scheduler" + "apiVersion": "v1" } ], "resourceVersion": "619605", @@ -353,7 +352,6 @@ ] }, "dnsPolicy": "None", - "schedulerName": "workspace-scheduler", "nodeName": "gke-gp-prod-ws-eu14-eu-workspace-pool-b6e0759a-3lb1", "affinity": { "nodeAffinity": { @@ -362,7 +360,7 @@ { "matchExpressions": [ { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "Exists" } ] diff --git a/components/ws-manager/pkg/manager/testdata/status_imagespec_RUNNING00.json b/components/ws-manager/pkg/manager/testdata/status_imagespec_RUNNING00.json index c35262a8d4b273..2640cd37c3b009 100644 --- a/components/ws-manager/pkg/manager/testdata/status_imagespec_RUNNING00.json +++ b/components/ws-manager/pkg/manager/testdata/status_imagespec_RUNNING00.json @@ -217,7 +217,7 @@ "operator": "Exists" }, { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "In", "values": [ "true" @@ -229,7 +229,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/status_interrupted.json b/components/ws-manager/pkg/manager/testdata/status_interrupted.json index 16f20702b450aa..ad0fe8f4c3ceb5 100644 --- a/components/ws-manager/pkg/manager/testdata/status_interrupted.json +++ b/components/ws-manager/pkg/manager/testdata/status_interrupted.json @@ -213,7 +213,7 @@ "operator": "Exists" }, { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "In", "values": [ "true" diff --git a/components/ws-manager/pkg/manager/testdata/status_interrupted_CREATING00.json b/components/ws-manager/pkg/manager/testdata/status_interrupted_CREATING00.json index 0c492a4dc845e5..f3b85315330aca 100644 --- a/components/ws-manager/pkg/manager/testdata/status_interrupted_CREATING00.json +++ b/components/ws-manager/pkg/manager/testdata/status_interrupted_CREATING00.json @@ -204,7 +204,7 @@ "operator": "Exists" }, { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "In", "values": [ "true" diff --git a/components/ws-manager/pkg/manager/testdata/status_interrupted_networkNotReady_1_event_only.json b/components/ws-manager/pkg/manager/testdata/status_interrupted_networkNotReady_1_event_only.json index 6392aec5ac26a9..f4a42915f8139a 100644 --- a/components/ws-manager/pkg/manager/testdata/status_interrupted_networkNotReady_1_event_only.json +++ b/components/ws-manager/pkg/manager/testdata/status_interrupted_networkNotReady_1_event_only.json @@ -148,7 +148,7 @@ "operator": "Exists" }, { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "In", "values": [ "true" @@ -160,7 +160,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/not-ready", diff --git a/components/ws-manager/pkg/manager/testdata/status_interrupted_networkNotReady_2_event_and_exitcode.json b/components/ws-manager/pkg/manager/testdata/status_interrupted_networkNotReady_2_event_and_exitcode.json index a7a12ef13a5ea1..b615cf9007d4a2 100644 --- a/components/ws-manager/pkg/manager/testdata/status_interrupted_networkNotReady_2_event_and_exitcode.json +++ b/components/ws-manager/pkg/manager/testdata/status_interrupted_networkNotReady_2_event_and_exitcode.json @@ -213,7 +213,7 @@ "operator": "Exists" }, { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "In", "values": [ "true" @@ -225,7 +225,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/not-ready", diff --git a/components/ws-manager/pkg/manager/testdata/status_interrupted_networkNotReady_3_recovered_CONSTRUCTED.json b/components/ws-manager/pkg/manager/testdata/status_interrupted_networkNotReady_3_recovered_CONSTRUCTED.json index d354a3d9270969..6736dbc87a16fd 100644 --- a/components/ws-manager/pkg/manager/testdata/status_interrupted_networkNotReady_3_recovered_CONSTRUCTED.json +++ b/components/ws-manager/pkg/manager/testdata/status_interrupted_networkNotReady_3_recovered_CONSTRUCTED.json @@ -213,7 +213,7 @@ "operator": "Exists" }, { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "In", "values": [ "true" @@ -225,7 +225,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/not-ready", diff --git a/components/ws-manager/pkg/manager/testdata/status_ownerToken.json b/components/ws-manager/pkg/manager/testdata/status_ownerToken.json index 255b92899686da..ebfe8fce9f85cf 100644 --- a/components/ws-manager/pkg/manager/testdata/status_ownerToken.json +++ b/components/ws-manager/pkg/manager/testdata/status_ownerToken.json @@ -148,7 +148,7 @@ "operator": "Exists" }, { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "In", "values": [ "true" @@ -160,7 +160,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/status_prebuildFail_STOPPED00.json b/components/ws-manager/pkg/manager/testdata/status_prebuildFail_STOPPED00.json index 5643746cd7fd04..08452d39d1fdd8 100644 --- a/components/ws-manager/pkg/manager/testdata/status_prebuildFail_STOPPED00.json +++ b/components/ws-manager/pkg/manager/testdata/status_prebuildFail_STOPPED00.json @@ -268,7 +268,7 @@ { "matchExpressions": [ { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "Exists" } ] diff --git a/components/ws-manager/pkg/manager/testdata/status_prebuildFail_STOPPING00.json b/components/ws-manager/pkg/manager/testdata/status_prebuildFail_STOPPING00.json index eafdf70b81325a..39b3aa9eaa8101 100644 --- a/components/ws-manager/pkg/manager/testdata/status_prebuildFail_STOPPING00.json +++ b/components/ws-manager/pkg/manager/testdata/status_prebuildFail_STOPPING00.json @@ -263,7 +263,7 @@ { "matchExpressions": [ { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "Exists" } ] @@ -272,7 +272,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/status_prebuildSuccess2_CREATING01.json b/components/ws-manager/pkg/manager/testdata/status_prebuildSuccess2_CREATING01.json index c2b4c8d488acee..405bafa1ae07cf 100644 --- a/components/ws-manager/pkg/manager/testdata/status_prebuildSuccess2_CREATING01.json +++ b/components/ws-manager/pkg/manager/testdata/status_prebuildSuccess2_CREATING01.json @@ -1 +1 @@ -{"pod":{"kind":"Pod","apiVersion":"v1","metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/pods/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","resourceVersion":"198743334","creationTimestamp":"2021-05-28T12:48:19Z","labels":{"app":"gitpod","component":"workspace","gitpod.io/networkpolicy":"default","gpwsman":"true","headless":"true","metaID":"green-wombat-62dzneud","owner":"d98c5b92-2066-4fce-bea6-1e08b58642ab","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae","workspaceType":"prebuild"},"annotations":{"cni.projectcalico.org/podIP":"10.60.61.170/32","container.apparmor.security.beta.kubernetes.io/workspace":"unconfined","gitpod.io/requiredNodeServices":"ws-daemon,registry-facade","gitpod/admission":"admit_owner_only","gitpod/contentInitializer":"[redacted]","gitpod/id":"8e0bbcdf-a926-4670-8c40-b718f035b2ae","gitpod/imageSpec":"CnRldS5nY3IuaW8vZ2l0cG9kLWNvcmUtZGV2L3JlZ2lzdHJ5L3dvcmtzcGFjZS1pbWFnZXM6ODFjNGZiNjAyYTU0MGQyNjFmMjEwY2ZjOGJhMDQzNWI2M2IyNDIzOGMxNzYyZWMwMjlkOGVkYWVjODE2YWZiNhJCZXUuZ2NyLmlvL2dpdHBvZC1jb3JlLWRldi9idWlsZC9pZGUvY29kZTpncGwtaGVhZGxlc3MtbG9nLXdzbWFuLjE3","gitpod/exposedPorts": "Cl4IuQoYASJXaHR0cHM6Ly8xMzM3LWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IuBcYASJXaHR0cHM6Ly8zMDAwLWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IuRcYASJXaHR0cHM6Ly8zMDAxLWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4I6hkYASJXaHR0cHM6Ly8zMzA2LWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IoB8YASJXaHR0cHM6Ly80MDAwLWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IjC4YASJXaHR0cHM6Ly81OTAwLWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tClwIwC8iV2h0dHBzOi8vNjA4MC1ncmVlbi13b21iYXQtNjJkem5ldWQud3MtZGV2LmdwbC1oZWFkbGVzcy1sb2ctd3NtYW4uc3RhZ2luZy5naXRwb2QtZGV2LmNvbQpeCI1IGAEiV2h0dHBzOi8vOTIyOS1ncmVlbi13b21iYXQtNjJkem5ldWQud3MtZGV2LmdwbC1oZWFkbGVzcy1sb2ctd3NtYW4uc3RhZ2luZy5naXRwb2QtZGV2LmNvbQpeCI9OGAEiV2h0dHBzOi8vOTk5OS1ncmVlbi13b21iYXQtNjJkem5ldWQud3MtZGV2LmdwbC1oZWFkbGVzcy1sb2ctd3NtYW4uc3RhZ2luZy5naXRwb2QtZGV2LmNvbQpfCMllGAEiWGh0dHBzOi8vMTMwMDEtZ3JlZW4td29tYmF0LTYyZHpuZXVkLndzLWRldi5ncGwtaGVhZGxlc3MtbG9nLXdzbWFuLnN0YWdpbmcuZ2l0cG9kLWRldi5jb20KXgjhPBgBIldodHRwczovLzc3NzctZ3JlZW4td29tYmF0LTYyZHpuZXVkLndzLWRldi5ncGwtaGVhZGxlc3MtbG9nLXdzbWFuLnN0YWdpbmcuZ2l0cG9kLWRldi5jb20KXwiEaRgBIlhodHRwczovLzEzNDQ0LWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29t","gitpod/never-ready":"true","gitpod/ownerToken":"FZ2k9zbSCo9e85Y21yh.SHLJbya7pW2Y","gitpod/servicePrefix":"green-wombat-62dzneud","gitpod/traceid":"AAAAAAAAAADk1qKpVgS8nkUB60sg2ZMPWUgTp0iuTisBAAAAAA==","gitpod/url":"https://green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","kubernetes.io/psp":"staging-gpl-headless-log-wsman-ns-workspace","prometheus.io/path":"/metrics","prometheus.io/port":"23000","prometheus.io/scrape":"true","seccomp.security.alpha.kubernetes.io/pod":"localhost/workspace_default_gpl-headless-log-wsman.17.json"}},"spec":{"volumes":[{"name":"vol-this-workspace","hostPath":{"path":"/mnt/disks/ssd0/workspaces/8e0bbcdf-a926-4670-8c40-b718f035b2ae","type":"DirectoryOrCreate"}},{"name":"daemon-mount","hostPath":{"path":"/mnt/disks/ssd0/workspaces/8e0bbcdf-a926-4670-8c40-b718f035b2ae-daemon","type":"DirectoryOrCreate"}}],"containers":[{"name":"workspace","image":"reg.gpl-headless-log-wsman.staging.gitpod-dev.com:30222/remote/8e0bbcdf-a926-4670-8c40-b718f035b2ae","command":["/.supervisor/workspacekit","ring0"],"ports":[{"containerPort":23000,"protocol":"TCP"}],"env":[{"name":"GITPOD_REPO_ROOT","value":"/workspace/gitpod"},{"name":"GITPOD_CLI_APITOKEN","value":"eGnGrk5s7-.KCc15tXUtyKlzwlbjOBIs"},{"name":"GITPOD_WORKSPACE_ID","value":"green-wombat-62dzneud"},{"name":"GITPOD_INSTANCE_ID","value":"8e0bbcdf-a926-4670-8c40-b718f035b2ae"},{"name":"GITPOD_THEIA_PORT","value":"23000"},{"name":"THEIA_WORKSPACE_ROOT","value":"/workspace/gitpod/gitpod-ws.code-workspace"},{"name":"GITPOD_HOST","value":"https://gpl-headless-log-wsman.staging.gitpod-dev.com"},{"name":"GITPOD_WORKSPACE_URL","value":"https://green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com"},{"name":"THEIA_SUPERVISOR_TOKEN","value":"354c0b368f2b4a93b7b812564e663d23"},{"name":"THEIA_SUPERVISOR_ENDPOINT","value":":22999"},{"name":"THEIA_WEBVIEW_EXTERNAL_ENDPOINT","value":"webview-{{hostname}}"},{"name":"THEIA_MINI_BROWSER_HOST_PATTERN","value":"browser-{{hostname}}"},{"name":"GITPOD_GIT_USER_NAME","value":"Gero Posmyk-Leinemann"},{"name":"GITPOD_GIT_USER_EMAIL","value":"gero@gitpod.io"},{"name":"PREBUILD_PARAMS","value":"[redacted]"},{"name":"GITPOD_WORKSPACE_CONTEXT_URL","value":"prebuild/https://github.com/gitpod-io/gitpod/tree/gpl/test-prebuild"},{"name":"GITPOD_WORKSPACE_CONTEXT","value":"{\"ref\":\"gpl/test-prebuild\",\"refType\":\"branch\",\"isFile\":false,\"path\":\"\",\"title\":\"gitpod-io/gitpod - gpl/test-prebuild\",\"revision\":\"a1afe2bb7d454ea7a4194f363601a31ae319ce9c\",\"repository\":{\"cloneUrl\":\"https://github.com/gitpod-io/gitpod.git\",\"host\":\"github.com\",\"name\":\"gitpod\",\"owner\":\"gitpod-io\",\"private\":false}}"},{"name":"GITPOD_TASKS","value":"[{\"name\":\"Test Command\",\"init\":\"export PREBUILD_PARAMS=${PREBUILD_PARAMS:-\\\"100_500ms_30m\\\"}; go run ./main.go $PREBUILD_PARAMS\"}]"},{"name":"THEIA_SUPERVISOR_TOKENS","value":"[{\"tokenOTS\":\"https://gpl-headless-log-wsman.staging.gitpod-dev.com/api/ots/get/71ca5ce2-b15e-4a0e-8a0f-65964c509d40\",\"token\":\"ots\",\"kind\":\"gitpod\",\"host\":\"gpl-headless-log-wsman.staging.gitpod-dev.com\",\"scope\":[\"function:getWorkspace\",\"function:getLoggedInUser\",\"function:getPortAuthenticationToken\",\"function:getWorkspaceOwner\",\"function:getWorkspaceUsers\",\"function:isWorkspaceOwner\",\"function:controlAdmission\",\"function:setWorkspaceTimeout\",\"function:getWorkspaceTimeout\",\"function:sendHeartBeat\",\"function:getOpenPorts\",\"function:openPort\",\"function:closePort\",\"function:getLayout\",\"function:generateNewGitpodToken\",\"function:takeSnapshot\",\"function:storeLayout\",\"function:stopWorkspace\",\"function:getToken\",\"function:getContentBlobUploadUrl\",\"function:getContentBlobDownloadUrl\",\"function:accessCodeSyncStorage\",\"function:guessGitTokenScopes\",\"function:getEnvVars\",\"function:setEnvVar\",\"function:deleteEnvVar\",\"resource:workspace::green-wombat-62dzneud::get/update\",\"resource:workspaceInstance::8e0bbcdf-a926-4670-8c40-b718f035b2ae::get/update/delete\",\"resource:snapshot::ws-green-wombat-62dzneud::create\",\"resource:gitpodToken::*::create\",\"resource:userStorage::*::create/get/update\",\"resource:token::*::get\",\"resource:contentBlob::*::create/get\",\"resource:envVar::gitpod-io/gitpod::create/get/update/delete\"],\"expiryDate\":\"2021-05-29T12:48:19.234Z\",\"reuse\":2}]"},{"name":"GITPOD_RESOLVED_EXTENSIONS","value":"{\"vscode.bat@1.44.2\":{\"fullPluginName\":\"vscode.bat@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.clojure@1.44.2\":{\"fullPluginName\":\"vscode.clojure@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.coffeescript@1.44.2\":{\"fullPluginName\":\"vscode.coffeescript@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.cpp@1.44.2\":{\"fullPluginName\":\"vscode.cpp@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.csharp@1.44.2\":{\"fullPluginName\":\"vscode.csharp@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"llvm-vs-code-extensions.vscode-clangd@0.1.5\":{\"fullPluginName\":\"llvm-vs-code-extensions.vscode-clangd@0.1.5\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.css@1.51.1\":{\"fullPluginName\":\"vscode.css@1.51.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.css-language-features@1.51.1\":{\"fullPluginName\":\"vscode.css-language-features@1.51.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.debug-auto-launch@1.44.2\":{\"fullPluginName\":\"vscode.debug-auto-launch@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.emmet@1.44.2\":{\"fullPluginName\":\"vscode.emmet@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.fsharp@1.44.2\":{\"fullPluginName\":\"vscode.fsharp@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.go@1.44.2\":{\"fullPluginName\":\"vscode.go@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.groovy@1.44.2\":{\"fullPluginName\":\"vscode.groovy@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.handlebars@1.44.2\":{\"fullPluginName\":\"vscode.handlebars@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.hlsl@1.44.2\":{\"fullPluginName\":\"vscode.hlsl@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.html@1.51.1\":{\"fullPluginName\":\"vscode.html@1.51.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.html-language-features@1.51.1\":{\"fullPluginName\":\"vscode.html-language-features@1.51.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.ini@1.44.2\":{\"fullPluginName\":\"vscode.ini@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.java@1.53.2\":{\"fullPluginName\":\"vscode.java@1.53.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.javascript@1.44.2\":{\"fullPluginName\":\"vscode.javascript@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.json@1.44.2\":{\"fullPluginName\":\"vscode.json@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.json-language-features@1.46.1\":{\"fullPluginName\":\"vscode.json-language-features@1.46.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.less@1.44.2\":{\"fullPluginName\":\"vscode.less@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.log@1.44.2\":{\"fullPluginName\":\"vscode.log@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.lua@1.44.2\":{\"fullPluginName\":\"vscode.lua@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.make@1.44.2\":{\"fullPluginName\":\"vscode.make@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.markdown@1.44.2\":{\"fullPluginName\":\"vscode.markdown@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.npm@1.39.1\":{\"fullPluginName\":\"vscode.npm@1.39.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.objective-c@1.44.2\":{\"fullPluginName\":\"vscode.objective-c@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.perl@1.44.2\":{\"fullPluginName\":\"vscode.perl@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.php@1.44.2\":{\"fullPluginName\":\"vscode.php@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.powershell@1.44.2\":{\"fullPluginName\":\"vscode.powershell@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.pug@1.44.2\":{\"fullPluginName\":\"vscode.pug@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.python@1.47.3\":{\"fullPluginName\":\"vscode.python@1.47.3\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.r@1.44.2\":{\"fullPluginName\":\"vscode.r@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.razor@1.44.2\":{\"fullPluginName\":\"vscode.razor@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.ruby@1.44.2\":{\"fullPluginName\":\"vscode.ruby@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.rust@1.44.2\":{\"fullPluginName\":\"vscode.rust@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.scss@1.44.2\":{\"fullPluginName\":\"vscode.scss@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.shaderlab@1.44.2\":{\"fullPluginName\":\"vscode.shaderlab@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.shellscript@1.44.2\":{\"fullPluginName\":\"vscode.shellscript@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.sql@1.44.2\":{\"fullPluginName\":\"vscode.sql@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.swift@1.44.2\":{\"fullPluginName\":\"vscode.swift@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.typescript@1.44.2\":{\"fullPluginName\":\"vscode.typescript@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.typescript-language-features@1.44.2\":{\"fullPluginName\":\"vscode.typescript-language-features@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.vb@1.44.2\":{\"fullPluginName\":\"vscode.vb@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.xml@1.44.2\":{\"fullPluginName\":\"vscode.xml@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.yaml@1.44.2\":{\"fullPluginName\":\"vscode.yaml@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"redhat.java@0.75.0\":{\"fullPluginName\":\"redhat.java@0.75.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscjava.vscode-java-debug@0.27.1\":{\"fullPluginName\":\"vscjava.vscode-java-debug@0.27.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscjava.vscode-java-dependency@0.18.0\":{\"fullPluginName\":\"vscjava.vscode-java-dependency@0.18.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-vscode.node-debug@1.38.4\":{\"fullPluginName\":\"ms-vscode.node-debug@1.38.4\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-vscode.node-debug2@1.33.0\":{\"fullPluginName\":\"ms-vscode.node-debug2@1.33.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-python.python@2020.7.96456\":{\"fullPluginName\":\"ms-python.python@2020.7.96456\",\"url\":\"local\",\"kind\":\"builtin\"},\"redhat.vscode-xml@0.11.0\":{\"fullPluginName\":\"redhat.vscode-xml@0.11.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"redhat.vscode-yaml@0.8.0\":{\"fullPluginName\":\"redhat.vscode-yaml@0.8.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"bmewburn.vscode-intelephense-client@1.4.0\":{\"fullPluginName\":\"bmewburn.vscode-intelephense-client@1.4.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"felixfbecker.php-debug@1.13.0\":{\"fullPluginName\":\"felixfbecker.php-debug@1.13.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"rust-lang.rust@0.7.8\":{\"fullPluginName\":\"rust-lang.rust@0.7.8\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-abyss@1.44.2\":{\"fullPluginName\":\"vscode.theme-abyss@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-kimbie-dark@1.44.2\":{\"fullPluginName\":\"vscode.theme-kimbie-dark@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-monokai@1.44.2\":{\"fullPluginName\":\"vscode.theme-monokai@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-monokai-dimmed@1.44.2\":{\"fullPluginName\":\"vscode.theme-monokai-dimmed@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-quietlight@1.44.2\":{\"fullPluginName\":\"vscode.theme-quietlight@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-red@1.44.2\":{\"fullPluginName\":\"vscode.theme-red@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-solarized-dark@1.44.2\":{\"fullPluginName\":\"vscode.theme-solarized-dark@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-solarized-light@1.44.2\":{\"fullPluginName\":\"vscode.theme-solarized-light@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-tomorrow-night-blue@1.44.2\":{\"fullPluginName\":\"vscode.theme-tomorrow-night-blue@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.vscode-theme-seti@1.44.2\":{\"fullPluginName\":\"vscode.vscode-theme-seti@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.merge-conflict@1.44.2\":{\"fullPluginName\":\"vscode.merge-conflict@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-vscode.references-view@0.0.47\":{\"fullPluginName\":\"ms-vscode.references-view@0.0.47\",\"url\":\"local\",\"kind\":\"builtin\"},\"EditorConfig.EditorConfig@0.15.1\":{\"fullPluginName\":\"editorconfig.editorconfig@0.15.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.docker@1.47.3\":{\"fullPluginName\":\"vscode.docker@1.47.3\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-kubernetes-tools.vscode-kubernetes-tools\":{\"fullPluginName\":\"ms-kubernetes-tools.vscode-kubernetes-tools@1.3.3\",\"url\":\"https://open-vsx.org/api/ms-kubernetes-tools/vscode-kubernetes-tools/1.3.3/file/ms-kubernetes-tools.vscode-kubernetes-tools-1.3.3.vsix\",\"kind\":\"workspace\"},\"hashicorp.terraform\":{\"fullPluginName\":\"hashicorp.terraform@2.11.0\",\"url\":\"https://open-vsx.org/api/hashicorp/terraform/2.11.0/file/hashicorp.terraform-2.11.0.vsix\",\"kind\":\"workspace\"},\"zxh404.vscode-proto3\":{\"fullPluginName\":\"zxh404.vscode-proto3@0.5.4\",\"url\":\"https://open-vsx.org/api/zxh404/vscode-proto3/0.5.4/file/zxh404.vscode-proto3-0.5.4.vsix\",\"kind\":\"workspace\"},\"bajdzis.vscode-database\":{\"fullPluginName\":\"bajdzis.vscode-database@2.2.3\",\"url\":\"https://open-vsx.org/api/bajdzis/vscode-database/2.2.3/file/bajdzis.vscode-database-2.2.3.vsix\",\"kind\":\"workspace\"},\"stkb.rewrap\":{\"fullPluginName\":\"stkb.rewrap@1.14.0\",\"url\":\"https://open-vsx.org/api/stkb/rewrap/1.14.0/file/stkb.rewrap-1.14.0.vsix\",\"kind\":\"workspace\"},\"golang.go\":{\"fullPluginName\":\"golang.go@0.25.0\",\"url\":\"https://open-vsx.org/api/golang/Go/0.25.0/file/golang.Go-0.25.0.vsix\",\"kind\":\"workspace\"}}"},{"name":"GITPOD_EXTERNAL_EXTENSIONS","value":"[]"},{"name":"GITPOD_INTERVAL","value":"30000"},{"name":"GITPOD_MEMORY","value":"2415"},{"name":"GITPOD_HEADLESS","value":"true"}],"resources":{"limits":{"cpu":"5","memory":"12Gi"},"requests":{"cpu":"1m","ephemeral-storage":"5Gi","memory":"4608Mi"}},"volumeMounts":[{"name":"vol-this-workspace","mountPath":"/workspace","mountPropagation":"HostToContainer"},{"name":"daemon-mount","mountPath":"/.workspace","mountPropagation":"HostToContainer"}],"readinessProbe":{"httpGet":{"path":"/_supervisor/v1/status/content/wait/true","port":22999,"scheme":"HTTP"},"timeoutSeconds":1,"periodSeconds":1,"successThreshold":1,"failureThreshold":600},"terminationMessagePath":"/dev/termination-log","terminationMessagePolicy":"FallbackToLogsOnError","imagePullPolicy":"Always","securityContext":{"capabilities":{"add":["AUDIT_WRITE","FSETID","KILL","NET_BIND_SERVICE","SYS_PTRACE"],"drop":["SETPCAP","CHOWN","NET_RAW","DAC_OVERRIDE","FOWNER","SYS_CHROOT","SETFCAP","SETUID","SETGID"]},"privileged":false,"runAsUser":33333,"runAsGroup":33333,"runAsNonRoot":true,"readOnlyRootFilesystem":false,"allowPrivilegeEscalation":true}}],"restartPolicy":"Never","terminationGracePeriodSeconds":30,"dnsPolicy":"None","serviceAccountName":"workspace","serviceAccount":"workspace","automountServiceAccountToken":false,"nodeName":"gke-dev-workload-1-49d27f81-pd35","securityContext":{"supplementalGroups":[1],"fsGroup":1},"imagePullSecrets":[{"name":"gcp-sa-registry-auth"}],"affinity":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"gitpod.io/workload_workspace","operator":"Exists"}]}]}}},"schedulerName":"workspace-scheduler","tolerations":[{"key":"node.kubernetes.io/disk-pressure","operator":"Exists","effect":"NoExecute"},{"key":"node.kubernetes.io/memory-pressure","operator":"Exists","effect":"NoExecute"},{"key":"node.kubernetes.io/network-unavailable","operator":"Exists","effect":"NoExecute","tolerationSeconds":30},{"key":"node.kubernetes.io/not-ready","operator":"Exists","effect":"NoExecute","tolerationSeconds":300},{"key":"node.kubernetes.io/unreachable","operator":"Exists","effect":"NoExecute","tolerationSeconds":300}],"priority":0,"dnsConfig":{"nameservers":["1.1.1.1","8.8.8.8"]},"enableServiceLinks":false},"status":{"phase":"Pending","conditions":[{"type":"Initialized","status":"True","lastProbeTime":null,"lastTransitionTime":"2021-05-28T12:48:19Z"},{"type":"Ready","status":"False","lastProbeTime":null,"lastTransitionTime":"2021-05-28T12:48:19Z","reason":"ContainersNotReady","message":"containers with unready status: [workspace]"},{"type":"ContainersReady","status":"False","lastProbeTime":null,"lastTransitionTime":"2021-05-28T12:48:19Z","reason":"ContainersNotReady","message":"containers with unready status: [workspace]"},{"type":"PodScheduled","status":"True","lastProbeTime":null,"lastTransitionTime":"2021-05-28T12:48:19Z"}],"hostIP":"10.132.15.221","startTime":"2021-05-28T12:48:19Z","containerStatuses":[{"name":"workspace","state":{"waiting":{"reason":"ContainerCreating"}},"lastState":{},"ready":false,"restartCount":0,"image":"reg.gpl-headless-log-wsman.staging.gitpod-dev.com:30222/remote/8e0bbcdf-a926-4670-8c40-b718f035b2ae","imageID":"","started":false}],"qosClass":"Burstable"}},"theiaService":{"kind":"Service","apiVersion":"v1","metadata":{"name":"ws-green-wombat-62dzneud-theia","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/services/ws-green-wombat-62dzneud-theia","uid":"67227f06-91de-44d4-83fe-0911cc6e3601","resourceVersion":"198743318","creationTimestamp":"2021-05-28T12:48:19Z","labels":{"app":"gitpod","component":"workspace","gpwsman":"true","headless":"true","metaID":"green-wombat-62dzneud","owner":"d98c5b92-2066-4fce-bea6-1e08b58642ab","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae","workspaceType":"prebuild"}},"spec":{"ports":[{"name":"ide","protocol":"TCP","port":23000,"targetPort":23000},{"name":"supervisor","protocol":"TCP","port":22999,"targetPort":22999}],"selector":{"app":"gitpod","component":"workspace","gpwsman":"true","headless":"true","metaID":"green-wombat-62dzneud","owner":"d98c5b92-2066-4fce-bea6-1e08b58642ab","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae","workspaceType":"prebuild"},"clusterIP":"10.63.250.40","type":"ClusterIP","sessionAffinity":"None"},"status":{"loadBalancer":{}}},"portsService":{"kind":"Service","apiVersion":"v1","metadata":{"name":"ws-green-wombat-62dzneud-ports","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/services/ws-green-wombat-62dzneud-ports","uid":"1ebcfc6e-15c3-415e-9de5-6c7adc47d1a7","resourceVersion":"198743322","creationTimestamp":"2021-05-28T12:48:19Z","labels":{"gpwsman":"true","metaID":"green-wombat-62dzneud","serviceType":"ports","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae"},"annotations":{"gitpod/port-url-13001":"https://13001-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-1337":"https://1337-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-13444":"https://13444-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-3000":"https://3000-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-3001":"https://3001-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-3306":"https://3306-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-4000":"https://4000-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-5900":"https://5900-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-6080":"https://6080-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-7777":"https://7777-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-9229":"https://9229-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-9999":"https://9999-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com"}},"spec":{"ports":[{"name":"p1337-public","protocol":"TCP","port":1337,"targetPort":1337},{"name":"p3000-public","protocol":"TCP","port":3000,"targetPort":3000},{"name":"p3001-public","protocol":"TCP","port":3001,"targetPort":3001},{"name":"p3306-public","protocol":"TCP","port":3306,"targetPort":3306},{"name":"p4000-public","protocol":"TCP","port":4000,"targetPort":4000},{"name":"p5900-public","protocol":"TCP","port":5900,"targetPort":5900},{"name":"p6080-private","protocol":"TCP","port":6080,"targetPort":6080},{"name":"p9229-public","protocol":"TCP","port":9229,"targetPort":9229},{"name":"p9999-public","protocol":"TCP","port":9999,"targetPort":9999},{"name":"p13001-public","protocol":"TCP","port":13001,"targetPort":13001},{"name":"p7777-public","protocol":"TCP","port":7777,"targetPort":7777},{"name":"p13444-public","protocol":"TCP","port":13444,"targetPort":13444}],"selector":{"gpwsman":"true","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae"},"clusterIP":"10.63.243.155","type":"ClusterIP","sessionAffinity":"None"},"status":{"loadBalancer":{}}},"events":[{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae - scheduled2zrpp","generateName":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae - scheduled","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae%20-%20scheduled2zrpp","uid":"e983c42a-b04a-48b6-b214-4fe60281b6ae","resourceVersion":"12819729","creationTimestamp":"2021-05-28T12:48:19Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e"},"reason":"Scheduled","message":"Placed pod [staging-gpl-headless-log-wsman/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae] on gke-dev-workload-1-49d27f81-pd35\n","source":{"component":"workspace-scheduler"},"firstTimestamp":"2021-05-28T12:48:19Z","lastTimestamp":"2021-05-28T12:48:19Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""}]} \ No newline at end of file +{"pod":{"kind":"Pod","apiVersion":"v1","metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/pods/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","resourceVersion":"198743334","creationTimestamp":"2021-05-28T12:48:19Z","labels":{"app":"gitpod","component":"workspace","gitpod.io/networkpolicy":"default","gpwsman":"true","headless":"true","metaID":"green-wombat-62dzneud","owner":"d98c5b92-2066-4fce-bea6-1e08b58642ab","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae","workspaceType":"prebuild"},"annotations":{"cni.projectcalico.org/podIP":"10.60.61.170/32","container.apparmor.security.beta.kubernetes.io/workspace":"unconfined","gitpod.io/requiredNodeServices":"ws-daemon,registry-facade","gitpod/admission":"admit_owner_only","gitpod/contentInitializer":"[redacted]","gitpod/id":"8e0bbcdf-a926-4670-8c40-b718f035b2ae","gitpod/imageSpec":"CnRldS5nY3IuaW8vZ2l0cG9kLWNvcmUtZGV2L3JlZ2lzdHJ5L3dvcmtzcGFjZS1pbWFnZXM6ODFjNGZiNjAyYTU0MGQyNjFmMjEwY2ZjOGJhMDQzNWI2M2IyNDIzOGMxNzYyZWMwMjlkOGVkYWVjODE2YWZiNhJCZXUuZ2NyLmlvL2dpdHBvZC1jb3JlLWRldi9idWlsZC9pZGUvY29kZTpncGwtaGVhZGxlc3MtbG9nLXdzbWFuLjE3","gitpod/exposedPorts": "Cl4IuQoYASJXaHR0cHM6Ly8xMzM3LWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IuBcYASJXaHR0cHM6Ly8zMDAwLWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IuRcYASJXaHR0cHM6Ly8zMDAxLWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4I6hkYASJXaHR0cHM6Ly8zMzA2LWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IoB8YASJXaHR0cHM6Ly80MDAwLWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IjC4YASJXaHR0cHM6Ly81OTAwLWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tClwIwC8iV2h0dHBzOi8vNjA4MC1ncmVlbi13b21iYXQtNjJkem5ldWQud3MtZGV2LmdwbC1oZWFkbGVzcy1sb2ctd3NtYW4uc3RhZ2luZy5naXRwb2QtZGV2LmNvbQpeCI1IGAEiV2h0dHBzOi8vOTIyOS1ncmVlbi13b21iYXQtNjJkem5ldWQud3MtZGV2LmdwbC1oZWFkbGVzcy1sb2ctd3NtYW4uc3RhZ2luZy5naXRwb2QtZGV2LmNvbQpeCI9OGAEiV2h0dHBzOi8vOTk5OS1ncmVlbi13b21iYXQtNjJkem5ldWQud3MtZGV2LmdwbC1oZWFkbGVzcy1sb2ctd3NtYW4uc3RhZ2luZy5naXRwb2QtZGV2LmNvbQpfCMllGAEiWGh0dHBzOi8vMTMwMDEtZ3JlZW4td29tYmF0LTYyZHpuZXVkLndzLWRldi5ncGwtaGVhZGxlc3MtbG9nLXdzbWFuLnN0YWdpbmcuZ2l0cG9kLWRldi5jb20KXgjhPBgBIldodHRwczovLzc3NzctZ3JlZW4td29tYmF0LTYyZHpuZXVkLndzLWRldi5ncGwtaGVhZGxlc3MtbG9nLXdzbWFuLnN0YWdpbmcuZ2l0cG9kLWRldi5jb20KXwiEaRgBIlhodHRwczovLzEzNDQ0LWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29t","gitpod/never-ready":"true","gitpod/ownerToken":"FZ2k9zbSCo9e85Y21yh.SHLJbya7pW2Y","gitpod/servicePrefix":"green-wombat-62dzneud","gitpod/traceid":"AAAAAAAAAADk1qKpVgS8nkUB60sg2ZMPWUgTp0iuTisBAAAAAA==","gitpod/url":"https://green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","kubernetes.io/psp":"staging-gpl-headless-log-wsman-ns-workspace","prometheus.io/path":"/metrics","prometheus.io/port":"23000","prometheus.io/scrape":"true","seccomp.security.alpha.kubernetes.io/pod":"localhost/workspace_default_gpl-headless-log-wsman.17.json"}},"spec":{"volumes":[{"name":"vol-this-workspace","hostPath":{"path":"/mnt/disks/ssd0/workspaces/8e0bbcdf-a926-4670-8c40-b718f035b2ae","type":"DirectoryOrCreate"}},{"name":"daemon-mount","hostPath":{"path":"/mnt/disks/ssd0/workspaces/8e0bbcdf-a926-4670-8c40-b718f035b2ae-daemon","type":"DirectoryOrCreate"}}],"containers":[{"name":"workspace","image":"reg.gpl-headless-log-wsman.staging.gitpod-dev.com:30222/remote/8e0bbcdf-a926-4670-8c40-b718f035b2ae","command":["/.supervisor/workspacekit","ring0"],"ports":[{"containerPort":23000,"protocol":"TCP"}],"env":[{"name":"GITPOD_REPO_ROOT","value":"/workspace/gitpod"},{"name":"GITPOD_CLI_APITOKEN","value":"eGnGrk5s7-.KCc15tXUtyKlzwlbjOBIs"},{"name":"GITPOD_WORKSPACE_ID","value":"green-wombat-62dzneud"},{"name":"GITPOD_INSTANCE_ID","value":"8e0bbcdf-a926-4670-8c40-b718f035b2ae"},{"name":"GITPOD_THEIA_PORT","value":"23000"},{"name":"THEIA_WORKSPACE_ROOT","value":"/workspace/gitpod/gitpod-ws.code-workspace"},{"name":"GITPOD_HOST","value":"https://gpl-headless-log-wsman.staging.gitpod-dev.com"},{"name":"GITPOD_WORKSPACE_URL","value":"https://green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com"},{"name":"THEIA_SUPERVISOR_TOKEN","value":"354c0b368f2b4a93b7b812564e663d23"},{"name":"THEIA_SUPERVISOR_ENDPOINT","value":":22999"},{"name":"THEIA_WEBVIEW_EXTERNAL_ENDPOINT","value":"webview-{{hostname}}"},{"name":"THEIA_MINI_BROWSER_HOST_PATTERN","value":"browser-{{hostname}}"},{"name":"GITPOD_GIT_USER_NAME","value":"Gero Posmyk-Leinemann"},{"name":"GITPOD_GIT_USER_EMAIL","value":"gero@gitpod.io"},{"name":"PREBUILD_PARAMS","value":"[redacted]"},{"name":"GITPOD_WORKSPACE_CONTEXT_URL","value":"prebuild/https://github.com/gitpod-io/gitpod/tree/gpl/test-prebuild"},{"name":"GITPOD_WORKSPACE_CONTEXT","value":"{\"ref\":\"gpl/test-prebuild\",\"refType\":\"branch\",\"isFile\":false,\"path\":\"\",\"title\":\"gitpod-io/gitpod - gpl/test-prebuild\",\"revision\":\"a1afe2bb7d454ea7a4194f363601a31ae319ce9c\",\"repository\":{\"cloneUrl\":\"https://github.com/gitpod-io/gitpod.git\",\"host\":\"github.com\",\"name\":\"gitpod\",\"owner\":\"gitpod-io\",\"private\":false}}"},{"name":"GITPOD_TASKS","value":"[{\"name\":\"Test Command\",\"init\":\"export PREBUILD_PARAMS=${PREBUILD_PARAMS:-\\\"100_500ms_30m\\\"}; go run ./main.go $PREBUILD_PARAMS\"}]"},{"name":"THEIA_SUPERVISOR_TOKENS","value":"[{\"tokenOTS\":\"https://gpl-headless-log-wsman.staging.gitpod-dev.com/api/ots/get/71ca5ce2-b15e-4a0e-8a0f-65964c509d40\",\"token\":\"ots\",\"kind\":\"gitpod\",\"host\":\"gpl-headless-log-wsman.staging.gitpod-dev.com\",\"scope\":[\"function:getWorkspace\",\"function:getLoggedInUser\",\"function:getPortAuthenticationToken\",\"function:getWorkspaceOwner\",\"function:getWorkspaceUsers\",\"function:isWorkspaceOwner\",\"function:controlAdmission\",\"function:setWorkspaceTimeout\",\"function:getWorkspaceTimeout\",\"function:sendHeartBeat\",\"function:getOpenPorts\",\"function:openPort\",\"function:closePort\",\"function:getLayout\",\"function:generateNewGitpodToken\",\"function:takeSnapshot\",\"function:storeLayout\",\"function:stopWorkspace\",\"function:getToken\",\"function:getContentBlobUploadUrl\",\"function:getContentBlobDownloadUrl\",\"function:accessCodeSyncStorage\",\"function:guessGitTokenScopes\",\"function:getEnvVars\",\"function:setEnvVar\",\"function:deleteEnvVar\",\"resource:workspace::green-wombat-62dzneud::get/update\",\"resource:workspaceInstance::8e0bbcdf-a926-4670-8c40-b718f035b2ae::get/update/delete\",\"resource:snapshot::ws-green-wombat-62dzneud::create\",\"resource:gitpodToken::*::create\",\"resource:userStorage::*::create/get/update\",\"resource:token::*::get\",\"resource:contentBlob::*::create/get\",\"resource:envVar::gitpod-io/gitpod::create/get/update/delete\"],\"expiryDate\":\"2021-05-29T12:48:19.234Z\",\"reuse\":2}]"},{"name":"GITPOD_RESOLVED_EXTENSIONS","value":"{\"vscode.bat@1.44.2\":{\"fullPluginName\":\"vscode.bat@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.clojure@1.44.2\":{\"fullPluginName\":\"vscode.clojure@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.coffeescript@1.44.2\":{\"fullPluginName\":\"vscode.coffeescript@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.cpp@1.44.2\":{\"fullPluginName\":\"vscode.cpp@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.csharp@1.44.2\":{\"fullPluginName\":\"vscode.csharp@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"llvm-vs-code-extensions.vscode-clangd@0.1.5\":{\"fullPluginName\":\"llvm-vs-code-extensions.vscode-clangd@0.1.5\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.css@1.51.1\":{\"fullPluginName\":\"vscode.css@1.51.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.css-language-features@1.51.1\":{\"fullPluginName\":\"vscode.css-language-features@1.51.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.debug-auto-launch@1.44.2\":{\"fullPluginName\":\"vscode.debug-auto-launch@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.emmet@1.44.2\":{\"fullPluginName\":\"vscode.emmet@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.fsharp@1.44.2\":{\"fullPluginName\":\"vscode.fsharp@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.go@1.44.2\":{\"fullPluginName\":\"vscode.go@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.groovy@1.44.2\":{\"fullPluginName\":\"vscode.groovy@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.handlebars@1.44.2\":{\"fullPluginName\":\"vscode.handlebars@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.hlsl@1.44.2\":{\"fullPluginName\":\"vscode.hlsl@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.html@1.51.1\":{\"fullPluginName\":\"vscode.html@1.51.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.html-language-features@1.51.1\":{\"fullPluginName\":\"vscode.html-language-features@1.51.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.ini@1.44.2\":{\"fullPluginName\":\"vscode.ini@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.java@1.53.2\":{\"fullPluginName\":\"vscode.java@1.53.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.javascript@1.44.2\":{\"fullPluginName\":\"vscode.javascript@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.json@1.44.2\":{\"fullPluginName\":\"vscode.json@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.json-language-features@1.46.1\":{\"fullPluginName\":\"vscode.json-language-features@1.46.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.less@1.44.2\":{\"fullPluginName\":\"vscode.less@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.log@1.44.2\":{\"fullPluginName\":\"vscode.log@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.lua@1.44.2\":{\"fullPluginName\":\"vscode.lua@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.make@1.44.2\":{\"fullPluginName\":\"vscode.make@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.markdown@1.44.2\":{\"fullPluginName\":\"vscode.markdown@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.npm@1.39.1\":{\"fullPluginName\":\"vscode.npm@1.39.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.objective-c@1.44.2\":{\"fullPluginName\":\"vscode.objective-c@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.perl@1.44.2\":{\"fullPluginName\":\"vscode.perl@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.php@1.44.2\":{\"fullPluginName\":\"vscode.php@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.powershell@1.44.2\":{\"fullPluginName\":\"vscode.powershell@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.pug@1.44.2\":{\"fullPluginName\":\"vscode.pug@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.python@1.47.3\":{\"fullPluginName\":\"vscode.python@1.47.3\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.r@1.44.2\":{\"fullPluginName\":\"vscode.r@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.razor@1.44.2\":{\"fullPluginName\":\"vscode.razor@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.ruby@1.44.2\":{\"fullPluginName\":\"vscode.ruby@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.rust@1.44.2\":{\"fullPluginName\":\"vscode.rust@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.scss@1.44.2\":{\"fullPluginName\":\"vscode.scss@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.shaderlab@1.44.2\":{\"fullPluginName\":\"vscode.shaderlab@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.shellscript@1.44.2\":{\"fullPluginName\":\"vscode.shellscript@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.sql@1.44.2\":{\"fullPluginName\":\"vscode.sql@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.swift@1.44.2\":{\"fullPluginName\":\"vscode.swift@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.typescript@1.44.2\":{\"fullPluginName\":\"vscode.typescript@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.typescript-language-features@1.44.2\":{\"fullPluginName\":\"vscode.typescript-language-features@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.vb@1.44.2\":{\"fullPluginName\":\"vscode.vb@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.xml@1.44.2\":{\"fullPluginName\":\"vscode.xml@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.yaml@1.44.2\":{\"fullPluginName\":\"vscode.yaml@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"redhat.java@0.75.0\":{\"fullPluginName\":\"redhat.java@0.75.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscjava.vscode-java-debug@0.27.1\":{\"fullPluginName\":\"vscjava.vscode-java-debug@0.27.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscjava.vscode-java-dependency@0.18.0\":{\"fullPluginName\":\"vscjava.vscode-java-dependency@0.18.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-vscode.node-debug@1.38.4\":{\"fullPluginName\":\"ms-vscode.node-debug@1.38.4\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-vscode.node-debug2@1.33.0\":{\"fullPluginName\":\"ms-vscode.node-debug2@1.33.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-python.python@2020.7.96456\":{\"fullPluginName\":\"ms-python.python@2020.7.96456\",\"url\":\"local\",\"kind\":\"builtin\"},\"redhat.vscode-xml@0.11.0\":{\"fullPluginName\":\"redhat.vscode-xml@0.11.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"redhat.vscode-yaml@0.8.0\":{\"fullPluginName\":\"redhat.vscode-yaml@0.8.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"bmewburn.vscode-intelephense-client@1.4.0\":{\"fullPluginName\":\"bmewburn.vscode-intelephense-client@1.4.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"felixfbecker.php-debug@1.13.0\":{\"fullPluginName\":\"felixfbecker.php-debug@1.13.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"rust-lang.rust@0.7.8\":{\"fullPluginName\":\"rust-lang.rust@0.7.8\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-abyss@1.44.2\":{\"fullPluginName\":\"vscode.theme-abyss@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-kimbie-dark@1.44.2\":{\"fullPluginName\":\"vscode.theme-kimbie-dark@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-monokai@1.44.2\":{\"fullPluginName\":\"vscode.theme-monokai@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-monokai-dimmed@1.44.2\":{\"fullPluginName\":\"vscode.theme-monokai-dimmed@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-quietlight@1.44.2\":{\"fullPluginName\":\"vscode.theme-quietlight@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-red@1.44.2\":{\"fullPluginName\":\"vscode.theme-red@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-solarized-dark@1.44.2\":{\"fullPluginName\":\"vscode.theme-solarized-dark@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-solarized-light@1.44.2\":{\"fullPluginName\":\"vscode.theme-solarized-light@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-tomorrow-night-blue@1.44.2\":{\"fullPluginName\":\"vscode.theme-tomorrow-night-blue@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.vscode-theme-seti@1.44.2\":{\"fullPluginName\":\"vscode.vscode-theme-seti@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.merge-conflict@1.44.2\":{\"fullPluginName\":\"vscode.merge-conflict@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-vscode.references-view@0.0.47\":{\"fullPluginName\":\"ms-vscode.references-view@0.0.47\",\"url\":\"local\",\"kind\":\"builtin\"},\"EditorConfig.EditorConfig@0.15.1\":{\"fullPluginName\":\"editorconfig.editorconfig@0.15.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.docker@1.47.3\":{\"fullPluginName\":\"vscode.docker@1.47.3\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-kubernetes-tools.vscode-kubernetes-tools\":{\"fullPluginName\":\"ms-kubernetes-tools.vscode-kubernetes-tools@1.3.3\",\"url\":\"https://open-vsx.org/api/ms-kubernetes-tools/vscode-kubernetes-tools/1.3.3/file/ms-kubernetes-tools.vscode-kubernetes-tools-1.3.3.vsix\",\"kind\":\"workspace\"},\"hashicorp.terraform\":{\"fullPluginName\":\"hashicorp.terraform@2.11.0\",\"url\":\"https://open-vsx.org/api/hashicorp/terraform/2.11.0/file/hashicorp.terraform-2.11.0.vsix\",\"kind\":\"workspace\"},\"zxh404.vscode-proto3\":{\"fullPluginName\":\"zxh404.vscode-proto3@0.5.4\",\"url\":\"https://open-vsx.org/api/zxh404/vscode-proto3/0.5.4/file/zxh404.vscode-proto3-0.5.4.vsix\",\"kind\":\"workspace\"},\"bajdzis.vscode-database\":{\"fullPluginName\":\"bajdzis.vscode-database@2.2.3\",\"url\":\"https://open-vsx.org/api/bajdzis/vscode-database/2.2.3/file/bajdzis.vscode-database-2.2.3.vsix\",\"kind\":\"workspace\"},\"stkb.rewrap\":{\"fullPluginName\":\"stkb.rewrap@1.14.0\",\"url\":\"https://open-vsx.org/api/stkb/rewrap/1.14.0/file/stkb.rewrap-1.14.0.vsix\",\"kind\":\"workspace\"},\"golang.go\":{\"fullPluginName\":\"golang.go@0.25.0\",\"url\":\"https://open-vsx.org/api/golang/Go/0.25.0/file/golang.Go-0.25.0.vsix\",\"kind\":\"workspace\"}}"},{"name":"GITPOD_EXTERNAL_EXTENSIONS","value":"[]"},{"name":"GITPOD_INTERVAL","value":"30000"},{"name":"GITPOD_MEMORY","value":"2415"},{"name":"GITPOD_HEADLESS","value":"true"}],"resources":{"limits":{"cpu":"5","memory":"12Gi"},"requests":{"cpu":"1m","ephemeral-storage":"5Gi","memory":"4608Mi"}},"volumeMounts":[{"name":"vol-this-workspace","mountPath":"/workspace","mountPropagation":"HostToContainer"},{"name":"daemon-mount","mountPath":"/.workspace","mountPropagation":"HostToContainer"}],"readinessProbe":{"httpGet":{"path":"/_supervisor/v1/status/content/wait/true","port":22999,"scheme":"HTTP"},"timeoutSeconds":1,"periodSeconds":1,"successThreshold":1,"failureThreshold":600},"terminationMessagePath":"/dev/termination-log","terminationMessagePolicy":"FallbackToLogsOnError","imagePullPolicy":"Always","securityContext":{"capabilities":{"add":["AUDIT_WRITE","FSETID","KILL","NET_BIND_SERVICE","SYS_PTRACE"],"drop":["SETPCAP","CHOWN","NET_RAW","DAC_OVERRIDE","FOWNER","SYS_CHROOT","SETFCAP","SETUID","SETGID"]},"privileged":false,"runAsUser":33333,"runAsGroup":33333,"runAsNonRoot":true,"readOnlyRootFilesystem":false,"allowPrivilegeEscalation":true}}],"restartPolicy":"Never","terminationGracePeriodSeconds":30,"dnsPolicy":"None","serviceAccountName":"workspace","serviceAccount":"workspace","automountServiceAccountToken":false,"nodeName":"gke-dev-workload-1-49d27f81-pd35","securityContext":{"supplementalGroups":[1],"fsGroup":1},"imagePullSecrets":[{"name":"gcp-sa-registry-auth"}],"affinity":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"gitpod.io/workload_workspace","operator":"Exists"}]}]}}},"tolerations":[{"key":"node.kubernetes.io/disk-pressure","operator":"Exists","effect":"NoExecute"},{"key":"node.kubernetes.io/memory-pressure","operator":"Exists","effect":"NoExecute"},{"key":"node.kubernetes.io/network-unavailable","operator":"Exists","effect":"NoExecute","tolerationSeconds":30},{"key":"node.kubernetes.io/not-ready","operator":"Exists","effect":"NoExecute","tolerationSeconds":300},{"key":"node.kubernetes.io/unreachable","operator":"Exists","effect":"NoExecute","tolerationSeconds":300}],"priority":0,"dnsConfig":{"nameservers":["1.1.1.1","8.8.8.8"]},"enableServiceLinks":false},"status":{"phase":"Pending","conditions":[{"type":"Initialized","status":"True","lastProbeTime":null,"lastTransitionTime":"2021-05-28T12:48:19Z"},{"type":"Ready","status":"False","lastProbeTime":null,"lastTransitionTime":"2021-05-28T12:48:19Z","reason":"ContainersNotReady","message":"containers with unready status: [workspace]"},{"type":"ContainersReady","status":"False","lastProbeTime":null,"lastTransitionTime":"2021-05-28T12:48:19Z","reason":"ContainersNotReady","message":"containers with unready status: [workspace]"},{"type":"PodScheduled","status":"True","lastProbeTime":null,"lastTransitionTime":"2021-05-28T12:48:19Z"}],"hostIP":"10.132.15.221","startTime":"2021-05-28T12:48:19Z","containerStatuses":[{"name":"workspace","state":{"waiting":{"reason":"ContainerCreating"}},"lastState":{},"ready":false,"restartCount":0,"image":"reg.gpl-headless-log-wsman.staging.gitpod-dev.com:30222/remote/8e0bbcdf-a926-4670-8c40-b718f035b2ae","imageID":"","started":false}],"qosClass":"Burstable"}},"theiaService":{"kind":"Service","apiVersion":"v1","metadata":{"name":"ws-green-wombat-62dzneud-theia","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/services/ws-green-wombat-62dzneud-theia","uid":"67227f06-91de-44d4-83fe-0911cc6e3601","resourceVersion":"198743318","creationTimestamp":"2021-05-28T12:48:19Z","labels":{"app":"gitpod","component":"workspace","gpwsman":"true","headless":"true","metaID":"green-wombat-62dzneud","owner":"d98c5b92-2066-4fce-bea6-1e08b58642ab","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae","workspaceType":"prebuild"}},"spec":{"ports":[{"name":"ide","protocol":"TCP","port":23000,"targetPort":23000},{"name":"supervisor","protocol":"TCP","port":22999,"targetPort":22999}],"selector":{"app":"gitpod","component":"workspace","gpwsman":"true","headless":"true","metaID":"green-wombat-62dzneud","owner":"d98c5b92-2066-4fce-bea6-1e08b58642ab","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae","workspaceType":"prebuild"},"clusterIP":"10.63.250.40","type":"ClusterIP","sessionAffinity":"None"},"status":{"loadBalancer":{}}},"portsService":{"kind":"Service","apiVersion":"v1","metadata":{"name":"ws-green-wombat-62dzneud-ports","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/services/ws-green-wombat-62dzneud-ports","uid":"1ebcfc6e-15c3-415e-9de5-6c7adc47d1a7","resourceVersion":"198743322","creationTimestamp":"2021-05-28T12:48:19Z","labels":{"gpwsman":"true","metaID":"green-wombat-62dzneud","serviceType":"ports","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae"},"annotations":{"gitpod/port-url-13001":"https://13001-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-1337":"https://1337-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-13444":"https://13444-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-3000":"https://3000-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-3001":"https://3001-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-3306":"https://3306-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-4000":"https://4000-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-5900":"https://5900-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-6080":"https://6080-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-7777":"https://7777-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-9229":"https://9229-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-9999":"https://9999-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com"}},"spec":{"ports":[{"name":"p1337-public","protocol":"TCP","port":1337,"targetPort":1337},{"name":"p3000-public","protocol":"TCP","port":3000,"targetPort":3000},{"name":"p3001-public","protocol":"TCP","port":3001,"targetPort":3001},{"name":"p3306-public","protocol":"TCP","port":3306,"targetPort":3306},{"name":"p4000-public","protocol":"TCP","port":4000,"targetPort":4000},{"name":"p5900-public","protocol":"TCP","port":5900,"targetPort":5900},{"name":"p6080-private","protocol":"TCP","port":6080,"targetPort":6080},{"name":"p9229-public","protocol":"TCP","port":9229,"targetPort":9229},{"name":"p9999-public","protocol":"TCP","port":9999,"targetPort":9999},{"name":"p13001-public","protocol":"TCP","port":13001,"targetPort":13001},{"name":"p7777-public","protocol":"TCP","port":7777,"targetPort":7777},{"name":"p13444-public","protocol":"TCP","port":13444,"targetPort":13444}],"selector":{"gpwsman":"true","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae"},"clusterIP":"10.63.243.155","type":"ClusterIP","sessionAffinity":"None"},"status":{"loadBalancer":{}}},"events":[{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae - scheduled2zrpp","generateName":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae - scheduled","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae%20-%20scheduled2zrpp","uid":"e983c42a-b04a-48b6-b214-4fe60281b6ae","resourceVersion":"12819729","creationTimestamp":"2021-05-28T12:48:19Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e"},"reason":"Scheduled","message":"Placed pod [staging-gpl-headless-log-wsman/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae] on gke-dev-workload-1-49d27f81-pd35\n","source":{"component":"workspace-scheduler"},"firstTimestamp":"2021-05-28T12:48:19Z","lastTimestamp":"2021-05-28T12:48:19Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""}]} \ No newline at end of file diff --git a/components/ws-manager/pkg/manager/testdata/status_prebuildSuccess_STOPPED00.json b/components/ws-manager/pkg/manager/testdata/status_prebuildSuccess_STOPPED00.json index 63e124bc3945d7..44873cf8323e8f 100644 --- a/components/ws-manager/pkg/manager/testdata/status_prebuildSuccess_STOPPED00.json +++ b/components/ws-manager/pkg/manager/testdata/status_prebuildSuccess_STOPPED00.json @@ -1 +1 @@ -{"pod":{"kind":"Pod","apiVersion":"v1","metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/pods/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","resourceVersion":"198744218","creationTimestamp":"2021-05-28T12:48:19Z","deletionTimestamp":"2021-05-28T12:49:46Z","deletionGracePeriodSeconds":0,"labels":{"app":"gitpod","component":"workspace","gitpod.io/networkpolicy":"default","gpwsman":"true","headless":"true","metaID":"green-wombat-62dzneud","owner":"d98c5b92-2066-4fce-bea6-1e08b58642ab","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae","workspaceType":"prebuild"},"annotations":{"cni.projectcalico.org/podIP":"10.60.61.170/32","container.apparmor.security.beta.kubernetes.io/workspace":"unconfined","gitpod.io/disposalStatus":"{\"backupComplete\":true}","gitpod.io/requiredNodeServices":"ws-daemon,registry-facade","gitpod/admission":"admit_owner_only","gitpod/contentInitializer":"[redacted]","gitpod/id":"8e0bbcdf-a926-4670-8c40-b718f035b2ae","gitpod/imageSpec":"CnRldS5nY3IuaW8vZ2l0cG9kLWNvcmUtZGV2L3JlZ2lzdHJ5L3dvcmtzcGFjZS1pbWFnZXM6ODFjNGZiNjAyYTU0MGQyNjFmMjEwY2ZjOGJhMDQzNWI2M2IyNDIzOGMxNzYyZWMwMjlkOGVkYWVjODE2YWZiNhJCZXUuZ2NyLmlvL2dpdHBvZC1jb3JlLWRldi9idWlsZC9pZGUvY29kZTpncGwtaGVhZGxlc3MtbG9nLXdzbWFuLjE3","gitpod/exposedPorts": "Cl4IuQoYASJXaHR0cHM6Ly8xMzM3LWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IuBcYASJXaHR0cHM6Ly8zMDAwLWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IuRcYASJXaHR0cHM6Ly8zMDAxLWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4I6hkYASJXaHR0cHM6Ly8zMzA2LWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IoB8YASJXaHR0cHM6Ly80MDAwLWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IjC4YASJXaHR0cHM6Ly81OTAwLWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tClwIwC8iV2h0dHBzOi8vNjA4MC1ncmVlbi13b21iYXQtNjJkem5ldWQud3MtZGV2LmdwbC1oZWFkbGVzcy1sb2ctd3NtYW4uc3RhZ2luZy5naXRwb2QtZGV2LmNvbQpeCI1IGAEiV2h0dHBzOi8vOTIyOS1ncmVlbi13b21iYXQtNjJkem5ldWQud3MtZGV2LmdwbC1oZWFkbGVzcy1sb2ctd3NtYW4uc3RhZ2luZy5naXRwb2QtZGV2LmNvbQpeCI9OGAEiV2h0dHBzOi8vOTk5OS1ncmVlbi13b21iYXQtNjJkem5ldWQud3MtZGV2LmdwbC1oZWFkbGVzcy1sb2ctd3NtYW4uc3RhZ2luZy5naXRwb2QtZGV2LmNvbQpfCMllGAEiWGh0dHBzOi8vMTMwMDEtZ3JlZW4td29tYmF0LTYyZHpuZXVkLndzLWRldi5ncGwtaGVhZGxlc3MtbG9nLXdzbWFuLnN0YWdpbmcuZ2l0cG9kLWRldi5jb20KXgjhPBgBIldodHRwczovLzc3NzctZ3JlZW4td29tYmF0LTYyZHpuZXVkLndzLWRldi5ncGwtaGVhZGxlc3MtbG9nLXdzbWFuLnN0YWdpbmcuZ2l0cG9kLWRldi5jb20KXwiEaRgBIlhodHRwczovLzEzNDQ0LWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29t","gitpod/ownerToken":"FZ2k9zbSCo9e85Y21yh.SHLJbya7pW2Y","gitpod/servicePrefix":"green-wombat-62dzneud","gitpod/snapshot":"workspaces/green-wombat-62dzneud/snapshot-1622206186881521445.tar@gitpod-user-d98c5b92-2066-4fce-bea6-1e08b58642ab","gitpod/url":"https://green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","kubernetes.io/psp":"staging-gpl-headless-log-wsman-ns-workspace","prometheus.io/path":"/metrics","prometheus.io/port":"23000","prometheus.io/scrape":"true","seccomp.security.alpha.kubernetes.io/pod":"localhost/workspace_default_gpl-headless-log-wsman.17.json"},"finalizers":["gitpod.io/finalizer","foregroundDeletion"]},"spec":{"volumes":[{"name":"vol-this-workspace","hostPath":{"path":"/mnt/disks/ssd0/workspaces/8e0bbcdf-a926-4670-8c40-b718f035b2ae","type":"DirectoryOrCreate"}},{"name":"daemon-mount","hostPath":{"path":"/mnt/disks/ssd0/workspaces/8e0bbcdf-a926-4670-8c40-b718f035b2ae-daemon","type":"DirectoryOrCreate"}}],"containers":[{"name":"workspace","image":"reg.gpl-headless-log-wsman.staging.gitpod-dev.com:30222/remote/8e0bbcdf-a926-4670-8c40-b718f035b2ae","command":["/.supervisor/workspacekit","ring0"],"ports":[{"containerPort":23000,"protocol":"TCP"}],"env":[{"name":"GITPOD_REPO_ROOT","value":"/workspace/gitpod"},{"name":"GITPOD_CLI_APITOKEN","value":"eGnGrk5s7-.KCc15tXUtyKlzwlbjOBIs"},{"name":"GITPOD_WORKSPACE_ID","value":"green-wombat-62dzneud"},{"name":"GITPOD_INSTANCE_ID","value":"8e0bbcdf-a926-4670-8c40-b718f035b2ae"},{"name":"GITPOD_THEIA_PORT","value":"23000"},{"name":"THEIA_WORKSPACE_ROOT","value":"/workspace/gitpod/gitpod-ws.code-workspace"},{"name":"GITPOD_HOST","value":"https://gpl-headless-log-wsman.staging.gitpod-dev.com"},{"name":"GITPOD_WORKSPACE_URL","value":"https://green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com"},{"name":"THEIA_SUPERVISOR_TOKEN","value":"354c0b368f2b4a93b7b812564e663d23"},{"name":"THEIA_SUPERVISOR_ENDPOINT","value":":22999"},{"name":"THEIA_WEBVIEW_EXTERNAL_ENDPOINT","value":"webview-{{hostname}}"},{"name":"THEIA_MINI_BROWSER_HOST_PATTERN","value":"browser-{{hostname}}"},{"name":"GITPOD_GIT_USER_NAME","value":"Gero Posmyk-Leinemann"},{"name":"GITPOD_GIT_USER_EMAIL","value":"gero@gitpod.io"},{"name":"PREBUILD_PARAMS","value":"[redacted]"},{"name":"GITPOD_WORKSPACE_CONTEXT_URL","value":"prebuild/https://github.com/gitpod-io/gitpod/tree/gpl/test-prebuild"},{"name":"GITPOD_WORKSPACE_CONTEXT","value":"{\"ref\":\"gpl/test-prebuild\",\"refType\":\"branch\",\"isFile\":false,\"path\":\"\",\"title\":\"gitpod-io/gitpod - gpl/test-prebuild\",\"revision\":\"a1afe2bb7d454ea7a4194f363601a31ae319ce9c\",\"repository\":{\"cloneUrl\":\"https://github.com/gitpod-io/gitpod.git\",\"host\":\"github.com\",\"name\":\"gitpod\",\"owner\":\"gitpod-io\",\"private\":false}}"},{"name":"GITPOD_TASKS","value":"[{\"name\":\"Test Command\",\"init\":\"export PREBUILD_PARAMS=${PREBUILD_PARAMS:-\\\"100_500ms_30m\\\"}; go run ./main.go $PREBUILD_PARAMS\"}]"},{"name":"THEIA_SUPERVISOR_TOKENS","value":"[{\"tokenOTS\":\"https://gpl-headless-log-wsman.staging.gitpod-dev.com/api/ots/get/71ca5ce2-b15e-4a0e-8a0f-65964c509d40\",\"token\":\"ots\",\"kind\":\"gitpod\",\"host\":\"gpl-headless-log-wsman.staging.gitpod-dev.com\",\"scope\":[\"function:getWorkspace\",\"function:getLoggedInUser\",\"function:getPortAuthenticationToken\",\"function:getWorkspaceOwner\",\"function:getWorkspaceUsers\",\"function:isWorkspaceOwner\",\"function:controlAdmission\",\"function:setWorkspaceTimeout\",\"function:getWorkspaceTimeout\",\"function:sendHeartBeat\",\"function:getOpenPorts\",\"function:openPort\",\"function:closePort\",\"function:getLayout\",\"function:generateNewGitpodToken\",\"function:takeSnapshot\",\"function:storeLayout\",\"function:stopWorkspace\",\"function:getToken\",\"function:getContentBlobUploadUrl\",\"function:getContentBlobDownloadUrl\",\"function:accessCodeSyncStorage\",\"function:guessGitTokenScopes\",\"function:getEnvVars\",\"function:setEnvVar\",\"function:deleteEnvVar\",\"resource:workspace::green-wombat-62dzneud::get/update\",\"resource:workspaceInstance::8e0bbcdf-a926-4670-8c40-b718f035b2ae::get/update/delete\",\"resource:snapshot::ws-green-wombat-62dzneud::create\",\"resource:gitpodToken::*::create\",\"resource:userStorage::*::create/get/update\",\"resource:token::*::get\",\"resource:contentBlob::*::create/get\",\"resource:envVar::gitpod-io/gitpod::create/get/update/delete\"],\"expiryDate\":\"2021-05-29T12:48:19.234Z\",\"reuse\":2}]"},{"name":"GITPOD_RESOLVED_EXTENSIONS","value":"{\"vscode.bat@1.44.2\":{\"fullPluginName\":\"vscode.bat@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.clojure@1.44.2\":{\"fullPluginName\":\"vscode.clojure@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.coffeescript@1.44.2\":{\"fullPluginName\":\"vscode.coffeescript@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.cpp@1.44.2\":{\"fullPluginName\":\"vscode.cpp@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.csharp@1.44.2\":{\"fullPluginName\":\"vscode.csharp@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"llvm-vs-code-extensions.vscode-clangd@0.1.5\":{\"fullPluginName\":\"llvm-vs-code-extensions.vscode-clangd@0.1.5\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.css@1.51.1\":{\"fullPluginName\":\"vscode.css@1.51.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.css-language-features@1.51.1\":{\"fullPluginName\":\"vscode.css-language-features@1.51.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.debug-auto-launch@1.44.2\":{\"fullPluginName\":\"vscode.debug-auto-launch@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.emmet@1.44.2\":{\"fullPluginName\":\"vscode.emmet@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.fsharp@1.44.2\":{\"fullPluginName\":\"vscode.fsharp@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.go@1.44.2\":{\"fullPluginName\":\"vscode.go@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.groovy@1.44.2\":{\"fullPluginName\":\"vscode.groovy@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.handlebars@1.44.2\":{\"fullPluginName\":\"vscode.handlebars@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.hlsl@1.44.2\":{\"fullPluginName\":\"vscode.hlsl@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.html@1.51.1\":{\"fullPluginName\":\"vscode.html@1.51.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.html-language-features@1.51.1\":{\"fullPluginName\":\"vscode.html-language-features@1.51.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.ini@1.44.2\":{\"fullPluginName\":\"vscode.ini@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.java@1.53.2\":{\"fullPluginName\":\"vscode.java@1.53.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.javascript@1.44.2\":{\"fullPluginName\":\"vscode.javascript@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.json@1.44.2\":{\"fullPluginName\":\"vscode.json@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.json-language-features@1.46.1\":{\"fullPluginName\":\"vscode.json-language-features@1.46.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.less@1.44.2\":{\"fullPluginName\":\"vscode.less@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.log@1.44.2\":{\"fullPluginName\":\"vscode.log@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.lua@1.44.2\":{\"fullPluginName\":\"vscode.lua@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.make@1.44.2\":{\"fullPluginName\":\"vscode.make@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.markdown@1.44.2\":{\"fullPluginName\":\"vscode.markdown@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.npm@1.39.1\":{\"fullPluginName\":\"vscode.npm@1.39.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.objective-c@1.44.2\":{\"fullPluginName\":\"vscode.objective-c@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.perl@1.44.2\":{\"fullPluginName\":\"vscode.perl@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.php@1.44.2\":{\"fullPluginName\":\"vscode.php@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.powershell@1.44.2\":{\"fullPluginName\":\"vscode.powershell@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.pug@1.44.2\":{\"fullPluginName\":\"vscode.pug@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.python@1.47.3\":{\"fullPluginName\":\"vscode.python@1.47.3\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.r@1.44.2\":{\"fullPluginName\":\"vscode.r@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.razor@1.44.2\":{\"fullPluginName\":\"vscode.razor@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.ruby@1.44.2\":{\"fullPluginName\":\"vscode.ruby@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.rust@1.44.2\":{\"fullPluginName\":\"vscode.rust@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.scss@1.44.2\":{\"fullPluginName\":\"vscode.scss@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.shaderlab@1.44.2\":{\"fullPluginName\":\"vscode.shaderlab@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.shellscript@1.44.2\":{\"fullPluginName\":\"vscode.shellscript@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.sql@1.44.2\":{\"fullPluginName\":\"vscode.sql@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.swift@1.44.2\":{\"fullPluginName\":\"vscode.swift@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.typescript@1.44.2\":{\"fullPluginName\":\"vscode.typescript@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.typescript-language-features@1.44.2\":{\"fullPluginName\":\"vscode.typescript-language-features@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.vb@1.44.2\":{\"fullPluginName\":\"vscode.vb@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.xml@1.44.2\":{\"fullPluginName\":\"vscode.xml@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.yaml@1.44.2\":{\"fullPluginName\":\"vscode.yaml@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"redhat.java@0.75.0\":{\"fullPluginName\":\"redhat.java@0.75.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscjava.vscode-java-debug@0.27.1\":{\"fullPluginName\":\"vscjava.vscode-java-debug@0.27.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscjava.vscode-java-dependency@0.18.0\":{\"fullPluginName\":\"vscjava.vscode-java-dependency@0.18.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-vscode.node-debug@1.38.4\":{\"fullPluginName\":\"ms-vscode.node-debug@1.38.4\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-vscode.node-debug2@1.33.0\":{\"fullPluginName\":\"ms-vscode.node-debug2@1.33.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-python.python@2020.7.96456\":{\"fullPluginName\":\"ms-python.python@2020.7.96456\",\"url\":\"local\",\"kind\":\"builtin\"},\"redhat.vscode-xml@0.11.0\":{\"fullPluginName\":\"redhat.vscode-xml@0.11.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"redhat.vscode-yaml@0.8.0\":{\"fullPluginName\":\"redhat.vscode-yaml@0.8.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"bmewburn.vscode-intelephense-client@1.4.0\":{\"fullPluginName\":\"bmewburn.vscode-intelephense-client@1.4.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"felixfbecker.php-debug@1.13.0\":{\"fullPluginName\":\"felixfbecker.php-debug@1.13.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"rust-lang.rust@0.7.8\":{\"fullPluginName\":\"rust-lang.rust@0.7.8\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-abyss@1.44.2\":{\"fullPluginName\":\"vscode.theme-abyss@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-kimbie-dark@1.44.2\":{\"fullPluginName\":\"vscode.theme-kimbie-dark@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-monokai@1.44.2\":{\"fullPluginName\":\"vscode.theme-monokai@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-monokai-dimmed@1.44.2\":{\"fullPluginName\":\"vscode.theme-monokai-dimmed@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-quietlight@1.44.2\":{\"fullPluginName\":\"vscode.theme-quietlight@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-red@1.44.2\":{\"fullPluginName\":\"vscode.theme-red@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-solarized-dark@1.44.2\":{\"fullPluginName\":\"vscode.theme-solarized-dark@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-solarized-light@1.44.2\":{\"fullPluginName\":\"vscode.theme-solarized-light@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-tomorrow-night-blue@1.44.2\":{\"fullPluginName\":\"vscode.theme-tomorrow-night-blue@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.vscode-theme-seti@1.44.2\":{\"fullPluginName\":\"vscode.vscode-theme-seti@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.merge-conflict@1.44.2\":{\"fullPluginName\":\"vscode.merge-conflict@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-vscode.references-view@0.0.47\":{\"fullPluginName\":\"ms-vscode.references-view@0.0.47\",\"url\":\"local\",\"kind\":\"builtin\"},\"EditorConfig.EditorConfig@0.15.1\":{\"fullPluginName\":\"editorconfig.editorconfig@0.15.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.docker@1.47.3\":{\"fullPluginName\":\"vscode.docker@1.47.3\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-kubernetes-tools.vscode-kubernetes-tools\":{\"fullPluginName\":\"ms-kubernetes-tools.vscode-kubernetes-tools@1.3.3\",\"url\":\"https://open-vsx.org/api/ms-kubernetes-tools/vscode-kubernetes-tools/1.3.3/file/ms-kubernetes-tools.vscode-kubernetes-tools-1.3.3.vsix\",\"kind\":\"workspace\"},\"hashicorp.terraform\":{\"fullPluginName\":\"hashicorp.terraform@2.11.0\",\"url\":\"https://open-vsx.org/api/hashicorp/terraform/2.11.0/file/hashicorp.terraform-2.11.0.vsix\",\"kind\":\"workspace\"},\"zxh404.vscode-proto3\":{\"fullPluginName\":\"zxh404.vscode-proto3@0.5.4\",\"url\":\"https://open-vsx.org/api/zxh404/vscode-proto3/0.5.4/file/zxh404.vscode-proto3-0.5.4.vsix\",\"kind\":\"workspace\"},\"bajdzis.vscode-database\":{\"fullPluginName\":\"bajdzis.vscode-database@2.2.3\",\"url\":\"https://open-vsx.org/api/bajdzis/vscode-database/2.2.3/file/bajdzis.vscode-database-2.2.3.vsix\",\"kind\":\"workspace\"},\"stkb.rewrap\":{\"fullPluginName\":\"stkb.rewrap@1.14.0\",\"url\":\"https://open-vsx.org/api/stkb/rewrap/1.14.0/file/stkb.rewrap-1.14.0.vsix\",\"kind\":\"workspace\"},\"golang.go\":{\"fullPluginName\":\"golang.go@0.25.0\",\"url\":\"https://open-vsx.org/api/golang/Go/0.25.0/file/golang.Go-0.25.0.vsix\",\"kind\":\"workspace\"}}"},{"name":"GITPOD_EXTERNAL_EXTENSIONS","value":"[]"},{"name":"GITPOD_INTERVAL","value":"30000"},{"name":"GITPOD_MEMORY","value":"2415"},{"name":"GITPOD_HEADLESS","value":"true"}],"resources":{"limits":{"cpu":"5","memory":"12Gi"},"requests":{"cpu":"1m","ephemeral-storage":"5Gi","memory":"4608Mi"}},"volumeMounts":[{"name":"vol-this-workspace","mountPath":"/workspace","mountPropagation":"HostToContainer"},{"name":"daemon-mount","mountPath":"/.workspace","mountPropagation":"HostToContainer"}],"readinessProbe":{"httpGet":{"path":"/_supervisor/v1/status/content/wait/true","port":22999,"scheme":"HTTP"},"timeoutSeconds":1,"periodSeconds":1,"successThreshold":1,"failureThreshold":600},"terminationMessagePath":"/dev/termination-log","terminationMessagePolicy":"FallbackToLogsOnError","imagePullPolicy":"Always","securityContext":{"capabilities":{"add":["AUDIT_WRITE","FSETID","KILL","NET_BIND_SERVICE","SYS_PTRACE"],"drop":["SETPCAP","CHOWN","NET_RAW","DAC_OVERRIDE","FOWNER","SYS_CHROOT","SETFCAP","SETUID","SETGID"]},"privileged":false,"runAsUser":33333,"runAsGroup":33333,"runAsNonRoot":true,"readOnlyRootFilesystem":false,"allowPrivilegeEscalation":true}}],"restartPolicy":"Never","terminationGracePeriodSeconds":30,"dnsPolicy":"None","serviceAccountName":"workspace","serviceAccount":"workspace","automountServiceAccountToken":false,"nodeName":"gke-dev-workload-1-49d27f81-pd35","securityContext":{"supplementalGroups":[1],"fsGroup":1},"imagePullSecrets":[{"name":"gcp-sa-registry-auth"}],"affinity":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"gitpod.io/workload_workspace","operator":"Exists"}]}]}}},"schedulerName":"workspace-scheduler","tolerations":[{"key":"node.kubernetes.io/disk-pressure","operator":"Exists","effect":"NoExecute"},{"key":"node.kubernetes.io/memory-pressure","operator":"Exists","effect":"NoExecute"},{"key":"node.kubernetes.io/network-unavailable","operator":"Exists","effect":"NoExecute","tolerationSeconds":30},{"key":"node.kubernetes.io/not-ready","operator":"Exists","effect":"NoExecute","tolerationSeconds":300},{"key":"node.kubernetes.io/unreachable","operator":"Exists","effect":"NoExecute","tolerationSeconds":300}],"priority":0,"dnsConfig":{"nameservers":["1.1.1.1","8.8.8.8"]},"enableServiceLinks":false},"status":{"phase":"Succeeded","conditions":[{"type":"Initialized","status":"True","lastProbeTime":null,"lastTransitionTime":"2021-05-28T12:48:19Z","reason":"PodCompleted"},{"type":"Ready","status":"False","lastProbeTime":null,"lastTransitionTime":"2021-05-28T12:49:46Z","reason":"PodCompleted"},{"type":"ContainersReady","status":"False","lastProbeTime":null,"lastTransitionTime":"2021-05-28T12:49:46Z","reason":"PodCompleted"},{"type":"PodScheduled","status":"True","lastProbeTime":null,"lastTransitionTime":"2021-05-28T12:48:19Z"}],"hostIP":"10.132.15.221","podIP":"10.60.61.170","podIPs":[{"ip":"10.60.61.170"}],"startTime":"2021-05-28T12:48:19Z","containerStatuses":[{"name":"workspace","state":{"terminated":{"exitCode":0,"reason":"Completed","startedAt":"2021-05-28T12:48:23Z","finishedAt":"2021-05-28T12:49:45Z","containerID":"containerd://c2fb575264ceeae177f754b0edd4dfbfc2439b2b9bdccab020dfa7fe494408cc"}},"lastState":{},"ready":false,"restartCount":0,"image":"reg.gpl-headless-log-wsman.staging.gitpod-dev.com:30942/remote/01709d83-71a4-47fa-b14d-6482b3650d8c:latest","imageID":"reg.gpl-headless-log-wsman.staging.gitpod-dev.com:30222/remote/8e0bbcdf-a926-4670-8c40-b718f035b2ae@sha256:6987f020499b07d3e3762844b819481fd5e1a0b04fd34ad2a1a17dca0c827599","containerID":"containerd://c2fb575264ceeae177f754b0edd4dfbfc2439b2b9bdccab020dfa7fe494408cc","started":false}],"qosClass":"Burstable"}},"theiaService":{"kind":"Service","apiVersion":"v1","metadata":{"name":"ws-green-wombat-62dzneud-theia","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/services/ws-green-wombat-62dzneud-theia","uid":"67227f06-91de-44d4-83fe-0911cc6e3601","resourceVersion":"198744199","creationTimestamp":"2021-05-28T12:48:19Z","deletionTimestamp":"2021-05-28T12:49:46Z","deletionGracePeriodSeconds":0,"labels":{"app":"gitpod","component":"workspace","gpwsman":"true","headless":"true","metaID":"green-wombat-62dzneud","owner":"d98c5b92-2066-4fce-bea6-1e08b58642ab","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae","workspaceType":"prebuild"},"finalizers":["foregroundDeletion"]},"spec":{"ports":[{"name":"ide","protocol":"TCP","port":23000,"targetPort":23000},{"name":"supervisor","protocol":"TCP","port":22999,"targetPort":22999}],"selector":{"app":"gitpod","component":"workspace","gpwsman":"true","headless":"true","metaID":"green-wombat-62dzneud","owner":"d98c5b92-2066-4fce-bea6-1e08b58642ab","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae","workspaceType":"prebuild"},"clusterIP":"10.63.250.40","type":"ClusterIP","sessionAffinity":"None"},"status":{"loadBalancer":{}}},"portsService":{"kind":"Service","apiVersion":"v1","metadata":{"name":"ws-green-wombat-62dzneud-ports","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/services/ws-green-wombat-62dzneud-ports","uid":"1ebcfc6e-15c3-415e-9de5-6c7adc47d1a7","resourceVersion":"198744202","creationTimestamp":"2021-05-28T12:48:19Z","deletionTimestamp":"2021-05-28T12:49:46Z","deletionGracePeriodSeconds":0,"labels":{"gpwsman":"true","metaID":"green-wombat-62dzneud","serviceType":"ports","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae"},"annotations":{"gitpod/port-url-13001":"https://13001-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-1337":"https://1337-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-13444":"https://13444-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-3000":"https://3000-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-3001":"https://3001-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-3306":"https://3306-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-4000":"https://4000-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-5900":"https://5900-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-6080":"https://6080-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-7777":"https://7777-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-9229":"https://9229-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-9999":"https://9999-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com"},"finalizers":["foregroundDeletion"]},"spec":{"ports":[{"name":"p1337-public","protocol":"TCP","port":1337,"targetPort":1337},{"name":"p3000-public","protocol":"TCP","port":3000,"targetPort":3000},{"name":"p3001-public","protocol":"TCP","port":3001,"targetPort":3001},{"name":"p3306-public","protocol":"TCP","port":3306,"targetPort":3306},{"name":"p4000-public","protocol":"TCP","port":4000,"targetPort":4000},{"name":"p5900-public","protocol":"TCP","port":5900,"targetPort":5900},{"name":"p6080-private","protocol":"TCP","port":6080,"targetPort":6080},{"name":"p9229-public","protocol":"TCP","port":9229,"targetPort":9229},{"name":"p9999-public","protocol":"TCP","port":9999,"targetPort":9999},{"name":"p13001-public","protocol":"TCP","port":13001,"targetPort":13001},{"name":"p7777-public","protocol":"TCP","port":7777,"targetPort":7777},{"name":"p13444-public","protocol":"TCP","port":13444,"targetPort":13444}],"selector":{"gpwsman":"true","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae"},"clusterIP":"10.63.243.155","type":"ClusterIP","sessionAffinity":"None"},"status":{"loadBalancer":{}}},"events":[{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae - scheduled2zrpp","generateName":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae - scheduled","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae%20-%20scheduled2zrpp","uid":"e983c42a-b04a-48b6-b214-4fe60281b6ae","resourceVersion":"12819729","creationTimestamp":"2021-05-28T12:48:19Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e"},"reason":"Scheduled","message":"Placed pod [staging-gpl-headless-log-wsman/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae] on gke-dev-workload-1-49d27f81-pd35\n","source":{"component":"workspace-scheduler"},"firstTimestamp":"2021-05-28T12:48:19Z","lastTimestamp":"2021-05-28T12:48:19Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdaa3effefd","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdaa3effefd","uid":"63db3a49-fc8f-401a-bf37-28c88295fb14","resourceVersion":"12819730","creationTimestamp":"2021-05-28T12:48:21Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","apiVersion":"v1","resourceVersion":"198743315","fieldPath":"spec.containers{workspace}"},"reason":"Pulling","message":"Pulling image \"reg.gpl-headless-log-wsman.staging.gitpod-dev.com:30222/remote/8e0bbcdf-a926-4670-8c40-b718f035b2ae\"","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-pd35"},"firstTimestamp":"2021-05-28T12:48:21Z","lastTimestamp":"2021-05-28T12:48:21Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdb0a0a2c9c","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdb0a0a2c9c","uid":"5b9b3c37-4fb1-4035-b4b1-a13aa83704ae","resourceVersion":"12819731","creationTimestamp":"2021-05-28T12:48:22Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","apiVersion":"v1","resourceVersion":"198743315","fieldPath":"spec.containers{workspace}"},"reason":"Pulled","message":"Successfully pulled image \"reg.gpl-headless-log-wsman.staging.gitpod-dev.com:30222/remote/8e0bbcdf-a926-4670-8c40-b718f035b2ae\"","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-pd35"},"firstTimestamp":"2021-05-28T12:48:22Z","lastTimestamp":"2021-05-28T12:48:22Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdb128fe8e4","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdb128fe8e4","uid":"bd854c78-0373-41b0-8f17-017ff5e2d080","resourceVersion":"12819732","creationTimestamp":"2021-05-28T12:48:22Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","apiVersion":"v1","resourceVersion":"198743315","fieldPath":"spec.containers{workspace}"},"reason":"Created","message":"Created container workspace","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-pd35"},"firstTimestamp":"2021-05-28T12:48:22Z","lastTimestamp":"2021-05-28T12:48:22Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdb21e5d246","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdb21e5d246","uid":"524e07b2-1738-4ee2-b190-2ff5c0c53d40","resourceVersion":"12819733","creationTimestamp":"2021-05-28T12:48:23Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","apiVersion":"v1","resourceVersion":"198743315","fieldPath":"spec.containers{workspace}"},"reason":"Started","message":"Started container workspace","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-pd35"},"firstTimestamp":"2021-05-28T12:48:23Z","lastTimestamp":"2021-05-28T12:48:23Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdbcfee72b0","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdbcfee72b0","uid":"af454391-08ae-4f6c-9338-09bc228242a8","resourceVersion":"12819742","creationTimestamp":"2021-05-28T12:48:26Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","apiVersion":"v1","resourceVersion":"198743315","fieldPath":"spec.containers{workspace}"},"reason":"Unhealthy","message":"Readiness probe failed: Get http://10.60.61.170:22999/_supervisor/v1/status/content/wait/true: net/http: request canceled (Client.Timeout exceeded while awaiting headers)","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-pd35"},"firstTimestamp":"2021-05-28T12:48:26Z","lastTimestamp":"2021-05-28T12:48:27Z","count":2,"type":"Warning","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bee704e5de5","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bee704e5de5","uid":"fda4b916-769c-4167-a782-566fa1574edb","resourceVersion":"12819805","creationTimestamp":"2021-05-28T12:49:46Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","apiVersion":"v1","resourceVersion":"198743315","fieldPath":"spec.containers{workspace}"},"reason":"Unhealthy","message":"Readiness probe failed: Get http://10.60.61.170:22999/_supervisor/v1/status/content/wait/true: dial tcp 10.60.61.170:22999: connect: connection refused","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-pd35"},"firstTimestamp":"2021-05-28T12:49:46Z","lastTimestamp":"2021-05-28T12:49:46Z","count":1,"type":"Warning","eventTime":null,"reportingComponent":"","reportingInstance":""}]} \ No newline at end of file +{"pod":{"kind":"Pod","apiVersion":"v1","metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/pods/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","resourceVersion":"198744218","creationTimestamp":"2021-05-28T12:48:19Z","deletionTimestamp":"2021-05-28T12:49:46Z","deletionGracePeriodSeconds":0,"labels":{"app":"gitpod","component":"workspace","gitpod.io/networkpolicy":"default","gpwsman":"true","headless":"true","metaID":"green-wombat-62dzneud","owner":"d98c5b92-2066-4fce-bea6-1e08b58642ab","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae","workspaceType":"prebuild"},"annotations":{"cni.projectcalico.org/podIP":"10.60.61.170/32","container.apparmor.security.beta.kubernetes.io/workspace":"unconfined","gitpod.io/disposalStatus":"{\"backupComplete\":true}","gitpod.io/requiredNodeServices":"ws-daemon,registry-facade","gitpod/admission":"admit_owner_only","gitpod/contentInitializer":"[redacted]","gitpod/id":"8e0bbcdf-a926-4670-8c40-b718f035b2ae","gitpod/imageSpec":"CnRldS5nY3IuaW8vZ2l0cG9kLWNvcmUtZGV2L3JlZ2lzdHJ5L3dvcmtzcGFjZS1pbWFnZXM6ODFjNGZiNjAyYTU0MGQyNjFmMjEwY2ZjOGJhMDQzNWI2M2IyNDIzOGMxNzYyZWMwMjlkOGVkYWVjODE2YWZiNhJCZXUuZ2NyLmlvL2dpdHBvZC1jb3JlLWRldi9idWlsZC9pZGUvY29kZTpncGwtaGVhZGxlc3MtbG9nLXdzbWFuLjE3","gitpod/exposedPorts": "Cl4IuQoYASJXaHR0cHM6Ly8xMzM3LWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IuBcYASJXaHR0cHM6Ly8zMDAwLWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IuRcYASJXaHR0cHM6Ly8zMDAxLWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4I6hkYASJXaHR0cHM6Ly8zMzA2LWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IoB8YASJXaHR0cHM6Ly80MDAwLWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IjC4YASJXaHR0cHM6Ly81OTAwLWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tClwIwC8iV2h0dHBzOi8vNjA4MC1ncmVlbi13b21iYXQtNjJkem5ldWQud3MtZGV2LmdwbC1oZWFkbGVzcy1sb2ctd3NtYW4uc3RhZ2luZy5naXRwb2QtZGV2LmNvbQpeCI1IGAEiV2h0dHBzOi8vOTIyOS1ncmVlbi13b21iYXQtNjJkem5ldWQud3MtZGV2LmdwbC1oZWFkbGVzcy1sb2ctd3NtYW4uc3RhZ2luZy5naXRwb2QtZGV2LmNvbQpeCI9OGAEiV2h0dHBzOi8vOTk5OS1ncmVlbi13b21iYXQtNjJkem5ldWQud3MtZGV2LmdwbC1oZWFkbGVzcy1sb2ctd3NtYW4uc3RhZ2luZy5naXRwb2QtZGV2LmNvbQpfCMllGAEiWGh0dHBzOi8vMTMwMDEtZ3JlZW4td29tYmF0LTYyZHpuZXVkLndzLWRldi5ncGwtaGVhZGxlc3MtbG9nLXdzbWFuLnN0YWdpbmcuZ2l0cG9kLWRldi5jb20KXgjhPBgBIldodHRwczovLzc3NzctZ3JlZW4td29tYmF0LTYyZHpuZXVkLndzLWRldi5ncGwtaGVhZGxlc3MtbG9nLXdzbWFuLnN0YWdpbmcuZ2l0cG9kLWRldi5jb20KXwiEaRgBIlhodHRwczovLzEzNDQ0LWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29t","gitpod/ownerToken":"FZ2k9zbSCo9e85Y21yh.SHLJbya7pW2Y","gitpod/servicePrefix":"green-wombat-62dzneud","gitpod/snapshot":"workspaces/green-wombat-62dzneud/snapshot-1622206186881521445.tar@gitpod-user-d98c5b92-2066-4fce-bea6-1e08b58642ab","gitpod/url":"https://green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","kubernetes.io/psp":"staging-gpl-headless-log-wsman-ns-workspace","prometheus.io/path":"/metrics","prometheus.io/port":"23000","prometheus.io/scrape":"true","seccomp.security.alpha.kubernetes.io/pod":"localhost/workspace_default_gpl-headless-log-wsman.17.json"},"finalizers":["gitpod.io/finalizer","foregroundDeletion"]},"spec":{"volumes":[{"name":"vol-this-workspace","hostPath":{"path":"/mnt/disks/ssd0/workspaces/8e0bbcdf-a926-4670-8c40-b718f035b2ae","type":"DirectoryOrCreate"}},{"name":"daemon-mount","hostPath":{"path":"/mnt/disks/ssd0/workspaces/8e0bbcdf-a926-4670-8c40-b718f035b2ae-daemon","type":"DirectoryOrCreate"}}],"containers":[{"name":"workspace","image":"reg.gpl-headless-log-wsman.staging.gitpod-dev.com:30222/remote/8e0bbcdf-a926-4670-8c40-b718f035b2ae","command":["/.supervisor/workspacekit","ring0"],"ports":[{"containerPort":23000,"protocol":"TCP"}],"env":[{"name":"GITPOD_REPO_ROOT","value":"/workspace/gitpod"},{"name":"GITPOD_CLI_APITOKEN","value":"eGnGrk5s7-.KCc15tXUtyKlzwlbjOBIs"},{"name":"GITPOD_WORKSPACE_ID","value":"green-wombat-62dzneud"},{"name":"GITPOD_INSTANCE_ID","value":"8e0bbcdf-a926-4670-8c40-b718f035b2ae"},{"name":"GITPOD_THEIA_PORT","value":"23000"},{"name":"THEIA_WORKSPACE_ROOT","value":"/workspace/gitpod/gitpod-ws.code-workspace"},{"name":"GITPOD_HOST","value":"https://gpl-headless-log-wsman.staging.gitpod-dev.com"},{"name":"GITPOD_WORKSPACE_URL","value":"https://green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com"},{"name":"THEIA_SUPERVISOR_TOKEN","value":"354c0b368f2b4a93b7b812564e663d23"},{"name":"THEIA_SUPERVISOR_ENDPOINT","value":":22999"},{"name":"THEIA_WEBVIEW_EXTERNAL_ENDPOINT","value":"webview-{{hostname}}"},{"name":"THEIA_MINI_BROWSER_HOST_PATTERN","value":"browser-{{hostname}}"},{"name":"GITPOD_GIT_USER_NAME","value":"Gero Posmyk-Leinemann"},{"name":"GITPOD_GIT_USER_EMAIL","value":"gero@gitpod.io"},{"name":"PREBUILD_PARAMS","value":"[redacted]"},{"name":"GITPOD_WORKSPACE_CONTEXT_URL","value":"prebuild/https://github.com/gitpod-io/gitpod/tree/gpl/test-prebuild"},{"name":"GITPOD_WORKSPACE_CONTEXT","value":"{\"ref\":\"gpl/test-prebuild\",\"refType\":\"branch\",\"isFile\":false,\"path\":\"\",\"title\":\"gitpod-io/gitpod - gpl/test-prebuild\",\"revision\":\"a1afe2bb7d454ea7a4194f363601a31ae319ce9c\",\"repository\":{\"cloneUrl\":\"https://github.com/gitpod-io/gitpod.git\",\"host\":\"github.com\",\"name\":\"gitpod\",\"owner\":\"gitpod-io\",\"private\":false}}"},{"name":"GITPOD_TASKS","value":"[{\"name\":\"Test Command\",\"init\":\"export PREBUILD_PARAMS=${PREBUILD_PARAMS:-\\\"100_500ms_30m\\\"}; go run ./main.go $PREBUILD_PARAMS\"}]"},{"name":"THEIA_SUPERVISOR_TOKENS","value":"[{\"tokenOTS\":\"https://gpl-headless-log-wsman.staging.gitpod-dev.com/api/ots/get/71ca5ce2-b15e-4a0e-8a0f-65964c509d40\",\"token\":\"ots\",\"kind\":\"gitpod\",\"host\":\"gpl-headless-log-wsman.staging.gitpod-dev.com\",\"scope\":[\"function:getWorkspace\",\"function:getLoggedInUser\",\"function:getPortAuthenticationToken\",\"function:getWorkspaceOwner\",\"function:getWorkspaceUsers\",\"function:isWorkspaceOwner\",\"function:controlAdmission\",\"function:setWorkspaceTimeout\",\"function:getWorkspaceTimeout\",\"function:sendHeartBeat\",\"function:getOpenPorts\",\"function:openPort\",\"function:closePort\",\"function:getLayout\",\"function:generateNewGitpodToken\",\"function:takeSnapshot\",\"function:storeLayout\",\"function:stopWorkspace\",\"function:getToken\",\"function:getContentBlobUploadUrl\",\"function:getContentBlobDownloadUrl\",\"function:accessCodeSyncStorage\",\"function:guessGitTokenScopes\",\"function:getEnvVars\",\"function:setEnvVar\",\"function:deleteEnvVar\",\"resource:workspace::green-wombat-62dzneud::get/update\",\"resource:workspaceInstance::8e0bbcdf-a926-4670-8c40-b718f035b2ae::get/update/delete\",\"resource:snapshot::ws-green-wombat-62dzneud::create\",\"resource:gitpodToken::*::create\",\"resource:userStorage::*::create/get/update\",\"resource:token::*::get\",\"resource:contentBlob::*::create/get\",\"resource:envVar::gitpod-io/gitpod::create/get/update/delete\"],\"expiryDate\":\"2021-05-29T12:48:19.234Z\",\"reuse\":2}]"},{"name":"GITPOD_RESOLVED_EXTENSIONS","value":"{\"vscode.bat@1.44.2\":{\"fullPluginName\":\"vscode.bat@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.clojure@1.44.2\":{\"fullPluginName\":\"vscode.clojure@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.coffeescript@1.44.2\":{\"fullPluginName\":\"vscode.coffeescript@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.cpp@1.44.2\":{\"fullPluginName\":\"vscode.cpp@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.csharp@1.44.2\":{\"fullPluginName\":\"vscode.csharp@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"llvm-vs-code-extensions.vscode-clangd@0.1.5\":{\"fullPluginName\":\"llvm-vs-code-extensions.vscode-clangd@0.1.5\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.css@1.51.1\":{\"fullPluginName\":\"vscode.css@1.51.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.css-language-features@1.51.1\":{\"fullPluginName\":\"vscode.css-language-features@1.51.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.debug-auto-launch@1.44.2\":{\"fullPluginName\":\"vscode.debug-auto-launch@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.emmet@1.44.2\":{\"fullPluginName\":\"vscode.emmet@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.fsharp@1.44.2\":{\"fullPluginName\":\"vscode.fsharp@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.go@1.44.2\":{\"fullPluginName\":\"vscode.go@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.groovy@1.44.2\":{\"fullPluginName\":\"vscode.groovy@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.handlebars@1.44.2\":{\"fullPluginName\":\"vscode.handlebars@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.hlsl@1.44.2\":{\"fullPluginName\":\"vscode.hlsl@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.html@1.51.1\":{\"fullPluginName\":\"vscode.html@1.51.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.html-language-features@1.51.1\":{\"fullPluginName\":\"vscode.html-language-features@1.51.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.ini@1.44.2\":{\"fullPluginName\":\"vscode.ini@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.java@1.53.2\":{\"fullPluginName\":\"vscode.java@1.53.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.javascript@1.44.2\":{\"fullPluginName\":\"vscode.javascript@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.json@1.44.2\":{\"fullPluginName\":\"vscode.json@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.json-language-features@1.46.1\":{\"fullPluginName\":\"vscode.json-language-features@1.46.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.less@1.44.2\":{\"fullPluginName\":\"vscode.less@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.log@1.44.2\":{\"fullPluginName\":\"vscode.log@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.lua@1.44.2\":{\"fullPluginName\":\"vscode.lua@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.make@1.44.2\":{\"fullPluginName\":\"vscode.make@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.markdown@1.44.2\":{\"fullPluginName\":\"vscode.markdown@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.npm@1.39.1\":{\"fullPluginName\":\"vscode.npm@1.39.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.objective-c@1.44.2\":{\"fullPluginName\":\"vscode.objective-c@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.perl@1.44.2\":{\"fullPluginName\":\"vscode.perl@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.php@1.44.2\":{\"fullPluginName\":\"vscode.php@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.powershell@1.44.2\":{\"fullPluginName\":\"vscode.powershell@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.pug@1.44.2\":{\"fullPluginName\":\"vscode.pug@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.python@1.47.3\":{\"fullPluginName\":\"vscode.python@1.47.3\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.r@1.44.2\":{\"fullPluginName\":\"vscode.r@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.razor@1.44.2\":{\"fullPluginName\":\"vscode.razor@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.ruby@1.44.2\":{\"fullPluginName\":\"vscode.ruby@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.rust@1.44.2\":{\"fullPluginName\":\"vscode.rust@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.scss@1.44.2\":{\"fullPluginName\":\"vscode.scss@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.shaderlab@1.44.2\":{\"fullPluginName\":\"vscode.shaderlab@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.shellscript@1.44.2\":{\"fullPluginName\":\"vscode.shellscript@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.sql@1.44.2\":{\"fullPluginName\":\"vscode.sql@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.swift@1.44.2\":{\"fullPluginName\":\"vscode.swift@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.typescript@1.44.2\":{\"fullPluginName\":\"vscode.typescript@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.typescript-language-features@1.44.2\":{\"fullPluginName\":\"vscode.typescript-language-features@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.vb@1.44.2\":{\"fullPluginName\":\"vscode.vb@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.xml@1.44.2\":{\"fullPluginName\":\"vscode.xml@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.yaml@1.44.2\":{\"fullPluginName\":\"vscode.yaml@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"redhat.java@0.75.0\":{\"fullPluginName\":\"redhat.java@0.75.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscjava.vscode-java-debug@0.27.1\":{\"fullPluginName\":\"vscjava.vscode-java-debug@0.27.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscjava.vscode-java-dependency@0.18.0\":{\"fullPluginName\":\"vscjava.vscode-java-dependency@0.18.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-vscode.node-debug@1.38.4\":{\"fullPluginName\":\"ms-vscode.node-debug@1.38.4\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-vscode.node-debug2@1.33.0\":{\"fullPluginName\":\"ms-vscode.node-debug2@1.33.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-python.python@2020.7.96456\":{\"fullPluginName\":\"ms-python.python@2020.7.96456\",\"url\":\"local\",\"kind\":\"builtin\"},\"redhat.vscode-xml@0.11.0\":{\"fullPluginName\":\"redhat.vscode-xml@0.11.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"redhat.vscode-yaml@0.8.0\":{\"fullPluginName\":\"redhat.vscode-yaml@0.8.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"bmewburn.vscode-intelephense-client@1.4.0\":{\"fullPluginName\":\"bmewburn.vscode-intelephense-client@1.4.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"felixfbecker.php-debug@1.13.0\":{\"fullPluginName\":\"felixfbecker.php-debug@1.13.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"rust-lang.rust@0.7.8\":{\"fullPluginName\":\"rust-lang.rust@0.7.8\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-abyss@1.44.2\":{\"fullPluginName\":\"vscode.theme-abyss@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-kimbie-dark@1.44.2\":{\"fullPluginName\":\"vscode.theme-kimbie-dark@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-monokai@1.44.2\":{\"fullPluginName\":\"vscode.theme-monokai@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-monokai-dimmed@1.44.2\":{\"fullPluginName\":\"vscode.theme-monokai-dimmed@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-quietlight@1.44.2\":{\"fullPluginName\":\"vscode.theme-quietlight@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-red@1.44.2\":{\"fullPluginName\":\"vscode.theme-red@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-solarized-dark@1.44.2\":{\"fullPluginName\":\"vscode.theme-solarized-dark@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-solarized-light@1.44.2\":{\"fullPluginName\":\"vscode.theme-solarized-light@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-tomorrow-night-blue@1.44.2\":{\"fullPluginName\":\"vscode.theme-tomorrow-night-blue@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.vscode-theme-seti@1.44.2\":{\"fullPluginName\":\"vscode.vscode-theme-seti@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.merge-conflict@1.44.2\":{\"fullPluginName\":\"vscode.merge-conflict@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-vscode.references-view@0.0.47\":{\"fullPluginName\":\"ms-vscode.references-view@0.0.47\",\"url\":\"local\",\"kind\":\"builtin\"},\"EditorConfig.EditorConfig@0.15.1\":{\"fullPluginName\":\"editorconfig.editorconfig@0.15.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.docker@1.47.3\":{\"fullPluginName\":\"vscode.docker@1.47.3\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-kubernetes-tools.vscode-kubernetes-tools\":{\"fullPluginName\":\"ms-kubernetes-tools.vscode-kubernetes-tools@1.3.3\",\"url\":\"https://open-vsx.org/api/ms-kubernetes-tools/vscode-kubernetes-tools/1.3.3/file/ms-kubernetes-tools.vscode-kubernetes-tools-1.3.3.vsix\",\"kind\":\"workspace\"},\"hashicorp.terraform\":{\"fullPluginName\":\"hashicorp.terraform@2.11.0\",\"url\":\"https://open-vsx.org/api/hashicorp/terraform/2.11.0/file/hashicorp.terraform-2.11.0.vsix\",\"kind\":\"workspace\"},\"zxh404.vscode-proto3\":{\"fullPluginName\":\"zxh404.vscode-proto3@0.5.4\",\"url\":\"https://open-vsx.org/api/zxh404/vscode-proto3/0.5.4/file/zxh404.vscode-proto3-0.5.4.vsix\",\"kind\":\"workspace\"},\"bajdzis.vscode-database\":{\"fullPluginName\":\"bajdzis.vscode-database@2.2.3\",\"url\":\"https://open-vsx.org/api/bajdzis/vscode-database/2.2.3/file/bajdzis.vscode-database-2.2.3.vsix\",\"kind\":\"workspace\"},\"stkb.rewrap\":{\"fullPluginName\":\"stkb.rewrap@1.14.0\",\"url\":\"https://open-vsx.org/api/stkb/rewrap/1.14.0/file/stkb.rewrap-1.14.0.vsix\",\"kind\":\"workspace\"},\"golang.go\":{\"fullPluginName\":\"golang.go@0.25.0\",\"url\":\"https://open-vsx.org/api/golang/Go/0.25.0/file/golang.Go-0.25.0.vsix\",\"kind\":\"workspace\"}}"},{"name":"GITPOD_EXTERNAL_EXTENSIONS","value":"[]"},{"name":"GITPOD_INTERVAL","value":"30000"},{"name":"GITPOD_MEMORY","value":"2415"},{"name":"GITPOD_HEADLESS","value":"true"}],"resources":{"limits":{"cpu":"5","memory":"12Gi"},"requests":{"cpu":"1m","ephemeral-storage":"5Gi","memory":"4608Mi"}},"volumeMounts":[{"name":"vol-this-workspace","mountPath":"/workspace","mountPropagation":"HostToContainer"},{"name":"daemon-mount","mountPath":"/.workspace","mountPropagation":"HostToContainer"}],"readinessProbe":{"httpGet":{"path":"/_supervisor/v1/status/content/wait/true","port":22999,"scheme":"HTTP"},"timeoutSeconds":1,"periodSeconds":1,"successThreshold":1,"failureThreshold":600},"terminationMessagePath":"/dev/termination-log","terminationMessagePolicy":"FallbackToLogsOnError","imagePullPolicy":"Always","securityContext":{"capabilities":{"add":["AUDIT_WRITE","FSETID","KILL","NET_BIND_SERVICE","SYS_PTRACE"],"drop":["SETPCAP","CHOWN","NET_RAW","DAC_OVERRIDE","FOWNER","SYS_CHROOT","SETFCAP","SETUID","SETGID"]},"privileged":false,"runAsUser":33333,"runAsGroup":33333,"runAsNonRoot":true,"readOnlyRootFilesystem":false,"allowPrivilegeEscalation":true}}],"restartPolicy":"Never","terminationGracePeriodSeconds":30,"dnsPolicy":"None","serviceAccountName":"workspace","serviceAccount":"workspace","automountServiceAccountToken":false,"nodeName":"gke-dev-workload-1-49d27f81-pd35","securityContext":{"supplementalGroups":[1],"fsGroup":1},"imagePullSecrets":[{"name":"gcp-sa-registry-auth"}],"affinity":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"gitpod.io/workload_workspace","operator":"Exists"}]}]}}},"tolerations":[{"key":"node.kubernetes.io/disk-pressure","operator":"Exists","effect":"NoExecute"},{"key":"node.kubernetes.io/memory-pressure","operator":"Exists","effect":"NoExecute"},{"key":"node.kubernetes.io/network-unavailable","operator":"Exists","effect":"NoExecute","tolerationSeconds":30},{"key":"node.kubernetes.io/not-ready","operator":"Exists","effect":"NoExecute","tolerationSeconds":300},{"key":"node.kubernetes.io/unreachable","operator":"Exists","effect":"NoExecute","tolerationSeconds":300}],"priority":0,"dnsConfig":{"nameservers":["1.1.1.1","8.8.8.8"]},"enableServiceLinks":false},"status":{"phase":"Succeeded","conditions":[{"type":"Initialized","status":"True","lastProbeTime":null,"lastTransitionTime":"2021-05-28T12:48:19Z","reason":"PodCompleted"},{"type":"Ready","status":"False","lastProbeTime":null,"lastTransitionTime":"2021-05-28T12:49:46Z","reason":"PodCompleted"},{"type":"ContainersReady","status":"False","lastProbeTime":null,"lastTransitionTime":"2021-05-28T12:49:46Z","reason":"PodCompleted"},{"type":"PodScheduled","status":"True","lastProbeTime":null,"lastTransitionTime":"2021-05-28T12:48:19Z"}],"hostIP":"10.132.15.221","podIP":"10.60.61.170","podIPs":[{"ip":"10.60.61.170"}],"startTime":"2021-05-28T12:48:19Z","containerStatuses":[{"name":"workspace","state":{"terminated":{"exitCode":0,"reason":"Completed","startedAt":"2021-05-28T12:48:23Z","finishedAt":"2021-05-28T12:49:45Z","containerID":"containerd://c2fb575264ceeae177f754b0edd4dfbfc2439b2b9bdccab020dfa7fe494408cc"}},"lastState":{},"ready":false,"restartCount":0,"image":"reg.gpl-headless-log-wsman.staging.gitpod-dev.com:30942/remote/01709d83-71a4-47fa-b14d-6482b3650d8c:latest","imageID":"reg.gpl-headless-log-wsman.staging.gitpod-dev.com:30222/remote/8e0bbcdf-a926-4670-8c40-b718f035b2ae@sha256:6987f020499b07d3e3762844b819481fd5e1a0b04fd34ad2a1a17dca0c827599","containerID":"containerd://c2fb575264ceeae177f754b0edd4dfbfc2439b2b9bdccab020dfa7fe494408cc","started":false}],"qosClass":"Burstable"}},"theiaService":{"kind":"Service","apiVersion":"v1","metadata":{"name":"ws-green-wombat-62dzneud-theia","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/services/ws-green-wombat-62dzneud-theia","uid":"67227f06-91de-44d4-83fe-0911cc6e3601","resourceVersion":"198744199","creationTimestamp":"2021-05-28T12:48:19Z","deletionTimestamp":"2021-05-28T12:49:46Z","deletionGracePeriodSeconds":0,"labels":{"app":"gitpod","component":"workspace","gpwsman":"true","headless":"true","metaID":"green-wombat-62dzneud","owner":"d98c5b92-2066-4fce-bea6-1e08b58642ab","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae","workspaceType":"prebuild"},"finalizers":["foregroundDeletion"]},"spec":{"ports":[{"name":"ide","protocol":"TCP","port":23000,"targetPort":23000},{"name":"supervisor","protocol":"TCP","port":22999,"targetPort":22999}],"selector":{"app":"gitpod","component":"workspace","gpwsman":"true","headless":"true","metaID":"green-wombat-62dzneud","owner":"d98c5b92-2066-4fce-bea6-1e08b58642ab","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae","workspaceType":"prebuild"},"clusterIP":"10.63.250.40","type":"ClusterIP","sessionAffinity":"None"},"status":{"loadBalancer":{}}},"portsService":{"kind":"Service","apiVersion":"v1","metadata":{"name":"ws-green-wombat-62dzneud-ports","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/services/ws-green-wombat-62dzneud-ports","uid":"1ebcfc6e-15c3-415e-9de5-6c7adc47d1a7","resourceVersion":"198744202","creationTimestamp":"2021-05-28T12:48:19Z","deletionTimestamp":"2021-05-28T12:49:46Z","deletionGracePeriodSeconds":0,"labels":{"gpwsman":"true","metaID":"green-wombat-62dzneud","serviceType":"ports","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae"},"annotations":{"gitpod/port-url-13001":"https://13001-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-1337":"https://1337-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-13444":"https://13444-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-3000":"https://3000-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-3001":"https://3001-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-3306":"https://3306-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-4000":"https://4000-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-5900":"https://5900-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-6080":"https://6080-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-7777":"https://7777-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-9229":"https://9229-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-9999":"https://9999-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com"},"finalizers":["foregroundDeletion"]},"spec":{"ports":[{"name":"p1337-public","protocol":"TCP","port":1337,"targetPort":1337},{"name":"p3000-public","protocol":"TCP","port":3000,"targetPort":3000},{"name":"p3001-public","protocol":"TCP","port":3001,"targetPort":3001},{"name":"p3306-public","protocol":"TCP","port":3306,"targetPort":3306},{"name":"p4000-public","protocol":"TCP","port":4000,"targetPort":4000},{"name":"p5900-public","protocol":"TCP","port":5900,"targetPort":5900},{"name":"p6080-private","protocol":"TCP","port":6080,"targetPort":6080},{"name":"p9229-public","protocol":"TCP","port":9229,"targetPort":9229},{"name":"p9999-public","protocol":"TCP","port":9999,"targetPort":9999},{"name":"p13001-public","protocol":"TCP","port":13001,"targetPort":13001},{"name":"p7777-public","protocol":"TCP","port":7777,"targetPort":7777},{"name":"p13444-public","protocol":"TCP","port":13444,"targetPort":13444}],"selector":{"gpwsman":"true","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae"},"clusterIP":"10.63.243.155","type":"ClusterIP","sessionAffinity":"None"},"status":{"loadBalancer":{}}},"events":[{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae - scheduled2zrpp","generateName":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae - scheduled","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae%20-%20scheduled2zrpp","uid":"e983c42a-b04a-48b6-b214-4fe60281b6ae","resourceVersion":"12819729","creationTimestamp":"2021-05-28T12:48:19Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e"},"reason":"Scheduled","message":"Placed pod [staging-gpl-headless-log-wsman/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae] on gke-dev-workload-1-49d27f81-pd35\n","source":{"component":"workspace-scheduler"},"firstTimestamp":"2021-05-28T12:48:19Z","lastTimestamp":"2021-05-28T12:48:19Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdaa3effefd","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdaa3effefd","uid":"63db3a49-fc8f-401a-bf37-28c88295fb14","resourceVersion":"12819730","creationTimestamp":"2021-05-28T12:48:21Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","apiVersion":"v1","resourceVersion":"198743315","fieldPath":"spec.containers{workspace}"},"reason":"Pulling","message":"Pulling image \"reg.gpl-headless-log-wsman.staging.gitpod-dev.com:30222/remote/8e0bbcdf-a926-4670-8c40-b718f035b2ae\"","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-pd35"},"firstTimestamp":"2021-05-28T12:48:21Z","lastTimestamp":"2021-05-28T12:48:21Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdb0a0a2c9c","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdb0a0a2c9c","uid":"5b9b3c37-4fb1-4035-b4b1-a13aa83704ae","resourceVersion":"12819731","creationTimestamp":"2021-05-28T12:48:22Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","apiVersion":"v1","resourceVersion":"198743315","fieldPath":"spec.containers{workspace}"},"reason":"Pulled","message":"Successfully pulled image \"reg.gpl-headless-log-wsman.staging.gitpod-dev.com:30222/remote/8e0bbcdf-a926-4670-8c40-b718f035b2ae\"","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-pd35"},"firstTimestamp":"2021-05-28T12:48:22Z","lastTimestamp":"2021-05-28T12:48:22Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdb128fe8e4","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdb128fe8e4","uid":"bd854c78-0373-41b0-8f17-017ff5e2d080","resourceVersion":"12819732","creationTimestamp":"2021-05-28T12:48:22Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","apiVersion":"v1","resourceVersion":"198743315","fieldPath":"spec.containers{workspace}"},"reason":"Created","message":"Created container workspace","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-pd35"},"firstTimestamp":"2021-05-28T12:48:22Z","lastTimestamp":"2021-05-28T12:48:22Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdb21e5d246","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdb21e5d246","uid":"524e07b2-1738-4ee2-b190-2ff5c0c53d40","resourceVersion":"12819733","creationTimestamp":"2021-05-28T12:48:23Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","apiVersion":"v1","resourceVersion":"198743315","fieldPath":"spec.containers{workspace}"},"reason":"Started","message":"Started container workspace","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-pd35"},"firstTimestamp":"2021-05-28T12:48:23Z","lastTimestamp":"2021-05-28T12:48:23Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdbcfee72b0","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdbcfee72b0","uid":"af454391-08ae-4f6c-9338-09bc228242a8","resourceVersion":"12819742","creationTimestamp":"2021-05-28T12:48:26Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","apiVersion":"v1","resourceVersion":"198743315","fieldPath":"spec.containers{workspace}"},"reason":"Unhealthy","message":"Readiness probe failed: Get http://10.60.61.170:22999/_supervisor/v1/status/content/wait/true: net/http: request canceled (Client.Timeout exceeded while awaiting headers)","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-pd35"},"firstTimestamp":"2021-05-28T12:48:26Z","lastTimestamp":"2021-05-28T12:48:27Z","count":2,"type":"Warning","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bee704e5de5","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bee704e5de5","uid":"fda4b916-769c-4167-a782-566fa1574edb","resourceVersion":"12819805","creationTimestamp":"2021-05-28T12:49:46Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","apiVersion":"v1","resourceVersion":"198743315","fieldPath":"spec.containers{workspace}"},"reason":"Unhealthy","message":"Readiness probe failed: Get http://10.60.61.170:22999/_supervisor/v1/status/content/wait/true: dial tcp 10.60.61.170:22999: connect: connection refused","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-pd35"},"firstTimestamp":"2021-05-28T12:49:46Z","lastTimestamp":"2021-05-28T12:49:46Z","count":1,"type":"Warning","eventTime":null,"reportingComponent":"","reportingInstance":""}]} \ No newline at end of file diff --git a/components/ws-manager/pkg/manager/testdata/status_prebuildSuccess_STOPPING00.json b/components/ws-manager/pkg/manager/testdata/status_prebuildSuccess_STOPPING00.json index 24251bb29526ce..efd9da90bb86a0 100644 --- a/components/ws-manager/pkg/manager/testdata/status_prebuildSuccess_STOPPING00.json +++ b/components/ws-manager/pkg/manager/testdata/status_prebuildSuccess_STOPPING00.json @@ -1 +1 @@ -{"pod":{"kind":"Pod","apiVersion":"v1","metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/pods/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","resourceVersion":"198744195","creationTimestamp":"2021-05-28T12:48:19Z","labels":{"app":"gitpod","component":"workspace","gitpod.io/networkpolicy":"default","gpwsman":"true","headless":"true","metaID":"green-wombat-62dzneud","owner":"d98c5b92-2066-4fce-bea6-1e08b58642ab","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae","workspaceType":"prebuild"},"annotations":{"cni.projectcalico.org/podIP":"10.60.61.170/32","container.apparmor.security.beta.kubernetes.io/workspace":"unconfined","gitpod.io/requiredNodeServices":"ws-daemon,registry-facade","gitpod/admission":"admit_owner_only","gitpod/contentInitializer":"[redacted]","gitpod/id":"8e0bbcdf-a926-4670-8c40-b718f035b2ae","gitpod/imageSpec":"CnRldS5nY3IuaW8vZ2l0cG9kLWNvcmUtZGV2L3JlZ2lzdHJ5L3dvcmtzcGFjZS1pbWFnZXM6ODFjNGZiNjAyYTU0MGQyNjFmMjEwY2ZjOGJhMDQzNWI2M2IyNDIzOGMxNzYyZWMwMjlkOGVkYWVjODE2YWZiNhJCZXUuZ2NyLmlvL2dpdHBvZC1jb3JlLWRldi9idWlsZC9pZGUvY29kZTpncGwtaGVhZGxlc3MtbG9nLXdzbWFuLjE3","gitpod/exposedPorts": "Cl4IuQoYASJXaHR0cHM6Ly8xMzM3LWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IuBcYASJXaHR0cHM6Ly8zMDAwLWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IuRcYASJXaHR0cHM6Ly8zMDAxLWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4I6hkYASJXaHR0cHM6Ly8zMzA2LWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IoB8YASJXaHR0cHM6Ly80MDAwLWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IjC4YASJXaHR0cHM6Ly81OTAwLWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tClwIwC8iV2h0dHBzOi8vNjA4MC1ncmVlbi13b21iYXQtNjJkem5ldWQud3MtZGV2LmdwbC1oZWFkbGVzcy1sb2ctd3NtYW4uc3RhZ2luZy5naXRwb2QtZGV2LmNvbQpeCI1IGAEiV2h0dHBzOi8vOTIyOS1ncmVlbi13b21iYXQtNjJkem5ldWQud3MtZGV2LmdwbC1oZWFkbGVzcy1sb2ctd3NtYW4uc3RhZ2luZy5naXRwb2QtZGV2LmNvbQpeCI9OGAEiV2h0dHBzOi8vOTk5OS1ncmVlbi13b21iYXQtNjJkem5ldWQud3MtZGV2LmdwbC1oZWFkbGVzcy1sb2ctd3NtYW4uc3RhZ2luZy5naXRwb2QtZGV2LmNvbQpfCMllGAEiWGh0dHBzOi8vMTMwMDEtZ3JlZW4td29tYmF0LTYyZHpuZXVkLndzLWRldi5ncGwtaGVhZGxlc3MtbG9nLXdzbWFuLnN0YWdpbmcuZ2l0cG9kLWRldi5jb20KXgjhPBgBIldodHRwczovLzc3NzctZ3JlZW4td29tYmF0LTYyZHpuZXVkLndzLWRldi5ncGwtaGVhZGxlc3MtbG9nLXdzbWFuLnN0YWdpbmcuZ2l0cG9kLWRldi5jb20KXwiEaRgBIlhodHRwczovLzEzNDQ0LWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29t","gitpod/ownerToken":"FZ2k9zbSCo9e85Y21yh.SHLJbya7pW2Y","gitpod/servicePrefix":"green-wombat-62dzneud","gitpod/url":"https://green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","kubernetes.io/psp":"staging-gpl-headless-log-wsman-ns-workspace","prometheus.io/path":"/metrics","prometheus.io/port":"23000","prometheus.io/scrape":"true","seccomp.security.alpha.kubernetes.io/pod":"localhost/workspace_default_gpl-headless-log-wsman.17.json"},"finalizers":["gitpod.io/finalizer"]},"spec":{"volumes":[{"name":"vol-this-workspace","hostPath":{"path":"/mnt/disks/ssd0/workspaces/8e0bbcdf-a926-4670-8c40-b718f035b2ae","type":"DirectoryOrCreate"}},{"name":"daemon-mount","hostPath":{"path":"/mnt/disks/ssd0/workspaces/8e0bbcdf-a926-4670-8c40-b718f035b2ae-daemon","type":"DirectoryOrCreate"}}],"containers":[{"name":"workspace","image":"reg.gpl-headless-log-wsman.staging.gitpod-dev.com:30222/remote/8e0bbcdf-a926-4670-8c40-b718f035b2ae","command":["/.supervisor/workspacekit","ring0"],"ports":[{"containerPort":23000,"protocol":"TCP"}],"env":[{"name":"GITPOD_REPO_ROOT","value":"/workspace/gitpod"},{"name":"GITPOD_CLI_APITOKEN","value":"eGnGrk5s7-.KCc15tXUtyKlzwlbjOBIs"},{"name":"GITPOD_WORKSPACE_ID","value":"green-wombat-62dzneud"},{"name":"GITPOD_INSTANCE_ID","value":"8e0bbcdf-a926-4670-8c40-b718f035b2ae"},{"name":"GITPOD_THEIA_PORT","value":"23000"},{"name":"THEIA_WORKSPACE_ROOT","value":"/workspace/gitpod/gitpod-ws.code-workspace"},{"name":"GITPOD_HOST","value":"https://gpl-headless-log-wsman.staging.gitpod-dev.com"},{"name":"GITPOD_WORKSPACE_URL","value":"https://green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com"},{"name":"THEIA_SUPERVISOR_TOKEN","value":"354c0b368f2b4a93b7b812564e663d23"},{"name":"THEIA_SUPERVISOR_ENDPOINT","value":":22999"},{"name":"THEIA_WEBVIEW_EXTERNAL_ENDPOINT","value":"webview-{{hostname}}"},{"name":"THEIA_MINI_BROWSER_HOST_PATTERN","value":"browser-{{hostname}}"},{"name":"GITPOD_GIT_USER_NAME","value":"Gero Posmyk-Leinemann"},{"name":"GITPOD_GIT_USER_EMAIL","value":"gero@gitpod.io"},{"name":"PREBUILD_PARAMS","value":"[redacted]"},{"name":"GITPOD_WORKSPACE_CONTEXT_URL","value":"prebuild/https://github.com/gitpod-io/gitpod/tree/gpl/test-prebuild"},{"name":"GITPOD_WORKSPACE_CONTEXT","value":"{\"ref\":\"gpl/test-prebuild\",\"refType\":\"branch\",\"isFile\":false,\"path\":\"\",\"title\":\"gitpod-io/gitpod - gpl/test-prebuild\",\"revision\":\"a1afe2bb7d454ea7a4194f363601a31ae319ce9c\",\"repository\":{\"cloneUrl\":\"https://github.com/gitpod-io/gitpod.git\",\"host\":\"github.com\",\"name\":\"gitpod\",\"owner\":\"gitpod-io\",\"private\":false}}"},{"name":"GITPOD_TASKS","value":"[{\"name\":\"Test Command\",\"init\":\"export PREBUILD_PARAMS=${PREBUILD_PARAMS:-\\\"100_500ms_30m\\\"}; go run ./main.go $PREBUILD_PARAMS\"}]"},{"name":"THEIA_SUPERVISOR_TOKENS","value":"[{\"tokenOTS\":\"https://gpl-headless-log-wsman.staging.gitpod-dev.com/api/ots/get/71ca5ce2-b15e-4a0e-8a0f-65964c509d40\",\"token\":\"ots\",\"kind\":\"gitpod\",\"host\":\"gpl-headless-log-wsman.staging.gitpod-dev.com\",\"scope\":[\"function:getWorkspace\",\"function:getLoggedInUser\",\"function:getPortAuthenticationToken\",\"function:getWorkspaceOwner\",\"function:getWorkspaceUsers\",\"function:isWorkspaceOwner\",\"function:controlAdmission\",\"function:setWorkspaceTimeout\",\"function:getWorkspaceTimeout\",\"function:sendHeartBeat\",\"function:getOpenPorts\",\"function:openPort\",\"function:closePort\",\"function:getLayout\",\"function:generateNewGitpodToken\",\"function:takeSnapshot\",\"function:storeLayout\",\"function:stopWorkspace\",\"function:getToken\",\"function:getContentBlobUploadUrl\",\"function:getContentBlobDownloadUrl\",\"function:accessCodeSyncStorage\",\"function:guessGitTokenScopes\",\"function:getEnvVars\",\"function:setEnvVar\",\"function:deleteEnvVar\",\"resource:workspace::green-wombat-62dzneud::get/update\",\"resource:workspaceInstance::8e0bbcdf-a926-4670-8c40-b718f035b2ae::get/update/delete\",\"resource:snapshot::ws-green-wombat-62dzneud::create\",\"resource:gitpodToken::*::create\",\"resource:userStorage::*::create/get/update\",\"resource:token::*::get\",\"resource:contentBlob::*::create/get\",\"resource:envVar::gitpod-io/gitpod::create/get/update/delete\"],\"expiryDate\":\"2021-05-29T12:48:19.234Z\",\"reuse\":2}]"},{"name":"GITPOD_RESOLVED_EXTENSIONS","value":"{\"vscode.bat@1.44.2\":{\"fullPluginName\":\"vscode.bat@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.clojure@1.44.2\":{\"fullPluginName\":\"vscode.clojure@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.coffeescript@1.44.2\":{\"fullPluginName\":\"vscode.coffeescript@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.cpp@1.44.2\":{\"fullPluginName\":\"vscode.cpp@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.csharp@1.44.2\":{\"fullPluginName\":\"vscode.csharp@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"llvm-vs-code-extensions.vscode-clangd@0.1.5\":{\"fullPluginName\":\"llvm-vs-code-extensions.vscode-clangd@0.1.5\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.css@1.51.1\":{\"fullPluginName\":\"vscode.css@1.51.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.css-language-features@1.51.1\":{\"fullPluginName\":\"vscode.css-language-features@1.51.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.debug-auto-launch@1.44.2\":{\"fullPluginName\":\"vscode.debug-auto-launch@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.emmet@1.44.2\":{\"fullPluginName\":\"vscode.emmet@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.fsharp@1.44.2\":{\"fullPluginName\":\"vscode.fsharp@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.go@1.44.2\":{\"fullPluginName\":\"vscode.go@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.groovy@1.44.2\":{\"fullPluginName\":\"vscode.groovy@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.handlebars@1.44.2\":{\"fullPluginName\":\"vscode.handlebars@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.hlsl@1.44.2\":{\"fullPluginName\":\"vscode.hlsl@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.html@1.51.1\":{\"fullPluginName\":\"vscode.html@1.51.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.html-language-features@1.51.1\":{\"fullPluginName\":\"vscode.html-language-features@1.51.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.ini@1.44.2\":{\"fullPluginName\":\"vscode.ini@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.java@1.53.2\":{\"fullPluginName\":\"vscode.java@1.53.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.javascript@1.44.2\":{\"fullPluginName\":\"vscode.javascript@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.json@1.44.2\":{\"fullPluginName\":\"vscode.json@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.json-language-features@1.46.1\":{\"fullPluginName\":\"vscode.json-language-features@1.46.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.less@1.44.2\":{\"fullPluginName\":\"vscode.less@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.log@1.44.2\":{\"fullPluginName\":\"vscode.log@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.lua@1.44.2\":{\"fullPluginName\":\"vscode.lua@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.make@1.44.2\":{\"fullPluginName\":\"vscode.make@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.markdown@1.44.2\":{\"fullPluginName\":\"vscode.markdown@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.npm@1.39.1\":{\"fullPluginName\":\"vscode.npm@1.39.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.objective-c@1.44.2\":{\"fullPluginName\":\"vscode.objective-c@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.perl@1.44.2\":{\"fullPluginName\":\"vscode.perl@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.php@1.44.2\":{\"fullPluginName\":\"vscode.php@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.powershell@1.44.2\":{\"fullPluginName\":\"vscode.powershell@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.pug@1.44.2\":{\"fullPluginName\":\"vscode.pug@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.python@1.47.3\":{\"fullPluginName\":\"vscode.python@1.47.3\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.r@1.44.2\":{\"fullPluginName\":\"vscode.r@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.razor@1.44.2\":{\"fullPluginName\":\"vscode.razor@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.ruby@1.44.2\":{\"fullPluginName\":\"vscode.ruby@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.rust@1.44.2\":{\"fullPluginName\":\"vscode.rust@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.scss@1.44.2\":{\"fullPluginName\":\"vscode.scss@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.shaderlab@1.44.2\":{\"fullPluginName\":\"vscode.shaderlab@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.shellscript@1.44.2\":{\"fullPluginName\":\"vscode.shellscript@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.sql@1.44.2\":{\"fullPluginName\":\"vscode.sql@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.swift@1.44.2\":{\"fullPluginName\":\"vscode.swift@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.typescript@1.44.2\":{\"fullPluginName\":\"vscode.typescript@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.typescript-language-features@1.44.2\":{\"fullPluginName\":\"vscode.typescript-language-features@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.vb@1.44.2\":{\"fullPluginName\":\"vscode.vb@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.xml@1.44.2\":{\"fullPluginName\":\"vscode.xml@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.yaml@1.44.2\":{\"fullPluginName\":\"vscode.yaml@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"redhat.java@0.75.0\":{\"fullPluginName\":\"redhat.java@0.75.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscjava.vscode-java-debug@0.27.1\":{\"fullPluginName\":\"vscjava.vscode-java-debug@0.27.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscjava.vscode-java-dependency@0.18.0\":{\"fullPluginName\":\"vscjava.vscode-java-dependency@0.18.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-vscode.node-debug@1.38.4\":{\"fullPluginName\":\"ms-vscode.node-debug@1.38.4\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-vscode.node-debug2@1.33.0\":{\"fullPluginName\":\"ms-vscode.node-debug2@1.33.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-python.python@2020.7.96456\":{\"fullPluginName\":\"ms-python.python@2020.7.96456\",\"url\":\"local\",\"kind\":\"builtin\"},\"redhat.vscode-xml@0.11.0\":{\"fullPluginName\":\"redhat.vscode-xml@0.11.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"redhat.vscode-yaml@0.8.0\":{\"fullPluginName\":\"redhat.vscode-yaml@0.8.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"bmewburn.vscode-intelephense-client@1.4.0\":{\"fullPluginName\":\"bmewburn.vscode-intelephense-client@1.4.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"felixfbecker.php-debug@1.13.0\":{\"fullPluginName\":\"felixfbecker.php-debug@1.13.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"rust-lang.rust@0.7.8\":{\"fullPluginName\":\"rust-lang.rust@0.7.8\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-abyss@1.44.2\":{\"fullPluginName\":\"vscode.theme-abyss@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-kimbie-dark@1.44.2\":{\"fullPluginName\":\"vscode.theme-kimbie-dark@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-monokai@1.44.2\":{\"fullPluginName\":\"vscode.theme-monokai@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-monokai-dimmed@1.44.2\":{\"fullPluginName\":\"vscode.theme-monokai-dimmed@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-quietlight@1.44.2\":{\"fullPluginName\":\"vscode.theme-quietlight@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-red@1.44.2\":{\"fullPluginName\":\"vscode.theme-red@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-solarized-dark@1.44.2\":{\"fullPluginName\":\"vscode.theme-solarized-dark@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-solarized-light@1.44.2\":{\"fullPluginName\":\"vscode.theme-solarized-light@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-tomorrow-night-blue@1.44.2\":{\"fullPluginName\":\"vscode.theme-tomorrow-night-blue@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.vscode-theme-seti@1.44.2\":{\"fullPluginName\":\"vscode.vscode-theme-seti@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.merge-conflict@1.44.2\":{\"fullPluginName\":\"vscode.merge-conflict@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-vscode.references-view@0.0.47\":{\"fullPluginName\":\"ms-vscode.references-view@0.0.47\",\"url\":\"local\",\"kind\":\"builtin\"},\"EditorConfig.EditorConfig@0.15.1\":{\"fullPluginName\":\"editorconfig.editorconfig@0.15.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.docker@1.47.3\":{\"fullPluginName\":\"vscode.docker@1.47.3\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-kubernetes-tools.vscode-kubernetes-tools\":{\"fullPluginName\":\"ms-kubernetes-tools.vscode-kubernetes-tools@1.3.3\",\"url\":\"https://open-vsx.org/api/ms-kubernetes-tools/vscode-kubernetes-tools/1.3.3/file/ms-kubernetes-tools.vscode-kubernetes-tools-1.3.3.vsix\",\"kind\":\"workspace\"},\"hashicorp.terraform\":{\"fullPluginName\":\"hashicorp.terraform@2.11.0\",\"url\":\"https://open-vsx.org/api/hashicorp/terraform/2.11.0/file/hashicorp.terraform-2.11.0.vsix\",\"kind\":\"workspace\"},\"zxh404.vscode-proto3\":{\"fullPluginName\":\"zxh404.vscode-proto3@0.5.4\",\"url\":\"https://open-vsx.org/api/zxh404/vscode-proto3/0.5.4/file/zxh404.vscode-proto3-0.5.4.vsix\",\"kind\":\"workspace\"},\"bajdzis.vscode-database\":{\"fullPluginName\":\"bajdzis.vscode-database@2.2.3\",\"url\":\"https://open-vsx.org/api/bajdzis/vscode-database/2.2.3/file/bajdzis.vscode-database-2.2.3.vsix\",\"kind\":\"workspace\"},\"stkb.rewrap\":{\"fullPluginName\":\"stkb.rewrap@1.14.0\",\"url\":\"https://open-vsx.org/api/stkb/rewrap/1.14.0/file/stkb.rewrap-1.14.0.vsix\",\"kind\":\"workspace\"},\"golang.go\":{\"fullPluginName\":\"golang.go@0.25.0\",\"url\":\"https://open-vsx.org/api/golang/Go/0.25.0/file/golang.Go-0.25.0.vsix\",\"kind\":\"workspace\"}}"},{"name":"GITPOD_EXTERNAL_EXTENSIONS","value":"[]"},{"name":"GITPOD_INTERVAL","value":"30000"},{"name":"GITPOD_MEMORY","value":"2415"},{"name":"GITPOD_HEADLESS","value":"true"}],"resources":{"limits":{"cpu":"5","memory":"12Gi"},"requests":{"cpu":"1m","ephemeral-storage":"5Gi","memory":"4608Mi"}},"volumeMounts":[{"name":"vol-this-workspace","mountPath":"/workspace","mountPropagation":"HostToContainer"},{"name":"daemon-mount","mountPath":"/.workspace","mountPropagation":"HostToContainer"}],"readinessProbe":{"httpGet":{"path":"/_supervisor/v1/status/content/wait/true","port":22999,"scheme":"HTTP"},"timeoutSeconds":1,"periodSeconds":1,"successThreshold":1,"failureThreshold":600},"terminationMessagePath":"/dev/termination-log","terminationMessagePolicy":"FallbackToLogsOnError","imagePullPolicy":"Always","securityContext":{"capabilities":{"add":["AUDIT_WRITE","FSETID","KILL","NET_BIND_SERVICE","SYS_PTRACE"],"drop":["SETPCAP","CHOWN","NET_RAW","DAC_OVERRIDE","FOWNER","SYS_CHROOT","SETFCAP","SETUID","SETGID"]},"privileged":false,"runAsUser":33333,"runAsGroup":33333,"runAsNonRoot":true,"readOnlyRootFilesystem":false,"allowPrivilegeEscalation":true}}],"restartPolicy":"Never","terminationGracePeriodSeconds":30,"dnsPolicy":"None","serviceAccountName":"workspace","serviceAccount":"workspace","automountServiceAccountToken":false,"nodeName":"gke-dev-workload-1-49d27f81-pd35","securityContext":{"supplementalGroups":[1],"fsGroup":1},"imagePullSecrets":[{"name":"gcp-sa-registry-auth"}],"affinity":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"gitpod.io/workload_workspace","operator":"Exists"}]}]}}},"schedulerName":"workspace-scheduler","tolerations":[{"key":"node.kubernetes.io/disk-pressure","operator":"Exists","effect":"NoExecute"},{"key":"node.kubernetes.io/memory-pressure","operator":"Exists","effect":"NoExecute"},{"key":"node.kubernetes.io/network-unavailable","operator":"Exists","effect":"NoExecute","tolerationSeconds":30},{"key":"node.kubernetes.io/not-ready","operator":"Exists","effect":"NoExecute","tolerationSeconds":300},{"key":"node.kubernetes.io/unreachable","operator":"Exists","effect":"NoExecute","tolerationSeconds":300}],"priority":0,"dnsConfig":{"nameservers":["1.1.1.1","8.8.8.8"]},"enableServiceLinks":false},"status":{"phase":"Succeeded","conditions":[{"type":"Initialized","status":"True","lastProbeTime":null,"lastTransitionTime":"2021-05-28T12:48:19Z","reason":"PodCompleted"},{"type":"Ready","status":"False","lastProbeTime":null,"lastTransitionTime":"2021-05-28T12:49:46Z","reason":"PodCompleted"},{"type":"ContainersReady","status":"False","lastProbeTime":null,"lastTransitionTime":"2021-05-28T12:49:46Z","reason":"PodCompleted"},{"type":"PodScheduled","status":"True","lastProbeTime":null,"lastTransitionTime":"2021-05-28T12:48:19Z"}],"hostIP":"10.132.15.221","podIP":"10.60.61.170","podIPs":[{"ip":"10.60.61.170"}],"startTime":"2021-05-28T12:48:19Z","containerStatuses":[{"name":"workspace","state":{"terminated":{"exitCode":0,"reason":"Completed","startedAt":"2021-05-28T12:48:23Z","finishedAt":"2021-05-28T12:49:45Z","containerID":"containerd://c2fb575264ceeae177f754b0edd4dfbfc2439b2b9bdccab020dfa7fe494408cc"}},"lastState":{},"ready":false,"restartCount":0,"image":"reg.gpl-headless-log-wsman.staging.gitpod-dev.com:30942/remote/01709d83-71a4-47fa-b14d-6482b3650d8c:latest","imageID":"reg.gpl-headless-log-wsman.staging.gitpod-dev.com:30222/remote/8e0bbcdf-a926-4670-8c40-b718f035b2ae@sha256:6987f020499b07d3e3762844b819481fd5e1a0b04fd34ad2a1a17dca0c827599","containerID":"containerd://c2fb575264ceeae177f754b0edd4dfbfc2439b2b9bdccab020dfa7fe494408cc","started":false}],"qosClass":"Burstable"}},"theiaService":{"kind":"Service","apiVersion":"v1","metadata":{"name":"ws-green-wombat-62dzneud-theia","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/services/ws-green-wombat-62dzneud-theia","uid":"67227f06-91de-44d4-83fe-0911cc6e3601","resourceVersion":"198743318","creationTimestamp":"2021-05-28T12:48:19Z","labels":{"app":"gitpod","component":"workspace","gpwsman":"true","headless":"true","metaID":"green-wombat-62dzneud","owner":"d98c5b92-2066-4fce-bea6-1e08b58642ab","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae","workspaceType":"prebuild"}},"spec":{"ports":[{"name":"ide","protocol":"TCP","port":23000,"targetPort":23000},{"name":"supervisor","protocol":"TCP","port":22999,"targetPort":22999}],"selector":{"app":"gitpod","component":"workspace","gpwsman":"true","headless":"true","metaID":"green-wombat-62dzneud","owner":"d98c5b92-2066-4fce-bea6-1e08b58642ab","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae","workspaceType":"prebuild"},"clusterIP":"10.63.250.40","type":"ClusterIP","sessionAffinity":"None"},"status":{"loadBalancer":{}}},"portsService":{"kind":"Service","apiVersion":"v1","metadata":{"name":"ws-green-wombat-62dzneud-ports","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/services/ws-green-wombat-62dzneud-ports","uid":"1ebcfc6e-15c3-415e-9de5-6c7adc47d1a7","resourceVersion":"198743322","creationTimestamp":"2021-05-28T12:48:19Z","labels":{"gpwsman":"true","metaID":"green-wombat-62dzneud","serviceType":"ports","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae"},"annotations":{"gitpod/port-url-13001":"https://13001-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-1337":"https://1337-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-13444":"https://13444-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-3000":"https://3000-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-3001":"https://3001-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-3306":"https://3306-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-4000":"https://4000-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-5900":"https://5900-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-6080":"https://6080-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-7777":"https://7777-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-9229":"https://9229-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-9999":"https://9999-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com"}},"spec":{"ports":[{"name":"p1337-public","protocol":"TCP","port":1337,"targetPort":1337},{"name":"p3000-public","protocol":"TCP","port":3000,"targetPort":3000},{"name":"p3001-public","protocol":"TCP","port":3001,"targetPort":3001},{"name":"p3306-public","protocol":"TCP","port":3306,"targetPort":3306},{"name":"p4000-public","protocol":"TCP","port":4000,"targetPort":4000},{"name":"p5900-public","protocol":"TCP","port":5900,"targetPort":5900},{"name":"p6080-private","protocol":"TCP","port":6080,"targetPort":6080},{"name":"p9229-public","protocol":"TCP","port":9229,"targetPort":9229},{"name":"p9999-public","protocol":"TCP","port":9999,"targetPort":9999},{"name":"p13001-public","protocol":"TCP","port":13001,"targetPort":13001},{"name":"p7777-public","protocol":"TCP","port":7777,"targetPort":7777},{"name":"p13444-public","protocol":"TCP","port":13444,"targetPort":13444}],"selector":{"gpwsman":"true","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae"},"clusterIP":"10.63.243.155","type":"ClusterIP","sessionAffinity":"None"},"status":{"loadBalancer":{}}},"events":[{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae - scheduled2zrpp","generateName":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae - scheduled","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae%20-%20scheduled2zrpp","uid":"e983c42a-b04a-48b6-b214-4fe60281b6ae","resourceVersion":"12819729","creationTimestamp":"2021-05-28T12:48:19Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e"},"reason":"Scheduled","message":"Placed pod [staging-gpl-headless-log-wsman/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae] on gke-dev-workload-1-49d27f81-pd35\n","source":{"component":"workspace-scheduler"},"firstTimestamp":"2021-05-28T12:48:19Z","lastTimestamp":"2021-05-28T12:48:19Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdaa3effefd","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdaa3effefd","uid":"63db3a49-fc8f-401a-bf37-28c88295fb14","resourceVersion":"12819730","creationTimestamp":"2021-05-28T12:48:21Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","apiVersion":"v1","resourceVersion":"198743315","fieldPath":"spec.containers{workspace}"},"reason":"Pulling","message":"Pulling image \"reg.gpl-headless-log-wsman.staging.gitpod-dev.com:30222/remote/8e0bbcdf-a926-4670-8c40-b718f035b2ae\"","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-pd35"},"firstTimestamp":"2021-05-28T12:48:21Z","lastTimestamp":"2021-05-28T12:48:21Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdb0a0a2c9c","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdb0a0a2c9c","uid":"5b9b3c37-4fb1-4035-b4b1-a13aa83704ae","resourceVersion":"12819731","creationTimestamp":"2021-05-28T12:48:22Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","apiVersion":"v1","resourceVersion":"198743315","fieldPath":"spec.containers{workspace}"},"reason":"Pulled","message":"Successfully pulled image \"reg.gpl-headless-log-wsman.staging.gitpod-dev.com:30222/remote/8e0bbcdf-a926-4670-8c40-b718f035b2ae\"","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-pd35"},"firstTimestamp":"2021-05-28T12:48:22Z","lastTimestamp":"2021-05-28T12:48:22Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdb128fe8e4","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdb128fe8e4","uid":"bd854c78-0373-41b0-8f17-017ff5e2d080","resourceVersion":"12819732","creationTimestamp":"2021-05-28T12:48:22Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","apiVersion":"v1","resourceVersion":"198743315","fieldPath":"spec.containers{workspace}"},"reason":"Created","message":"Created container workspace","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-pd35"},"firstTimestamp":"2021-05-28T12:48:22Z","lastTimestamp":"2021-05-28T12:48:22Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdb21e5d246","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdb21e5d246","uid":"524e07b2-1738-4ee2-b190-2ff5c0c53d40","resourceVersion":"12819733","creationTimestamp":"2021-05-28T12:48:23Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","apiVersion":"v1","resourceVersion":"198743315","fieldPath":"spec.containers{workspace}"},"reason":"Started","message":"Started container workspace","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-pd35"},"firstTimestamp":"2021-05-28T12:48:23Z","lastTimestamp":"2021-05-28T12:48:23Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdbcfee72b0","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdbcfee72b0","uid":"af454391-08ae-4f6c-9338-09bc228242a8","resourceVersion":"12819742","creationTimestamp":"2021-05-28T12:48:26Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","apiVersion":"v1","resourceVersion":"198743315","fieldPath":"spec.containers{workspace}"},"reason":"Unhealthy","message":"Readiness probe failed: Get http://10.60.61.170:22999/_supervisor/v1/status/content/wait/true: net/http: request canceled (Client.Timeout exceeded while awaiting headers)","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-pd35"},"firstTimestamp":"2021-05-28T12:48:26Z","lastTimestamp":"2021-05-28T12:48:27Z","count":2,"type":"Warning","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bee704e5de5","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bee704e5de5","uid":"fda4b916-769c-4167-a782-566fa1574edb","resourceVersion":"12819805","creationTimestamp":"2021-05-28T12:49:46Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","apiVersion":"v1","resourceVersion":"198743315","fieldPath":"spec.containers{workspace}"},"reason":"Unhealthy","message":"Readiness probe failed: Get http://10.60.61.170:22999/_supervisor/v1/status/content/wait/true: dial tcp 10.60.61.170:22999: connect: connection refused","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-pd35"},"firstTimestamp":"2021-05-28T12:49:46Z","lastTimestamp":"2021-05-28T12:49:46Z","count":1,"type":"Warning","eventTime":null,"reportingComponent":"","reportingInstance":""}]} \ No newline at end of file +{"pod":{"kind":"Pod","apiVersion":"v1","metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/pods/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","resourceVersion":"198744195","creationTimestamp":"2021-05-28T12:48:19Z","labels":{"app":"gitpod","component":"workspace","gitpod.io/networkpolicy":"default","gpwsman":"true","headless":"true","metaID":"green-wombat-62dzneud","owner":"d98c5b92-2066-4fce-bea6-1e08b58642ab","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae","workspaceType":"prebuild"},"annotations":{"cni.projectcalico.org/podIP":"10.60.61.170/32","container.apparmor.security.beta.kubernetes.io/workspace":"unconfined","gitpod.io/requiredNodeServices":"ws-daemon,registry-facade","gitpod/admission":"admit_owner_only","gitpod/contentInitializer":"[redacted]","gitpod/id":"8e0bbcdf-a926-4670-8c40-b718f035b2ae","gitpod/imageSpec":"CnRldS5nY3IuaW8vZ2l0cG9kLWNvcmUtZGV2L3JlZ2lzdHJ5L3dvcmtzcGFjZS1pbWFnZXM6ODFjNGZiNjAyYTU0MGQyNjFmMjEwY2ZjOGJhMDQzNWI2M2IyNDIzOGMxNzYyZWMwMjlkOGVkYWVjODE2YWZiNhJCZXUuZ2NyLmlvL2dpdHBvZC1jb3JlLWRldi9idWlsZC9pZGUvY29kZTpncGwtaGVhZGxlc3MtbG9nLXdzbWFuLjE3","gitpod/exposedPorts": "Cl4IuQoYASJXaHR0cHM6Ly8xMzM3LWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IuBcYASJXaHR0cHM6Ly8zMDAwLWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IuRcYASJXaHR0cHM6Ly8zMDAxLWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4I6hkYASJXaHR0cHM6Ly8zMzA2LWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IoB8YASJXaHR0cHM6Ly80MDAwLWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IjC4YASJXaHR0cHM6Ly81OTAwLWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tClwIwC8iV2h0dHBzOi8vNjA4MC1ncmVlbi13b21iYXQtNjJkem5ldWQud3MtZGV2LmdwbC1oZWFkbGVzcy1sb2ctd3NtYW4uc3RhZ2luZy5naXRwb2QtZGV2LmNvbQpeCI1IGAEiV2h0dHBzOi8vOTIyOS1ncmVlbi13b21iYXQtNjJkem5ldWQud3MtZGV2LmdwbC1oZWFkbGVzcy1sb2ctd3NtYW4uc3RhZ2luZy5naXRwb2QtZGV2LmNvbQpeCI9OGAEiV2h0dHBzOi8vOTk5OS1ncmVlbi13b21iYXQtNjJkem5ldWQud3MtZGV2LmdwbC1oZWFkbGVzcy1sb2ctd3NtYW4uc3RhZ2luZy5naXRwb2QtZGV2LmNvbQpfCMllGAEiWGh0dHBzOi8vMTMwMDEtZ3JlZW4td29tYmF0LTYyZHpuZXVkLndzLWRldi5ncGwtaGVhZGxlc3MtbG9nLXdzbWFuLnN0YWdpbmcuZ2l0cG9kLWRldi5jb20KXgjhPBgBIldodHRwczovLzc3NzctZ3JlZW4td29tYmF0LTYyZHpuZXVkLndzLWRldi5ncGwtaGVhZGxlc3MtbG9nLXdzbWFuLnN0YWdpbmcuZ2l0cG9kLWRldi5jb20KXwiEaRgBIlhodHRwczovLzEzNDQ0LWdyZWVuLXdvbWJhdC02MmR6bmV1ZC53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29t","gitpod/ownerToken":"FZ2k9zbSCo9e85Y21yh.SHLJbya7pW2Y","gitpod/servicePrefix":"green-wombat-62dzneud","gitpod/url":"https://green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","kubernetes.io/psp":"staging-gpl-headless-log-wsman-ns-workspace","prometheus.io/path":"/metrics","prometheus.io/port":"23000","prometheus.io/scrape":"true","seccomp.security.alpha.kubernetes.io/pod":"localhost/workspace_default_gpl-headless-log-wsman.17.json"},"finalizers":["gitpod.io/finalizer"]},"spec":{"volumes":[{"name":"vol-this-workspace","hostPath":{"path":"/mnt/disks/ssd0/workspaces/8e0bbcdf-a926-4670-8c40-b718f035b2ae","type":"DirectoryOrCreate"}},{"name":"daemon-mount","hostPath":{"path":"/mnt/disks/ssd0/workspaces/8e0bbcdf-a926-4670-8c40-b718f035b2ae-daemon","type":"DirectoryOrCreate"}}],"containers":[{"name":"workspace","image":"reg.gpl-headless-log-wsman.staging.gitpod-dev.com:30222/remote/8e0bbcdf-a926-4670-8c40-b718f035b2ae","command":["/.supervisor/workspacekit","ring0"],"ports":[{"containerPort":23000,"protocol":"TCP"}],"env":[{"name":"GITPOD_REPO_ROOT","value":"/workspace/gitpod"},{"name":"GITPOD_CLI_APITOKEN","value":"eGnGrk5s7-.KCc15tXUtyKlzwlbjOBIs"},{"name":"GITPOD_WORKSPACE_ID","value":"green-wombat-62dzneud"},{"name":"GITPOD_INSTANCE_ID","value":"8e0bbcdf-a926-4670-8c40-b718f035b2ae"},{"name":"GITPOD_THEIA_PORT","value":"23000"},{"name":"THEIA_WORKSPACE_ROOT","value":"/workspace/gitpod/gitpod-ws.code-workspace"},{"name":"GITPOD_HOST","value":"https://gpl-headless-log-wsman.staging.gitpod-dev.com"},{"name":"GITPOD_WORKSPACE_URL","value":"https://green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com"},{"name":"THEIA_SUPERVISOR_TOKEN","value":"354c0b368f2b4a93b7b812564e663d23"},{"name":"THEIA_SUPERVISOR_ENDPOINT","value":":22999"},{"name":"THEIA_WEBVIEW_EXTERNAL_ENDPOINT","value":"webview-{{hostname}}"},{"name":"THEIA_MINI_BROWSER_HOST_PATTERN","value":"browser-{{hostname}}"},{"name":"GITPOD_GIT_USER_NAME","value":"Gero Posmyk-Leinemann"},{"name":"GITPOD_GIT_USER_EMAIL","value":"gero@gitpod.io"},{"name":"PREBUILD_PARAMS","value":"[redacted]"},{"name":"GITPOD_WORKSPACE_CONTEXT_URL","value":"prebuild/https://github.com/gitpod-io/gitpod/tree/gpl/test-prebuild"},{"name":"GITPOD_WORKSPACE_CONTEXT","value":"{\"ref\":\"gpl/test-prebuild\",\"refType\":\"branch\",\"isFile\":false,\"path\":\"\",\"title\":\"gitpod-io/gitpod - gpl/test-prebuild\",\"revision\":\"a1afe2bb7d454ea7a4194f363601a31ae319ce9c\",\"repository\":{\"cloneUrl\":\"https://github.com/gitpod-io/gitpod.git\",\"host\":\"github.com\",\"name\":\"gitpod\",\"owner\":\"gitpod-io\",\"private\":false}}"},{"name":"GITPOD_TASKS","value":"[{\"name\":\"Test Command\",\"init\":\"export PREBUILD_PARAMS=${PREBUILD_PARAMS:-\\\"100_500ms_30m\\\"}; go run ./main.go $PREBUILD_PARAMS\"}]"},{"name":"THEIA_SUPERVISOR_TOKENS","value":"[{\"tokenOTS\":\"https://gpl-headless-log-wsman.staging.gitpod-dev.com/api/ots/get/71ca5ce2-b15e-4a0e-8a0f-65964c509d40\",\"token\":\"ots\",\"kind\":\"gitpod\",\"host\":\"gpl-headless-log-wsman.staging.gitpod-dev.com\",\"scope\":[\"function:getWorkspace\",\"function:getLoggedInUser\",\"function:getPortAuthenticationToken\",\"function:getWorkspaceOwner\",\"function:getWorkspaceUsers\",\"function:isWorkspaceOwner\",\"function:controlAdmission\",\"function:setWorkspaceTimeout\",\"function:getWorkspaceTimeout\",\"function:sendHeartBeat\",\"function:getOpenPorts\",\"function:openPort\",\"function:closePort\",\"function:getLayout\",\"function:generateNewGitpodToken\",\"function:takeSnapshot\",\"function:storeLayout\",\"function:stopWorkspace\",\"function:getToken\",\"function:getContentBlobUploadUrl\",\"function:getContentBlobDownloadUrl\",\"function:accessCodeSyncStorage\",\"function:guessGitTokenScopes\",\"function:getEnvVars\",\"function:setEnvVar\",\"function:deleteEnvVar\",\"resource:workspace::green-wombat-62dzneud::get/update\",\"resource:workspaceInstance::8e0bbcdf-a926-4670-8c40-b718f035b2ae::get/update/delete\",\"resource:snapshot::ws-green-wombat-62dzneud::create\",\"resource:gitpodToken::*::create\",\"resource:userStorage::*::create/get/update\",\"resource:token::*::get\",\"resource:contentBlob::*::create/get\",\"resource:envVar::gitpod-io/gitpod::create/get/update/delete\"],\"expiryDate\":\"2021-05-29T12:48:19.234Z\",\"reuse\":2}]"},{"name":"GITPOD_RESOLVED_EXTENSIONS","value":"{\"vscode.bat@1.44.2\":{\"fullPluginName\":\"vscode.bat@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.clojure@1.44.2\":{\"fullPluginName\":\"vscode.clojure@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.coffeescript@1.44.2\":{\"fullPluginName\":\"vscode.coffeescript@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.cpp@1.44.2\":{\"fullPluginName\":\"vscode.cpp@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.csharp@1.44.2\":{\"fullPluginName\":\"vscode.csharp@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"llvm-vs-code-extensions.vscode-clangd@0.1.5\":{\"fullPluginName\":\"llvm-vs-code-extensions.vscode-clangd@0.1.5\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.css@1.51.1\":{\"fullPluginName\":\"vscode.css@1.51.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.css-language-features@1.51.1\":{\"fullPluginName\":\"vscode.css-language-features@1.51.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.debug-auto-launch@1.44.2\":{\"fullPluginName\":\"vscode.debug-auto-launch@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.emmet@1.44.2\":{\"fullPluginName\":\"vscode.emmet@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.fsharp@1.44.2\":{\"fullPluginName\":\"vscode.fsharp@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.go@1.44.2\":{\"fullPluginName\":\"vscode.go@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.groovy@1.44.2\":{\"fullPluginName\":\"vscode.groovy@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.handlebars@1.44.2\":{\"fullPluginName\":\"vscode.handlebars@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.hlsl@1.44.2\":{\"fullPluginName\":\"vscode.hlsl@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.html@1.51.1\":{\"fullPluginName\":\"vscode.html@1.51.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.html-language-features@1.51.1\":{\"fullPluginName\":\"vscode.html-language-features@1.51.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.ini@1.44.2\":{\"fullPluginName\":\"vscode.ini@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.java@1.53.2\":{\"fullPluginName\":\"vscode.java@1.53.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.javascript@1.44.2\":{\"fullPluginName\":\"vscode.javascript@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.json@1.44.2\":{\"fullPluginName\":\"vscode.json@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.json-language-features@1.46.1\":{\"fullPluginName\":\"vscode.json-language-features@1.46.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.less@1.44.2\":{\"fullPluginName\":\"vscode.less@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.log@1.44.2\":{\"fullPluginName\":\"vscode.log@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.lua@1.44.2\":{\"fullPluginName\":\"vscode.lua@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.make@1.44.2\":{\"fullPluginName\":\"vscode.make@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.markdown@1.44.2\":{\"fullPluginName\":\"vscode.markdown@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.npm@1.39.1\":{\"fullPluginName\":\"vscode.npm@1.39.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.objective-c@1.44.2\":{\"fullPluginName\":\"vscode.objective-c@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.perl@1.44.2\":{\"fullPluginName\":\"vscode.perl@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.php@1.44.2\":{\"fullPluginName\":\"vscode.php@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.powershell@1.44.2\":{\"fullPluginName\":\"vscode.powershell@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.pug@1.44.2\":{\"fullPluginName\":\"vscode.pug@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.python@1.47.3\":{\"fullPluginName\":\"vscode.python@1.47.3\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.r@1.44.2\":{\"fullPluginName\":\"vscode.r@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.razor@1.44.2\":{\"fullPluginName\":\"vscode.razor@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.ruby@1.44.2\":{\"fullPluginName\":\"vscode.ruby@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.rust@1.44.2\":{\"fullPluginName\":\"vscode.rust@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.scss@1.44.2\":{\"fullPluginName\":\"vscode.scss@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.shaderlab@1.44.2\":{\"fullPluginName\":\"vscode.shaderlab@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.shellscript@1.44.2\":{\"fullPluginName\":\"vscode.shellscript@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.sql@1.44.2\":{\"fullPluginName\":\"vscode.sql@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.swift@1.44.2\":{\"fullPluginName\":\"vscode.swift@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.typescript@1.44.2\":{\"fullPluginName\":\"vscode.typescript@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.typescript-language-features@1.44.2\":{\"fullPluginName\":\"vscode.typescript-language-features@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.vb@1.44.2\":{\"fullPluginName\":\"vscode.vb@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.xml@1.44.2\":{\"fullPluginName\":\"vscode.xml@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.yaml@1.44.2\":{\"fullPluginName\":\"vscode.yaml@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"redhat.java@0.75.0\":{\"fullPluginName\":\"redhat.java@0.75.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscjava.vscode-java-debug@0.27.1\":{\"fullPluginName\":\"vscjava.vscode-java-debug@0.27.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscjava.vscode-java-dependency@0.18.0\":{\"fullPluginName\":\"vscjava.vscode-java-dependency@0.18.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-vscode.node-debug@1.38.4\":{\"fullPluginName\":\"ms-vscode.node-debug@1.38.4\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-vscode.node-debug2@1.33.0\":{\"fullPluginName\":\"ms-vscode.node-debug2@1.33.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-python.python@2020.7.96456\":{\"fullPluginName\":\"ms-python.python@2020.7.96456\",\"url\":\"local\",\"kind\":\"builtin\"},\"redhat.vscode-xml@0.11.0\":{\"fullPluginName\":\"redhat.vscode-xml@0.11.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"redhat.vscode-yaml@0.8.0\":{\"fullPluginName\":\"redhat.vscode-yaml@0.8.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"bmewburn.vscode-intelephense-client@1.4.0\":{\"fullPluginName\":\"bmewburn.vscode-intelephense-client@1.4.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"felixfbecker.php-debug@1.13.0\":{\"fullPluginName\":\"felixfbecker.php-debug@1.13.0\",\"url\":\"local\",\"kind\":\"builtin\"},\"rust-lang.rust@0.7.8\":{\"fullPluginName\":\"rust-lang.rust@0.7.8\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-abyss@1.44.2\":{\"fullPluginName\":\"vscode.theme-abyss@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-kimbie-dark@1.44.2\":{\"fullPluginName\":\"vscode.theme-kimbie-dark@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-monokai@1.44.2\":{\"fullPluginName\":\"vscode.theme-monokai@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-monokai-dimmed@1.44.2\":{\"fullPluginName\":\"vscode.theme-monokai-dimmed@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-quietlight@1.44.2\":{\"fullPluginName\":\"vscode.theme-quietlight@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-red@1.44.2\":{\"fullPluginName\":\"vscode.theme-red@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-solarized-dark@1.44.2\":{\"fullPluginName\":\"vscode.theme-solarized-dark@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-solarized-light@1.44.2\":{\"fullPluginName\":\"vscode.theme-solarized-light@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.theme-tomorrow-night-blue@1.44.2\":{\"fullPluginName\":\"vscode.theme-tomorrow-night-blue@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.vscode-theme-seti@1.44.2\":{\"fullPluginName\":\"vscode.vscode-theme-seti@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.merge-conflict@1.44.2\":{\"fullPluginName\":\"vscode.merge-conflict@1.44.2\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-vscode.references-view@0.0.47\":{\"fullPluginName\":\"ms-vscode.references-view@0.0.47\",\"url\":\"local\",\"kind\":\"builtin\"},\"EditorConfig.EditorConfig@0.15.1\":{\"fullPluginName\":\"editorconfig.editorconfig@0.15.1\",\"url\":\"local\",\"kind\":\"builtin\"},\"vscode.docker@1.47.3\":{\"fullPluginName\":\"vscode.docker@1.47.3\",\"url\":\"local\",\"kind\":\"builtin\"},\"ms-kubernetes-tools.vscode-kubernetes-tools\":{\"fullPluginName\":\"ms-kubernetes-tools.vscode-kubernetes-tools@1.3.3\",\"url\":\"https://open-vsx.org/api/ms-kubernetes-tools/vscode-kubernetes-tools/1.3.3/file/ms-kubernetes-tools.vscode-kubernetes-tools-1.3.3.vsix\",\"kind\":\"workspace\"},\"hashicorp.terraform\":{\"fullPluginName\":\"hashicorp.terraform@2.11.0\",\"url\":\"https://open-vsx.org/api/hashicorp/terraform/2.11.0/file/hashicorp.terraform-2.11.0.vsix\",\"kind\":\"workspace\"},\"zxh404.vscode-proto3\":{\"fullPluginName\":\"zxh404.vscode-proto3@0.5.4\",\"url\":\"https://open-vsx.org/api/zxh404/vscode-proto3/0.5.4/file/zxh404.vscode-proto3-0.5.4.vsix\",\"kind\":\"workspace\"},\"bajdzis.vscode-database\":{\"fullPluginName\":\"bajdzis.vscode-database@2.2.3\",\"url\":\"https://open-vsx.org/api/bajdzis/vscode-database/2.2.3/file/bajdzis.vscode-database-2.2.3.vsix\",\"kind\":\"workspace\"},\"stkb.rewrap\":{\"fullPluginName\":\"stkb.rewrap@1.14.0\",\"url\":\"https://open-vsx.org/api/stkb/rewrap/1.14.0/file/stkb.rewrap-1.14.0.vsix\",\"kind\":\"workspace\"},\"golang.go\":{\"fullPluginName\":\"golang.go@0.25.0\",\"url\":\"https://open-vsx.org/api/golang/Go/0.25.0/file/golang.Go-0.25.0.vsix\",\"kind\":\"workspace\"}}"},{"name":"GITPOD_EXTERNAL_EXTENSIONS","value":"[]"},{"name":"GITPOD_INTERVAL","value":"30000"},{"name":"GITPOD_MEMORY","value":"2415"},{"name":"GITPOD_HEADLESS","value":"true"}],"resources":{"limits":{"cpu":"5","memory":"12Gi"},"requests":{"cpu":"1m","ephemeral-storage":"5Gi","memory":"4608Mi"}},"volumeMounts":[{"name":"vol-this-workspace","mountPath":"/workspace","mountPropagation":"HostToContainer"},{"name":"daemon-mount","mountPath":"/.workspace","mountPropagation":"HostToContainer"}],"readinessProbe":{"httpGet":{"path":"/_supervisor/v1/status/content/wait/true","port":22999,"scheme":"HTTP"},"timeoutSeconds":1,"periodSeconds":1,"successThreshold":1,"failureThreshold":600},"terminationMessagePath":"/dev/termination-log","terminationMessagePolicy":"FallbackToLogsOnError","imagePullPolicy":"Always","securityContext":{"capabilities":{"add":["AUDIT_WRITE","FSETID","KILL","NET_BIND_SERVICE","SYS_PTRACE"],"drop":["SETPCAP","CHOWN","NET_RAW","DAC_OVERRIDE","FOWNER","SYS_CHROOT","SETFCAP","SETUID","SETGID"]},"privileged":false,"runAsUser":33333,"runAsGroup":33333,"runAsNonRoot":true,"readOnlyRootFilesystem":false,"allowPrivilegeEscalation":true}}],"restartPolicy":"Never","terminationGracePeriodSeconds":30,"dnsPolicy":"None","serviceAccountName":"workspace","serviceAccount":"workspace","automountServiceAccountToken":false,"nodeName":"gke-dev-workload-1-49d27f81-pd35","securityContext":{"supplementalGroups":[1],"fsGroup":1},"imagePullSecrets":[{"name":"gcp-sa-registry-auth"}],"affinity":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"gitpod.io/workload_workspace","operator":"Exists"}]}]}}},"tolerations":[{"key":"node.kubernetes.io/disk-pressure","operator":"Exists","effect":"NoExecute"},{"key":"node.kubernetes.io/memory-pressure","operator":"Exists","effect":"NoExecute"},{"key":"node.kubernetes.io/network-unavailable","operator":"Exists","effect":"NoExecute","tolerationSeconds":30},{"key":"node.kubernetes.io/not-ready","operator":"Exists","effect":"NoExecute","tolerationSeconds":300},{"key":"node.kubernetes.io/unreachable","operator":"Exists","effect":"NoExecute","tolerationSeconds":300}],"priority":0,"dnsConfig":{"nameservers":["1.1.1.1","8.8.8.8"]},"enableServiceLinks":false},"status":{"phase":"Succeeded","conditions":[{"type":"Initialized","status":"True","lastProbeTime":null,"lastTransitionTime":"2021-05-28T12:48:19Z","reason":"PodCompleted"},{"type":"Ready","status":"False","lastProbeTime":null,"lastTransitionTime":"2021-05-28T12:49:46Z","reason":"PodCompleted"},{"type":"ContainersReady","status":"False","lastProbeTime":null,"lastTransitionTime":"2021-05-28T12:49:46Z","reason":"PodCompleted"},{"type":"PodScheduled","status":"True","lastProbeTime":null,"lastTransitionTime":"2021-05-28T12:48:19Z"}],"hostIP":"10.132.15.221","podIP":"10.60.61.170","podIPs":[{"ip":"10.60.61.170"}],"startTime":"2021-05-28T12:48:19Z","containerStatuses":[{"name":"workspace","state":{"terminated":{"exitCode":0,"reason":"Completed","startedAt":"2021-05-28T12:48:23Z","finishedAt":"2021-05-28T12:49:45Z","containerID":"containerd://c2fb575264ceeae177f754b0edd4dfbfc2439b2b9bdccab020dfa7fe494408cc"}},"lastState":{},"ready":false,"restartCount":0,"image":"reg.gpl-headless-log-wsman.staging.gitpod-dev.com:30942/remote/01709d83-71a4-47fa-b14d-6482b3650d8c:latest","imageID":"reg.gpl-headless-log-wsman.staging.gitpod-dev.com:30222/remote/8e0bbcdf-a926-4670-8c40-b718f035b2ae@sha256:6987f020499b07d3e3762844b819481fd5e1a0b04fd34ad2a1a17dca0c827599","containerID":"containerd://c2fb575264ceeae177f754b0edd4dfbfc2439b2b9bdccab020dfa7fe494408cc","started":false}],"qosClass":"Burstable"}},"theiaService":{"kind":"Service","apiVersion":"v1","metadata":{"name":"ws-green-wombat-62dzneud-theia","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/services/ws-green-wombat-62dzneud-theia","uid":"67227f06-91de-44d4-83fe-0911cc6e3601","resourceVersion":"198743318","creationTimestamp":"2021-05-28T12:48:19Z","labels":{"app":"gitpod","component":"workspace","gpwsman":"true","headless":"true","metaID":"green-wombat-62dzneud","owner":"d98c5b92-2066-4fce-bea6-1e08b58642ab","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae","workspaceType":"prebuild"}},"spec":{"ports":[{"name":"ide","protocol":"TCP","port":23000,"targetPort":23000},{"name":"supervisor","protocol":"TCP","port":22999,"targetPort":22999}],"selector":{"app":"gitpod","component":"workspace","gpwsman":"true","headless":"true","metaID":"green-wombat-62dzneud","owner":"d98c5b92-2066-4fce-bea6-1e08b58642ab","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae","workspaceType":"prebuild"},"clusterIP":"10.63.250.40","type":"ClusterIP","sessionAffinity":"None"},"status":{"loadBalancer":{}}},"portsService":{"kind":"Service","apiVersion":"v1","metadata":{"name":"ws-green-wombat-62dzneud-ports","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/services/ws-green-wombat-62dzneud-ports","uid":"1ebcfc6e-15c3-415e-9de5-6c7adc47d1a7","resourceVersion":"198743322","creationTimestamp":"2021-05-28T12:48:19Z","labels":{"gpwsman":"true","metaID":"green-wombat-62dzneud","serviceType":"ports","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae"},"annotations":{"gitpod/port-url-13001":"https://13001-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-1337":"https://1337-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-13444":"https://13444-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-3000":"https://3000-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-3001":"https://3001-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-3306":"https://3306-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-4000":"https://4000-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-5900":"https://5900-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-6080":"https://6080-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-7777":"https://7777-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-9229":"https://9229-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com","gitpod/port-url-9999":"https://9999-green-wombat-62dzneud.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com"}},"spec":{"ports":[{"name":"p1337-public","protocol":"TCP","port":1337,"targetPort":1337},{"name":"p3000-public","protocol":"TCP","port":3000,"targetPort":3000},{"name":"p3001-public","protocol":"TCP","port":3001,"targetPort":3001},{"name":"p3306-public","protocol":"TCP","port":3306,"targetPort":3306},{"name":"p4000-public","protocol":"TCP","port":4000,"targetPort":4000},{"name":"p5900-public","protocol":"TCP","port":5900,"targetPort":5900},{"name":"p6080-private","protocol":"TCP","port":6080,"targetPort":6080},{"name":"p9229-public","protocol":"TCP","port":9229,"targetPort":9229},{"name":"p9999-public","protocol":"TCP","port":9999,"targetPort":9999},{"name":"p13001-public","protocol":"TCP","port":13001,"targetPort":13001},{"name":"p7777-public","protocol":"TCP","port":7777,"targetPort":7777},{"name":"p13444-public","protocol":"TCP","port":13444,"targetPort":13444}],"selector":{"gpwsman":"true","workspaceID":"8e0bbcdf-a926-4670-8c40-b718f035b2ae"},"clusterIP":"10.63.243.155","type":"ClusterIP","sessionAffinity":"None"},"status":{"loadBalancer":{}}},"events":[{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae - scheduled2zrpp","generateName":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae - scheduled","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae%20-%20scheduled2zrpp","uid":"e983c42a-b04a-48b6-b214-4fe60281b6ae","resourceVersion":"12819729","creationTimestamp":"2021-05-28T12:48:19Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e"},"reason":"Scheduled","message":"Placed pod [staging-gpl-headless-log-wsman/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae] on gke-dev-workload-1-49d27f81-pd35\n","source":{"component":"workspace-scheduler"},"firstTimestamp":"2021-05-28T12:48:19Z","lastTimestamp":"2021-05-28T12:48:19Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdaa3effefd","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdaa3effefd","uid":"63db3a49-fc8f-401a-bf37-28c88295fb14","resourceVersion":"12819730","creationTimestamp":"2021-05-28T12:48:21Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","apiVersion":"v1","resourceVersion":"198743315","fieldPath":"spec.containers{workspace}"},"reason":"Pulling","message":"Pulling image \"reg.gpl-headless-log-wsman.staging.gitpod-dev.com:30222/remote/8e0bbcdf-a926-4670-8c40-b718f035b2ae\"","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-pd35"},"firstTimestamp":"2021-05-28T12:48:21Z","lastTimestamp":"2021-05-28T12:48:21Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdb0a0a2c9c","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdb0a0a2c9c","uid":"5b9b3c37-4fb1-4035-b4b1-a13aa83704ae","resourceVersion":"12819731","creationTimestamp":"2021-05-28T12:48:22Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","apiVersion":"v1","resourceVersion":"198743315","fieldPath":"spec.containers{workspace}"},"reason":"Pulled","message":"Successfully pulled image \"reg.gpl-headless-log-wsman.staging.gitpod-dev.com:30222/remote/8e0bbcdf-a926-4670-8c40-b718f035b2ae\"","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-pd35"},"firstTimestamp":"2021-05-28T12:48:22Z","lastTimestamp":"2021-05-28T12:48:22Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdb128fe8e4","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdb128fe8e4","uid":"bd854c78-0373-41b0-8f17-017ff5e2d080","resourceVersion":"12819732","creationTimestamp":"2021-05-28T12:48:22Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","apiVersion":"v1","resourceVersion":"198743315","fieldPath":"spec.containers{workspace}"},"reason":"Created","message":"Created container workspace","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-pd35"},"firstTimestamp":"2021-05-28T12:48:22Z","lastTimestamp":"2021-05-28T12:48:22Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdb21e5d246","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdb21e5d246","uid":"524e07b2-1738-4ee2-b190-2ff5c0c53d40","resourceVersion":"12819733","creationTimestamp":"2021-05-28T12:48:23Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","apiVersion":"v1","resourceVersion":"198743315","fieldPath":"spec.containers{workspace}"},"reason":"Started","message":"Started container workspace","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-pd35"},"firstTimestamp":"2021-05-28T12:48:23Z","lastTimestamp":"2021-05-28T12:48:23Z","count":1,"type":"Normal","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdbcfee72b0","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bdbcfee72b0","uid":"af454391-08ae-4f6c-9338-09bc228242a8","resourceVersion":"12819742","creationTimestamp":"2021-05-28T12:48:26Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","apiVersion":"v1","resourceVersion":"198743315","fieldPath":"spec.containers{workspace}"},"reason":"Unhealthy","message":"Readiness probe failed: Get http://10.60.61.170:22999/_supervisor/v1/status/content/wait/true: net/http: request canceled (Client.Timeout exceeded while awaiting headers)","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-pd35"},"firstTimestamp":"2021-05-28T12:48:26Z","lastTimestamp":"2021-05-28T12:48:27Z","count":2,"type":"Warning","eventTime":null,"reportingComponent":"","reportingInstance":""},{"metadata":{"name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bee704e5de5","namespace":"staging-gpl-headless-log-wsman","selfLink":"/api/v1/namespaces/staging-gpl-headless-log-wsman/events/prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae.16833bee704e5de5","uid":"fda4b916-769c-4167-a782-566fa1574edb","resourceVersion":"12819805","creationTimestamp":"2021-05-28T12:49:46Z"},"involvedObject":{"kind":"Pod","namespace":"staging-gpl-headless-log-wsman","name":"prebuild-8e0bbcdf-a926-4670-8c40-b718f035b2ae","uid":"bde1c8ff-8a05-43b6-a2ce-2f88e32dbe1e","apiVersion":"v1","resourceVersion":"198743315","fieldPath":"spec.containers{workspace}"},"reason":"Unhealthy","message":"Readiness probe failed: Get http://10.60.61.170:22999/_supervisor/v1/status/content/wait/true: dial tcp 10.60.61.170:22999: connect: connection refused","source":{"component":"kubelet","host":"gke-dev-workload-1-49d27f81-pd35"},"firstTimestamp":"2021-05-28T12:49:46Z","lastTimestamp":"2021-05-28T12:49:46Z","count":1,"type":"Warning","eventTime":null,"reportingComponent":"","reportingInstance":""}]} \ No newline at end of file diff --git a/components/ws-manager/pkg/manager/testdata/status_stoppedByRequest_000_RUNNING00.json b/components/ws-manager/pkg/manager/testdata/status_stoppedByRequest_000_RUNNING00.json index e71c09ab43eb62..f7a160817eabf5 100644 --- a/components/ws-manager/pkg/manager/testdata/status_stoppedByRequest_000_RUNNING00.json +++ b/components/ws-manager/pkg/manager/testdata/status_stoppedByRequest_000_RUNNING00.json @@ -664,7 +664,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", @@ -1000,7 +999,6 @@ "creationTimestamp": "2021-10-14T19:11:23Z", "managedFields": [ { - "manager": "ws-scheduler", "operation": "Update", "apiVersion": "v1", "time": "2021-10-14T19:11:23Z", diff --git a/components/ws-manager/pkg/manager/testdata/status_stuckInCreating_CREATING00.json b/components/ws-manager/pkg/manager/testdata/status_stuckInCreating_CREATING00.json index c8d1aea3a0330a..deece6ac2c36c2 100644 --- a/components/ws-manager/pkg/manager/testdata/status_stuckInCreating_CREATING00.json +++ b/components/ws-manager/pkg/manager/testdata/status_stuckInCreating_CREATING00.json @@ -150,7 +150,7 @@ "operator": "Exists" }, { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "In", "values": [ "true" @@ -162,7 +162,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/status_stuckInStopping_RUNNING00.json b/components/ws-manager/pkg/manager/testdata/status_stuckInStopping_RUNNING00.json index d49a71d84970bf..a589f53d8802b5 100644 --- a/components/ws-manager/pkg/manager/testdata/status_stuckInStopping_RUNNING00.json +++ b/components/ws-manager/pkg/manager/testdata/status_stuckInStopping_RUNNING00.json @@ -240,7 +240,6 @@ "managedFields": [ { "apiVersion": "v1", - "manager": "ws-scheduler", "operation": "Update", "fieldsType": "FieldsV1", "time": "2021-08-19T05:14:19Z", @@ -1041,7 +1040,7 @@ { "matchExpressions": [ { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "Exists" } ] @@ -1068,7 +1067,6 @@ }, "nodeName": "gke-gp-prod-ws-us14-us-workspace-pool-67d93ed3-l67s", "priority": 0, - "schedulerName": "workspace-scheduler", "dnsPolicy": "None", "restartPolicy": "Never", "terminationGracePeriodSeconds": 30, diff --git a/components/ws-manager/pkg/manager/testdata/status_stuckInStopping_STOPPING00.json b/components/ws-manager/pkg/manager/testdata/status_stuckInStopping_STOPPING00.json index 3133d9db9a9daf..d35cfa068a17c0 100644 --- a/components/ws-manager/pkg/manager/testdata/status_stuckInStopping_STOPPING00.json +++ b/components/ws-manager/pkg/manager/testdata/status_stuckInStopping_STOPPING00.json @@ -641,7 +641,6 @@ "nodeName": "gke-gp-prod-ws-us14-us-workspace-pool-67d93ed3-l67s", "automountServiceAccountToken": false, "terminationGracePeriodSeconds": 30, - "schedulerName": "workspace-scheduler", "dnsConfig": { "nameservers": [ "1.1.1.1", @@ -655,7 +654,7 @@ { "matchExpressions": [ { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regulars", "operator": "Exists" } ] @@ -1018,7 +1017,6 @@ "f:generateName": {} } }, - "manager": "ws-scheduler", "operation": "Update", "fieldsType": "FieldsV1", "time": "2021-08-19T05:14:19Z" diff --git a/components/ws-manager/pkg/manager/testdata/stopping_basic.json b/components/ws-manager/pkg/manager/testdata/stopping_basic.json index 017189692894df..c2bb6c2beabe01 100644 --- a/components/ws-manager/pkg/manager/testdata/stopping_basic.json +++ b/components/ws-manager/pkg/manager/testdata/stopping_basic.json @@ -146,7 +146,7 @@ "operator": "Exists" }, { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "In", "values": [ "true" @@ -158,7 +158,6 @@ } } }, - "schedulerName": "workspace-scheduler", "tolerations": [ { "key": "node.kubernetes.io/disk-pressure", diff --git a/components/ws-manager/pkg/manager/testdata/timeout_interrupted_noActivity.json b/components/ws-manager/pkg/manager/testdata/timeout_interrupted_noActivity.json index 261ff81a7340fc..b204b4b4ee265a 100644 --- a/components/ws-manager/pkg/manager/testdata/timeout_interrupted_noActivity.json +++ b/components/ws-manager/pkg/manager/testdata/timeout_interrupted_noActivity.json @@ -214,7 +214,7 @@ "operator": "Exists" }, { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "In", "values": [ "true" diff --git a/components/ws-manager/pkg/manager/testdata/timeout_interrupted_withActivity.json b/components/ws-manager/pkg/manager/testdata/timeout_interrupted_withActivity.json index c62ec926c46369..0bc29cc25aebea 100644 --- a/components/ws-manager/pkg/manager/testdata/timeout_interrupted_withActivity.json +++ b/components/ws-manager/pkg/manager/testdata/timeout_interrupted_withActivity.json @@ -215,7 +215,7 @@ "operator": "Exists" }, { - "key": "gitpod.io/workload_workspace", + "key": "gitpod.io/workload_workspace_regular", "operator": "In", "values": [ "true" diff --git a/components/ws-manager/pkg/manager/testing_test.go b/components/ws-manager/pkg/manager/testing_test.go index c342e416aad9e5..6e0bd8569a1f8d 100644 --- a/components/ws-manager/pkg/manager/testing_test.go +++ b/components/ws-manager/pkg/manager/testing_test.go @@ -30,7 +30,6 @@ import ( func forTestingOnlyManagerConfig() config.Configuration { return config.Configuration{ Namespace: "default", - SchedulerName: "workspace-scheduler", SeccompProfile: "localhost/workspace-default", HeartbeatInterval: util.Duration(30 * time.Second), WorkspaceHostPath: "/tmp/workspaces", diff --git a/components/ws-proxy/go.mod b/components/ws-proxy/go.mod index 95af1779bc3cca..3a741dc1d9061c 100644 --- a/components/ws-proxy/go.mod +++ b/components/ws-proxy/go.mod @@ -16,6 +16,7 @@ require ( github.com/sirupsen/logrus v1.8.1 github.com/spf13/cobra v1.1.3 golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 + golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 google.golang.org/grpc v1.39.1 k8s.io/api v0.22.2 @@ -58,7 +59,6 @@ require ( github.com/uber/jaeger-client-go v2.29.1+incompatible // indirect github.com/uber/jaeger-lib v2.4.1+incompatible // indirect go.uber.org/atomic v1.8.0 // indirect - golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 // indirect golang.org/x/oauth2 v0.0.0-20210615190721-d04028783cf1 // indirect golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2 // indirect golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d // indirect diff --git a/components/ws-proxy/go.sum b/components/ws-proxy/go.sum index 5060b8cba73374..5fc5d25facb4d8 100644 --- a/components/ws-proxy/go.sum +++ b/components/ws-proxy/go.sum @@ -44,13 +44,11 @@ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBp github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/HdrHistogram/hdrhistogram-go v1.1.0 h1:6dpdDPTRoo78HxAJ6T1HfMiKSnqhgRRqzCuPshRkQ7I= -github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -71,13 +69,11 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bombsimon/logrusr v1.1.0 h1:Y03FI4Z/Shyrc9jF26vuaUbnPxC5NMJnTtJA/3Lihq8= github.com/bombsimon/logrusr v1.1.0/go.mod h1:Jq0nHtvxabKE5EMwAAdgTaz7dfWE8C4i11NOltxGQpc= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -124,7 +120,6 @@ github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQL github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -157,14 +152,12 @@ github.com/go-ozzo/ozzo-validation v3.6.0+incompatible h1:msy24VGS42fKO9K1vLz82/ github.com/go-ozzo/ozzo-validation v3.6.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-test/deep v1.0.5/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v0.0.0-20210429001901-424d2337a529 h1:2voWjNECnrZRbfwXxHB1/j8wa6xdKn85B5NzgVL/pTU= github.com/golang/glog v0.0.0-20210429001901-424d2337a529/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -181,7 +174,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -246,7 +238,6 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmg github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.5.0 h1:ajue7SzQMywqRjg2fK7dcpc0QhFGpTR2plWfV4EZWR4= github.com/grpc-ecosystem/grpc-gateway/v2 v2.5.0/go.mod h1:r1hZAcvfFXuYmcKyCJI9wlyOPIZUJl6FCB8Cpca/NLE= @@ -291,7 +282,6 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -404,7 +394,6 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/segmentio/backo-go v0.0.0-20200129164019-23eae7c10bd3/go.mod h1:9/Rh6yILuLysoQnZ2oNooD2g7aBnvM7r/fNVxRNWfBc= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -447,7 +436,6 @@ github.com/uber/jaeger-client-go v2.29.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMW github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c/go.mod h1:UrdRz5enIKZ63MEE3IF9l2/ebyx59GyGgPi+tICQdmM= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -502,10 +490,7 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= @@ -515,7 +500,6 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -667,16 +651,13 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -723,7 +704,6 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3 h1:L69ShwSZEyCsLKoAxDKeMvLDZkumEe8gXUZAjab0tX8= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= @@ -734,10 +714,6 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1N golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -842,7 +818,6 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/segmentio/analytics-go.v3 v3.1.0/go.mod h1:4QqqlTlSSpVlWA9/9nDcPw+FkM2yv1NQoYjUbL9/JAw= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= @@ -892,7 +867,6 @@ k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2R k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a h1:8dYfu/Fc9Gz2rNJKB9IQRGgQOh2clmRzNIPPY1xLY5g= k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= diff --git a/dev/kubecdl/go.sum b/dev/kubecdl/go.sum index 13e75e2055b7e5..8ff6abcf808669 100644 --- a/dev/kubecdl/go.sum +++ b/dev/kubecdl/go.sum @@ -1,9 +1,12 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/gitpod-ws.code-workspace b/gitpod-ws.code-workspace index 26fab724461135..b986537a6d89cd 100644 --- a/gitpod-ws.code-workspace +++ b/gitpod-ws.code-workspace @@ -6,7 +6,6 @@ { "path": "components/content-service" }, { "path": "components/docker-up" }, { "path": "components/ee/agent-smith" }, - { "path": "components/ee/ws-scheduler" }, { "path": "components/gitpod-cli" }, { "path": "components/gitpod-protocol" }, { "path": "components/image-builder-bob" }, diff --git a/installer/BUILD.yaml b/installer/BUILD.yaml index 39947a854245df..12fb2c89c177e6 100644 --- a/installer/BUILD.yaml +++ b/installer/BUILD.yaml @@ -18,7 +18,6 @@ packages: - components/ws-manager-api/go:lib - components/content-service:lib - components/ee/agent-smith:lib - - components/ee/ws-scheduler:lib - components/blobserve:lib - components/content-service-api/go:lib - components/gitpod-protocol/go:lib diff --git a/installer/ToDo.md b/installer/ToDo.md index 7d7853229c6c51..ba7a57fca6e8ff 100644 --- a/installer/ToDo.md +++ b/installer/ToDo.md @@ -6,7 +6,6 @@ - [x] ws-daemon - [x] ws-manager - [x] ws-proxy - - [x] ws-scheduler - [x] registry-facade - [x] blobserve - [x] agent-smith diff --git a/installer/go.mod b/installer/go.mod index 10ead33736fc2e..b68297cd417fd8 100644 --- a/installer/go.mod +++ b/installer/go.mod @@ -16,7 +16,6 @@ require ( github.com/gitpod-io/gitpod/ws-daemon/api v0.0.0-00010101000000-000000000000 github.com/gitpod-io/gitpod/ws-manager/api v0.0.0-00010101000000-000000000000 github.com/gitpod-io/gitpod/ws-proxy v0.0.0-00010101000000-000000000000 - github.com/gitpod-io/gitpod/ws-scheduler v0.0.0-00010101000000-000000000000 github.com/go-playground/validator/v10 v10.9.0 github.com/google/go-cmp v0.5.6 github.com/jetstack/cert-manager v1.4.4 @@ -213,7 +212,6 @@ require ( k8s.io/apiserver v0.22.2 // indirect k8s.io/cli-runtime v0.22.2 // indirect k8s.io/component-base v0.22.2 // indirect - k8s.io/component-helpers v0.22.2 // indirect k8s.io/klog/v2 v2.9.0 // indirect k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e // indirect oras.land/oras-go v0.4.0 // indirect @@ -229,8 +227,6 @@ replace github.com/gitpod-io/gitpod/image-builder/api => ../components/image-bui replace github.com/gitpod-io/gitpod/openvsx-proxy => ../components/openvsx-proxy // leeway -replace github.com/gitpod-io/gitpod/ws-scheduler => ../components/ee/ws-scheduler // leeway - replace github.com/gitpod-io/gitpod/ws-proxy => ../components/ws-proxy // leeway replace github.com/gitpod-io/gitpod/agent-smith => ../components/ee/agent-smith // leeway diff --git a/installer/go.sum b/installer/go.sum index e0ffea2aa14423..01673ae10cbea7 100644 --- a/installer/go.sum +++ b/installer/go.sum @@ -73,7 +73,6 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/HdrHistogram/hdrhistogram-go v1.1.0 h1:6dpdDPTRoo78HxAJ6T1HfMiKSnqhgRRqzCuPshRkQ7I= -github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd h1:sjQovDkwrZp8u+gxLtPgKGjk5hCxuy2hrRejBTA9xFU= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= @@ -84,7 +83,6 @@ github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3Q github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8= github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= @@ -107,7 +105,6 @@ github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg3 github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= -github.com/Microsoft/hcsshim v0.8.17/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= github.com/Microsoft/hcsshim v0.8.18 h1:cYnKADiM1869gvBpos3YCteeT6sZLB48lB5dmMMs8Tg= github.com/Microsoft/hcsshim v0.8.18/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= @@ -128,11 +125,7 @@ github.com/StackExchange/wmi v0.0.0-20210224194228-fe8f1750fd46/go.mod h1:3eOhrU github.com/Venafi/vcert/v4 v4.13.1/go.mod h1:Z3sJFoAurFNXPpoSUSHq46aIeHLiGQEMDhprfxlpofQ= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/akamai/AkamaiOPEN-edgegrid-golang v1.1.0/go.mod h1:kX6YddBkXqqywAe8c9LyvgTCyFuZCTMF4cRPQhc3Fy8= -github.com/alecthomas/jsonschema v0.0.0-20190504002508-159cbd5dba26/go.mod h1:qpebaTNSsyUn5rPSJMsfqEtDw71TTggXM6stUDI16HA= -github.com/alecthomas/jsonschema v0.0.0-20210413112511-5c9c23bdc720/go.mod h1:/n6+1/DWPltRLWL/VKyUxg6tzsl5kHUCcraimt4vr60= -github.com/alecthomas/repr v0.0.0-20200325044227-4184120f674c/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -153,7 +146,6 @@ github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:l github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/ashwanthkumar/slack-go-webhook v0.0.0-20200209025033-430dd4e66960/go.mod h1:97O1qkjJBHSSaWJxsTShRIeFy0HWiygk+jnugO9aX3I= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= @@ -176,7 +168,6 @@ github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqO github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/bombsimon/logrusr v1.1.0/go.mod h1:Jq0nHtvxabKE5EMwAAdgTaz7dfWE8C4i11NOltxGQpc= github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b h1:L/QXpzIa3pOvUGt1D1lA5KjYhPBAN/3iWdP7xeFS9F0= github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= @@ -325,7 +316,6 @@ github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= @@ -370,7 +360,6 @@ github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v17.12.0-ce-rc1.0.20200618181300-9dc6525e6118+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.7+incompatible h1:Z6O9Nhsjv+ayUEeI1IojKbYcsGdgYSNqxe1s2MYzUhQ= github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= @@ -430,7 +419,6 @@ github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4 github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.3+incompatible h1:7ZaBxOI7TMoYBfyA3cQHErNNyAWIKUMIwqxEtgHOs5c= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= @@ -482,7 +470,6 @@ github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-ozzo/ozzo-validation v3.5.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= github.com/go-ozzo/ozzo-validation v3.6.0+incompatible h1:msy24VGS42fKO9K1vLz82/GeYW1cILu7Nuuj1N3BBkE= github.com/go-ozzo/ozzo-validation v3.6.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= @@ -502,7 +489,6 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/go-test/deep v1.0.5 h1:AKODKU3pDH1RzZzm6YZu77YWtEAq6uh1rLIAQlay2qc= -github.com/go-test/deep v1.0.5/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= github.com/gobuffalo/flect v0.2.2/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc= github.com/gobuffalo/logger v1.0.3 h1:YaXOTHNPCvkqqA7w05A4v0k2tCdpr+sgFlgINbQ6gqc= github.com/gobuffalo/logger v1.0.3/go.mod h1:SoeejUwldiS7ZsyCBphOGURmWdwUFXs0J7TCjEhjKxM= @@ -514,7 +500,6 @@ github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68FptL43tDKIq8FladmaTs3Xs7Z8= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= @@ -533,9 +518,7 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v0.0.0-20210429001901-424d2337a529/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -552,7 +535,6 @@ github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -648,7 +630,6 @@ github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= @@ -663,9 +644,7 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.5.0/go.mod h1:r1hZAcvfFXuYmcKyCJI9wlyOPIZUJl6FCB8Cpca/NLE= github.com/h2non/filetype v1.0.8 h1:le8gpf+FQA0/DlDABbtisA1KiTS0Xi+YSC/E8yY3Y14= -github.com/h2non/filetype v1.0.8/go.mod h1:isekKqOuhMj+s/7r3rIeTErIRy4Rub5uBWHfvMusLMU= github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= @@ -712,7 +691,6 @@ github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -754,7 +732,6 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/karrick/godirwalk v1.15.8 h1:7+rWAZPn9zuRxaIqqT8Ohs2Q2Ac0msBqwRdxNCr2VVs= github.com/karrick/godirwalk v1.15.8/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= @@ -981,7 +958,6 @@ github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/parnurzeal/gorequest v0.2.16/go.mod h1:3Kh2QUMJoqw3icWAecsyzkpY7UzRfDhbRdTjtNwNiUE= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= @@ -1077,7 +1053,6 @@ github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0 github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/segmentio/backo-go v0.0.0-20200129164019-23eae7c10bd3/go.mod h1:9/Rh6yILuLysoQnZ2oNooD2g7aBnvM7r/fNVxRNWfBc= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shirou/gopsutil v2.20.9+incompatible h1:msXs2frUV+O/JLva9EDLpuJ84PrFsdCTCQex8PUdtkQ= @@ -1103,7 +1078,6 @@ github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9 github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/sourcegraph/jsonrpc2 v0.0.0-20200429184054-15c2290dcb37/go.mod h1:ZafdZgk/axhT1cvZAPOhw+95nz2I/Ra5qMlU4gTRwIo= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= @@ -1142,7 +1116,6 @@ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoH github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -1187,7 +1160,6 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c/go.mod h1:UrdRz5enIKZ63MEE3IF9l2/ebyx59GyGgPi+tICQdmM= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1285,10 +1257,7 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= @@ -1298,7 +1267,6 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1398,7 +1366,6 @@ golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210615190721-d04028783cf1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914 h1:3B43BWw0xEBsLZ/NO1VALz6fppU3481pik+2Ksv45z8= golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1541,13 +1508,11 @@ golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180824175216-6c1c5e93cdc1/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1619,10 +1584,6 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= @@ -1789,7 +1750,6 @@ gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/segmentio/analytics-go.v3 v3.1.0/go.mod h1:4QqqlTlSSpVlWA9/9nDcPw+FkM2yv1NQoYjUbL9/JAw= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= @@ -1841,7 +1801,6 @@ k8s.io/client-go v0.22.2/go.mod h1:sAlhrkVDf50ZHx6z4K0S40wISNTarf1r800F+RlCF6U= k8s.io/code-generator v0.22.2/go.mod h1:eV77Y09IopzeXOJzndrDyCI88UBok2h6WxAlBwpxa+o= k8s.io/component-base v0.22.2 h1:vNIvE0AIrLhjX8drH0BgCNJcR4QZxMXcJzBsDplDx9M= k8s.io/component-base v0.22.2/go.mod h1:5Br2QhI9OTe79p+TzPe9JKNQYvEKbq9rTJDWllunGug= -k8s.io/component-helpers v0.22.2 h1:guQ9oYclE5LMydWFfAFA+u7SQgQzz2g+YgpJ5QooSyY= k8s.io/component-helpers v0.22.2/go.mod h1:+N61JAR9aKYSWbnLA88YcFr9K/6ISYvRNybX7QW7Rs8= k8s.io/cri-api v0.22.2/go.mod h1:mj5DGUtElRyErU5AZ8EM0ahxbElYsaLAMTPhLPQ40Eg= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= @@ -1865,13 +1824,11 @@ k8s.io/utils v0.0.0-20210111153108-fddb29f9d009/go.mod h1:jPW/WVKK9YHAvNhRxK0md/ k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210820185131-d34e5cb4466e h1:ldQh+neBabomh7+89dTpiFAB8tGdfVmuIzAHbvtl+9I= k8s.io/utils v0.0.0-20210820185131-d34e5cb4466e/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -moul.io/http2curl v1.0.0/go.mod h1:f6cULg+e4Md/oW1cYmwW4IWQOVl2lGbmCNGOHvzX2kE= oras.land/oras-go v0.4.0 h1:u6+7D+raZDYHwlz/uOwNANiRmyYDSSMW7A9E1xXycUQ= oras.land/oras-go v0.4.0/go.mod h1:VJcU+VE4rkclUbum5C0O7deEZbBYnsnpbGSACwTjOcg= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/letsencrypt v0.0.3 h1:H7xDfhkaFFSYEJlKeq38RwX2jYcnTeHuDQyT+mMNMwM= rsc.io/letsencrypt v0.0.3/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= diff --git a/installer/pkg/common/constants.go b/installer/pkg/common/constants.go index 536dfab76afd99..e538b7d6a942df 100644 --- a/installer/pkg/common/constants.go +++ b/installer/pkg/common/constants.go @@ -5,8 +5,9 @@ package common import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "time" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) // This file exists to break cyclic-dependency errors @@ -41,7 +42,6 @@ const ( WSManagerComponent = "ws-manager" WSManagerBridgeComponent = "ws-manager-bridge" WSProxyComponent = "ws-proxy" - WSSchedulerComponent = "ws-scheduler" AnnotationConfigChecksum = "gitpod.io/checksum_config" ) diff --git a/installer/pkg/components/components.go b/installer/pkg/components/components.go index c4d10b1b4c967b..9fd994b8975f8b 100644 --- a/installer/pkg/components/components.go +++ b/installer/pkg/components/components.go @@ -29,7 +29,6 @@ import ( wsmanager "github.com/gitpod-io/gitpod/installer/pkg/components/ws-manager" wsmanagerbridge "github.com/gitpod-io/gitpod/installer/pkg/components/ws-manager-bridge" wsproxy "github.com/gitpod-io/gitpod/installer/pkg/components/ws-proxy" - wsscheduler "github.com/gitpod-io/gitpod/installer/pkg/components/ws-scheduler" ) var MetaObjects = common.CompositeRenderFunc( @@ -55,7 +54,6 @@ var WorkspaceObjects = common.CompositeRenderFunc( wsdaemon.Objects, wsmanager.Objects, wsproxy.Objects, - wsscheduler.Objects, ) var FullObjects = common.CompositeRenderFunc( diff --git a/installer/pkg/components/ws-manager/configmap.go b/installer/pkg/components/ws-manager/configmap.go index 9715441b17900d..3f2deda1cd0a53 100644 --- a/installer/pkg/components/ws-manager/configmap.go +++ b/installer/pkg/components/ws-manager/configmap.go @@ -43,7 +43,6 @@ func configmap(ctx *common.RenderContext) ([]runtime.Object, error) { wsmcfg := config.ServiceConfiguration{ Manager: config.Configuration{ Namespace: ctx.Namespace, - SchedulerName: "workspace-scheduler", SeccompProfile: fmt.Sprintf("localhost/workspace_default_%s.json", ctx.VersionManifest.Version), DryRun: false, WorkspaceDaemon: config.WorkspaceDaemonConfiguration{ @@ -94,9 +93,8 @@ func configmap(ctx *common.RenderContext) ([]runtime.Object, error) { Interrupted: util.Duration(5 * time.Minute), }, //EventTraceLog: "", // todo(sje): make conditional based on config - ReconnectionInterval: util.Duration(30 * time.Second), - RegistryFacadeHost: fmt.Sprintf("reg.%s:%d", ctx.Config.Domain, common.RegistryFacadeServicePort), - EnforceWorkspaceNodeAffinity: true, + ReconnectionInterval: util.Duration(30 * time.Second), + RegistryFacadeHost: fmt.Sprintf("reg.%s:%d", ctx.Config.Domain, common.RegistryFacadeServicePort), }, Content: struct { Storage storageconfig.StorageConfig `json:"storage"` diff --git a/installer/pkg/components/ws-manager/tlssecret.go b/installer/pkg/components/ws-manager/tlssecret.go index 59c0ebaebf23e7..58d48dc4ddf53d 100644 --- a/installer/pkg/components/ws-manager/tlssecret.go +++ b/installer/pkg/components/ws-manager/tlssecret.go @@ -6,6 +6,7 @@ package wsmanager import ( "fmt" + "github.com/gitpod-io/gitpod/installer/pkg/common" certmanagerv1 "github.com/jetstack/cert-manager/pkg/apis/certmanager/v1" @@ -25,7 +26,6 @@ func tlssecret(ctx *common.RenderContext) ([]runtime.Object, error) { common.RegistryFacadeComponent, common.ServerComponent, common.WSManagerBridgeComponent, - common.WSSchedulerComponent, common.WSProxyComponent, Component, } diff --git a/installer/pkg/components/ws-scheduler/OWNERS b/installer/pkg/components/ws-scheduler/OWNERS deleted file mode 100644 index cd8b31399c625f..00000000000000 --- a/installer/pkg/components/ws-scheduler/OWNERS +++ /dev/null @@ -1,9 +0,0 @@ - -options: - no_parent_owners: true - -approvers: - - engineering-workspace - -labels: - - "team: workspace" \ No newline at end of file diff --git a/installer/pkg/components/ws-scheduler/clusterrole.go b/installer/pkg/components/ws-scheduler/clusterrole.go deleted file mode 100644 index 804080240b178a..00000000000000 --- a/installer/pkg/components/ws-scheduler/clusterrole.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) 2021 Gitpod GmbH. All rights reserved. -// Licensed under the GNU Affero General Public License (AGPL). -// See License-AGPL.txt in the project root for license information. - -package wsscheduler - -import ( - "fmt" - - "github.com/gitpod-io/gitpod/installer/pkg/common" - - rbacv1 "k8s.io/api/rbac/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" -) - -func clusterrole(ctx *common.RenderContext) ([]runtime.Object, error) { - labels := common.DefaultLabels(Component) - - return []runtime.Object{ - &rbacv1.ClusterRole{ - TypeMeta: common.TypeMetaClusterRole, - ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("%s-ns-%s", ctx.Namespace, Component), - Labels: labels, - }, - Rules: []rbacv1.PolicyRule{{ - APIGroups: []string{""}, - Resources: []string{"nodes"}, - Verbs: []string{"get", "list", "watch"}, - }, { - APIGroups: []string{""}, - Resources: []string{"pods"}, - Verbs: []string{"delete", "get", "list", "watch", "update", "patch"}, - }, { - APIGroups: []string{""}, - Resources: []string{"pods/status"}, - Verbs: []string{"update"}, - }, { - APIGroups: []string{""}, - Resources: []string{"pods/binding", "events"}, - Verbs: []string{"create"}, - }, { - APIGroups: []string{"policy"}, - Resources: []string{"podsecuritypolicies"}, - Verbs: []string{"use"}, - ResourceNames: []string{ - fmt.Sprintf("%s-ns-unprivileged", ctx.Namespace), - }, - }}, - }, - }, nil -} diff --git a/installer/pkg/components/ws-scheduler/clusterrolebinding.go b/installer/pkg/components/ws-scheduler/clusterrolebinding.go deleted file mode 100644 index 45c56ae92452e9..00000000000000 --- a/installer/pkg/components/ws-scheduler/clusterrolebinding.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (c) 2021 Gitpod GmbH. All rights reserved. -// Licensed under the GNU Affero General Public License (AGPL). -// See License-AGPL.txt in the project root for license information. - -package wsscheduler - -import ( - "fmt" - - "github.com/gitpod-io/gitpod/installer/pkg/common" - - rbacv1 "k8s.io/api/rbac/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" -) - -func clusterrolebinding(ctx *common.RenderContext) ([]runtime.Object, error) { - labels := common.DefaultLabels(Component) - - return []runtime.Object{ - &rbacv1.ClusterRoleBinding{ - TypeMeta: common.TypeMetaClusterRoleBinding, - ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("%s-ns-%s", ctx.Namespace, Component), - Labels: labels, - }, - RoleRef: rbacv1.RoleRef{ - Kind: "ClusterRole", - Name: fmt.Sprintf("%s-ns-%s", ctx.Namespace, Component), - APIGroup: "rbac.authorization.k8s.io", - }, - Subjects: []rbacv1.Subject{ - { - Kind: "ServiceAccount", - Name: Component, - Namespace: ctx.Namespace, - }, - }, - }, - &rbacv1.ClusterRoleBinding{ - TypeMeta: common.TypeMetaClusterRoleBinding, - ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("%s-ns-%s-kube-rbac-proxy", ctx.Namespace, Component), - Labels: labels, - }, - RoleRef: rbacv1.RoleRef{ - Kind: "ClusterRole", - Name: fmt.Sprintf("%s-kube-rbac-proxy", ctx.Namespace), - APIGroup: "rbac.authorization.k8s.io", - }, - Subjects: []rbacv1.Subject{ - { - Kind: "ServiceAccount", - Name: Component, - Namespace: ctx.Namespace, - }, - }, - }, - }, nil -} diff --git a/installer/pkg/components/ws-scheduler/configmap.go b/installer/pkg/components/ws-scheduler/configmap.go deleted file mode 100644 index f9dd1ee1ee4580..00000000000000 --- a/installer/pkg/components/ws-scheduler/configmap.go +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright (c) 2021 Gitpod GmbH. All rights reserved. -// Licensed under the GNU Affero General Public License (AGPL). -// See License-AGPL.txt in the project root for license information. - -package wsscheduler - -import ( - "encoding/json" - "fmt" - "time" - - "github.com/gitpod-io/gitpod/common-go/util" - "github.com/gitpod-io/gitpod/installer/pkg/common" - "github.com/gitpod-io/gitpod/installer/pkg/components/workspace" - "github.com/gitpod-io/gitpod/installer/pkg/components/workspace/ide" - wsmanager "github.com/gitpod-io/gitpod/installer/pkg/components/ws-manager" - "github.com/gitpod-io/gitpod/ws-scheduler/pkg/scaler" - "github.com/gitpod-io/gitpod/ws-scheduler/pkg/scheduler" - - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" -) - -// todo(sje): export this from components/ee/ws-scheduler/root -type config struct { - Scheduler scheduler.Configuration `json:"scheduler"` - Scaler struct { - Enabled bool `json:"enabled"` - Driver scaler.WorkspaceManagerPrescaleDriverConfig `json:"driver"` - Controller scaler.ControllerConfig `json:"controller"` - } `json:"scaler"` - Prometheus struct { - Addr string `json:"addr"` - } `json:"prometheus"` - PProf struct { - Addr string `json:"addr"` - } `json:"pprof"` -} - -func configmap(ctx *common.RenderContext) ([]runtime.Object, error) { - // todo(sje): check this config - - scaler := struct { - Enabled bool `json:"enabled"` - Driver scaler.WorkspaceManagerPrescaleDriverConfig `json:"driver"` - Controller scaler.ControllerConfig `json:"controller"` - }{ - Enabled: true, - Controller: scaler.ControllerConfig{ - Kind: "switchedConstant", - Constant: struct { - Setpoint int `json:"setpoint"` - }{ - Setpoint: 5, - }, - SwitchedConstant: struct { - DefaultSetpoint int `json:"default"` - Setpoints []scaler.SwitchedSetpoint `json:"setpoints"` - }{ - DefaultSetpoint: 0, - Setpoints: []scaler.SwitchedSetpoint{ - { - Setpoint: 80, - Time: scaler.TimeOfDay(time.Date(0, 1, 1, 6, 0, 0, 0, time.UTC)), - }, - { - Setpoint: 0, - Time: scaler.TimeOfDay(time.Date(0, 1, 1, 11, 0, 0, 0, time.UTC)), - }, - }, - }, - }, - Driver: scaler.WorkspaceManagerPrescaleDriverConfig{ - WsManager: scaler.WorkspaceManagerConfig{ - Addr: fmt.Sprintf("dns:///%s:%d", wsmanager.Component, wsmanager.RPCPort), - TLS: &struct { - CA string `json:"ca"` - Certificate string `json:"crt"` - PrivateKey string `json:"key"` - }{ - CA: "/ws-manager-client-tls-certs/ca.crt", - Certificate: "/ws-manager-client-tls-certs/tls.crt", - PrivateKey: "/ws-manager-client-tls-certs/tls.key", - }, - }, - WorkspaceImage: common.ImageName(common.ThirdPartyContainerRepo(ctx.Config.Repository, ""), workspace.DefaultWorkspaceImage, workspace.DefaultWorkspaceImageVersion), - IDEImage: common.ImageName(ctx.Config.Repository, ide.CodeIDEImage, ide.CodeIDEImageStableVersion), - SupervisorImage: common.ImageName(ctx.Config.Repository, workspace.SupervisorImage, ctx.VersionManifest.Components.Workspace.Supervisor.Version), - FeatureFlags: nil, - MaxGhostWorkspaces: 0, - SchedulerInterval: util.Duration(time.Second * 5), - Renewal: struct { - Interval util.Duration `json:"interval"` - Percentage int `json:"percentage"` - }{ - Interval: util.Duration(time.Minute * 5), - Percentage: 20, - }, - }, - } - - wsscfg := config{ - Scheduler: scheduler.Configuration{ - SchedulerName: "workspace-scheduler", - Namespace: ctx.Namespace, - NodeLabelSelector: map[string]string{}, - StrategyName: scheduler.StrategyDensityAndExperience, - DensityAndExperienceConfig: &scheduler.DensityAndExperienceConfig{ - WorkspaceFreshPeriodSeconds: 120, - NodeFreshWorkspaceLimit: 2, - }, - // todo(sje): rate limits? - RateLimit: &scheduler.RateLimitConfig{ - MaxRPS: 10, - }, - }, - Scaler: scaler, - PProf: struct { - Addr string `json:"addr"` - }{Addr: "localhost:6060"}, - Prometheus: struct { - Addr string `json:"addr"` - }{Addr: "127.0.0.1:9500"}, - } - - fc, err := json.MarshalIndent(wsscfg, "", " ") - if err != nil { - return nil, fmt.Errorf("failed to marshal ws-proxy config: %w", err) - } - - return []runtime.Object{ - &corev1.ConfigMap{ - TypeMeta: common.TypeMetaConfigmap, - ObjectMeta: metav1.ObjectMeta{ - Name: Component, - Namespace: ctx.Namespace, - Labels: common.DefaultLabels(Component), - }, - Data: map[string]string{ - "config.json": string(fc), - }, - }, - }, nil -} diff --git a/installer/pkg/components/ws-scheduler/constants.go b/installer/pkg/components/ws-scheduler/constants.go deleted file mode 100644 index 6613fb81df086d..00000000000000 --- a/installer/pkg/components/ws-scheduler/constants.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) 2021 Gitpod GmbH. All rights reserved. -// Licensed under the GNU Affero General Public License (AGPL). -// See License-AGPL.txt in the project root for license information. - -package wsscheduler - -import "github.com/gitpod-io/gitpod/installer/pkg/common" - -const ( - Component = common.WSSchedulerComponent -) diff --git a/installer/pkg/components/ws-scheduler/deployment.go b/installer/pkg/components/ws-scheduler/deployment.go deleted file mode 100644 index 35285a9f4588c6..00000000000000 --- a/installer/pkg/components/ws-scheduler/deployment.go +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (c) 2021 Gitpod GmbH. All rights reserved. -// Licensed under the GNU Affero General Public License (AGPL). -// See License-AGPL.txt in the project root for license information. - -package wsscheduler - -import ( - "github.com/gitpod-io/gitpod/installer/pkg/cluster" - "github.com/gitpod-io/gitpod/installer/pkg/common" - - wsmanager "github.com/gitpod-io/gitpod/installer/pkg/components/ws-manager" - - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/utils/pointer" -) - -func deployment(ctx *common.RenderContext) ([]runtime.Object, error) { - labels := common.DefaultLabels(Component) - - configHash, err := common.ObjectHash(configmap(ctx)) - if err != nil { - return nil, err - } - - return []runtime.Object{&appsv1.Deployment{ - TypeMeta: common.TypeMetaDeployment, - ObjectMeta: metav1.ObjectMeta{ - Name: Component, - Namespace: ctx.Namespace, - Labels: labels, - }, - Spec: appsv1.DeploymentSpec{ - Selector: &metav1.LabelSelector{MatchLabels: labels}, - Replicas: pointer.Int32(1), - Strategy: common.DeploymentStrategy, - Template: corev1.PodTemplateSpec{ - ObjectMeta: metav1.ObjectMeta{ - Name: Component, - Namespace: ctx.Namespace, - Labels: labels, - Annotations: map[string]string{ - common.AnnotationConfigChecksum: configHash, - }, - }, - Spec: corev1.PodSpec{ - PriorityClassName: common.SystemNodeCritical, - Affinity: common.Affinity(cluster.AffinityLabelWorkspaceServices), - EnableServiceLinks: pointer.Bool(false), - ServiceAccountName: Component, - SecurityContext: &corev1.PodSecurityContext{ - RunAsUser: pointer.Int64(31002), - }, - Volumes: []corev1.Volume{{ - Name: "config", - VolumeSource: corev1.VolumeSource{ - ConfigMap: &corev1.ConfigMapVolumeSource{ - LocalObjectReference: corev1.LocalObjectReference{Name: Component}, - }, - }, - }, { - Name: "ws-manager-client-tls-certs", - VolumeSource: corev1.VolumeSource{ - Secret: &corev1.SecretVolumeSource{ - SecretName: wsmanager.TLSSecretNameClient, - }, - }, - }}, - Containers: []corev1.Container{{ - Name: Component, - Args: []string{"run", "-v", "--config", "/config/config.json"}, - Image: common.ImageName(ctx.Config.Repository, Component, ctx.VersionManifest.Components.WSScheduler.Version), - ImagePullPolicy: corev1.PullIfNotPresent, - Resources: corev1.ResourceRequirements{ - Requests: corev1.ResourceList{ - "cpu": resource.MustParse("100m"), - "memory": resource.MustParse("32Mi"), - }, - }, - SecurityContext: &corev1.SecurityContext{ - Privileged: pointer.Bool(false), - }, - Env: common.MergeEnv( - common.DefaultEnv(&ctx.Config), - common.TracingEnv(&ctx.Config), - ), - VolumeMounts: []corev1.VolumeMount{{ - Name: "config", - MountPath: "/config", - ReadOnly: true, - }, { - Name: "ws-manager-client-tls-certs", - MountPath: "/ws-manager-client-tls-certs", - ReadOnly: true, - }}, - }, *common.KubeRBACProxyContainer(ctx)}, - }, - }, - }, - }}, nil -} diff --git a/installer/pkg/components/ws-scheduler/networkpolicy.go b/installer/pkg/components/ws-scheduler/networkpolicy.go deleted file mode 100644 index 98455047f5ea29..00000000000000 --- a/installer/pkg/components/ws-scheduler/networkpolicy.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2021 Gitpod GmbH. All rights reserved. -// Licensed under the GNU Affero General Public License (AGPL). -// See License-AGPL.txt in the project root for license information. - -package wsscheduler - -import ( - "github.com/gitpod-io/gitpod/installer/pkg/common" - - networkingv1 "k8s.io/api/networking/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" -) - -func networkpolicy(ctx *common.RenderContext) ([]runtime.Object, error) { - labels := common.DefaultLabels(Component) - - return []runtime.Object{&networkingv1.NetworkPolicy{ - TypeMeta: common.TypeMetaNetworkPolicy, - ObjectMeta: metav1.ObjectMeta{ - Name: Component, - Namespace: ctx.Namespace, - Labels: labels, - }, - Spec: networkingv1.NetworkPolicySpec{ - PodSelector: metav1.LabelSelector{MatchLabels: labels}, - PolicyTypes: []networkingv1.PolicyType{"Ingress"}, - Ingress: []networkingv1.NetworkPolicyIngressRule{{}}, - }, - }}, nil -} diff --git a/installer/pkg/components/ws-scheduler/objects.go b/installer/pkg/components/ws-scheduler/objects.go deleted file mode 100644 index a1fdb45a4ad140..00000000000000 --- a/installer/pkg/components/ws-scheduler/objects.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) 2021 Gitpod GmbH. All rights reserved. -// Licensed under the GNU Affero General Public License (AGPL). -// See License-AGPL.txt in the project root for license information. - -package wsscheduler - -import "github.com/gitpod-io/gitpod/installer/pkg/common" - -var Objects = common.CompositeRenderFunc( - clusterrole, - clusterrolebinding, - configmap, - deployment, - networkpolicy, - common.DefaultServiceAccount(Component), -) diff --git a/operations/observability/mixins/workspace/dashboards.libsonnet b/operations/observability/mixins/workspace/dashboards.libsonnet index 5ba65d57e85187..6f0efad09d6354 100644 --- a/operations/observability/mixins/workspace/dashboards.libsonnet +++ b/operations/observability/mixins/workspace/dashboards.libsonnet @@ -15,7 +15,6 @@ 'gitpod-component-ws-daemon.json': (import 'dashboards/components/ws-daemon.json'), 'gitpod-component-ws-manager.json': (import 'dashboards/components/ws-manager.json'), 'gitpod-component-ws-proxy.json': (import 'dashboards/components/ws-proxy.json'), - 'gitpod-component-ws-scheduler.json': (import 'dashboards/components/ws-scheduler.json'), 'gitpod-workspace-success-criteria.json': (import 'dashboards/success-criteria.json'), }, } diff --git a/operations/observability/mixins/workspace/dashboards/components/ws-scheduler.json b/operations/observability/mixins/workspace/dashboards/components/ws-scheduler.json deleted file mode 100644 index f9852dbda12305..00000000000000 --- a/operations/observability/mixins/workspace/dashboards/components/ws-scheduler.json +++ /dev/null @@ -1,2640 +0,0 @@ -{ - "__inputs": [], - "__requires": [ - { - "type": "grafana", - "id": "grafana", - "name": "Grafana", - "version": "8.1.2" - }, - { - "type": "panel", - "id": "graph", - "name": "Graph (old)", - "version": "" - }, - { - "type": "datasource", - "id": "prometheus", - "name": "Prometheus", - "version": "1.0.0" - }, - { - "type": "panel", - "id": "timeseries", - "name": "Time series", - "version": "" - } - ], - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": false, - "tags": [], - "type": "dashboard" - }, - "type": "dashboard" - } - ] - }, - "editable": true, - "gnetId": null, - "graphTooltip": 1, - "id": null, - "iteration": 1630955989006, - "links": [], - "panels": [ - { - "collapsed": true, - "datasource": null, - "fieldConfig": { - "defaults": {}, - "overrides": [] - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 50, - "panels": [ - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 1 - }, - "hiddenSeries": false, - "id": 40, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": true, - "min": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(gitpod_ws_scheduler_schedule_attempts_total{cluster=~\"$cluster\"}[5m])) by (cluster, workspaceType)", - "interval": "", - "legendFormat": "{{cluster}} - {{pod}} - {{workspaceType}}", - "queryType": "randomWalk", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Schedule attempt rate", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 2, - "format": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 1 - }, - "hiddenSeries": false, - "id": 42, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": true, - "min": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(gitpod_ws_scheduler_schedule_attempts_total{cluster=~\"$cluster\", result!=\"scheduled\"}[5m])) by (cluster, workspaceType, result)", - "interval": "", - "legendFormat": "{{cluster}} - {{pod}} - {{workspaceType}} - {{result}}", - "queryType": "randomWalk", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Schedule failure rate", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 2, - "format": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 9 - }, - "hiddenSeries": false, - "id": 41, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(gitpod_ws_scheduler_preemption_attempts_total{cluster=~\"$cluster\"}[5m])) by (cluster)", - "interval": "", - "legendFormat": "{{cluster}} - {{pod}}", - "queryType": "randomWalk", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Preemption attempt rate", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 2, - "format": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 9 - }, - "hiddenSeries": false, - "id": 44, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": true, - "min": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(gitpod_ws_scheduler_pending_pods{cluster=~\"$cluster\"}) by (cluster, queue)", - "interval": "", - "legendFormat": "{{cluster}} - {{queue}}", - "queryType": "randomWalk", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Pending pods per queue", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "pods", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 17 - }, - "hiddenSeries": false, - "id": 45, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": true, - "min": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, \n sum(\n rate(gitpod_ws_scheduler_pod_scheduling_attempts_bucket{cluster=~\"$cluster\", workspaceType=\"regular\"}[5m])\n ) by (cluster, workspaceType, le)\n)", - "interval": "", - "legendFormat": "{{cluster}} - 99th percentile", - "queryType": "randomWalk", - "refId": "A" - }, - { - "expr": "histogram_quantile(0.95, \n sum(\n rate(gitpod_ws_scheduler_pod_scheduling_attempts_bucket{cluster=~\"$cluster\", workspaceType=\"regular\"}[5m])\n ) by (cluster, workspaceType, le)\n)", - "hide": false, - "interval": "", - "legendFormat": "{{cluster}} - 95th percentile", - "queryType": "randomWalk", - "refId": "B" - }, - { - "expr": "histogram_quantile(0.50, \n sum(\n rate(gitpod_ws_scheduler_pod_scheduling_attempts_bucket{cluster=~\"$cluster\", workspaceType=\"regular\"}[5m])\n ) by (cluster, workspaceType, le)\n)", - "hide": false, - "interval": "", - "legendFormat": "{{cluster}} - 50th percentile", - "queryType": "randomWalk", - "refId": "C" - }, - { - "expr": " sum(\n rate(gitpod_ws_scheduler_pod_scheduling_attempts_bucket{cluster=~\"$cluster\",workspaceType=\"regular\"}[5m])\n ) by (cluster)\n /\n sum(\n rate(gitpod_ws_scheduler_pod_scheduling_attempts_bucket{cluster=~\"$cluster\",workspaceType=\"regular\"}[5m])\n ) by (cluster)", - "hide": false, - "interval": "", - "legendFormat": "{{cluster}} - avg", - "queryType": "randomWalk", - "refId": "D" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Attempts until succesful scheduling - Regular workspaces", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "attempts", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 17 - }, - "hiddenSeries": false, - "id": 34, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": true, - "min": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, \n sum(\n rate(gitpod_ws_scheduler_e2e_scheduling_duration_seconds_bucket{cluster=~\"$cluster\", workspaceType=\"regular\"}[5m])\n ) by (cluster, workspaceType, le)\n)", - "interval": "", - "legendFormat": "{{cluster}} - 99th percentile", - "queryType": "randomWalk", - "refId": "A" - }, - { - "expr": "histogram_quantile(0.95, \n sum(\n rate(gitpod_ws_scheduler_e2e_scheduling_duration_seconds_bucket{cluster=~\"$cluster\", workspaceType=\"regular\"}[5m])\n ) by (cluster, workspaceType, le)\n)", - "hide": false, - "interval": "", - "legendFormat": "{{cluster}} - 95th percentile", - "queryType": "randomWalk", - "refId": "B" - }, - { - "expr": "histogram_quantile(0.50, \n sum(\n rate(gitpod_ws_scheduler_e2e_scheduling_duration_seconds_bucket{cluster=~\"$cluster\", workspaceType=\"regular\"}[5m])\n ) by (cluster, workspaceType, le)\n)", - "hide": false, - "interval": "", - "legendFormat": "{{cluster}} - 50th percentile", - "queryType": "randomWalk", - "refId": "C" - }, - { - "expr": " sum(\n rate(gitpod_ws_scheduler_e2e_scheduling_duration_seconds_sum{cluster=~\"$cluster\",workspaceType=\"regular\"}[5m])\n ) by (cluster)\n /\n sum(\n rate(gitpod_ws_scheduler_e2e_scheduling_duration_seconds_count{cluster=~\"$cluster\",workspaceType=\"regular\"}[5m])\n ) by (cluster)", - "hide": false, - "interval": "", - "legendFormat": "{{cluster}} - avg", - "queryType": "randomWalk", - "refId": "D" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "End-to-end scheduling duration - Regular workspaces", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 25 - }, - "hiddenSeries": false, - "id": 46, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": true, - "min": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, \n sum(\n rate(gitpod_ws_scheduler_pod_scheduling_attempts_bucket{cluster=~\"$cluster\", workspaceType=\"prebuild\"}[5m])\n ) by (cluster, workspaceType, le)\n)", - "interval": "", - "legendFormat": "{{cluster}} - 99th percentile", - "queryType": "randomWalk", - "refId": "A" - }, - { - "expr": "histogram_quantile(0.95, \n sum(\n rate(gitpod_ws_scheduler_pod_scheduling_attempts_bucket{cluster=~\"$cluster\", workspaceType=\"prebuild\"}[5m])\n ) by (cluster, workspaceType, le)\n)", - "hide": false, - "interval": "", - "legendFormat": "{{cluster}} - 95th percentile", - "queryType": "randomWalk", - "refId": "B" - }, - { - "expr": "histogram_quantile(0.50, \n sum(\n rate(gitpod_ws_scheduler_pod_scheduling_attempts_bucket{cluster=~\"$cluster\", workspaceType=\"prebuild\"}[5m])\n ) by (cluster, workspaceType, le)\n)", - "hide": false, - "interval": "", - "legendFormat": "{{cluster}} - 50th percentile", - "queryType": "randomWalk", - "refId": "C" - }, - { - "expr": " sum(\n rate(gitpod_ws_scheduler_pod_scheduling_attempts_bucket{cluster=~\"$cluster\",workspaceType=\"prebuild\"}[5m])\n ) by (cluster)\n /\n sum(\n rate(gitpod_ws_scheduler_pod_scheduling_attempts_bucket{cluster=~\"$cluster\",workspaceType=\"prebuild\"}[5m])\n ) by (cluster)", - "hide": false, - "interval": "", - "legendFormat": "{{cluster}} - avg", - "queryType": "randomWalk", - "refId": "D" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Attempts until succesful scheduling - Prebuild workspaces", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "attempts", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 25 - }, - "hiddenSeries": false, - "id": 37, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": true, - "min": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, \n sum(\n rate(gitpod_ws_scheduler_e2e_scheduling_duration_seconds_bucket{cluster=~\"$cluster\", workspaceType=\"prebuild\"}[5m])\n ) by (cluster, workspaceType, le)\n)", - "interval": "", - "legendFormat": "{{cluster}} - 99th percentile", - "queryType": "randomWalk", - "refId": "A" - }, - { - "expr": "histogram_quantile(0.95, \n sum(\n rate(gitpod_ws_scheduler_e2e_scheduling_duration_seconds_bucket{cluster=~\"$cluster\", workspaceType=\"prebuild\"}[5m])\n ) by (cluster, workspaceType, le)\n)", - "hide": false, - "interval": "", - "legendFormat": "{{cluster}} - 95th percentile", - "queryType": "randomWalk", - "refId": "B" - }, - { - "expr": "histogram_quantile(0.50, \n sum(\n rate(gitpod_ws_scheduler_e2e_scheduling_duration_seconds_bucket{cluster=~\"$cluster\", workspaceType=\"prebuild\"}[5m])\n ) by (cluster, workspaceType, le)\n)", - "hide": false, - "interval": "", - "legendFormat": "{{cluster}} - 50th percentile", - "queryType": "randomWalk", - "refId": "C" - }, - { - "expr": " sum(\n rate(gitpod_ws_scheduler_e2e_scheduling_duration_seconds_sum{cluster=~\"$cluster\",workspaceType=\"prebuild\"}[5m])\n ) by (cluster)\n /\n sum(\n rate(gitpod_ws_scheduler_e2e_scheduling_duration_seconds_count{cluster=~\"$cluster\",workspaceType=\"prebuild\"}[5m])\n ) by (cluster)", - "hide": false, - "interval": "", - "legendFormat": "{{cluster}} - avg", - "queryType": "randomWalk", - "refId": "D" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "End-to-end scheduling duration - Prebuild workspaces", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 33 - }, - "hiddenSeries": false, - "id": 47, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": true, - "min": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, \n sum(\n rate(gitpod_ws_scheduler_pod_scheduling_attempts_bucket{cluster=~\"$cluster\", workspaceType=\"ghost\"}[5m])\n ) by (cluster, workspaceType, le)\n)", - "interval": "", - "legendFormat": "{{cluster}} - 99th percentile", - "queryType": "randomWalk", - "refId": "A" - }, - { - "expr": "histogram_quantile(0.95, \n sum(\n rate(gitpod_ws_scheduler_pod_scheduling_attempts_bucket{cluster=~\"$cluster\", workspaceType=\"ghost\"}[5m])\n ) by (cluster, workspaceType, le)\n)", - "hide": false, - "interval": "", - "legendFormat": "{{cluster}} - 95th percentile", - "queryType": "randomWalk", - "refId": "B" - }, - { - "expr": "histogram_quantile(0.50, \n sum(\n rate(gitpod_ws_scheduler_pod_scheduling_attempts_bucket{cluster=~\"$cluster\", workspaceType=\"ghost\"}[5m])\n ) by (cluster, workspaceType, le)\n)", - "hide": false, - "interval": "", - "legendFormat": "{{cluster}} - 50th percentile", - "queryType": "randomWalk", - "refId": "C" - }, - { - "expr": " sum(\n rate(gitpod_ws_scheduler_pod_scheduling_attempts_bucket{cluster=~\"$cluster\",workspaceType=\"ghost\"}[5m])\n ) by (cluster)\n /\n sum(\n rate(gitpod_ws_scheduler_pod_scheduling_attempts_bucket{cluster=~\"$cluster\",workspaceType=\"ghost\"}[5m])\n ) by (cluster)", - "hide": false, - "interval": "", - "legendFormat": "{{cluster}} - avg", - "queryType": "randomWalk", - "refId": "D" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Attempts until succesful scheduling - Ghost workspaces", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "attempts", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 33 - }, - "hiddenSeries": false, - "id": 36, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": true, - "min": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, \n sum(\n rate(gitpod_ws_scheduler_e2e_scheduling_duration_seconds_bucket{cluster=~\"$cluster\", workspaceType=\"ghost\"}[5m])\n ) by (cluster, workspaceType, le)\n)", - "interval": "", - "legendFormat": "{{cluster}} - 99th percentile", - "queryType": "randomWalk", - "refId": "A" - }, - { - "expr": "histogram_quantile(0.95, \n sum(\n rate(gitpod_ws_scheduler_e2e_scheduling_duration_seconds_bucket{cluster=~\"$cluster\", workspaceType=\"ghost\"}[5m])\n ) by (cluster, workspaceType, le)\n)", - "hide": false, - "interval": "", - "legendFormat": "{{cluster}} - 95th percentile", - "queryType": "randomWalk", - "refId": "B" - }, - { - "expr": "histogram_quantile(0.50, \n sum(\n rate(gitpod_ws_scheduler_e2e_scheduling_duration_seconds_bucket{cluster=~\"$cluster\", workspaceType=\"ghost\"}[5m])\n ) by (cluster, workspaceType, le)\n)", - "hide": false, - "interval": "", - "legendFormat": "{{cluster}} - 50th percentile", - "queryType": "randomWalk", - "refId": "C" - }, - { - "expr": " sum(\n rate(gitpod_ws_scheduler_e2e_scheduling_duration_seconds_sum{cluster=~\"$cluster\",workspaceType=\"ghost\"}[5m])\n ) by (cluster)\n /\n sum(\n rate(gitpod_ws_scheduler_e2e_scheduling_duration_seconds_count{cluster=~\"$cluster\",workspaceType=\"ghost\"}[5m])\n ) by (cluster)", - "hide": false, - "interval": "", - "legendFormat": "{{cluster}} - avg", - "queryType": "randomWalk", - "refId": "D" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "End-to-end scheduling duration - Ghost workspaces", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 41 - }, - "hiddenSeries": false, - "id": 48, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": true, - "min": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, \n sum(\n rate(gitpod_ws_scheduler_pod_scheduling_attempts_bucket{cluster=~\"$cluster\", workspaceType=\"probe\"}[5m])\n ) by (cluster, workspaceType, le)\n)", - "interval": "", - "legendFormat": "{{cluster}} - 99th percentile", - "queryType": "randomWalk", - "refId": "A" - }, - { - "expr": "histogram_quantile(0.95, \n sum(\n rate(gitpod_ws_scheduler_pod_scheduling_attempts_bucket{cluster=~\"$cluster\", workspaceType=\"probe\"}[5m])\n ) by (cluster, workspaceType, le)\n)", - "hide": false, - "interval": "", - "legendFormat": "{{cluster}} - 95th percentile", - "queryType": "randomWalk", - "refId": "B" - }, - { - "expr": "histogram_quantile(0.50, \n sum(\n rate(gitpod_ws_scheduler_pod_scheduling_attempts_bucket{cluster=~\"$cluster\", workspaceType=\"probe\"}[5m])\n ) by (cluster, workspaceType, le)\n)", - "hide": false, - "interval": "", - "legendFormat": "{{cluster}} - 50th percentile", - "queryType": "randomWalk", - "refId": "C" - }, - { - "expr": " sum(\n rate(gitpod_ws_scheduler_pod_scheduling_attempts_bucket{cluster=~\"$cluster\",workspaceType=\"probe\"}[5m])\n ) by (cluster)\n /\n sum(\n rate(gitpod_ws_scheduler_pod_scheduling_attempts_bucket{cluster=~\"$cluster\",workspaceType=\"probe\"}[5m])\n ) by (cluster)", - "hide": false, - "interval": "", - "legendFormat": "{{cluster}} - avg", - "queryType": "randomWalk", - "refId": "D" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Attempts until succesful scheduling - Probe workspaces", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "attempts", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 41 - }, - "hiddenSeries": false, - "id": 38, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": true, - "min": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.99, \n sum(\n rate(gitpod_ws_scheduler_e2e_scheduling_duration_seconds_bucket{cluster=~\"$cluster\", workspaceType=\"probe\"}[5m])\n ) by (cluster, workspaceType, le)\n)", - "interval": "", - "legendFormat": "{{cluster}} - 99th percentile", - "queryType": "randomWalk", - "refId": "A" - }, - { - "expr": "histogram_quantile(0.95, \n sum(\n rate(gitpod_ws_scheduler_e2e_scheduling_duration_seconds_bucket{cluster=~\"$cluster\", workspaceType=\"probe\"}[5m])\n ) by (cluster, workspaceType, le)\n)", - "hide": false, - "interval": "", - "legendFormat": "{{cluster}} - 95th percentile", - "queryType": "randomWalk", - "refId": "B" - }, - { - "expr": "histogram_quantile(0.50, \n sum(\n rate(gitpod_ws_scheduler_e2e_scheduling_duration_seconds_bucket{cluster=~\"$cluster\", workspaceType=\"probe\"}[5m])\n ) by (cluster, workspaceType, le)\n)", - "hide": false, - "interval": "", - "legendFormat": "{{cluster}} - 50th percentile", - "queryType": "randomWalk", - "refId": "C" - }, - { - "expr": " sum(\n rate(gitpod_ws_scheduler_e2e_scheduling_duration_seconds_sum{cluster=~\"$cluster\",workspaceType=\"probe\"}[5m])\n ) by (cluster)\n /\n sum(\n rate(gitpod_ws_scheduler_e2e_scheduling_duration_seconds_count{cluster=~\"$cluster\",workspaceType=\"probe\"}[5m])\n ) by (cluster)", - "hide": false, - "interval": "", - "legendFormat": "{{cluster}} - avg", - "queryType": "randomWalk", - "refId": "D" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "End-to-end scheduling duration - Probe workspaces", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "title": "ws-scheduler Metrics", - "type": "row" - }, - { - "collapsed": false, - "datasource": null, - "fieldConfig": { - "defaults": {}, - "overrides": [] - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 1 - }, - "id": 16, - "panels": [], - "title": "Pod Metrics", - "type": "row" - }, - { - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 10, - "x": 0, - "y": 2 - }, - "id": 52, - "options": { - "legend": { - "calcs": [], - "displayMode": "table", - "placement": "right" - }, - "tooltip": { - "mode": "single" - } - }, - "targets": [ - { - "exemplar": true, - "expr": "kube_pod_container_info{cluster=~\"$cluster\", pod=~\"$pod\", image=~\".+\", container=\"scheduler\"}", - "interval": "", - "legendFormat": "{{cluster}} - {{image}}", - "queryType": "randomWalk", - "refId": "A" - } - ], - "title": "Container image version", - "type": "timeseries" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "decimals": 2, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 7, - "x": 10, - "y": 2 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "max": true, - "min": false, - "show": true, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.1.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(\n rate(container_cpu_usage_seconds_total{container!=\"POD\", cluster=~\"$cluster\", node=~\"$node\", pod=~\"$pod\"}[1m])\n) by (pod, cluster, node)", - "interval": "", - "legendFormat": "{{cluster}} - {{node}} - {{pod}} - Cores being used", - "queryType": "randomWalk", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "CPU Utilization", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 2, - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "description": "Saturation > 100% means that the container is requesting more than its limits.\n\nKubernetes will start to throttle CPU when that happens. That's a sign of degraded performance.\n\n'No Data' indicates that the pod has no CPU limits.", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 7, - "x": 17, - "y": 2 - }, - "hiddenSeries": false, - "id": 4, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.1.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "/.*CPU Throttles/", - "yaxis": 2 - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(\n rate(container_cpu_usage_seconds_total{container!=\"POD\", cluster=~\"$cluster\", node=~\"$node\", pod=~\"$pod\"}[1m])\n) by (pod, cluster, node)\n/\nsum(\n kube_pod_container_resource_limits_cpu_cores{container!=\"POD\", cluster=\"$cluster\", pod=~\"$pod\"}\n) by (pod, cluster, node)\n", - "interval": "", - "legendFormat": "{{cluster}} - {{node} - {{pod}} - CPU Saturation", - "queryType": "randomWalk", - "refId": "A" - }, - { - "expr": "sum(\nrate(container_cpu_cfs_throttled_seconds_total{container!=\"POD\", cluster=~\"$cluster\", node=~\"$node\", pod=~\"$pod\"}[1m])\n) by (pod)", - "interval": "", - "legendFormat": "{{pod}} - CPU Throttles", - "queryType": "randomWalk", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "CPU Saturation", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 2, - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 9 - }, - "hiddenSeries": false, - "id": 6, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "max": true, - "min": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.1.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(container_memory_working_set_bytes{container!=\"POD\", container!=\"\", cluster=~\"$cluster\", node=~\"$node\", pod=~\"$pod\"}) by (pod, cluster, node)", - "interval": "", - "legendFormat": "{{cluster}} - {{node}} - {{pod}}", - "queryType": "randomWalk", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Memory Utilization", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "decimals": 4, - "description": "Memory can't be throttled. When a container reaches 100% of its memory limits, Kubernetes will kill the container and restart it.\n\n'No Data' indicates that the pod doesn't have Memory limits.", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 9 - }, - "hiddenSeries": false, - "id": 8, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "max": true, - "min": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.1.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(\nrate(container_memory_working_set_bytes{container!=\"POD\", container!=\"\", cluster=~\"$cluster\", node=~\"$node\", pod=~\"$pod\"}[1m])\n) by (pod, cluster, node)\n/\nsum(\n kube_pod_container_resource_limits{container!=\"POD\", cluster=\"$cluster\", pod=~\"$pod\", resource=\"memory\"}\n) by (pod, cluster, node)\n", - "interval": "", - "legendFormat": "{{cluster}} - {{node}} - {{pod}} - Memory Saturation", - "queryType": "randomWalk", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Memory Saturation", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 2, - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 16 - }, - "hiddenSeries": false, - "id": 10, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.1.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum (\n rate(container_network_receive_bytes_total{container!=\"POD\", cluster=~\"$cluster\", node=~\"$node\", pod=~\"$pod\"}[1m])\n) by (pod, cluster, node)", - "interval": "", - "legendFormat": "{{cluster}} - {{node}} - {{pod}} - Received", - "queryType": "randomWalk", - "refId": "A" - }, - { - "expr": "sum (\n rate(container_network_transmit_bytes_total{container!=\"POD\", cluster=~\"$cluster\", node=~\"$node\", pod=~\"$pod\"}[1m])\n) by (pod, cluster, node)", - "interval": "", - "legendFormat": "{{cluster}} - {{node}} - {{pod}} - Transmitted", - "queryType": "randomWalk", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Network Utilization", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "binBps", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 16 - }, - "hiddenSeries": false, - "id": 30, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.1.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum (\n rate(container_network_receive_packets_dropped_total{container!=\"POD\", pod!=\"\", cluster=~\"$cluster\", node=~\"$node\", pod=~\"$pod\"}[1m])\n) by (pod, cluster, node)", - "interval": "", - "legendFormat": "{{cluster}} - {{node}} - {{pod}} - Receive", - "queryType": "randomWalk", - "refId": "A" - }, - { - "expr": "sum (\n rate(container_network_transmit_packets_dropped_total{container!=\"POD\", pod!=\"\", cluster=~\"$cluster\", node=~\"$node\", pod=~\"$pod\"}[1m])\n) by (pod, cluster, node)", - "interval": "", - "legendFormat": "{{cluster}} - {{node}} - {{pod}} - Transmit", - "queryType": "randomWalk", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Network Saturation (Packets Dropped)", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 2, - "format": "pps", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 16 - }, - "hiddenSeries": false, - "id": 32, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.1.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum (\n rate(container_network_receive_errors_total{container!=\"POD\", pod!=\"\", cluster=~\"$cluster\", node=~\"$node\", pod=~\"$pod\"}[1m])\n) by (pod, cluster, node)", - "interval": "", - "legendFormat": "{{cluster}} - {{node}} - {{pod}} - Received", - "queryType": "randomWalk", - "refId": "A" - }, - { - "expr": "sum (\n rate(container_network_transmit_errors_total{container!=\"POD\", pod!=\"\", cluster=~\"$cluster\", node=~\"$node\", pod=~\"$pod\"}[1m])\n) by (pod, cluster, node)", - "interval": "", - "legendFormat": "{{cluster}} - {{node}} - {{pod}} - Transmitted", - "queryType": "randomWalk", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Network Errors", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 2, - "format": "Errors/s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "decimals": 4, - "description": "", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 8, - "x": 0, - "y": 23 - }, - "hiddenSeries": false, - "id": 22, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "max": true, - "min": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.1.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(kube_pod_container_status_restarts_total{cluster=~\"$cluster\", pod=~\"$pod\"}[1m])", - "interval": "", - "legendFormat": "{{cluster}} - {{kubernetes_pod_node_name}} - {{pod}} ", - "queryType": "randomWalk", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Pod Restarts", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 2, - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "decimals": 0, - "description": "", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 8, - "x": 8, - "y": 23 - }, - "hiddenSeries": false, - "id": 28, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.1.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "kube_pod_container_status_running{cluster=~\"$cluster\", pod=~\"$pod\"} == 1 ", - "interval": "", - "legendFormat": "{{pod}} - RUNNING", - "queryType": "randomWalk", - "refId": "A" - }, - { - "expr": "(\n sum by (pod) (kube_pod_container_status_terminated{cluster=~\"$cluster\", pod=~\"$pod\"}) == 1\n) * on(pod) group_left(reason) (\n sum by (pod, reason) (kube_pod_container_status_terminated_reason{cluster=~\"$cluster\", pod=~\"$pod\"}) == 1\n)", - "interval": "", - "legendFormat": "{{pod}} - TERMINATED -> {{reason}}", - "queryType": "randomWalk", - "refId": "B" - }, - { - "expr": "(\n sum by (pod) (kube_pod_container_status_waiting{cluster=~\"$cluster\", pod=~\"$pod\"}) == 1\n) * on(pod) group_left(reason) (\n sum by (pod, reason) (kube_pod_container_status_waiting_reason{cluster=~\"$cluster\", pod=~\"$pod\"}) == 1\n)", - "interval": "", - "legendFormat": "{{pod}} - WAITING -> {{reason}}", - "queryType": "randomWalk", - "refId": "C" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Pod Status", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 0, - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "decimals": 0, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 8, - "x": 16, - "y": 23 - }, - "hiddenSeries": false, - "id": 26, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.1.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "kube_deployment_spec_replicas{cluster=~\"$cluster\", deployment=\"ws-scheduler\"}", - "interval": "", - "legendFormat": "{{cluster}} - {{deployment}} - Desired", - "queryType": "randomWalk", - "refId": "C" - }, - { - "expr": "kube_deployment_status_replicas_available{cluster=~\"$cluster\", deployment=\"ws-scheduler\"}", - "interval": "", - "legendFormat": "{{cluster}} - {{deployment}} - Available replicas", - "queryType": "randomWalk", - "refId": "A" - }, - { - "expr": "kube_deployment_status_replicas_unavailable{cluster=~\"$cluster\", deployment=\"ws-scheduler\"}", - "interval": "", - "legendFormat": "{{cluster}} - {{deployment}} - Unvailable replicas", - "queryType": "randomWalk", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Replicas availability", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 0, - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": "30s", - "schemaVersion": 30, - "style": "dark", - "tags": [ - "gitpod-mixin" - ], - "templating": { - "list": [ - { - "allValue": null, - "current": {}, - "datasource": "$datasource", - "definition": "label_values(up{job=\"ws-scheduler\"}, cluster)", - "description": null, - "error": null, - "hide": 0, - "includeAll": true, - "label": "Cluster", - "multi": true, - "name": "cluster", - "options": [], - "query": { - "query": "label_values(up{job=\"ws-scheduler\"}, cluster)", - "refId": "StandardVariableQuery" - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": {}, - "datasource": "$datasource", - "definition": "label_values(container_cpu_usage_seconds_total{cluster=~\"$cluster\", pod=~\"ws-scheduler.*\"}, node)", - "description": null, - "error": null, - "hide": 0, - "includeAll": true, - "label": "Node", - "multi": true, - "name": "node", - "options": [], - "query": { - "query": "label_values(container_cpu_usage_seconds_total{cluster=~\"$cluster\", pod=~\"ws-scheduler.*\"}, node)", - "refId": "StandardVariableQuery" - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": {}, - "datasource": "$datasource", - "definition": "label_values(container_cpu_usage_seconds_total{cluster=~\"$cluster\", node=~\"$node\", pod=~\"ws-scheduler.*\"}, pod)", - "description": null, - "error": null, - "hide": 0, - "includeAll": true, - "label": "Pod", - "multi": true, - "name": "pod", - "options": [], - "query": { - "query": "label_values(container_cpu_usage_seconds_total{cluster=~\"$cluster\", node=~\"$node\", pod=~\"ws-scheduler.*\"}, pod)", - "refId": "StandardVariableQuery" - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "current": { - "selected": false, - "text": "VictoriaMetrics", - "value": "VictoriaMetrics" - }, - "description": null, - "error": null, - "hide": 2, - "includeAll": false, - "label": null, - "multi": false, - "name": "datasource", - "options": [], - "query": "prometheus", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "type": "datasource" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": {}, - "timezone": "utc", - "title": "Gitpod / Component / ws-scheduler", - "uid": "ws-scheduler", - "version": 1 -} \ No newline at end of file diff --git a/test/go.sum b/test/go.sum index 2b2aa82a4ab579..143f35db7811b2 100644 --- a/test/go.sum +++ b/test/go.sum @@ -57,7 +57,6 @@ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBp github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/HdrHistogram/hdrhistogram-go v1.1.0 h1:6dpdDPTRoo78HxAJ6T1HfMiKSnqhgRRqzCuPshRkQ7I= -github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd h1:sjQovDkwrZp8u+gxLtPgKGjk5hCxuy2hrRejBTA9xFU= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= @@ -87,7 +86,6 @@ github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbt github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -119,11 +117,9 @@ github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7 github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -296,7 +292,6 @@ github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8 github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= @@ -336,14 +331,12 @@ github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-ozzo/ozzo-validation v3.5.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= github.com/go-ozzo/ozzo-validation v3.6.0+incompatible h1:msy24VGS42fKO9K1vLz82/GeYW1cILu7Nuuj1N3BBkE= github.com/go-ozzo/ozzo-validation v3.6.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-test/deep v1.0.5/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= @@ -357,7 +350,6 @@ github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v0.0.0-20210429001901-424d2337a529 h1:2voWjNECnrZRbfwXxHB1/j8wa6xdKn85B5NzgVL/pTU= github.com/golang/glog v0.0.0-20210429001901-424d2337a529/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -464,7 +456,6 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.5.0 h1:ajue7SzQMywqRjg2fK7dcpc0QhFGpTR2plWfV4EZWR4= github.com/grpc-ecosystem/grpc-gateway/v2 v2.5.0/go.mod h1:r1hZAcvfFXuYmcKyCJI9wlyOPIZUJl6FCB8Cpca/NLE= @@ -523,7 +514,6 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -724,7 +714,6 @@ github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiB github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/segmentio/backo-go v0.0.0-20200129164019-23eae7c10bd3/go.mod h1:9/Rh6yILuLysoQnZ2oNooD2g7aBnvM7r/fNVxRNWfBc= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= @@ -810,7 +799,6 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c/go.mod h1:UrdRz5enIKZ63MEE3IF9l2/ebyx59GyGgPi+tICQdmM= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -880,10 +868,7 @@ golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= @@ -893,7 +878,6 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1105,16 +1089,13 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1177,10 +1158,6 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -1328,7 +1305,6 @@ gopkg.in/ini.v1 v1.57.0 h1:9unxIsFcTt4I55uWluz+UmL95q4kdJ0buvQ1ZIqVQww= gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/segmentio/analytics-go.v3 v3.1.0/go.mod h1:4QqqlTlSSpVlWA9/9nDcPw+FkM2yv1NQoYjUbL9/JAw= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= @@ -1394,7 +1370,6 @@ k8s.io/utils v0.0.0-20210527160623-6fdb442a123b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/ k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a h1:8dYfu/Fc9Gz2rNJKB9IQRGgQOh2clmRzNIPPY1xLY5g= k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= diff --git a/test/pkg/integration/setup.go b/test/pkg/integration/setup.go index 5c46c5a2bf8e64..c883cbde86ba1c 100644 --- a/test/pkg/integration/setup.go +++ b/test/pkg/integration/setup.go @@ -110,7 +110,6 @@ func waitOnGitpodRunning(namespace string, waitTimeout time.Duration) env.Func { "ws-manager", "ws-manager-bridge", "ws-proxy", - "ws-scheduler", } client := cfg.Client()