diff --git a/chart/templates/ws-proxy-configmap.yaml b/chart/templates/ws-proxy-configmap.yaml index 52190bbf3a2566..35ff0a428bfba6 100644 --- a/chart/templates/ws-proxy-configmap.yaml +++ b/chart/templates/ws-proxy-configmap.yaml @@ -17,20 +17,12 @@ metadata: data: config.json: |- { + "namespace": {{ .Release.Namespace | quote }}, "ingress": { "httpAddress": ":{{- $comp.ports.httpProxy.containerPort -}}", "httpsAddress": ":{{- $comp.ports.httpsProxy.containerPort -}}", "header": "{{- $comp.hostHeader -}}" }, - "workspaceInfoProviderConfig": { - "wsManagerAddr": "ws-manager:8080", - "reconnectInterval": "3s", - "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" - } - }, "proxy": { "https": { "crt": "/mnt/certificates/tls.crt", @@ -53,8 +45,6 @@ data: "workspaceHostSuffixRegex": {{ ($comp.workspaceHostSuffixRegex | default (printf "%s%s" "\\.ws[^\\.]*\\." ($.Values.hostname | replace "." "\\."))) | quote }} }, "workspacePodConfig": { - "serviceTemplate": "http://ws-{{"{{ .workspaceID }}"}}-theia.{{- .Release.Namespace -}}.svc.cluster.local:{{"{{ .port }}"}}", - "portServiceTemplate": "http://ws-{{"{{ .workspaceID }}"}}-ports.{{- .Release.Namespace -}}.svc.cluster.local:{{"{{ .port }}"}}", "theiaPort": {{ .Values.components.workspace.ports.http.containerPort }}, "supervisorPort": {{ .Values.components.workspace.ports.http.supervisorPort }}, "supervisorImage": "{{ template "gitpod.comp.imageFull" (dict "root" . "gp" $.Values "comp" .Values.components.workspace.supervisor) }}" diff --git a/chart/templates/ws-proxy-deployment.yaml b/chart/templates/ws-proxy-deployment.yaml index 84af708f101851..19cf816b83fd91 100644 --- a/chart/templates/ws-proxy-deployment.yaml +++ b/chart/templates/ws-proxy-deployment.yaml @@ -66,7 +66,7 @@ spec: periodSeconds: 5 failureThreshold: 10 httpGet: - path: / + path: /readyz port: 60088 livenessProbe: initialDelaySeconds: 2 @@ -75,15 +75,12 @@ spec: successThreshold: 1 timeoutSeconds: 2 httpGet: - path: / + path: /healthz port: 60088 volumeMounts: - name: config mountPath: "/config" readOnly: true - - mountPath: /ws-manager-client-tls-certs - name: ws-manager-client-tls-certs - readOnly: true {{- if $.Values.certificatesSecret.secretName }} - name: config-certificates mountPath: "/mnt/certificates" @@ -93,4 +90,4 @@ spec: {{ include "gitpod.container.defaultEnv" $this | indent 8 }} {{ include "gitpod.container.tracingEnv" $this | indent 8 }} {{ toYaml .Values.defaults | indent 6 }} -{{ end }} \ No newline at end of file +{{ end }} diff --git a/chart/templates/ws-proxy-role.yaml b/chart/templates/ws-proxy-role.yaml new file mode 100644 index 00000000000000..b60c21d6b2ea55 --- /dev/null +++ b/chart/templates/ws-proxy-role.yaml @@ -0,0 +1,21 @@ +# 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: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + app: {{ template "gitpod.fullname" . }} + component: ws-proxy + kind: role + stage: {{ .Values.installation.stage }} + name: ws-proxy +rules: +- apiGroups: + - "" + resources: + - pods + verbs: + - get + - list + - watch diff --git a/chart/templates/ws-proxy-rolebinding.yaml b/chart/templates/ws-proxy-rolebinding.yaml index 9bcf3bedc8362d..94fefbdb18b320 100644 --- a/chart/templates/ws-proxy-rolebinding.yaml +++ b/chart/templates/ws-proxy-rolebinding.yaml @@ -20,4 +20,23 @@ roleRef: kind: ClusterRole name: {{ .Release.Namespace }}-ns-psp:unprivileged apiGroup: rbac.authorization.k8s.io -{{ end }} \ No newline at end of file +--- + +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: ws-proxy-api + labels: + app: {{ template "gitpod.fullname" . }} + component: ws-proxy + kind: role-binding + stage: {{ .Values.installation.stage }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: ws-proxy +subjects: +- kind: ServiceAccount + name: ws-proxy + +{{ end }} diff --git a/components/common-go/kubernetes/kubernetes.go b/components/common-go/kubernetes/kubernetes.go index 07fab762c5e763..c8904f6df8d3c5 100644 --- a/components/common-go/kubernetes/kubernetes.go +++ b/components/common-go/kubernetes/kubernetes.go @@ -57,6 +57,22 @@ const ( // ContainerIsGoneAnnotation is used as workaround for containerd https://github.com/containerd/containerd/pull/4214 // which might cause workspace container status propagation to fail, which in turn would keep a workspace running indefinitely. ContainerIsGoneAnnotation = "gitpod.io/containerIsGone" + + // WorkspaceURLAnnotation is the annotation on the WS pod which contains the public workspace URL. + WorkspaceURLAnnotation = "gitpod/url" + + // OwnerTokenAnnotation contains the owner token of the workspace. + OwnerTokenAnnotation = "gitpod/ownerToken" + + // WorkspaceAdmissionAnnotation determines the user admission to a workspace, i.e. if it can be accessed by everyone without token. + WorkspaceAdmissionAnnotation = "gitpod/admission" + + // WorkspaceImageSpecAnnotation contains the protobuf serialized image spec in base64 encoding. We need to keep this around post-request + // to provide this information to the registry facade later in the workspace's lifecycle. + WorkspaceImageSpecAnnotation = "gitpod/imageSpec" + + // WorkspaceExposedPorts contains the exposed ports in the workspace + WorkspaceExposedPorts = "gitpod/exposedPorts" ) // WorkspaceSupervisorEndpoint produces the supervisor endpoint of a workspace. diff --git a/components/content-service-api/go/blobs.pb.go b/components/content-service-api/go/blobs.pb.go index b9047a3008f000..1e96558d12c86d 100644 --- a/components/content-service-api/go/blobs.pb.go +++ b/components/content-service-api/go/blobs.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.1 -// protoc v3.19.0 +// protoc v3.19.1 // source: blobs.proto package api diff --git a/components/content-service-api/go/content.pb.go b/components/content-service-api/go/content.pb.go index 1f560fabff2f64..dae311159ee437 100644 --- a/components/content-service-api/go/content.pb.go +++ b/components/content-service-api/go/content.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.1 -// protoc v3.19.0 +// protoc v3.19.1 // source: content.proto package api diff --git a/components/content-service-api/go/headless-log.pb.go b/components/content-service-api/go/headless-log.pb.go index f8c3371df64ced..24e00916d6150f 100644 --- a/components/content-service-api/go/headless-log.pb.go +++ b/components/content-service-api/go/headless-log.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.1 -// protoc v3.19.0 +// protoc v3.19.1 // source: headless-log.proto package api diff --git a/components/content-service-api/go/ideplugin.pb.go b/components/content-service-api/go/ideplugin.pb.go index 9380a3d22828f3..9e268700902109 100644 --- a/components/content-service-api/go/ideplugin.pb.go +++ b/components/content-service-api/go/ideplugin.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.1 -// protoc v3.19.0 +// protoc v3.19.1 // source: ideplugin.proto package api diff --git a/components/content-service-api/go/initializer.pb.go b/components/content-service-api/go/initializer.pb.go index e0d0aaa39c5028..f2af243286177a 100644 --- a/components/content-service-api/go/initializer.pb.go +++ b/components/content-service-api/go/initializer.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.1 -// protoc v3.19.0 +// protoc v3.19.1 // source: initializer.proto package api diff --git a/components/content-service-api/go/workspace.pb.go b/components/content-service-api/go/workspace.pb.go index bc0dab8f227969..18fa93cd6d5471 100644 --- a/components/content-service-api/go/workspace.pb.go +++ b/components/content-service-api/go/workspace.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.1 -// protoc v3.19.0 +// protoc v3.19.1 // source: workspace.proto package api diff --git a/components/content-service-api/typescript/src/blobs_pb.js b/components/content-service-api/typescript/src/blobs_pb.js index cfced0c7ee3749..720f76c514c5c2 100644 --- a/components/content-service-api/typescript/src/blobs_pb.js +++ b/components/content-service-api/typescript/src/blobs_pb.js @@ -19,7 +19,13 @@ var jspb = require('google-protobuf'); var goog = jspb; -var global = (function() { return this || window || global || self || Function('return this')(); }).call(null); +var global = (function() { + if (this) { return this; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + if (typeof self !== 'undefined') { return self; } + return Function('return this')(); +}.call(null)); goog.exportSymbol('proto.contentservice.DeleteRequest', null, global); goog.exportSymbol('proto.contentservice.DeleteRequest.NameCase', null, global); diff --git a/components/content-service-api/typescript/src/content_pb.js b/components/content-service-api/typescript/src/content_pb.js index b7d7f31b69c800..7cb048c5342202 100644 --- a/components/content-service-api/typescript/src/content_pb.js +++ b/components/content-service-api/typescript/src/content_pb.js @@ -19,7 +19,13 @@ var jspb = require('google-protobuf'); var goog = jspb; -var global = (function() { return this || window || global || self || Function('return this')(); }).call(null); +var global = (function() { + if (this) { return this; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + if (typeof self !== 'undefined') { return self; } + return Function('return this')(); +}.call(null)); goog.exportSymbol('proto.contentservice.DeleteUserContentRequest', null, global); goog.exportSymbol('proto.contentservice.DeleteUserContentResponse', null, global); diff --git a/components/content-service-api/typescript/src/headless-log_pb.js b/components/content-service-api/typescript/src/headless-log_pb.js index 9c5ede429b867e..d4d53ba298b1c3 100644 --- a/components/content-service-api/typescript/src/headless-log_pb.js +++ b/components/content-service-api/typescript/src/headless-log_pb.js @@ -19,7 +19,13 @@ var jspb = require('google-protobuf'); var goog = jspb; -var global = (function() { return this || window || global || self || Function('return this')(); }).call(null); +var global = (function() { + if (this) { return this; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + if (typeof self !== 'undefined') { return self; } + return Function('return this')(); +}.call(null)); goog.exportSymbol('proto.contentservice.ListLogsRequest', null, global); goog.exportSymbol('proto.contentservice.ListLogsResponse', null, global); diff --git a/components/content-service-api/typescript/src/ideplugin_pb.js b/components/content-service-api/typescript/src/ideplugin_pb.js index 619200a53f5d85..c8a322bba6382c 100644 --- a/components/content-service-api/typescript/src/ideplugin_pb.js +++ b/components/content-service-api/typescript/src/ideplugin_pb.js @@ -19,7 +19,13 @@ var jspb = require('google-protobuf'); var goog = jspb; -var global = (function() { return this || window || global || self || Function('return this')(); }).call(null); +var global = (function() { + if (this) { return this; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + if (typeof self !== 'undefined') { return self; } + return Function('return this')(); +}.call(null)); goog.exportSymbol('proto.ideplugin.PluginDownloadURLRequest', null, global); goog.exportSymbol('proto.ideplugin.PluginDownloadURLResponse', null, global); diff --git a/components/content-service-api/typescript/src/initializer_pb.js b/components/content-service-api/typescript/src/initializer_pb.js index 9f7d92a14cc684..8a00062cdd444d 100644 --- a/components/content-service-api/typescript/src/initializer_pb.js +++ b/components/content-service-api/typescript/src/initializer_pb.js @@ -19,7 +19,13 @@ var jspb = require('google-protobuf'); var goog = jspb; -var global = (function() { return this || window || global || self || Function('return this')(); }).call(null); +var global = (function() { + if (this) { return this; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + if (typeof self !== 'undefined') { return self; } + return Function('return this')(); +}.call(null)); goog.exportSymbol('proto.contentservice.CloneTargetMode', null, global); goog.exportSymbol('proto.contentservice.CompositeInitializer', null, global); diff --git a/components/content-service-api/typescript/src/workspace_pb.js b/components/content-service-api/typescript/src/workspace_pb.js index 9929f3d9f96bfd..cc954dfd5b9df8 100644 --- a/components/content-service-api/typescript/src/workspace_pb.js +++ b/components/content-service-api/typescript/src/workspace_pb.js @@ -19,7 +19,13 @@ var jspb = require('google-protobuf'); var goog = jspb; -var global = (function() { return this || window || global || self || Function('return this')(); }).call(null); +var global = (function() { + if (this) { return this; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + if (typeof self !== 'undefined') { return self; } + return Function('return this')(); +}.call(null)); goog.exportSymbol('proto.contentservice.DeleteWorkspaceRequest', null, global); goog.exportSymbol('proto.contentservice.DeleteWorkspaceResponse', null, global); diff --git a/components/gitpod-protocol/go/gitpod-service.go b/components/gitpod-protocol/go/gitpod-service.go index 004e027600a567..0b62d735595351 100644 --- a/components/gitpod-protocol/go/gitpod-service.go +++ b/components/gitpod-protocol/go/gitpod-service.go @@ -1747,7 +1747,6 @@ type WorkspaceInstanceConditions struct { FirstUserActivity string `json:"firstUserActivity,omitempty"` NeededImageBuild bool `json:"neededImageBuild,omitempty"` PullingImages bool `json:"pullingImages,omitempty"` - ServiceExists bool `json:"serviceExists,omitempty"` Timeout string `json:"timeout,omitempty"` } @@ -1795,7 +1794,6 @@ type GetWorkspaceTimeoutResult struct { // WorkspaceInstancePort is the WorkspaceInstancePort message type type WorkspaceInstancePort struct { Port float64 `json:"port,omitempty"` - TargetPort float64 `json:"targetPort,omitempty"` URL string `json:"url,omitempty"` Visibility string `json:"visibility,omitempty"` } diff --git a/components/gitpod-protocol/src/workspace-instance.ts b/components/gitpod-protocol/src/workspace-instance.ts index 9ed22626ae9d7b..da5d9015278491 100644 --- a/components/gitpod-protocol/src/workspace-instance.ts +++ b/components/gitpod-protocol/src/workspace-instance.ts @@ -134,9 +134,6 @@ export interface WorkspaceInstanceConditions { // PullingImages marks if the workspace is currently pulling its images. This condition can only be set during PhaseCreating pullingImages?: boolean - // ServiceExists denotes if the workspace theia-/ports- services exist. This condition will be true if either of the two services exist. - serviceExists?: boolean - // deployed marks that a workspace instance was sent/deployed at a workspace manager deployed?: boolean; @@ -164,9 +161,6 @@ export interface WorkspaceInstancePort { // The outward-facing port number port: number; - // An optional inward-facing port number. If not present we'll use port. - targetPort?: number; - // The visiblity of this port. Optional for backwards compatibility. visibility?: PortVisibility; diff --git a/components/gitpod-protocol/src/wsready.ts b/components/gitpod-protocol/src/wsready.ts index 13bca3396648f4..5cf18d354dc25a 100644 --- a/components/gitpod-protocol/src/wsready.ts +++ b/components/gitpod-protocol/src/wsready.ts @@ -4,7 +4,7 @@ * See License-AGPL.txt in the project root for license information. */ -// generated using github.com/32leaves/bel on 2021-10-28 22:18:05.015278404 +0000 UTC m=+0.005187484 +// generated using github.com/32leaves/bel on 2021-11-04 12:16:53.917570766 +0000 UTC m=+0.006002884 // DO NOT MODIFY export enum WorkspaceInitSource { diff --git a/components/image-builder-api/go/imgbuilder.pb.go b/components/image-builder-api/go/imgbuilder.pb.go index 1a88b6ae37cb37..56e1f4e2ee631c 100644 --- a/components/image-builder-api/go/imgbuilder.pb.go +++ b/components/image-builder-api/go/imgbuilder.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.1 -// protoc v3.19.0 +// protoc v3.19.1 // source: imgbuilder.proto package api diff --git a/components/image-builder-api/typescript/src/imgbuilder_pb.js b/components/image-builder-api/typescript/src/imgbuilder_pb.js index bf1e4edc652c93..7a30031017d145 100644 --- a/components/image-builder-api/typescript/src/imgbuilder_pb.js +++ b/components/image-builder-api/typescript/src/imgbuilder_pb.js @@ -19,7 +19,13 @@ var jspb = require('google-protobuf'); var goog = jspb; -var global = (function() { return this || window || global || self || Function('return this')(); }).call(null); +var global = (function() { + if (this) { return this; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + if (typeof self !== 'undefined') { return self; } + return Function('return this')(); +}.call(null)); var content$service$api_initializer_pb = require('@gitpod/content-service/lib'); goog.object.extend(proto, content$service$api_initializer_pb); diff --git a/components/local-app-api/go/localapp.pb.go b/components/local-app-api/go/localapp.pb.go index 426ca2829d6c9a..70baf486fc1d39 100644 --- a/components/local-app-api/go/localapp.pb.go +++ b/components/local-app-api/go/localapp.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.1 -// protoc v3.19.0 +// protoc v3.19.1 // source: localapp.proto package api diff --git a/components/registry-facade-api/go/imagespec.pb.go b/components/registry-facade-api/go/imagespec.pb.go index 5e4f6b3207329e..c9dae272b56e7d 100644 --- a/components/registry-facade-api/go/imagespec.pb.go +++ b/components/registry-facade-api/go/imagespec.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.1 -// protoc v3.19.0 +// protoc v3.19.1 // source: imagespec.proto package api diff --git a/components/registry-facade-api/go/provider.pb.go b/components/registry-facade-api/go/provider.pb.go index c22d71e9899bb3..e3d93863ef4058 100644 --- a/components/registry-facade-api/go/provider.pb.go +++ b/components/registry-facade-api/go/provider.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.1 -// protoc v3.19.0 +// protoc v3.19.1 // source: provider.proto package api diff --git a/components/server/ee/src/graphql/graphql-gen.ts b/components/server/ee/src/graphql/graphql-gen.ts index 6d683e48afadb8..6deeecdff9588d 100644 --- a/components/server/ee/src/graphql/graphql-gen.ts +++ b/components/server/ee/src/graphql/graphql-gen.ts @@ -185,11 +185,6 @@ export type WorkspaceInstanceConditions = { * condition can only be set during PhaseCreating */ pullingImages?: Maybe; - /** - * ServiceExists denotes if the workspace theia-/ports- services exist. This - * condition will be true if either of the two services exist. - */ - serviceExists?: Maybe; /** deployed marks that a workspace instance was sent/deployed at a workspace manager */ deployed?: Maybe; /** Whether the workspace start triggered an image build */ @@ -401,7 +396,6 @@ export type WorkspaceInstanceConditionsResolvers, ParentType, ContextType>, timeout?: Resolver, ParentType, ContextType>, pullingImages?: Resolver, ParentType, ContextType>, - serviceExists?: Resolver, ParentType, ContextType>, deployed?: Resolver, ParentType, ContextType>, neededImageBuild?: Resolver, ParentType, ContextType>, firstUserActivity?: Resolver, ParentType, ContextType>, diff --git a/components/server/ee/src/graphql/graphql.schema.json b/components/server/ee/src/graphql/graphql.schema.json index c00cb12a7ccc4f..6e06f3ec63db7a 100644 --- a/components/server/ee/src/graphql/graphql.schema.json +++ b/components/server/ee/src/graphql/graphql.schema.json @@ -1070,18 +1070,6 @@ "isDeprecated": false, "deprecationReason": null }, - { - "name": "serviceExists", - "description": " ServiceExists denotes if the workspace theia-/ports- services exist. This condition will be true if either of the two services exist. ", - "args": [], - "type": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, { "name": "deployed", "description": " deployed marks that a workspace instance was sent/deployed at a workspace manager ", diff --git a/components/server/ee/src/graphql/schema.graphql b/components/server/ee/src/graphql/schema.graphql index 4e2b492e36ae93..c1ed0ab7afa4ba 100644 --- a/components/server/ee/src/graphql/schema.graphql +++ b/components/server/ee/src/graphql/schema.graphql @@ -170,9 +170,6 @@ type WorkspaceInstanceConditions { """ PullingImages marks if the workspace is currently pulling its images. This condition can only be set during PhaseCreating """ pullingImages: Boolean - """ ServiceExists denotes if the workspace theia-/ports- services exist. This condition will be true if either of the two services exist. """ - serviceExists: Boolean - """ deployed marks that a workspace instance was sent/deployed at a workspace manager """ deployed: Boolean diff --git a/components/server/src/workspace/gitpod-server-impl.ts b/components/server/src/workspace/gitpod-server-impl.ts index 511d01319c033d..6819f1f7fd8795 100644 --- a/components/server/src/workspace/gitpod-server-impl.ts +++ b/components/server/src/workspace/gitpod-server-impl.ts @@ -1029,7 +1029,6 @@ export class GitpodServerImpl { port: p.getPort(), - targetPort: p.getTarget(), url: p.getUrl(), visibility: this.portVisibilityFromProto(p.getVisibility()) }); @@ -1063,11 +1062,6 @@ export class GitpodServerImpl !!spec) as PortSpec[]; diff --git a/components/supervisor-api/control.proto b/components/supervisor-api/control.proto index 29e7baae633afb..b21a2f9a687378 100644 --- a/components/supervisor-api/control.proto +++ b/components/supervisor-api/control.proto @@ -20,6 +20,6 @@ message ExposePortRequest { // local port uint32 port = 1; // external port if missing the the same as port - uint32 target_port = 2; + reserved 2; } message ExposePortResponse {} \ No newline at end of file diff --git a/components/supervisor-api/go/control.pb.go b/components/supervisor-api/go/control.pb.go index 8fa2a63d6f7e63..e7b629e27ad1d9 100644 --- a/components/supervisor-api/go/control.pb.go +++ b/components/supervisor-api/go/control.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.1 -// protoc v3.19.0 +// protoc v3.19.1 // source: control.proto package api @@ -31,8 +31,6 @@ type ExposePortRequest struct { // local port Port uint32 `protobuf:"varint,1,opt,name=port,proto3" json:"port,omitempty"` - // external port if missing the the same as port - TargetPort uint32 `protobuf:"varint,2,opt,name=target_port,json=targetPort,proto3" json:"target_port,omitempty"` } func (x *ExposePortRequest) Reset() { @@ -74,13 +72,6 @@ func (x *ExposePortRequest) GetPort() uint32 { return 0 } -func (x *ExposePortRequest) GetTargetPort() uint32 { - if x != nil { - return x.TargetPort - } - return 0 -} - type ExposePortResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -123,24 +114,23 @@ var File_control_proto protoreflect.FileDescriptor var file_control_proto_rawDesc = []byte{ 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, - 0x0a, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x22, 0x48, 0x0a, 0x11, 0x45, + 0x0a, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x22, 0x2d, 0x0a, 0x11, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, - 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, - 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x50, 0x6f, 0x72, 0x74, 0x22, 0x14, 0x0a, 0x12, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x50, - 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x5f, 0x0a, 0x0e, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4d, 0x0a, - 0x0a, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1d, 0x2e, 0x73, 0x75, - 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x50, - 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x73, 0x75, 0x70, - 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x50, 0x6f, - 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x46, 0x0a, 0x18, - 0x69, 0x6f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, - 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2d, 0x69, 0x6f, 0x2f, 0x67, - 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, - 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x14, 0x0a, 0x12, 0x45, 0x78, + 0x70, 0x6f, 0x73, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x32, 0x5f, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x4d, 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x50, 0x6f, 0x72, 0x74, + 0x12, 0x1d, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x45, 0x78, + 0x70, 0x6f, 0x73, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1e, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x45, 0x78, 0x70, + 0x6f, 0x73, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x42, 0x46, 0x0a, 0x18, 0x69, 0x6f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x73, + 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x5a, 0x2a, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, + 0x2d, 0x69, 0x6f, 0x2f, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2f, 0x73, 0x75, 0x70, 0x65, 0x72, + 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/components/supervisor-api/go/info.pb.go b/components/supervisor-api/go/info.pb.go index f83fa19c9303b3..9a49f4b8dcb051 100644 --- a/components/supervisor-api/go/info.pb.go +++ b/components/supervisor-api/go/info.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.1 -// protoc v3.19.0 +// protoc v3.19.1 // source: info.proto package api diff --git a/components/supervisor-api/go/notification.pb.go b/components/supervisor-api/go/notification.pb.go index 513c2fa76e6e14..7c232da2ecf1f3 100644 --- a/components/supervisor-api/go/notification.pb.go +++ b/components/supervisor-api/go/notification.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.1 -// protoc v3.19.0 +// protoc v3.19.1 // source: notification.proto package api diff --git a/components/supervisor-api/go/port.pb.go b/components/supervisor-api/go/port.pb.go index 3bafa3f76037cf..14403699a2cc52 100644 --- a/components/supervisor-api/go/port.pb.go +++ b/components/supervisor-api/go/port.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.1 -// protoc v3.19.0 +// protoc v3.19.1 // source: port.proto package api diff --git a/components/supervisor-api/go/status.pb.go b/components/supervisor-api/go/status.pb.go index 9f41e32b1a4e33..4967c09749d534 100644 --- a/components/supervisor-api/go/status.pb.go +++ b/components/supervisor-api/go/status.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.1 -// protoc v3.19.0 +// protoc v3.19.1 // source: status.proto package api @@ -892,8 +892,7 @@ type PortsStatus struct { // outside the container. To help with this, supervisor then starts a proxy // that forwards traffic to this local port. In those cases, global_port // contains the port where the proxy is listening on. - LocalPort uint32 `protobuf:"varint,1,opt,name=local_port,json=localPort,proto3" json:"local_port,omitempty"` - GlobalPort uint32 `protobuf:"varint,2,opt,name=global_port,json=globalPort,proto3" json:"global_port,omitempty"` + LocalPort uint32 `protobuf:"varint,1,opt,name=local_port,json=localPort,proto3" json:"local_port,omitempty"` // served is true if there is a process in the workspace that serves this port. Served bool `protobuf:"varint,4,opt,name=served,proto3" json:"served,omitempty"` // Exposed provides information when a port is exposed. If this field isn't set, @@ -945,13 +944,6 @@ func (x *PortsStatus) GetLocalPort() uint32 { return 0 } -func (x *PortsStatus) GetGlobalPort() uint32 { - if x != nil { - return x.GlobalPort - } - return 0 -} - func (x *PortsStatus) GetServed() bool { if x != nil { return x.Served @@ -1337,127 +1329,125 @@ var file_status_proto_rawDesc = []byte{ 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x99, 0x02, 0x0a, 0x0b, 0x50, 0x6f, 0x72, 0x74, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfe, 0x01, 0x0a, 0x0b, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x12, - 0x35, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x45, 0x78, - 0x70, 0x6f, 0x73, 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x65, - 0x78, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x12, 0x41, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x65, - 0x78, 0x70, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, - 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x41, - 0x75, 0x74, 0x6f, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x52, 0x0c, 0x61, 0x75, 0x74, - 0x6f, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x74, 0x75, 0x6e, - 0x6e, 0x65, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x75, - 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x65, - 0x64, 0x50, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x74, 0x75, 0x6e, 0x6e, 0x65, - 0x6c, 0x65, 0x64, 0x22, 0x2e, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x62, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x6f, 0x62, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x22, 0x43, 0x0a, 0x13, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x05, 0x74, 0x61, - 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x73, 0x75, 0x70, 0x65, - 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0xa7, 0x01, 0x0a, 0x0a, 0x54, 0x61, 0x73, - 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, - 0x73, 0x6f, 0x72, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, - 0x12, 0x40, 0x0a, 0x0c, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, - 0x73, 0x6f, 0x72, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x5c, 0x0a, 0x10, 0x54, 0x61, 0x73, 0x6b, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6f, 0x70, - 0x65, 0x6e, 0x5f, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x70, 0x65, - 0x6e, 0x49, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x6e, 0x4d, 0x6f, 0x64, 0x65, - 0x2a, 0x43, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x10, - 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x70, 0x72, 0x65, 0x62, 0x75, - 0x69, 0x6c, 0x64, 0x10, 0x02, 0x2a, 0x29, 0x0a, 0x0e, 0x50, 0x6f, 0x72, 0x74, 0x56, 0x69, 0x73, - 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x0b, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x10, 0x01, - 0x2a, 0x65, 0x0a, 0x13, 0x4f, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, - 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0a, 0x0a, 0x06, 0x69, 0x67, 0x6e, 0x6f, 0x72, - 0x65, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x62, 0x72, 0x6f, 0x77, - 0x73, 0x65, 0x72, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x70, 0x72, - 0x65, 0x76, 0x69, 0x65, 0x77, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x6f, 0x74, 0x69, 0x66, - 0x79, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x5f, 0x70, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x10, 0x04, 0x2a, 0x39, 0x0a, 0x10, 0x50, 0x6f, 0x72, 0x74, 0x41, - 0x75, 0x74, 0x6f, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x74, - 0x72, 0x79, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x73, 0x75, 0x63, 0x63, 0x65, - 0x65, 0x64, 0x65, 0x64, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, - 0x10, 0x02, 0x2a, 0x31, 0x0a, 0x09, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x0b, 0x0a, 0x07, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, - 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x63, 0x6c, 0x6f, - 0x73, 0x65, 0x64, 0x10, 0x02, 0x32, 0xcb, 0x06, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x7c, 0x0a, 0x10, 0x53, 0x75, 0x70, 0x65, 0x72, - 0x76, 0x69, 0x73, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, 0x2e, 0x73, 0x75, - 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x53, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, - 0x73, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x24, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x53, 0x75, + 0x61, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x12, 0x35, + 0x0a, 0x07, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x45, 0x78, 0x70, + 0x6f, 0x73, 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x65, 0x78, + 0x70, 0x6f, 0x73, 0x65, 0x64, 0x12, 0x41, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x65, 0x78, + 0x70, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x73, + 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x41, 0x75, + 0x74, 0x6f, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x52, 0x0c, 0x61, 0x75, 0x74, 0x6f, + 0x45, 0x78, 0x70, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x74, 0x75, 0x6e, 0x6e, + 0x65, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x75, 0x70, + 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x65, 0x64, + 0x50, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, + 0x65, 0x64, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x2e, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, + 0x0a, 0x07, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x22, 0x43, 0x0a, 0x13, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x2c, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x54, 0x61, 0x73, 0x6b, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0xa7, 0x01, + 0x0a, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x73, 0x75, + 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x40, 0x0a, 0x0c, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x75, + 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x50, 0x72, 0x65, + 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x70, 0x72, 0x65, 0x73, 0x65, + 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5c, 0x0a, 0x10, 0x54, 0x61, 0x73, 0x6b, 0x50, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x17, 0x0a, 0x07, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x6f, 0x70, 0x65, 0x6e, 0x49, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x6e, + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x70, 0x65, + 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x2a, 0x43, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6f, + 0x74, 0x68, 0x65, 0x72, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x62, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x66, 0x72, 0x6f, 0x6d, 0x5f, + 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x10, 0x02, 0x2a, 0x29, 0x0a, 0x0e, 0x50, 0x6f, + 0x72, 0x74, 0x56, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x0b, 0x0a, 0x07, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x10, 0x01, 0x2a, 0x65, 0x0a, 0x13, 0x4f, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x45, + 0x78, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0a, 0x0a, 0x06, + 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x6f, 0x70, 0x65, 0x6e, + 0x5f, 0x62, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x6f, 0x70, + 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, + 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x6e, 0x6f, 0x74, 0x69, + 0x66, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x10, 0x04, 0x2a, 0x39, 0x0a, 0x10, + 0x50, 0x6f, 0x72, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x75, 0x72, 0x65, + 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x02, 0x2a, 0x31, 0x0a, 0x09, 0x54, 0x61, 0x73, 0x6b, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x10, + 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x12, 0x0a, + 0x0a, 0x06, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x10, 0x02, 0x32, 0xcb, 0x06, 0x0a, 0x0d, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x7c, 0x0a, 0x10, + 0x53, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x23, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x53, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, - 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2f, 0x73, 0x75, 0x70, 0x65, 0x72, - 0x76, 0x69, 0x73, 0x6f, 0x72, 0x12, 0x83, 0x01, 0x0a, 0x09, 0x49, 0x44, 0x45, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, - 0x2e, 0x49, 0x44, 0x45, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1d, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x49, - 0x44, 0x45, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x12, 0x0e, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x2f, 0x69, 0x64, 0x65, 0x5a, 0x21, 0x12, 0x1f, 0x2f, 0x76, 0x31, 0x2f, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2f, 0x69, 0x64, 0x65, 0x2f, 0x77, 0x61, 0x69, 0x74, 0x2f, - 0x7b, 0x77, 0x61, 0x69, 0x74, 0x3d, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x12, 0x97, 0x01, 0x0a, 0x0d, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x2e, - 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x12, 0x12, 0x2f, 0x76, 0x31, 0x2f, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5a, 0x25, - 0x12, 0x23, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2f, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x2f, 0x77, 0x61, 0x69, 0x74, 0x2f, 0x7b, 0x77, 0x61, 0x69, 0x74, 0x3d, - 0x74, 0x72, 0x75, 0x65, 0x7d, 0x12, 0x6c, 0x0a, 0x0c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, - 0x6f, 0x72, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, - 0x73, 0x6f, 0x72, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, - 0x12, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2f, 0x62, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x12, 0x95, 0x01, 0x0a, 0x0b, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x1e, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, - 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, - 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x12, 0x10, 0x2f, 0x76, - 0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5a, 0x29, - 0x12, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2f, 0x70, 0x6f, 0x72, - 0x74, 0x73, 0x2f, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x2f, 0x7b, 0x6f, 0x62, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x3d, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x30, 0x01, 0x12, 0x95, 0x01, 0x0a, 0x0b, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x2e, 0x73, 0x75, - 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x73, 0x75, - 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x3d, 0x12, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x5a, 0x29, 0x12, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2f, 0x6f, 0x62, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x2f, 0x7b, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x3d, 0x74, 0x72, 0x75, 0x65, - 0x7d, 0x30, 0x01, 0x42, 0x46, 0x0a, 0x18, 0x69, 0x6f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, - 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x5a, - 0x2a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x69, 0x74, 0x70, - 0x6f, 0x64, 0x2d, 0x69, 0x6f, 0x2f, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2f, 0x73, 0x75, 0x70, - 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, + 0x6f, 0x72, 0x2e, 0x53, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2f, + 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x12, 0x83, 0x01, 0x0a, 0x09, 0x49, + 0x44, 0x45, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, + 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x49, 0x44, 0x45, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, + 0x73, 0x6f, 0x72, 0x2e, 0x49, 0x44, 0x45, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x12, 0x0e, 0x2f, + 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2f, 0x69, 0x64, 0x65, 0x5a, 0x21, 0x12, + 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2f, 0x69, 0x64, 0x65, 0x2f, + 0x77, 0x61, 0x69, 0x74, 0x2f, 0x7b, 0x77, 0x61, 0x69, 0x74, 0x3d, 0x74, 0x72, 0x75, 0x65, 0x7d, + 0x12, 0x97, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x20, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, + 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x12, + 0x12, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x5a, 0x25, 0x12, 0x23, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2f, 0x77, 0x61, 0x69, 0x74, 0x2f, 0x7b, + 0x77, 0x61, 0x69, 0x74, 0x3d, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x12, 0x6c, 0x0a, 0x0c, 0x42, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x75, 0x70, + 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x73, 0x75, + 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x95, 0x01, 0x0a, 0x0b, 0x50, 0x6f, 0x72, + 0x74, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, + 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, + 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x3d, 0x12, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2f, 0x70, 0x6f, + 0x72, 0x74, 0x73, 0x5a, 0x29, 0x12, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x2f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x2f, + 0x7b, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x3d, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x30, 0x01, + 0x12, 0x95, 0x01, 0x0a, 0x0b, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x1e, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1f, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2e, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x12, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x5a, 0x29, 0x12, 0x27, 0x2f, + 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2f, + 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x2f, 0x7b, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x3d, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x30, 0x01, 0x42, 0x46, 0x0a, 0x18, 0x69, 0x6f, 0x2e, 0x67, + 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, + 0x2e, 0x61, 0x70, 0x69, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2d, 0x69, 0x6f, 0x2f, 0x67, 0x69, 0x74, 0x70, 0x6f, + 0x64, 0x2f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2f, 0x61, 0x70, 0x69, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/components/supervisor-api/go/terminal.pb.go b/components/supervisor-api/go/terminal.pb.go index 4e94f23bb73f5c..f980620b94b1c3 100644 --- a/components/supervisor-api/go/terminal.pb.go +++ b/components/supervisor-api/go/terminal.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.1 -// protoc v3.19.0 +// protoc v3.19.1 // source: terminal.proto package api diff --git a/components/supervisor-api/go/token.pb.go b/components/supervisor-api/go/token.pb.go index 78d161f9ec4ffa..383a559986cb75 100644 --- a/components/supervisor-api/go/token.pb.go +++ b/components/supervisor-api/go/token.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.1 -// protoc v3.19.0 +// protoc v3.19.1 // source: token.proto package api diff --git a/components/supervisor-api/java/src/main/java/io/gitpod/supervisor/api/Control.java b/components/supervisor-api/java/src/main/java/io/gitpod/supervisor/api/Control.java index 65a7cb8fb4b61d..5d3b3c486c4e1e 100644 --- a/components/supervisor-api/java/src/main/java/io/gitpod/supervisor/api/Control.java +++ b/components/supervisor-api/java/src/main/java/io/gitpod/supervisor/api/Control.java @@ -31,16 +31,6 @@ public interface ExposePortRequestOrBuilder extends * @return The port. */ int getPort(); - - /** - *
-     * external port if missing the the same as port
-     * 
- * - * uint32 target_port = 2; - * @return The targetPort. - */ - int getTargetPort(); } /** * Protobuf type {@code supervisor.ExposePortRequest} @@ -92,11 +82,6 @@ private ExposePortRequest( port_ = input.readUInt32(); break; } - case 16: { - - targetPort_ = input.readUInt32(); - break; - } default: { if (!parseUnknownField( input, unknownFields, extensionRegistry, tag)) { @@ -144,21 +129,6 @@ public int getPort() { return port_; } - public static final int TARGET_PORT_FIELD_NUMBER = 2; - private int targetPort_; - /** - *
-     * external port if missing the the same as port
-     * 
- * - * uint32 target_port = 2; - * @return The targetPort. - */ - @java.lang.Override - public int getTargetPort() { - return targetPort_; - } - private byte memoizedIsInitialized = -1; @java.lang.Override public final boolean isInitialized() { @@ -176,9 +146,6 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) if (port_ != 0) { output.writeUInt32(1, port_); } - if (targetPort_ != 0) { - output.writeUInt32(2, targetPort_); - } unknownFields.writeTo(output); } @@ -192,10 +159,6 @@ public int getSerializedSize() { size += com.google.protobuf.CodedOutputStream .computeUInt32Size(1, port_); } - if (targetPort_ != 0) { - size += com.google.protobuf.CodedOutputStream - .computeUInt32Size(2, targetPort_); - } size += unknownFields.getSerializedSize(); memoizedSize = size; return size; @@ -213,8 +176,6 @@ public boolean equals(final java.lang.Object obj) { if (getPort() != other.getPort()) return false; - if (getTargetPort() - != other.getTargetPort()) return false; if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -228,8 +189,6 @@ public int hashCode() { hash = (19 * hash) + getDescriptor().hashCode(); hash = (37 * hash) + PORT_FIELD_NUMBER; hash = (53 * hash) + getPort(); - hash = (37 * hash) + TARGET_PORT_FIELD_NUMBER; - hash = (53 * hash) + getTargetPort(); hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; @@ -365,8 +324,6 @@ public Builder clear() { super.clear(); port_ = 0; - targetPort_ = 0; - return this; } @@ -394,7 +351,6 @@ public io.gitpod.supervisor.api.Control.ExposePortRequest build() { public io.gitpod.supervisor.api.Control.ExposePortRequest buildPartial() { io.gitpod.supervisor.api.Control.ExposePortRequest result = new io.gitpod.supervisor.api.Control.ExposePortRequest(this); result.port_ = port_; - result.targetPort_ = targetPort_; onBuilt(); return result; } @@ -446,9 +402,6 @@ public Builder mergeFrom(io.gitpod.supervisor.api.Control.ExposePortRequest othe if (other.getPort() != 0) { setPort(other.getPort()); } - if (other.getTargetPort() != 0) { - setTargetPort(other.getTargetPort()); - } this.mergeUnknownFields(other.unknownFields); onChanged(); return this; @@ -520,49 +473,6 @@ public Builder clearPort() { onChanged(); return this; } - - private int targetPort_ ; - /** - *
-       * external port if missing the the same as port
-       * 
- * - * uint32 target_port = 2; - * @return The targetPort. - */ - @java.lang.Override - public int getTargetPort() { - return targetPort_; - } - /** - *
-       * external port if missing the the same as port
-       * 
- * - * uint32 target_port = 2; - * @param value The targetPort to set. - * @return This builder for chaining. - */ - public Builder setTargetPort(int value) { - - targetPort_ = value; - onChanged(); - return this; - } - /** - *
-       * external port if missing the the same as port
-       * 
- * - * uint32 target_port = 2; - * @return This builder for chaining. - */ - public Builder clearTargetPort() { - - targetPort_ = 0; - onChanged(); - return this; - } @java.lang.Override public final Builder setUnknownFields( final com.google.protobuf.UnknownFieldSet unknownFields) { @@ -1053,14 +963,13 @@ public io.gitpod.supervisor.api.Control.ExposePortResponse getDefaultInstanceFor descriptor; static { java.lang.String[] descriptorData = { - "\n\rcontrol.proto\022\nsupervisor\"6\n\021ExposePor" + - "tRequest\022\014\n\004port\030\001 \001(\r\022\023\n\013target_port\030\002 " + - "\001(\r\"\024\n\022ExposePortResponse2_\n\016ControlServ" + - "ice\022M\n\nExposePort\022\035.supervisor.ExposePor" + - "tRequest\032\036.supervisor.ExposePortResponse" + - "\"\000BF\n\030io.gitpod.supervisor.apiZ*github.c" + - "om/gitpod-io/gitpod/supervisor/apib\006prot" + - "o3" + "\n\rcontrol.proto\022\nsupervisor\"\'\n\021ExposePor" + + "tRequest\022\014\n\004port\030\001 \001(\rJ\004\010\002\020\003\"\024\n\022ExposePo" + + "rtResponse2_\n\016ControlService\022M\n\nExposePo" + + "rt\022\035.supervisor.ExposePortRequest\032\036.supe" + + "rvisor.ExposePortResponse\"\000BF\n\030io.gitpod" + + ".supervisor.apiZ*github.com/gitpod-io/gi" + + "tpod/supervisor/apib\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor .internalBuildGeneratedFileFrom(descriptorData, @@ -1071,7 +980,7 @@ public io.gitpod.supervisor.api.Control.ExposePortResponse getDefaultInstanceFor internal_static_supervisor_ExposePortRequest_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( internal_static_supervisor_ExposePortRequest_descriptor, - new java.lang.String[] { "Port", "TargetPort", }); + new java.lang.String[] { "Port", }); internal_static_supervisor_ExposePortResponse_descriptor = getDescriptor().getMessageTypes().get(1); internal_static_supervisor_ExposePortResponse_fieldAccessorTable = new diff --git a/components/supervisor-api/java/src/main/java/io/gitpod/supervisor/api/Status.java b/components/supervisor-api/java/src/main/java/io/gitpod/supervisor/api/Status.java index 85b0ca98857854..33e0e67de0f493 100644 --- a/components/supervisor-api/java/src/main/java/io/gitpod/supervisor/api/Status.java +++ b/components/supervisor-api/java/src/main/java/io/gitpod/supervisor/api/Status.java @@ -8775,12 +8775,6 @@ public interface PortsStatusOrBuilder extends */ int getLocalPort(); - /** - * uint32 global_port = 2; - * @return The globalPort. - */ - int getGlobalPort(); - /** *
      * served is true if there is a process in the workspace that serves this port.
@@ -8921,11 +8915,6 @@ private PortsStatus(
               localPort_ = input.readUInt32();
               break;
             }
-            case 16: {
-
-              globalPort_ = input.readUInt32();
-              break;
-            }
             case 32: {
 
               served_ = input.readBool();
@@ -9014,17 +9003,6 @@ public int getLocalPort() {
       return localPort_;
     }
 
-    public static final int GLOBAL_PORT_FIELD_NUMBER = 2;
-    private int globalPort_;
-    /**
-     * uint32 global_port = 2;
-     * @return The globalPort.
-     */
-    @java.lang.Override
-    public int getGlobalPort() {
-      return globalPort_;
-    }
-
     public static final int SERVED_FIELD_NUMBER = 4;
     private boolean served_;
     /**
@@ -9166,9 +9144,6 @@ public void writeTo(com.google.protobuf.CodedOutputStream output)
       if (localPort_ != 0) {
         output.writeUInt32(1, localPort_);
       }
-      if (globalPort_ != 0) {
-        output.writeUInt32(2, globalPort_);
-      }
       if (served_ != false) {
         output.writeBool(4, served_);
       }
@@ -9194,10 +9169,6 @@ public int getSerializedSize() {
         size += com.google.protobuf.CodedOutputStream
           .computeUInt32Size(1, localPort_);
       }
-      if (globalPort_ != 0) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeUInt32Size(2, globalPort_);
-      }
       if (served_ != false) {
         size += com.google.protobuf.CodedOutputStream
           .computeBoolSize(4, served_);
@@ -9231,8 +9202,6 @@ public boolean equals(final java.lang.Object obj) {
 
       if (getLocalPort()
           != other.getLocalPort()) return false;
-      if (getGlobalPort()
-          != other.getGlobalPort()) return false;
       if (getServed()
           != other.getServed()) return false;
       if (hasExposed() != other.hasExposed()) return false;
@@ -9259,8 +9228,6 @@ public int hashCode() {
       hash = (19 * hash) + getDescriptor().hashCode();
       hash = (37 * hash) + LOCAL_PORT_FIELD_NUMBER;
       hash = (53 * hash) + getLocalPort();
-      hash = (37 * hash) + GLOBAL_PORT_FIELD_NUMBER;
-      hash = (53 * hash) + getGlobalPort();
       hash = (37 * hash) + SERVED_FIELD_NUMBER;
       hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
           getServed());
@@ -9409,8 +9376,6 @@ public Builder clear() {
         super.clear();
         localPort_ = 0;
 
-        globalPort_ = 0;
-
         served_ = false;
 
         if (exposedBuilder_ == null) {
@@ -9454,7 +9419,6 @@ public io.gitpod.supervisor.api.Status.PortsStatus build() {
       public io.gitpod.supervisor.api.Status.PortsStatus buildPartial() {
         io.gitpod.supervisor.api.Status.PortsStatus result = new io.gitpod.supervisor.api.Status.PortsStatus(this);
         result.localPort_ = localPort_;
-        result.globalPort_ = globalPort_;
         result.served_ = served_;
         if (exposedBuilder_ == null) {
           result.exposed_ = exposed_;
@@ -9518,9 +9482,6 @@ public Builder mergeFrom(io.gitpod.supervisor.api.Status.PortsStatus other) {
         if (other.getLocalPort() != 0) {
           setLocalPort(other.getLocalPort());
         }
-        if (other.getGlobalPort() != 0) {
-          setGlobalPort(other.getGlobalPort());
-        }
         if (other.getServed() != false) {
           setServed(other.getServed());
         }
@@ -9617,37 +9578,6 @@ public Builder clearLocalPort() {
         return this;
       }
 
-      private int globalPort_ ;
-      /**
-       * uint32 global_port = 2;
-       * @return The globalPort.
-       */
-      @java.lang.Override
-      public int getGlobalPort() {
-        return globalPort_;
-      }
-      /**
-       * uint32 global_port = 2;
-       * @param value The globalPort to set.
-       * @return This builder for chaining.
-       */
-      public Builder setGlobalPort(int value) {
-        
-        globalPort_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * uint32 global_port = 2;
-       * @return This builder for chaining.
-       */
-      public Builder clearGlobalPort() {
-        
-        globalPort_ = 0;
-        onChanged();
-        return this;
-      }
-
       private boolean served_ ;
       /**
        * 
@@ -13475,52 +13405,52 @@ public io.gitpod.supervisor.api.Status.TaskPresentation getDefaultInstanceForTyp
       "y\030\002 \001(\0162\033.supervisor.TunnelVisiblity\022:\n\007" +
       "clients\030\003 \003(\0132).supervisor.TunneledPortI" +
       "nfo.ClientsEntry\032.\n\014ClientsEntry\022\013\n\003key\030" +
-      "\001 \001(\t\022\r\n\005value\030\002 \001(\r:\0028\001\"\331\001\n\013PortsStatus" +
-      "\022\022\n\nlocal_port\030\001 \001(\r\022\023\n\013global_port\030\002 \001(" +
-      "\r\022\016\n\006served\030\004 \001(\010\022,\n\007exposed\030\005 \001(\0132\033.sup" +
-      "ervisor.ExposedPortInfo\0223\n\rauto_exposure" +
-      "\030\007 \001(\0162\034.supervisor.PortAutoExposure\022.\n\010" +
-      "tunneled\030\006 \001(\0132\034.supervisor.TunneledPort" +
-      "Info\"%\n\022TasksStatusRequest\022\017\n\007observe\030\001 " +
-      "\001(\010\"<\n\023TasksStatusResponse\022%\n\005tasks\030\001 \003(" +
-      "\0132\026.supervisor.TaskStatus\"\204\001\n\nTaskStatus" +
-      "\022\n\n\002id\030\001 \001(\t\022$\n\005state\030\002 \001(\0162\025.supervisor" +
-      ".TaskState\022\020\n\010terminal\030\003 \001(\t\0222\n\014presenta" +
-      "tion\030\004 \001(\0132\034.supervisor.TaskPresentation" +
-      "\"D\n\020TaskPresentation\022\014\n\004name\030\001 \001(\t\022\017\n\007op" +
-      "en_in\030\002 \001(\t\022\021\n\topen_mode\030\003 \001(\t*C\n\rConten" +
-      "tSource\022\016\n\nfrom_other\020\000\022\017\n\013from_backup\020\001" +
-      "\022\021\n\rfrom_prebuild\020\002*?\n\016PortVisibility\022\026\n" +
-      "\022private_visibility\020\000\022\025\n\021public_visibili" +
-      "ty\020\001*e\n\023OnPortExposedAction\022\n\n\006ignore\020\000\022" +
-      "\020\n\014open_browser\020\001\022\020\n\014open_preview\020\002\022\n\n\006n" +
-      "otify\020\003\022\022\n\016notify_private\020\004*9\n\020PortAutoE" +
-      "xposure\022\n\n\006trying\020\000\022\r\n\tsucceeded\020\001\022\n\n\006fa" +
-      "iled\020\002*1\n\tTaskState\022\013\n\007opening\020\000\022\013\n\007runn" +
-      "ing\020\001\022\n\n\006closed\020\0022\313\006\n\rStatusService\022|\n\020S" +
-      "upervisorStatus\022#.supervisor.SupervisorS" +
-      "tatusRequest\032$.supervisor.SupervisorStat" +
-      "usResponse\"\035\202\323\344\223\002\027\022\025/v1/status/superviso" +
-      "r\022\203\001\n\tIDEStatus\022\034.supervisor.IDEStatusRe" +
-      "quest\032\035.supervisor.IDEStatusResponse\"9\202\323" +
-      "\344\223\0023\022\016/v1/status/ideZ!\022\037/v1/status/ide/w" +
-      "ait/{wait=true}\022\227\001\n\rContentStatus\022 .supe" +
-      "rvisor.ContentStatusRequest\032!.supervisor" +
-      ".ContentStatusResponse\"A\202\323\344\223\002;\022\022/v1/stat" +
-      "us/contentZ%\022#/v1/status/content/wait/{w" +
-      "ait=true}\022l\n\014BackupStatus\022\037.supervisor.B" +
-      "ackupStatusRequest\032 .supervisor.BackupSt" +
-      "atusResponse\"\031\202\323\344\223\002\023\022\021/v1/status/backup\022" +
-      "\225\001\n\013PortsStatus\022\036.supervisor.PortsStatus" +
-      "Request\032\037.supervisor.PortsStatusResponse" +
-      "\"C\202\323\344\223\002=\022\020/v1/status/portsZ)\022\'/v1/status" +
-      "/ports/observe/{observe=true}0\001\022\225\001\n\013Task" +
-      "sStatus\022\036.supervisor.TasksStatusRequest\032" +
-      "\037.supervisor.TasksStatusResponse\"C\202\323\344\223\002=" +
-      "\022\020/v1/status/tasksZ)\022\'/v1/status/tasks/o" +
-      "bserve/{observe=true}0\001BF\n\030io.gitpod.sup" +
-      "ervisor.apiZ*github.com/gitpod-io/gitpod" +
-      "/supervisor/apib\006proto3"
+      "\001 \001(\t\022\r\n\005value\030\002 \001(\r:\0028\001\"\312\001\n\013PortsStatus" +
+      "\022\022\n\nlocal_port\030\001 \001(\r\022\016\n\006served\030\004 \001(\010\022,\n\007" +
+      "exposed\030\005 \001(\0132\033.supervisor.ExposedPortIn" +
+      "fo\0223\n\rauto_exposure\030\007 \001(\0162\034.supervisor.P" +
+      "ortAutoExposure\022.\n\010tunneled\030\006 \001(\0132\034.supe" +
+      "rvisor.TunneledPortInfoJ\004\010\002\020\003\"%\n\022TasksSt" +
+      "atusRequest\022\017\n\007observe\030\001 \001(\010\"<\n\023TasksSta" +
+      "tusResponse\022%\n\005tasks\030\001 \003(\0132\026.supervisor." +
+      "TaskStatus\"\204\001\n\nTaskStatus\022\n\n\002id\030\001 \001(\t\022$\n" +
+      "\005state\030\002 \001(\0162\025.supervisor.TaskState\022\020\n\010t" +
+      "erminal\030\003 \001(\t\0222\n\014presentation\030\004 \001(\0132\034.su" +
+      "pervisor.TaskPresentation\"D\n\020TaskPresent" +
+      "ation\022\014\n\004name\030\001 \001(\t\022\017\n\007open_in\030\002 \001(\t\022\021\n\t" +
+      "open_mode\030\003 \001(\t*C\n\rContentSource\022\016\n\nfrom" +
+      "_other\020\000\022\017\n\013from_backup\020\001\022\021\n\rfrom_prebui" +
+      "ld\020\002*?\n\016PortVisibility\022\026\n\022private_visibi" +
+      "lity\020\000\022\025\n\021public_visibility\020\001*e\n\023OnPortE" +
+      "xposedAction\022\n\n\006ignore\020\000\022\020\n\014open_browser" +
+      "\020\001\022\020\n\014open_preview\020\002\022\n\n\006notify\020\003\022\022\n\016noti" +
+      "fy_private\020\004*9\n\020PortAutoExposure\022\n\n\006tryi" +
+      "ng\020\000\022\r\n\tsucceeded\020\001\022\n\n\006failed\020\002*1\n\tTaskS" +
+      "tate\022\013\n\007opening\020\000\022\013\n\007running\020\001\022\n\n\006closed" +
+      "\020\0022\313\006\n\rStatusService\022|\n\020SupervisorStatus" +
+      "\022#.supervisor.SupervisorStatusRequest\032$." +
+      "supervisor.SupervisorStatusResponse\"\035\202\323\344" +
+      "\223\002\027\022\025/v1/status/supervisor\022\203\001\n\tIDEStatus" +
+      "\022\034.supervisor.IDEStatusRequest\032\035.supervi" +
+      "sor.IDEStatusResponse\"9\202\323\344\223\0023\022\016/v1/statu" +
+      "s/ideZ!\022\037/v1/status/ide/wait/{wait=true}" +
+      "\022\227\001\n\rContentStatus\022 .supervisor.ContentS" +
+      "tatusRequest\032!.supervisor.ContentStatusR" +
+      "esponse\"A\202\323\344\223\002;\022\022/v1/status/contentZ%\022#/" +
+      "v1/status/content/wait/{wait=true}\022l\n\014Ba" +
+      "ckupStatus\022\037.supervisor.BackupStatusRequ" +
+      "est\032 .supervisor.BackupStatusResponse\"\031\202" +
+      "\323\344\223\002\023\022\021/v1/status/backup\022\225\001\n\013PortsStatus" +
+      "\022\036.supervisor.PortsStatusRequest\032\037.super" +
+      "visor.PortsStatusResponse\"C\202\323\344\223\002=\022\020/v1/s" +
+      "tatus/portsZ)\022\'/v1/status/ports/observe/" +
+      "{observe=true}0\001\022\225\001\n\013TasksStatus\022\036.super" +
+      "visor.TasksStatusRequest\032\037.supervisor.Ta" +
+      "sksStatusResponse\"C\202\323\344\223\002=\022\020/v1/status/ta" +
+      "sksZ)\022\'/v1/status/tasks/observe/{observe" +
+      "=true}0\001BF\n\030io.gitpod.supervisor.apiZ*gi" +
+      "thub.com/gitpod-io/gitpod/supervisor/api" +
+      "b\006proto3"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,
@@ -13617,7 +13547,7 @@ public io.gitpod.supervisor.api.Status.TaskPresentation getDefaultInstanceForTyp
     internal_static_supervisor_PortsStatus_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_supervisor_PortsStatus_descriptor,
-        new java.lang.String[] { "LocalPort", "GlobalPort", "Served", "Exposed", "AutoExposure", "Tunneled", });
+        new java.lang.String[] { "LocalPort", "Served", "Exposed", "AutoExposure", "Tunneled", });
     internal_static_supervisor_TasksStatusRequest_descriptor =
       getDescriptor().getMessageTypes().get(13);
     internal_static_supervisor_TasksStatusRequest_fieldAccessorTable = new
diff --git a/components/supervisor-api/java/src/main/java/io/gitpod/supervisor/testclient/TestClient.java b/components/supervisor-api/java/src/main/java/io/gitpod/supervisor/testclient/TestClient.java
index a758abb46e874f..90b3e77fe44e27 100644
--- a/components/supervisor-api/java/src/main/java/io/gitpod/supervisor/testclient/TestClient.java
+++ b/components/supervisor-api/java/src/main/java/io/gitpod/supervisor/testclient/TestClient.java
@@ -54,7 +54,7 @@ private static void callPortStatus(ManagedChannel channel) throws Exception {
             PortsStatusResponse portStatusResponse = response.next();
             System.out.println("portsCount: " + portStatusResponse.getPortsCount());
             for (PortsStatus portStatus : portStatusResponse.getPortsList()) {
-                System.out.println("l:" + portStatus.getLocalPort() + " g:" + portStatus.getGlobalPort());
+                System.out.println("l:" + portStatus.getLocalPort());
                 System.out.println("visibitilty: " + portStatus.getExposed().getVisibility());
             }
         }
diff --git a/components/supervisor-api/status.proto b/components/supervisor-api/status.proto
index bc0189790f5382..5dcf10949acf5b 100644
--- a/components/supervisor-api/status.proto
+++ b/components/supervisor-api/status.proto
@@ -170,7 +170,8 @@ message PortsStatus {
     // contains the port where the proxy is listening on.
     uint32 local_port = 1;
 
-    uint32 global_port = 2;
+    // DEPRECATED global_port
+    reserved 2;
 
     // served is true if there is a process in the workspace that serves this port.
     bool served = 4;
diff --git a/components/supervisor/pkg/ports/exposed-ports.go b/components/supervisor/pkg/ports/exposed-ports.go
index 76f6aac42ffba9..d998865d2bed9c 100644
--- a/components/supervisor/pkg/ports/exposed-ports.go
+++ b/components/supervisor/pkg/ports/exposed-ports.go
@@ -12,31 +12,30 @@ import (
 	gitpod "github.com/gitpod-io/gitpod/gitpod-protocol"
 )
 
-// ExposedPort represents an exposed pprt.
+// ExposedPort represents an exposed pprt
 type ExposedPort struct {
-	LocalPort  uint32
-	GlobalPort uint32
-	URL        string
-	Public     bool
+	LocalPort uint32
+	URL       string
+	Public    bool
 }
 
-// ExposedPortsInterface provides access to port exposure.
+// ExposedPortsInterface provides access to port exposure
 type ExposedPortsInterface interface {
 	// Observe starts observing the exposed ports until the context is canceled.
 	// The list of exposed ports is always the complete picture, i.e. if a single port changes,
 	// the whole list is returned.
 	// When the observer stops operating (because the context as canceled or an irrecoverable
-	// error occurred), the observer will close both channels.
+	// error occured), the observer will close both channels.
 	Observe(ctx context.Context) (<-chan []ExposedPort, <-chan error)
 
 	// Run starts listening to expose port requests.
 	Run(ctx context.Context)
 
 	// Expose exposes a port to the internet. Upon successful execution any Observer will be updated.
-	Expose(ctx context.Context, local, global uint32, public bool) <-chan error
+	Expose(ctx context.Context, port uint32, public bool) <-chan error
 }
 
-// NoopExposedPorts implements ExposedPortsInterface but does nothing.
+// NoopExposedPorts implements ExposedPortsInterface but does nothing
 type NoopExposedPorts struct{}
 
 // Observe starts observing the exposed ports until the context is canceled.
@@ -48,7 +47,7 @@ func (*NoopExposedPorts) Observe(ctx context.Context) (<-chan []ExposedPort, <-c
 func (*NoopExposedPorts) Run(ctx context.Context) {}
 
 // Expose exposes a port to the internet. Upon successful execution any Observer will be updated.
-func (*NoopExposedPorts) Expose(ctx context.Context, local, global uint32, public bool) <-chan error {
+func (*NoopExposedPorts) Expose(ctx context.Context, local uint32, public bool) <-chan error {
 	done := make(chan error)
 	close(done)
 	return done
@@ -74,7 +73,7 @@ type exposePortRequest struct {
 	done chan error
 }
 
-// NewGitpodExposedPorts creates a new instance of GitpodExposedPorts.
+// NewGitpodExposedPorts creates a new instance of GitpodExposedPorts
 func NewGitpodExposedPorts(workspaceID string, instanceID string, gitpodService gitpod.APIInterface) *GitpodExposedPorts {
 	return &GitpodExposedPorts{
 		WorkspaceID: workspaceID,
@@ -115,18 +114,10 @@ func (g *GitpodExposedPorts) Observe(ctx context.Context) (<-chan []ExposedPort,
 
 				res := make([]ExposedPort, len(u.Status.ExposedPorts))
 				for i, p := range u.Status.ExposedPorts {
-					globalport := p.TargetPort
-					if globalport == 0 {
-						// Ports exposed through confighuration (e.g. .gitpod.yml) do not have explicit target ports,
-						// but rather implicitaly forward to their "port".
-						globalport = p.Port
-					}
-
 					res[i] = ExposedPort{
-						LocalPort:  uint32(p.Port),
-						GlobalPort: uint32(globalport),
-						Public:     p.Visibility == "public",
-						URL:        p.URL,
+						LocalPort: uint32(p.Port),
+						Public:    p.Visibility == "public",
+						URL:       p.URL,
 					}
 				}
 
@@ -140,7 +131,7 @@ func (g *GitpodExposedPorts) Observe(ctx context.Context) (<-chan []ExposedPort,
 	return reschan, errchan
 }
 
-// Listen starts listening to expose port requests.
+// Listen starts listening to expose port requests
 func (g *GitpodExposedPorts) Run(ctx context.Context) {
 	// process multiple parallel requests but process one by one to avoid server/ws-manager rate limitting
 	// if it does not help then we try to expose the same port again with the exponential backoff.
@@ -182,16 +173,14 @@ func (g *GitpodExposedPorts) doExpose(req *exposePortRequest) {
 }
 
 // Expose exposes a port to the internet. Upon successful execution any Observer will be updated.
-func (g *GitpodExposedPorts) Expose(ctx context.Context, local, global uint32, public bool) <-chan error {
+func (g *GitpodExposedPorts) Expose(ctx context.Context, local uint32, public bool) <-chan error {
 	v := "private"
 	if public {
 		v = "public"
 	}
-
 	req := &exposePortRequest{
 		port: &gitpod.WorkspaceInstancePort{
 			Port:       float64(local),
-			TargetPort: float64(global),
 			Visibility: v,
 		},
 		ctx:  ctx,
diff --git a/components/supervisor/pkg/ports/ports.go b/components/supervisor/pkg/ports/ports.go
index 6d7406c90a4840..157f66da1d9f0c 100644
--- a/components/supervisor/pkg/ports/ports.go
+++ b/components/supervisor/pkg/ports/ports.go
@@ -18,6 +18,7 @@ import (
 	"sync"
 	"time"
 
+	"golang.org/x/net/nettest"
 	"golang.org/x/xerrors"
 
 	"github.com/gitpod-io/gitpod/common-go/log"
@@ -25,14 +26,7 @@ import (
 	"github.com/gitpod-io/gitpod/supervisor/api"
 )
 
-const (
-	// proxyPortRange is the port range in which we'll try to find
-	// ports for proxying localhost-only services.
-	proxyPortRangeLo uint32 = 50000
-	proxyPortRangeHi uint32 = 60000
-)
-
-// NewManager creates a new port manager.
+// NewManager creates a new port manager
 func NewManager(exposed ExposedPortsInterface, served ServedPortsObserver, config ConfigInterace, tunneled TunneledPortsInterface, slirp SlirpClient, internalPorts ...uint32) *Manager {
 	state := make(map[uint32]*managedPort)
 	internal := make(map[uint32]struct{})
@@ -42,7 +36,10 @@ func NewManager(exposed ExposedPortsInterface, served ServedPortsObserver, confi
 
 	if slirp != nil {
 		for _, p := range internalPorts {
-			_ = slirp.Expose(p)
+			err := slirp.Expose(p)
+			if err != nil {
+				log.WithError(err).WithField("port", p).Error("cannot expose port")
+			}
 		}
 	}
 
@@ -74,10 +71,9 @@ type localhostProxy struct {
 }
 
 type autoExposure struct {
-	state      api.PortAutoExposure
-	ctx        context.Context
-	globalPort uint32
-	public     bool
+	state  api.PortAutoExposure
+	ctx    context.Context
+	public bool
 }
 
 // Manager brings together served and exposed ports. It keeps track of which port is exposed, which one is served,
@@ -93,7 +89,7 @@ type Manager struct {
 
 	internal     map[uint32]struct{}
 	proxies      map[uint32]*localhostProxy
-	proxyStarter func(LocalhostPort uint32, GlobalPort uint32) (proxy io.Closer, err error)
+	proxyStarter func(port uint32) (proxy io.Closer, err error)
 	autoExposed  map[uint32]*autoExposure
 
 	autoTunneled      map[uint32]struct{}
@@ -120,7 +116,6 @@ type managedPort struct {
 	AutoExposure api.PortAutoExposure
 
 	LocalhostPort uint32
-	GlobalPort    uint32
 
 	Tunneled           bool
 	TunneledTargetPort uint32
@@ -128,13 +123,13 @@ type managedPort struct {
 	TunneledClients    map[string]uint32
 }
 
-// Subscription is a Subscription to status updates.
+// Subscription is a Subscription to status updates
 type Subscription struct {
 	updates chan []*api.PortsStatus
 	Close   func() error
 }
 
-// Updates returns the updates channel.
+// Updates returns the updates channel
 func (s *Subscription) Updates() <-chan []*api.PortsStatus {
 	return s.updates
 }
@@ -162,6 +157,42 @@ func (pm *Manager) Run(ctx context.Context, wg *sync.WaitGroup) {
 	}()
 	defer cancel()
 
+	// set a health check for exposed port trough the proxies
+	go func() {
+		tick := time.NewTicker(2 * time.Second)
+		defer tick.Stop()
+
+		for {
+			<-tick.C
+
+			pm.mu.RLock()
+			servedGlobal := make(map[uint32]struct{})
+			for _, p := range pm.served {
+				if !p.BoundToLocalhost {
+					servedGlobal[p.Port] = struct{}{}
+				}
+			}
+			pm.mu.RUnlock()
+
+			for localPort, proxy := range pm.proxies {
+				_, openedGlobal := servedGlobal[localPort]
+				openedLocal := isLocalPortOpen(int(localPort))
+				if !openedLocal && openedGlobal {
+					pm.mu.Lock()
+					delete(pm.proxies, localPort)
+					pm.mu.Unlock()
+
+					err := proxy.Close()
+					if err != nil {
+						log.WithError(err).WithField("localPort", localPort).Warn("cannot stop localhost proxy")
+					} else {
+						log.WithField("localPort", localPort).Info("localhost proxy has been stopped")
+					}
+				}
+			}
+		}
+	}()
+
 	go pm.E.Run(ctx)
 	exposedUpdates, exposedErrors := pm.E.Observe(ctx)
 	servedUpdates, servedErrors := pm.S.Observe(ctx)
@@ -233,7 +264,7 @@ func (pm *Manager) Run(ctx context.Context, wg *sync.WaitGroup) {
 	}
 }
 
-// Status provides the current port status.
+// Status provides the current port status
 func (pm *Manager) Status() []*api.PortsStatus {
 	pm.mu.RLock()
 	defer pm.mu.RUnlock()
@@ -274,7 +305,9 @@ func (pm *Manager) updateState(ctx context.Context, exposed []ExposedPort, serve
 		for _, key := range servedKeys {
 			newServed = append(newServed, servedMap[key])
 		}
+
 		if !reflect.DeepEqual(pm.served, newServed) {
+			log.WithField("served", newServed).Debug("updating served ports")
 			pm.served = newServed
 			pm.updateProxies()
 			pm.updateSlirp()
@@ -323,7 +356,6 @@ func (pm *Manager) nextState(ctx context.Context) map[uint32]*managedPort {
 		}
 		state[port] = &managedPort{
 			LocalhostPort: port,
-			GlobalPort:    exposed.GlobalPort,
 			Exposed:       true,
 			Visibility:    Visibility,
 			URL:           exposed.URL,
@@ -336,6 +368,7 @@ func (pm *Manager) nextState(ctx context.Context) map[uint32]*managedPort {
 		if pm.boundInternally(port) {
 			continue
 		}
+
 		mp, exists := state[port]
 		if !exists {
 			mp = &managedPort{}
@@ -374,13 +407,13 @@ func (pm *Manager) nextState(ctx context.Context) map[uint32]*managedPort {
 			if autoExposed {
 				return
 			}
-			mp.GlobalPort = port
+
 			mp.Visibility = api.PortVisibility_private
 			if config.Visibility == "public" {
 				mp.Visibility = api.PortVisibility_public
 			}
 			public := mp.Visibility == api.PortVisibility_public
-			mp.AutoExposure = pm.autoExpose(ctx, mp.LocalhostPort, mp.GlobalPort, public).state
+			mp.AutoExposure = pm.autoExpose(ctx, mp.LocalhostPort, public).state
 		})
 	}
 
@@ -402,28 +435,9 @@ func (pm *Manager) nextState(ctx context.Context) map[uint32]*managedPort {
 		mp.LocalhostPort = port
 		mp.Served = true
 
-		var exposedGlobalPort uint32
 		autoExposure, autoExposed := pm.autoExposed[port]
 		if autoExposed {
-			exposedGlobalPort = autoExposure.globalPort
 			mp.AutoExposure = autoExposure.state
-		} else if mp.Exposed {
-			exposedGlobalPort = mp.GlobalPort
-		}
-
-		if served.BoundToLocalhost {
-			proxy, exists := pm.proxies[port]
-			if exists {
-				mp.GlobalPort = proxy.proxyPort
-			} else {
-				mp.GlobalPort = 0
-			}
-		} else {
-			// we don't need a proxy - the port is globally bound
-			mp.GlobalPort = port
-		}
-
-		if mp.GlobalPort == 0 || ((mp.Exposed || autoExposed) && mp.GlobalPort == exposedGlobalPort) {
 			continue
 		}
 
@@ -436,38 +450,56 @@ func (pm *Manager) nextState(ctx context.Context) map[uint32]*managedPort {
 			public = exists && config.Visibility == "public"
 		}
 
-		mp.AutoExposure = pm.autoExpose(ctx, mp.LocalhostPort, mp.GlobalPort, public).state
+		if mp.Exposed && ((mp.Visibility == api.PortVisibility_public && public) || (mp.Visibility == api.PortVisibility_private && !public)) {
+			continue
+		}
+
+		mp.AutoExposure = pm.autoExpose(ctx, mp.LocalhostPort, public).state
+	}
+
+	var ports []uint32
+	for port := range state {
+		ports = append(ports, port)
+	}
+
+	sort.Slice(ports, func(i, j int) bool {
+		return ports[i] < ports[j]
+	})
+
+	newState := make(map[uint32]*managedPort)
+	for _, mp := range ports {
+		newState[mp] = state[mp]
 	}
-	return state
+
+	return newState
 }
 
-// clients should guard a call with check whether such port is already exposed or auto exposed.
-func (pm *Manager) autoExpose(ctx context.Context, localPort uint32, globalPort uint32, public bool) *autoExposure {
-	exposing := pm.E.Expose(ctx, localPort, globalPort, public)
+// clients should guard a call with check whether such port is already exposed or auto exposed
+func (pm *Manager) autoExpose(ctx context.Context, localPort uint32, public bool) *autoExposure {
+	exposing := pm.E.Expose(ctx, localPort, public)
 	autoExpose := &autoExposure{
-		state:      api.PortAutoExposure_trying,
-		ctx:        ctx,
-		globalPort: globalPort,
-		public:     public,
+		state:  api.PortAutoExposure_trying,
+		ctx:    ctx,
+		public: public,
 	}
 	go func() {
 		err := <-exposing
 		if err != nil {
 			if err != context.Canceled {
 				autoExpose.state = api.PortAutoExposure_failed
-				log.WithError(err).WithField("localPort", localPort).WithField("globalPort", globalPort).Warn("cannot auto-expose port")
+				log.WithError(err).WithField("localPort", localPort).Warn("cannot auto-expose port")
 			}
 			return
 		}
 		autoExpose.state = api.PortAutoExposure_succeeded
-		log.WithField("localPort", localPort).WithField("globalPort", globalPort).Info("auto-exposed port")
+		log.WithField("localPort", localPort).Info("auto-exposed port")
 	}()
 	pm.autoExposed[localPort] = autoExpose
-	log.WithField("localPort", localPort).WithField("globalPort", globalPort).Info("auto-exposing port")
+	log.WithField("localPort", localPort).Info("auto-exposing port")
 	return autoExpose
 }
 
-// RetryAutoExpose retries auto exposing the give port.
+// RetryAutoExpose retries auto exposing the give port
 func (pm *Manager) RetryAutoExpose(ctx context.Context, localPort uint32) {
 	pm.mu.Lock()
 	defer pm.mu.Unlock()
@@ -475,7 +507,7 @@ func (pm *Manager) RetryAutoExpose(ctx context.Context, localPort uint32) {
 	if !autoExposed || autoExpose.state != api.PortAutoExposure_failed || autoExpose.ctx.Err() != nil {
 		return
 	}
-	pm.autoExpose(autoExpose.ctx, localPort, autoExpose.globalPort, autoExpose.public)
+	pm.autoExpose(autoExpose.ctx, localPort, autoExpose.public)
 	pm.forceUpdate()
 }
 
@@ -504,6 +536,7 @@ func (pm *Manager) autoTunnel(ctx context.Context) {
 		if pm.boundInternally(served.Port) {
 			continue
 		}
+
 		_, autoTunneled := pm.autoTunneled[served.Port]
 		if !autoTunneled {
 			descs = append(descs, &PortTunnelDescription{
@@ -538,29 +571,13 @@ func (pm *Manager) updateSlirp() {
 }
 
 func (pm *Manager) updateProxies() {
-	opened := make(map[uint32]struct{}, len(pm.served))
+	servedLocal := make(map[uint32]struct{})
+	servedGlobal := make(map[uint32]struct{})
 	for _, p := range pm.served {
-		opened[p.Port] = struct{}{}
-	}
-
-	for localPort, proxy := range pm.proxies {
-		globalPort := proxy.proxyPort
-		_, openedLocal := opened[localPort]
-		_, openedGlobal := opened[globalPort]
-
-		if !openedLocal && openedGlobal {
-			delete(pm.proxies, localPort)
-
-			err := proxy.Close()
-			if err != nil {
-				log.WithError(err).WithField("globalPort", globalPort).WithField("localPort", localPort).Warn("cannot stop localhost proxy")
-			} else {
-				log.WithField("globalPort", globalPort).WithField("localPort", localPort).Info("localhost proxy has been stopped")
-			}
-		}
-
-		if !openedGlobal {
-			delete(pm.internal, globalPort)
+		if p.BoundToLocalhost {
+			servedLocal[p.Port] = struct{}{}
+		} else {
+			servedGlobal[p.Port] = struct{}{}
 		}
 	}
 
@@ -571,34 +588,16 @@ func (pm *Manager) updateProxies() {
 			continue
 		}
 
-		var globalPort uint32
-		for port := proxyPortRangeHi; port >= proxyPortRangeLo; port-- {
-			if _, used := opened[port]; used {
-				continue
-			}
-			if _, used := pm.internal[port]; used {
-				continue
-			}
-
-			globalPort = port
-			break
-		}
-		if globalPort == 0 {
-			log.WithField("port", localPort).Error("cannot find a free proxy port")
-			continue
-		}
-
-		proxy, err := pm.proxyStarter(localPort, globalPort)
+		proxy, err := pm.proxyStarter(localPort)
 		if err != nil {
-			log.WithError(err).WithField("globalPort", globalPort).WithField("localPort", localPort).Warn("cannot start localhost proxy")
+			log.WithError(err).WithField("localPort", localPort).Warn("cannot start localhost proxy")
 			continue
 		}
-		log.WithField("globalPort", globalPort).WithField("localPort", localPort).Info("localhost proxy has been started")
+		log.WithField("localPort", localPort).Info("localhost proxy has been started")
 
-		pm.internal[globalPort] = struct{}{}
 		pm.proxies[localPort] = &localhostProxy{
 			Closer:    proxy,
-			proxyPort: globalPort,
+			proxyPort: localPort,
 		}
 	}
 }
@@ -630,8 +629,8 @@ func (pm *Manager) boundInternally(port uint32) bool {
 	return exists
 }
 
-// Expose exposes a port.
-func (pm *Manager) Expose(ctx context.Context, port uint32, targetPort uint32) error {
+// Expose exposes a port
+func (pm *Manager) Expose(ctx context.Context, port uint32) error {
 	unlock := true
 	pm.mu.RLock()
 	defer func() {
@@ -661,14 +660,10 @@ func (pm *Manager) Expose(ctx context.Context, port uint32, targetPort uint32) e
 	pm.mu.RUnlock()
 	unlock = false
 
-	global := targetPort
-	if global == 0 {
-		global = port
-	}
 	public := exists && config.Visibility != "private"
-	err := <-pm.E.Expose(ctx, port, global, public)
+	err := <-pm.E.Expose(ctx, port, public)
 	if err != nil && err != context.Canceled {
-		log.WithError(err).WithField("port", port).WithField("targetPort", targetPort).Error("cannot expose port")
+		log.WithError(err).WithField("port", port).Error("cannot expose port")
 	}
 	return err
 }
@@ -680,6 +675,7 @@ func (pm *Manager) Tunnel(ctx context.Context, desc *PortTunnelDescription) erro
 	if pm.boundInternally(desc.LocalPort) {
 		return xerrors.New("cannot tunnel internal port")
 	}
+
 	tunneled, err := pm.T.Tunnel(ctx, &TunnelOptions{
 		SkipIfExists: false,
 	}, desc)
@@ -698,9 +694,11 @@ func (pm *Manager) CloseTunnel(ctx context.Context, port uint32) error {
 			pm.mu.RUnlock()
 		}
 	}()
+
 	if pm.boundInternally(port) {
 		return xerrors.New("cannot close internal port tunnel")
 	}
+
 	// we don't need the lock anymore. Let's unlock and make sure the defer doesn't try
 	// the same thing again.
 	pm.mu.RUnlock()
@@ -710,12 +708,12 @@ func (pm *Manager) CloseTunnel(ctx context.Context, port uint32) error {
 	return err
 }
 
-// EstablishTunnel actually establishes the tunnel.
+// EstablishTunnel actually establishes the tunnel
 func (pm *Manager) EstablishTunnel(ctx context.Context, clientID string, localPort uint32, targetPort uint32) (net.Conn, error) {
 	return pm.T.EstablishTunnel(ctx, clientID, localPort, targetPort)
 }
 
-// AutoTunnel controls enablement of auto tunneling.
+// AutoTunnel controls enablement of auto tunneling
 func (pm *Manager) AutoTunnel(ctx context.Context, enabled bool) {
 	pm.mu.Lock()
 	defer pm.mu.Unlock()
@@ -724,13 +722,13 @@ func (pm *Manager) AutoTunnel(ctx context.Context, enabled bool) {
 }
 
 var (
-	// ErrClosed when the port management is stopped.
+	// ErrClosed when the port management is stopped
 	ErrClosed = errors.New("closed")
-	// ErrTooManySubscriptions when max allowed subscriptions exceed.
+	// ErrTooManySubscriptions when max allowed subscriptions exceed
 	ErrTooManySubscriptions = errors.New("too many subscriptions")
 )
 
-// Subscribe subscribes for status updates.
+// Subscribe subscribes for status updates
 func (pm *Manager) Subscribe() (*Subscription, error) {
 	pm.mu.Lock()
 	defer pm.mu.Unlock()
@@ -776,9 +774,8 @@ func (pm *Manager) getStatus() []*api.PortsStatus {
 func (pm *Manager) getPortStatus(port uint32) *api.PortsStatus {
 	mp := pm.state[port]
 	ps := &api.PortsStatus{
-		GlobalPort: mp.GlobalPort,
-		LocalPort:  mp.LocalhostPort,
-		Served:     mp.Served,
+		LocalPort: mp.LocalhostPort,
+		Served:    mp.Served,
 	}
 	if mp.Exposed && mp.URL != "" {
 		ps.Exposed = &api.ExposedPortInfo{
@@ -798,12 +795,19 @@ func (pm *Manager) getPortStatus(port uint32) *api.PortsStatus {
 	return ps
 }
 
-func startLocalhostProxy(localPort uint32, globalPort uint32) (io.Closer, error) {
-	host := fmt.Sprintf("localhost:%d", localPort)
+var workspaceIPAdress string
+
+func init() {
+	workspaceIPAdress = defaultRoutableIP()
+}
+func startLocalhostProxy(port uint32) (io.Closer, error) {
+	host := fmt.Sprintf("localhost:%d", port)
+
 	dsturl, err := url.Parse("http://" + host)
 	if err != nil {
 		return nil, xerrors.Errorf("cannot produce proxy destination URL: %w", err)
 	}
+
 	proxy := httputil.NewSingleHostReverseProxy(dsturl)
 	originalDirector := proxy.Director
 	proxy.Director = func(req *http.Request) {
@@ -811,13 +815,14 @@ func startLocalhostProxy(localPort uint32, globalPort uint32) (io.Closer, error)
 		originalDirector(req)
 	}
 	proxy.ErrorHandler = func(rw http.ResponseWriter, req *http.Request, err error) {
-		log.WithError(err).WithField("local-port", localPort).WithField("url", req.URL.String()).Warn("localhost proxy request failed")
+		log.WithError(err).WithField("local-port", port).WithField("url", req.URL.String()).Warn("localhost proxy request failed")
 		rw.WriteHeader(http.StatusBadGateway)
 	}
-	proxyAddr := fmt.Sprintf(":%d", globalPort)
+
+	proxyAddr := fmt.Sprintf("%v:%d", workspaceIPAdress, port)
 	lis, err := net.Listen("tcp", proxyAddr)
 	if err != nil {
-		return nil, xerrors.Errorf("cannot listen on proxy port %d: %w", globalPort, err)
+		return nil, xerrors.Errorf("cannot listen on proxy port %d: %w", port, err)
 	}
 
 	srv := &http.Server{
@@ -829,8 +834,43 @@ func startLocalhostProxy(localPort uint32, globalPort uint32) (io.Closer, error)
 		if err == http.ErrServerClosed {
 			return
 		}
-		log.WithError(err).WithField("local-port", localPort).Error("localhost proxy failed")
+		log.WithError(err).WithField("local-port", port).Error("localhost proxy failed")
 	}()
 
 	return srv, nil
 }
+
+func defaultRoutableIP() string {
+	iface, err := nettest.RoutedInterface("ip", net.FlagUp|net.FlagBroadcast)
+	if err != nil {
+		return ""
+	}
+
+	iface, err = net.InterfaceByName(iface.Name)
+	if err != nil {
+		return ""
+	}
+
+	addresses, err := iface.Addrs()
+	if err != nil {
+		return ""
+	}
+
+	return addresses[0].(*net.IPNet).IP.String()
+}
+
+func isLocalPortOpen(port int) bool {
+	timeout := 1 * time.Second
+	target := fmt.Sprintf("127.0.0.1:%d", port)
+	conn, err := net.DialTimeout("tcp", target, timeout)
+	if err != nil {
+		return false
+	}
+
+	if conn != nil {
+		conn.Close()
+		return true
+	}
+
+	return false
+}
diff --git a/components/supervisor/pkg/ports/ports_test.go b/components/supervisor/pkg/ports/ports_test.go
index 531bc39d257c03..a02c916163413a 100644
--- a/components/supervisor/pkg/ports/ports_test.go
+++ b/components/supervisor/pkg/ports/ports_test.go
@@ -50,19 +50,22 @@ func TestPortsUpdateState(t *testing.T) {
 			Desc: "basic locally served",
 			Changes: []Change{
 				{Served: []ServedPort{{"0100007F", 8080, true}}},
-				{Exposed: []ExposedPort{{LocalPort: 8080, GlobalPort: 60000, URL: "foobar"}}},
+				{Exposed: []ExposedPort{{LocalPort: 8080, URL: "foobar"}}},
 				{Served: []ServedPort{{"0100007F", 8080, true}, {"00000000", 60000, false}}},
 				{Served: []ServedPort{{"00000000", 60000, false}}},
 				{Served: []ServedPort{}},
 			},
 			ExpectedExposure: []ExposedPort{
-				{LocalPort: 8080, GlobalPort: 60000},
+				{LocalPort: 8080},
+				{LocalPort: 60000},
 			},
 			ExpectedUpdates: UpdateExpectation{
 				{},
-				[]*api.PortsStatus{{LocalPort: 8080, GlobalPort: 60000, Served: true}},
-				[]*api.PortsStatus{{LocalPort: 8080, GlobalPort: 60000, Served: true, Exposed: &api.ExposedPortInfo{OnExposed: api.OnPortExposedAction_notify_private, Visibility: api.PortVisibility_private, Url: "foobar"}}},
-				[]*api.PortsStatus{{LocalPort: 8080, GlobalPort: 60000, Served: false, Exposed: &api.ExposedPortInfo{OnExposed: api.OnPortExposedAction_notify_private, Visibility: api.PortVisibility_private, Url: "foobar"}}},
+				[]*api.PortsStatus{{LocalPort: 8080, Served: true}},
+				[]*api.PortsStatus{{LocalPort: 8080, Served: true, Exposed: &api.ExposedPortInfo{OnExposed: api.OnPortExposedAction_notify_private, Visibility: api.PortVisibility_private, Url: "foobar"}}},
+				[]*api.PortsStatus{{LocalPort: 8080, Served: true, Exposed: &api.ExposedPortInfo{OnExposed: api.OnPortExposedAction_notify_private, Visibility: api.PortVisibility_private, Url: "foobar"}}, {LocalPort: 60000, Served: true}},
+				[]*api.PortsStatus{{LocalPort: 8080, Served: false, Exposed: &api.ExposedPortInfo{OnExposed: api.OnPortExposedAction_notify_private, Visibility: api.PortVisibility_private, Url: "foobar"}}, {LocalPort: 60000, Served: true}},
+				[]*api.PortsStatus{{LocalPort: 8080, Served: false, Exposed: &api.ExposedPortInfo{OnExposed: api.OnPortExposedAction_notify_private, Visibility: api.PortVisibility_private, Url: "foobar"}}},
 			},
 		},
 		{
@@ -72,26 +75,26 @@ func TestPortsUpdateState(t *testing.T) {
 				{Served: []ServedPort{}},
 			},
 			ExpectedExposure: []ExposedPort{
-				{LocalPort: 8080, GlobalPort: 8080},
+				{LocalPort: 8080},
 			},
 			ExpectedUpdates: UpdateExpectation{
 				{},
-				[]*api.PortsStatus{{LocalPort: 8080, GlobalPort: 8080, Served: true}},
+				[]*api.PortsStatus{{LocalPort: 8080, Served: true}},
 				{},
 			},
 		},
 		{
 			Desc: "basic port publically exposed",
 			Changes: []Change{
-				{Exposed: []ExposedPort{{LocalPort: 8080, GlobalPort: 8080, Public: false, URL: "foobar"}}},
-				{Exposed: []ExposedPort{{LocalPort: 8080, GlobalPort: 8080, Public: true, URL: "foobar"}}},
+				{Exposed: []ExposedPort{{LocalPort: 8080, Public: false, URL: "foobar"}}},
+				{Exposed: []ExposedPort{{LocalPort: 8080, Public: true, URL: "foobar"}}},
 				{Served: []ServedPort{{Port: 8080}}},
 			},
 			ExpectedUpdates: UpdateExpectation{
 				{},
-				[]*api.PortsStatus{{LocalPort: 8080, GlobalPort: 8080, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, Url: "foobar", OnExposed: api.OnPortExposedAction_notify_private}}},
-				[]*api.PortsStatus{{LocalPort: 8080, GlobalPort: 8080, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_public, Url: "foobar", OnExposed: api.OnPortExposedAction_notify_private}}},
-				[]*api.PortsStatus{{LocalPort: 8080, GlobalPort: 8080, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_public, Url: "foobar", OnExposed: api.OnPortExposedAction_notify_private}}},
+				[]*api.PortsStatus{{LocalPort: 8080, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, Url: "foobar", OnExposed: api.OnPortExposedAction_notify_private}}},
+				[]*api.PortsStatus{{LocalPort: 8080, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_public, Url: "foobar", OnExposed: api.OnPortExposedAction_notify_private}}},
+				[]*api.PortsStatus{{LocalPort: 8080, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_public, Url: "foobar", OnExposed: api.OnPortExposedAction_notify_private}}},
 			},
 		},
 		{
@@ -116,8 +119,8 @@ func TestPortsUpdateState(t *testing.T) {
 				}},
 				{
 					Exposed: []ExposedPort{
-						{LocalPort: 8080, GlobalPort: 8080, Public: true, URL: "8080-foobar"},
-						{LocalPort: 9229, GlobalPort: 9229, Public: false, URL: "9229-foobar"},
+						{LocalPort: 8080, Public: true, URL: "8080-foobar"},
+						{LocalPort: 9229, Public: false, URL: "9229-foobar"},
 					},
 				},
 				{
@@ -128,20 +131,19 @@ func TestPortsUpdateState(t *testing.T) {
 				},
 			},
 			ExpectedExposure: []ExposedPort{
-				{LocalPort: 8080, GlobalPort: 8080},
-				{LocalPort: 9229, GlobalPort: 9229},
-				{LocalPort: 9229, GlobalPort: 60000},
+				{LocalPort: 8080},
+				{LocalPort: 9229},
 			},
 			ExpectedUpdates: UpdateExpectation{
 				{},
-				[]*api.PortsStatus{{LocalPort: 8080, GlobalPort: 8080}, {LocalPort: 9229, GlobalPort: 9229}},
+				[]*api.PortsStatus{{LocalPort: 8080}, {LocalPort: 9229}},
 				[]*api.PortsStatus{
-					{LocalPort: 8080, GlobalPort: 8080, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_public, Url: "8080-foobar", OnExposed: api.OnPortExposedAction_open_browser}},
-					{LocalPort: 9229, GlobalPort: 9229, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, Url: "9229-foobar", OnExposed: api.OnPortExposedAction_ignore}},
+					{LocalPort: 8080, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_public, Url: "8080-foobar", OnExposed: api.OnPortExposedAction_open_browser}},
+					{LocalPort: 9229, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, Url: "9229-foobar", OnExposed: api.OnPortExposedAction_ignore}},
 				},
 				[]*api.PortsStatus{
-					{LocalPort: 8080, GlobalPort: 8080, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_public, Url: "8080-foobar", OnExposed: api.OnPortExposedAction_open_browser}},
-					{LocalPort: 9229, GlobalPort: 60000, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, Url: "9229-foobar", OnExposed: api.OnPortExposedAction_ignore}},
+					{LocalPort: 8080, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_public, Url: "8080-foobar", OnExposed: api.OnPortExposedAction_open_browser}},
+					{LocalPort: 9229, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, Url: "9229-foobar", OnExposed: api.OnPortExposedAction_ignore}},
 				},
 			},
 		},
@@ -155,17 +157,20 @@ func TestPortsUpdateState(t *testing.T) {
 					}},
 				}},
 				{Served: []ServedPort{{"0100007F", 4040, true}}},
-				{Exposed: []ExposedPort{{LocalPort: 4040, GlobalPort: 60000, Public: true, URL: "4040-foobar"}}},
+				{Exposed: []ExposedPort{{LocalPort: 4040, Public: true, URL: "4040-foobar"}}},
 				{Served: []ServedPort{{"0100007F", 4040, true}, {"00000000", 60000, false}}},
 			},
 			ExpectedExposure: []ExposedPort{
-				{LocalPort: 4040, GlobalPort: 60000},
+				{LocalPort: 4040},
+				{LocalPort: 60000},
 			},
 			ExpectedUpdates: UpdateExpectation{
 				{},
-				[]*api.PortsStatus{{LocalPort: 4040, GlobalPort: 60000, Served: true}},
+				[]*api.PortsStatus{{LocalPort: 4040, Served: true}},
+				[]*api.PortsStatus{{LocalPort: 4040, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_public, Url: "4040-foobar", OnExposed: api.OnPortExposedAction_open_browser}}},
 				[]*api.PortsStatus{
-					{LocalPort: 4040, GlobalPort: 60000, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_public, Url: "4040-foobar", OnExposed: api.OnPortExposedAction_open_browser}},
+					{LocalPort: 4040, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_public, Url: "4040-foobar", OnExposed: api.OnPortExposedAction_open_browser}},
+					{LocalPort: 60000, Served: true},
 				},
 			},
 		},
@@ -178,22 +183,19 @@ func TestPortsUpdateState(t *testing.T) {
 					}},
 				},
 				{
-					Exposed: []ExposedPort{{LocalPort: 8080, GlobalPort: 8080, Public: false, URL: "foobar"}},
+					Exposed: []ExposedPort{{LocalPort: 8080, Public: false, URL: "foobar"}},
 				},
 				{
-					Exposed: []ExposedPort{{LocalPort: 8080, GlobalPort: 8080, Public: true, URL: "foobar"}},
+					Exposed: []ExposedPort{{LocalPort: 8080, Public: true, URL: "foobar"}},
 				},
 				{
 					Served: []ServedPort{{"0100007F", 8080, true}},
 				},
 				{
-					Exposed: []ExposedPort{{LocalPort: 8080, GlobalPort: 60000, Public: true, URL: "foobar"}},
+					Exposed: []ExposedPort{{LocalPort: 8080, Public: true, URL: "foobar"}},
 				},
 				{
-					Served: []ServedPort{{"0100007F", 8080, true}, {"00000000", 60000, false}},
-				},
-				{
-					Served: []ServedPort{{"00000000", 60000, false}},
+					Served: []ServedPort{{"0100007F", 8080, true}},
 				},
 				{
 					Served: []ServedPort{},
@@ -203,18 +205,16 @@ func TestPortsUpdateState(t *testing.T) {
 				},
 			},
 			ExpectedExposure: []ExposedPort{
-				{LocalPort: 8080, GlobalPort: 8080, Public: false},
-				{LocalPort: 8080, GlobalPort: 60000, Public: true},
-				{LocalPort: 8080, GlobalPort: 8080, Public: true},
+				{LocalPort: 8080, Public: false},
 			},
 			ExpectedUpdates: UpdateExpectation{
 				{},
-				[]*api.PortsStatus{{LocalPort: 8080, GlobalPort: 8080}},
-				[]*api.PortsStatus{{LocalPort: 8080, GlobalPort: 8080, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, OnExposed: api.OnPortExposedAction_notify, Url: "foobar"}}},
-				[]*api.PortsStatus{{LocalPort: 8080, GlobalPort: 8080, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_public, OnExposed: api.OnPortExposedAction_notify, Url: "foobar"}}},
-				[]*api.PortsStatus{{LocalPort: 8080, GlobalPort: 60000, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_public, OnExposed: api.OnPortExposedAction_notify, Url: "foobar"}}},
-				[]*api.PortsStatus{{LocalPort: 8080, GlobalPort: 60000, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_public, OnExposed: api.OnPortExposedAction_notify, Url: "foobar"}}},
-				[]*api.PortsStatus{{LocalPort: 8080, GlobalPort: 8080, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_public, OnExposed: api.OnPortExposedAction_notify, Url: "foobar"}}},
+				[]*api.PortsStatus{{LocalPort: 8080}},
+				[]*api.PortsStatus{{LocalPort: 8080, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, OnExposed: api.OnPortExposedAction_notify, Url: "foobar"}}},
+				[]*api.PortsStatus{{LocalPort: 8080, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_public, OnExposed: api.OnPortExposedAction_notify, Url: "foobar"}}},
+				[]*api.PortsStatus{{LocalPort: 8080, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_public, OnExposed: api.OnPortExposedAction_notify, Url: "foobar"}}},
+				[]*api.PortsStatus{{LocalPort: 8080, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_public, OnExposed: api.OnPortExposedAction_notify, Url: "foobar"}}},
+				[]*api.PortsStatus{{LocalPort: 8080, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_public, OnExposed: api.OnPortExposedAction_notify, Url: "foobar"}}},
 			},
 		},
 		{
@@ -225,14 +225,14 @@ func TestPortsUpdateState(t *testing.T) {
 				},
 			},
 			ExpectedExposure: []ExposedPort{
-				{LocalPort: 8080, GlobalPort: 59999},
-				{LocalPort: 3000, GlobalPort: 60000},
+				{LocalPort: 8080},
+				{LocalPort: 3000},
 			},
 			ExpectedUpdates: UpdateExpectation{
 				{},
 				{
-					{LocalPort: 8080, GlobalPort: 59999, Served: true},
-					{LocalPort: 3000, GlobalPort: 60000, Served: true},
+					{LocalPort: 8080, Served: true},
+					{LocalPort: 3000, Served: true},
 				},
 			},
 		},
@@ -248,17 +248,17 @@ func TestPortsUpdateState(t *testing.T) {
 					Served: []ServedPort{{"00000000", 8080, false}},
 				},
 				{
-					Exposed: []ExposedPort{{LocalPort: 8080, GlobalPort: 8080, Public: false, URL: "foobar"}},
+					Exposed: []ExposedPort{{LocalPort: 8080, Public: false, URL: "foobar"}},
 				},
 			},
 			ExpectedExposure: []ExposedPort{
-				{LocalPort: 8080, GlobalPort: 8080},
+				{LocalPort: 8080},
 			},
 			ExpectedUpdates: UpdateExpectation{
 				{},
-				{{LocalPort: 8080, GlobalPort: 8080}},
-				{{LocalPort: 8080, GlobalPort: 8080, Served: true}},
-				{{LocalPort: 8080, GlobalPort: 8080, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, OnExposed: api.OnPortExposedAction_notify, Url: "foobar"}}},
+				{{LocalPort: 8080}},
+				{{LocalPort: 8080, Served: true}},
+				{{LocalPort: 8080, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, OnExposed: api.OnPortExposedAction_notify, Url: "foobar"}}},
 			},
 		},
 		{
@@ -268,24 +268,22 @@ func TestPortsUpdateState(t *testing.T) {
 					Served: []ServedPort{{"0100007F", 5900, true}},
 				},
 				{
-					Exposed: []ExposedPort{{LocalPort: 5900, GlobalPort: 60000, URL: "foobar"}},
+					Exposed: []ExposedPort{{LocalPort: 5900, URL: "foobar"}},
 				},
 				{
 					Served: []ServedPort{{"0100007F", 5900, true}, {"00000000", 5900, false}},
 				},
 				{
-					Exposed: []ExposedPort{{LocalPort: 5900, GlobalPort: 5900, URL: "foobar"}},
+					Exposed: []ExposedPort{{LocalPort: 5900, URL: "foobar"}},
 				},
 			},
 			ExpectedExposure: []ExposedPort{
-				{LocalPort: 5900, GlobalPort: 60000},
-				{LocalPort: 5900, GlobalPort: 5900},
+				{LocalPort: 5900},
 			},
 			ExpectedUpdates: UpdateExpectation{
 				{},
-				{{LocalPort: 5900, GlobalPort: 60000, Served: true}},
-				{{LocalPort: 5900, GlobalPort: 60000, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, OnExposed: api.OnPortExposedAction_notify_private, Url: "foobar"}}},
-				{{LocalPort: 5900, GlobalPort: 5900, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, OnExposed: api.OnPortExposedAction_notify_private, Url: "foobar"}}},
+				{{LocalPort: 5900, Served: true}},
+				{{LocalPort: 5900, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, OnExposed: api.OnPortExposedAction_notify_private, Url: "foobar"}}},
 			},
 		},
 		{
@@ -298,21 +296,19 @@ func TestPortsUpdateState(t *testing.T) {
 					Served: []ServedPort{{"0100007F", 5900, true}, {"00000000", 5900, false}},
 				},
 				{
-					Exposed: []ExposedPort{{LocalPort: 5900, GlobalPort: 60000, URL: "foobar"}},
+					Exposed: []ExposedPort{{LocalPort: 5900, URL: "foobar"}},
 				},
 				{
-					Exposed: []ExposedPort{{LocalPort: 5900, GlobalPort: 5900, URL: "foobar"}},
+					Exposed: []ExposedPort{{LocalPort: 5900, URL: "foobar"}},
 				},
 			},
 			ExpectedExposure: []ExposedPort{
-				{LocalPort: 5900, GlobalPort: 60000},
-				{LocalPort: 5900, GlobalPort: 5900},
+				{LocalPort: 5900},
 			},
 			ExpectedUpdates: UpdateExpectation{
 				{},
-				{{LocalPort: 5900, GlobalPort: 60000, Served: true}},
-				{{LocalPort: 5900, GlobalPort: 5900, Served: true}},
-				{{LocalPort: 5900, GlobalPort: 5900, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, OnExposed: api.OnPortExposedAction_notify_private, Url: "foobar"}}},
+				{{LocalPort: 5900, Served: true}},
+				{{LocalPort: 5900, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, OnExposed: api.OnPortExposedAction_notify_private, Url: "foobar"}}},
 			},
 		},
 		{
@@ -322,19 +318,19 @@ func TestPortsUpdateState(t *testing.T) {
 					Served: []ServedPort{{"00000000", 5900, false}},
 				},
 				{
-					Exposed: []ExposedPort{{LocalPort: 5900, GlobalPort: 5900, URL: "foobar"}},
+					Exposed: []ExposedPort{{LocalPort: 5900, URL: "foobar"}},
 				},
 				{
 					Served: []ServedPort{{"00000000", 5900, false}, {"0100007F", 5900, true}},
 				},
 			},
 			ExpectedExposure: []ExposedPort{
-				{LocalPort: 5900, GlobalPort: 5900},
+				{LocalPort: 5900},
 			},
 			ExpectedUpdates: UpdateExpectation{
 				{},
-				{{LocalPort: 5900, GlobalPort: 5900, Served: true}},
-				{{LocalPort: 5900, GlobalPort: 5900, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, OnExposed: api.OnPortExposedAction_notify_private, Url: "foobar"}}},
+				{{LocalPort: 5900, Served: true}},
+				{{LocalPort: 5900, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, OnExposed: api.OnPortExposedAction_notify_private, Url: "foobar"}}},
 			},
 		},
 		{
@@ -347,16 +343,16 @@ func TestPortsUpdateState(t *testing.T) {
 					Served: []ServedPort{{"00000000", 5900, false}, {"0100007F", 5900, true}},
 				},
 				{
-					Exposed: []ExposedPort{{LocalPort: 5900, GlobalPort: 5900, URL: "foobar"}},
+					Exposed: []ExposedPort{{LocalPort: 5900, URL: "foobar"}},
 				},
 			},
 			ExpectedExposure: []ExposedPort{
-				{LocalPort: 5900, GlobalPort: 5900},
+				{LocalPort: 5900},
 			},
 			ExpectedUpdates: UpdateExpectation{
 				{},
-				{{LocalPort: 5900, GlobalPort: 5900, Served: true}},
-				{{LocalPort: 5900, GlobalPort: 5900, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, OnExposed: api.OnPortExposedAction_notify_private, Url: "foobar"}}},
+				{{LocalPort: 5900, Served: true}},
+				{{LocalPort: 5900, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, OnExposed: api.OnPortExposedAction_notify_private, Url: "foobar"}}},
 			},
 		},
 		{
@@ -366,19 +362,19 @@ func TestPortsUpdateState(t *testing.T) {
 					Served: []ServedPort{{"0100007F", 5900, true}},
 				},
 				{
-					Exposed: []ExposedPort{{LocalPort: 5900, GlobalPort: 60000, URL: "foobar"}},
+					Exposed: []ExposedPort{{LocalPort: 5900, URL: "foobar"}},
 				},
 				{
 					Served: []ServedPort{{"0100007F", 5900, true}, {"00000000000000000000010000000000", 5900, true}},
 				},
 			},
 			ExpectedExposure: []ExposedPort{
-				{LocalPort: 5900, GlobalPort: 60000},
+				{LocalPort: 5900},
 			},
 			ExpectedUpdates: UpdateExpectation{
 				{},
-				{{LocalPort: 5900, GlobalPort: 60000, Served: true}},
-				{{LocalPort: 5900, GlobalPort: 60000, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, OnExposed: api.OnPortExposedAction_notify_private, Url: "foobar"}}},
+				{{LocalPort: 5900, Served: true}},
+				{{LocalPort: 5900, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, OnExposed: api.OnPortExposedAction_notify_private, Url: "foobar"}}},
 			},
 		},
 		{
@@ -391,16 +387,16 @@ func TestPortsUpdateState(t *testing.T) {
 					Served: []ServedPort{{"0100007F", 5900, true}, {"00000000000000000000010000000000", 5900, true}},
 				},
 				{
-					Exposed: []ExposedPort{{LocalPort: 5900, GlobalPort: 60000, URL: "foobar"}},
+					Exposed: []ExposedPort{{LocalPort: 5900, URL: "foobar"}},
 				},
 			},
 			ExpectedExposure: []ExposedPort{
-				{LocalPort: 5900, GlobalPort: 60000},
+				{LocalPort: 5900},
 			},
 			ExpectedUpdates: UpdateExpectation{
 				{},
-				{{LocalPort: 5900, GlobalPort: 60000, Served: true}},
-				{{LocalPort: 5900, GlobalPort: 60000, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, OnExposed: api.OnPortExposedAction_notify_private, Url: "foobar"}}},
+				{{LocalPort: 5900, Served: true}},
+				{{LocalPort: 5900, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, OnExposed: api.OnPortExposedAction_notify_private, Url: "foobar"}}},
 			},
 		},
 		{
@@ -410,19 +406,19 @@ func TestPortsUpdateState(t *testing.T) {
 					Served: []ServedPort{{"00000000", 5900, false}},
 				},
 				{
-					Exposed: []ExposedPort{{LocalPort: 5900, GlobalPort: 5900, URL: "foobar"}},
+					Exposed: []ExposedPort{{LocalPort: 5900, URL: "foobar"}},
 				},
 				{
 					Served: []ServedPort{{"00000000", 5900, false}, {"00000000000000000000000000000000", 5900, false}},
 				},
 			},
 			ExpectedExposure: []ExposedPort{
-				{LocalPort: 5900, GlobalPort: 5900},
+				{LocalPort: 5900},
 			},
 			ExpectedUpdates: UpdateExpectation{
 				{},
-				{{LocalPort: 5900, GlobalPort: 5900, Served: true}},
-				{{LocalPort: 5900, GlobalPort: 5900, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, OnExposed: api.OnPortExposedAction_notify_private, Url: "foobar"}}},
+				{{LocalPort: 5900, Served: true}},
+				{{LocalPort: 5900, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, OnExposed: api.OnPortExposedAction_notify_private, Url: "foobar"}}},
 			},
 		},
 		{
@@ -435,16 +431,16 @@ func TestPortsUpdateState(t *testing.T) {
 					Served: []ServedPort{{"00000000", 5900, false}, {"00000000000000000000000000000000", 5900, false}},
 				},
 				{
-					Exposed: []ExposedPort{{LocalPort: 5900, GlobalPort: 5900, URL: "foobar"}},
+					Exposed: []ExposedPort{{LocalPort: 5900, URL: "foobar"}},
 				},
 			},
 			ExpectedExposure: []ExposedPort{
-				{LocalPort: 5900, GlobalPort: 5900},
+				{LocalPort: 5900},
 			},
 			ExpectedUpdates: UpdateExpectation{
 				{},
-				{{LocalPort: 5900, GlobalPort: 5900, Served: true}},
-				{{LocalPort: 5900, GlobalPort: 5900, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, OnExposed: api.OnPortExposedAction_notify_private, Url: "foobar"}}},
+				{{LocalPort: 5900, Served: true}},
+				{{LocalPort: 5900, Served: true, Exposed: &api.ExposedPortInfo{Visibility: api.PortVisibility_private, OnExposed: api.OnPortExposedAction_notify_private, Url: "foobar"}}},
 			},
 		},
 	}
@@ -474,7 +470,7 @@ func TestPortsUpdateState(t *testing.T) {
 				pm    = NewManager(exposed, served, config, tunneled, nil, test.InternalPorts...)
 				updts [][]*api.PortsStatus
 			)
-			pm.proxyStarter = func(localPort uint32, globalPort uint32) (io.Closer, error) {
+			pm.proxyStarter = func(port uint32) (io.Closer, error) {
 				return io.NopCloser(nil), nil
 			}
 
@@ -488,10 +484,8 @@ func TestPortsUpdateState(t *testing.T) {
 				t.Fatal(err)
 			}
 			go func() {
-				defer func() {
-					wg.Done()
-					_ = sub.Close()
-				}()
+				defer wg.Done()
+				defer sub.Close()
 
 				for up := range sub.Updates() {
 					updts = append(updts, up)
@@ -564,15 +558,12 @@ type testTunneledPorts struct {
 func (tep *testTunneledPorts) Observe(ctx context.Context) (<-chan []PortTunnelState, <-chan error) {
 	return tep.Changes, tep.Error
 }
-
 func (tep *testTunneledPorts) Tunnel(ctx context.Context, options *TunnelOptions, descs ...*PortTunnelDescription) ([]uint32, error) {
 	return nil, nil
 }
-
 func (tep *testTunneledPorts) CloseTunnel(ctx context.Context, localPorts ...uint32) ([]uint32, error) {
 	return nil, nil
 }
-
 func (tep *testTunneledPorts) EstablishTunnel(ctx context.Context, clientID string, localPort uint32, targetPort uint32) (net.Conn, error) {
 	return nil, nil
 }
@@ -601,14 +592,13 @@ func (tep *testExposedPorts) Observe(ctx context.Context) (<-chan []ExposedPort,
 func (tep *testExposedPorts) Run(ctx context.Context) {
 }
 
-func (tep *testExposedPorts) Expose(ctx context.Context, local, global uint32, public bool) <-chan error {
+func (tep *testExposedPorts) Expose(ctx context.Context, local uint32, public bool) <-chan error {
 	tep.mu.Lock()
 	defer tep.mu.Unlock()
 
 	tep.Exposures = append(tep.Exposures, ExposedPort{
-		GlobalPort: global,
-		LocalPort:  local,
-		Public:     public,
+		LocalPort: local,
+		Public:    public,
 	})
 	return nil
 }
@@ -622,7 +612,7 @@ func (tps *testServedPorts) Observe(ctx context.Context) (<-chan []ServedPort, <
 	return tps.Changes, tps.Error
 }
 
-// testing for deadlocks between subscribing and processing events.
+// testing for deadlocks between subscribing and processing events
 func TestPortsConcurrentSubscribe(t *testing.T) {
 	var (
 		subscribes  = 100
@@ -645,7 +635,7 @@ func TestPortsConcurrentSubscribe(t *testing.T) {
 		}
 		pm = NewManager(exposed, served, config, tunneled, nil)
 	)
-	pm.proxyStarter = func(localPort uint32, globalPort uint32) (io.Closer, error) {
+	pm.proxyStarter = func(local uint32) (io.Closer, error) {
 		return io.NopCloser(nil), nil
 	}
 
@@ -667,6 +657,7 @@ func TestPortsConcurrentSubscribe(t *testing.T) {
 
 		var j uint32
 		for {
+
 			select {
 			case <-time.After(50 * time.Millisecond):
 				served.Changes <- []ServedPort{{Port: j}}
@@ -691,7 +682,7 @@ func TestPortsConcurrentSubscribe(t *testing.T) {
 				// update
 				case <-sub.Updates():
 				}
-				_ = sub.Close()
+				sub.Close()
 			}
 			return nil
 		})
diff --git a/components/supervisor/pkg/ports/served-ports.go b/components/supervisor/pkg/ports/served-ports.go
index e893428906fa2b..bc490da4960d44 100644
--- a/components/supervisor/pkg/ports/served-ports.go
+++ b/components/supervisor/pkg/ports/served-ports.go
@@ -10,6 +10,7 @@ import (
 	"fmt"
 	"io"
 	"os"
+	"sort"
 	"strconv"
 	"strings"
 	"time"
@@ -112,6 +113,11 @@ func (p *PollingServedPortsObserver) Observe(ctx context.Context) (<-chan []Serv
 	return reschan, errchan
 }
 
+const (
+	v6Localhost = "00000000000000000000000001000000"
+	v4Localhost = "0100007F"
+)
+
 func readNetTCPFile(fc io.Reader, listeningOnly bool) (ports []ServedPort, err error) {
 	scanner := bufio.NewScanner(fc)
 	for scanner.Scan() {
@@ -129,7 +135,7 @@ func readNetTCPFile(fc io.Reader, listeningOnly bool) (ports []ServedPort, err e
 		}
 		addr, prt := segs[0], segs[1]
 
-		globallyBound := addr == "00000000" || addr == "00000000000000000000000000000000"
+		locallyBound := addr == v4Localhost || addr == v6Localhost
 		port, err := strconv.ParseUint(prt, 16, 32)
 		if err != nil {
 			log.WithError(err).WithField("port", prt).Warn("cannot parse port entry from /proc/net/tcp* file")
@@ -137,10 +143,23 @@ func readNetTCPFile(fc io.Reader, listeningOnly bool) (ports []ServedPort, err e
 		}
 
 		ports = append(ports, ServedPort{
-			BoundToLocalhost: !globallyBound,
+			BoundToLocalhost: locallyBound,
 			Address:          addr,
 			Port:             uint32(port),
 		})
+
+		sort.Slice(ports, func(i, j int) bool {
+			sortedByAddress := ports[i].Address > ports[j].Address
+			if ports[i].Address == ports[j].Address {
+				sortedByPort := ports[i].Port < ports[j].Port
+				return sortedByPort
+			}
+			return sortedByAddress
+		})
+
+		sort.Slice(ports, func(i, j int) bool {
+			return ports[i].Port < ports[j].Port
+		})
 	}
 	if err = scanner.Err(); err != nil {
 		return nil, err
diff --git a/components/supervisor/pkg/ports/served-ports_test.go b/components/supervisor/pkg/ports/served-ports_test.go
index 4493934d7eee24..f3df3ee3bc3ada 100644
--- a/components/supervisor/pkg/ports/served-ports_test.go
+++ b/components/supervisor/pkg/ports/served-ports_test.go
@@ -50,12 +50,12 @@ func TestObserve(t *testing.T) {
 			},
 			Expectation: Expectation{
 				{
-					{Address: "00000000", Port: 23000},
-					{Address: "00000000", Port: 6080},
 					{Address: "0100007F", Port: 5900, BoundToLocalhost: true},
+					{Address: "00000000", Port: 6080},
+					{Address: "00000000", Port: 23000},
+					{Address: "00000000000000000000000001000000", Port: 5900, BoundToLocalhost: true},
 					{Address: "00000000000000000000000000000000", Port: 22999},
 					{Address: "00000000000000000000000000000000", Port: 35900},
-					{Address: "00000000000000000000000001000000", Port: 5900, BoundToLocalhost: true},
 					{Address: "00000000000000000000000000000000", Port: 36080},
 				},
 			},
@@ -75,12 +75,12 @@ func TestObserve(t *testing.T) {
 			},
 			Expectation: Expectation{
 				{
-					{Address: "00000000", Port: 6080},
 					{Address: "0100007F", Port: 5900, BoundToLocalhost: true},
+					{Address: "00000000", Port: 6080},
 					{Address: "00000000", Port: 23000},
-					{Address: "00000000000000000000000000000000", Port: 60000},
 					{Address: "00000000000000000000000001000000", Port: 5900, BoundToLocalhost: true},
 					{Address: "00000000000000000000000000000000", Port: 22999},
+					{Address: "00000000000000000000000000000000", Port: 60000},
 				},
 			},
 		},
@@ -99,12 +99,12 @@ func TestObserve(t *testing.T) {
 			},
 			Expectation: Expectation{
 				{
-					{Address: "00000000", Port: 6080},
 					{Address: "0100007F", Port: 5900, BoundToLocalhost: true},
+					{Address: "00000000", Port: 6080},
 					{Address: "00000000", Port: 23000},
-					{Address: "00000000000000000000000000000000", Port: 60000},
-					{Address: "00000000000000000000000000000000", Port: 5900},
+					{Address: "00000000000000000000000000000000", Port: 5900, BoundToLocalhost: false},
 					{Address: "00000000000000000000000000000000", Port: 22999},
+					{Address: "00000000000000000000000000000000", Port: 60000},
 				},
 			},
 		},
@@ -123,12 +123,83 @@ func TestObserve(t *testing.T) {
 			},
 			Expectation: Expectation{
 				{
-					{Address: "00000000", Port: 6080},
 					{Address: "00000000", Port: 5900},
+					{Address: "00000000", Port: 6080},
 					{Address: "00000000", Port: 23000},
-					{Address: "00000000000000000000000000000000", Port: 60000},
 					{Address: "00000000000000000000000001000000", Port: 5900, BoundToLocalhost: true},
 					{Address: "00000000000000000000000000000000", Port: 22999},
+					{Address: "00000000000000000000000000000000", Port: 60000},
+				},
+			},
+		},
+		{
+			Name: "multiple ports bound locally and globally",
+			FileContents: []string{
+				"", "",
+				`
+   0: AD0E600A:240D 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 53934502 1 0000000000000000 100 0 0 10 0
+   1: 0100007F:240D 00000000:0000 0A 00000000:00000000 00:00000000 00000000 33333        0 53938101 1 0000000000000000 100 0 0 10 0
+   2: 00000000:59D8 00000000:0000 0A 00000000:00000000 00:00000000 00000000 33333        0 53939555 1 0000000000000000 100 0 0 10 0
+   3: 0100007F:6989 00000000:0000 0A 00000000:00000000 00:00000000 00000000 33333        0 54384751 1 0000000000000000 100 0 0 10 1024
+   4: AD0E600A:6989 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 53934503 1 0000000000000000 100 0 0 10 0
+   5: 0100007F:AC48 0100007F:59D7 01 00000000:00000000 02:000004A8 00000000     0        0 53921525 2 0000000000000000 20 4 0 10 -1
+   6: 0100007F:6989 0100007F:C74E 01 00000000:00000000 02:0000653F 00000000 33333        0 54366989 2 0000000000000000 20 4 31 10 -1
+   7: 0100007F:AC40 0100007F:59D7 01 00000000:00000000 02:000004A8 00000000     0        0 53944840 2 0000000000000000 20 4 0 10 -1
+   8: 0100007F:B5D8 0100007F:59D7 01 00000000:00000000 02:0000018F 00000000     0        0 54068010 2 0000000000000000 20 4 0 10 -1
+   9: 0100007F:AC42 0100007F:59D7 01 00000000:00000000 02:000004C2 00000000     0        0 53938397 2 0000000000000000 20 4 0 10 -1
+   10: 0100007F:AC46 0100007F:59D7 01 00000000:00000000 02:000004C2 00000000     0        0 53921524 2 0000000000000000 20 4 0 10 -1
+   11: AD0E600A:B8CC F61BC768:01BB 01 00000000:00000000 02:0000034A 00000000     0        0 53880829 2 0000000000000000 21 4 26 10 -1
+   12: 0100007F:C74E 0100007F:6989 01 00000000:00000000 02:0000077F 00000000 33333        0 54384853 2 0000000000000000 20 4 30 10 -1
+   13: 0100007F:AC44 0100007F:59D7 01 00000000:00000000 02:00000300 00000000     0        0 53932419 2 0000000000000000 20 4 22 10 -1
+   14: 0100007F:AC4A 0100007F:59D7 01 00000000:00000000 02:000004C2 00000000     0        0 53920639 2 0000000000000000 20 4 0 10 -1
+   15: AD0E600A:BAEA F61BC768:01BB 01 00000000:00000000 00:00000000 00000000 33333        0 53962195 1 0000000000000000 20 4 28 10 -1
+   16: AD0E600A:59D8 760B600A:DA78 01 00000000:00000000 00:00000000 00000000 33333        0 53934581 3 0000000000000000 20 4 27 10 33
+   17: 0100007F:C6A6 0100007F:6989 01 00000000:00000000 02:00000360 00000000 33333        0 54383783 2 0000000000000000 20 4 30 10 -1
+   18: AD0E600A:59D8 760B600A:DAD0 01 00000000:00000000 00:00000000 00000000 33333        0 53961912 3 0000000000000000 20 4 31 10 -1
+   19: 0100007F:AC66 0100007F:59D7 01 00000000:00000000 00:00000000 00000000 33333        0 53939557 1 0000000000000000 20 4 0 10 -1
+   20: 0100007F:AE52 0100007F:59D7 01 00000000:00000000 00:00000000 00000000 33333        0 53963729 1 0000000000000000 20 4 0 10 -1
+   21: 0100007F:6989 0100007F:C6A6 01 00000000:00000000 02:00006120 00000000 33333        0 54366964 2 0000000000000000 20 4 20 10 -1`,
+			},
+			Expectation: Expectation{
+				{
+					{Address: "AD0E600A", Port: 9229},
+					{Address: "0100007F", Port: 9229, BoundToLocalhost: true},
+					{Address: "00000000", Port: 23000},
+					{Address: "AD0E600A", Port: 27017, BoundToLocalhost: false},
+					{Address: "0100007F", Port: 27017, BoundToLocalhost: true},
+				},
+			},
+		},
+		{
+			Name: "multiple ports bound locally and globally",
+			FileContents: []string{
+				"", "",
+				`
+   sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
+   0: 220E600A:6989 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 61354170 1 0000000000000000 100 0 0 10 0
+   1: 220E600A:240D 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 61354169 1 0000000000000000 100 0 0 10 0
+   2: 0100007F:240D 00000000:0000 0A 00000000:00000000 00:00000000 00000000 33333        0 61232087 1 0000000000000000 100 0 0 10 0
+   3: 00000000:59D8 00000000:0000 0A 00000000:00000000 00:00000000 00000000 33333        0 61285963 1 0000000000000000 100 0 0 10 0
+   4: 0100007F:DD60 0100007F:59D7 01 00000000:00000000 02:00000366 00000000     0        0 61278087 2 0000000000000000 20 4 0 10 -1
+   5: 0100007F:DD5E 0100007F:59D7 01 00000000:00000000 02:00000380 00000000     0        0 61286915 2 0000000000000000 20 4 0 10 -1
+   6: 0100007F:DD64 0100007F:59D7 01 00000000:00000000 02:0000019A 00000000     0        0 61281217 2 0000000000000000 20 4 0 10 -1
+   7: 0100007F:E08C 0100007F:59D7 01 00000000:00000000 02:00000233 00000000     0        0 61342352 2 0000000000000000 20 4 0 10 -1
+   8: 0100007F:DD82 0100007F:59D7 01 00000000:00000000 00:00000000 00000000 33333        0 61285965 1 0000000000000000 20 4 0 10 -1
+   9: 220E600A:59D8 760B600A:E920 01 00000000:00000000 00:00000000 00000000 33333        0 61352088 3 0000000000000000 20 4 27 10 28
+   10: 0100007F:DD62 0100007F:59D7 01 00000000:00000000 02:0000019A 00000000     0        0 61278088 2 0000000000000000 20 4 0 10 -1
+   11: 0100007F:DD5C 0100007F:59D7 01 00000000:00000000 02:000000FE 00000000     0        0 61232037 2 0000000000000000 20 4 22 10 -1
+   12: 220E600A:BE20 F61BC768:01BB 01 00000000:00000000 00:00000000 00000000 33333        0 61342422 1 0000000000000000 21 4 26 10 -1
+   13: 0100007F:DD5A 0100007F:59D7 01 00000000:00000000 02:0000019A 00000000     0        0 61232036 2 0000000000000000 20 4 0 10 -1
+   14: 0100007F:E0C6 0100007F:59D7 01 00000000:00000000 00:00000000 00000000 33333        0 61342375 1 0000000000000000 20 4 0 10 -1
+   15: 220E600A:BAB0 F61BC768:01BB 01 00000000:00000000 02:00000418 00000000     0        0 61278493 2 0000000000000000 20 4 30 10 -1
+   16: 220E600A:59D8 760B600A:E96C 01 00000000:00000000 00:00000000 00000000 33333        0 61331984 3 0000000000000000 20 4 31 10 -1`,
+			},
+			Expectation: Expectation{
+				{
+					{Address: "220E600A", Port: 9229},
+					{Address: "0100007F", Port: 9229, BoundToLocalhost: true},
+					{Address: "00000000", Port: 23000},
+					{Address: "220E600A", Port: 27017},
 				},
 			},
 		},
@@ -190,9 +261,9 @@ func TestReadNetTCPFile(t *testing.T) {
 			ListeningOnly: true,
 			Expectation: Expectation{
 				Ports: []ServedPort{
-					{Address: "00000000", Port: 23000},
-					{Address: "00000000", Port: 6080},
 					{Address: "0100007F", Port: 5900, BoundToLocalhost: true},
+					{Address: "00000000", Port: 6080},
+					{Address: "00000000", Port: 23000},
 				},
 			},
 		},
@@ -202,9 +273,9 @@ func TestReadNetTCPFile(t *testing.T) {
 			ListeningOnly: true,
 			Expectation: Expectation{
 				Ports: []ServedPort{
+					{Address: "00000000000000000000000001000000", Port: 5900, BoundToLocalhost: true},
 					{Address: "00000000000000000000000000000000", Port: 22999},
 					{Address: "00000000000000000000000000000000", Port: 35900},
-					{Address: "00000000000000000000000001000000", Port: 5900, BoundToLocalhost: true},
 					{Address: "00000000000000000000000000000000", Port: 36080},
 				},
 			},
diff --git a/components/supervisor/pkg/supervisor/services.go b/components/supervisor/pkg/supervisor/services.go
index 4178c56df19975..f5b66f7ca7822c 100644
--- a/components/supervisor/pkg/supervisor/services.go
+++ b/components/supervisor/pkg/supervisor/services.go
@@ -697,7 +697,7 @@ func (c *ControlService) RegisterGRPC(srv *grpc.Server) {
 
 // ExposePort exposes a port.
 func (c *ControlService) ExposePort(ctx context.Context, req *api.ExposePortRequest) (*api.ExposePortResponse, error) {
-	err := c.portsManager.Expose(ctx, req.Port, req.TargetPort)
+	err := c.portsManager.Expose(ctx, req.Port)
 	return &api.ExposePortResponse{}, err
 }
 
diff --git a/components/ws-daemon-api/go/daemon.pb.go b/components/ws-daemon-api/go/daemon.pb.go
index ca8a1eadf67301..ea6b637b106073 100644
--- a/components/ws-daemon-api/go/daemon.pb.go
+++ b/components/ws-daemon-api/go/daemon.pb.go
@@ -5,7 +5,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
 // 	protoc-gen-go v1.27.1
-// 	protoc        v3.19.0
+// 	protoc        v3.19.1
 // source: daemon.proto
 
 package api
diff --git a/components/ws-daemon-api/go/workspace_daemon.pb.go b/components/ws-daemon-api/go/workspace_daemon.pb.go
index 1b61259667c396..be6a3fba031f9e 100644
--- a/components/ws-daemon-api/go/workspace_daemon.pb.go
+++ b/components/ws-daemon-api/go/workspace_daemon.pb.go
@@ -5,7 +5,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
 // 	protoc-gen-go v1.27.1
-// 	protoc        v3.19.0
+// 	protoc        v3.19.1
 // source: workspace_daemon.proto
 
 package api
diff --git a/components/ws-daemon-api/typescript/src/daemon_pb.js b/components/ws-daemon-api/typescript/src/daemon_pb.js
index dc23a5e3764014..91b444bc1cb6cd 100644
--- a/components/ws-daemon-api/typescript/src/daemon_pb.js
+++ b/components/ws-daemon-api/typescript/src/daemon_pb.js
@@ -19,7 +19,13 @@
 
 var jspb = require('google-protobuf');
 var goog = jspb;
-var global = (function() { return this || window || global || self || Function('return this')(); }).call(null);
+var global = (function() {
+  if (this) { return this; }
+  if (typeof window !== 'undefined') { return window; }
+  if (typeof global !== 'undefined') { return global; }
+  if (typeof self !== 'undefined') { return self; }
+  return Function('return this')();
+}.call(null));
 
 var content$service$api_initializer_pb = require('@gitpod/content-service/lib');
 goog.object.extend(proto, content$service$api_initializer_pb);
diff --git a/components/ws-daemon-api/typescript/src/workspace_daemon_pb.js b/components/ws-daemon-api/typescript/src/workspace_daemon_pb.js
index 573ada7cc74088..859149503a59cd 100644
--- a/components/ws-daemon-api/typescript/src/workspace_daemon_pb.js
+++ b/components/ws-daemon-api/typescript/src/workspace_daemon_pb.js
@@ -19,7 +19,13 @@
 
 var jspb = require('google-protobuf');
 var goog = jspb;
-var global = (function() { return this || window || global || self || Function('return this')(); }).call(null);
+var global = (function() {
+  if (this) { return this; }
+  if (typeof window !== 'undefined') { return window; }
+  if (typeof global !== 'undefined') { return global; }
+  if (typeof self !== 'undefined') { return self; }
+  return Function('return this')();
+}.call(null));
 
 goog.exportSymbol('proto.iws.FSShiftMethod', null, global);
 goog.exportSymbol('proto.iws.MountProcRequest', null, global);
diff --git a/components/ws-manager-api/core.proto b/components/ws-manager-api/core.proto
index 7f6ef0f4fd2790..a62500751c82b6 100644
--- a/components/ws-manager-api/core.proto
+++ b/components/ws-manager-api/core.proto
@@ -312,8 +312,8 @@ message PortSpec {
     // port is the outward-facing port
     uint32 port = 1;
 
-    // target is the inward-facing target port
-    uint32 target = 2;
+    // DEPRECATED target is the inward-facing target port
+    reserved 2;
 
     // visibility defines the visibility of the port
     PortVisibility visibility = 3;
@@ -344,8 +344,8 @@ message WorkspaceConditions {
     // pulling_images marks if the workspace is currently pulling its images. This condition can only be set during PhaseCreating
     WorkspaceConditionBool pulling_images = 3;
 
-    // service_exists denotes if the workspace theia-/ports- services exist. This condition will be true if either of the two services exist.
-    WorkspaceConditionBool service_exists = 4;
+    // DEPRECATED service_exists denotes if the workspace theia-/ports- services exist. This condition will be true if either of the two services exist.
+    reserved 4;
 
     // snapshot contains a snapshot URL if a snapshot was produced prior to shutting the workspace down. This condition is only used for headless workspaces.
     string snapshot = 5;
@@ -557,3 +557,9 @@ enum WorkspaceType {
     // Imagebuild workspaces build a workspace, incl. their Gitpod layer. They run headless and have no direct user-interaction.
     IMAGEBUILD = 4;
 }
+
+// ExposedPorts describes the exposed ports of a workspace
+message ExposedPorts {
+    // ports is the set of ports which ought to be exposed to the internet
+    repeated PortSpec ports = 1;
+}
diff --git a/components/ws-manager-api/go/core.pb.go b/components/ws-manager-api/go/core.pb.go
index 1b9b42f79227ba..34bba20141cc88 100644
--- a/components/ws-manager-api/go/core.pb.go
+++ b/components/ws-manager-api/go/core.pb.go
@@ -5,7 +5,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
 // 	protoc-gen-go v1.27.1
-// 	protoc        v3.19.0
+// 	protoc        v3.19.1
 // source: core.proto
 
 package api
@@ -1960,8 +1960,6 @@ type PortSpec struct {
 
 	// port is the outward-facing port
 	Port uint32 `protobuf:"varint,1,opt,name=port,proto3" json:"port,omitempty"`
-	// target is the inward-facing target port
-	Target uint32 `protobuf:"varint,2,opt,name=target,proto3" json:"target,omitempty"`
 	// visibility defines the visibility of the port
 	Visibility PortVisibility `protobuf:"varint,3,opt,name=visibility,proto3,enum=wsman.PortVisibility" json:"visibility,omitempty"`
 	// url is the public-facing URL this port is available at
@@ -2007,13 +2005,6 @@ func (x *PortSpec) GetPort() uint32 {
 	return 0
 }
 
-func (x *PortSpec) GetTarget() uint32 {
-	if x != nil {
-		return x.Target
-	}
-	return 0
-}
-
 func (x *PortSpec) GetVisibility() PortVisibility {
 	if x != nil {
 		return x.Visibility
@@ -2041,8 +2032,6 @@ type WorkspaceConditions struct {
 	Timeout string `protobuf:"bytes,2,opt,name=timeout,proto3" json:"timeout,omitempty"`
 	// pulling_images marks if the workspace is currently pulling its images. This condition can only be set during PhaseCreating
 	PullingImages WorkspaceConditionBool `protobuf:"varint,3,opt,name=pulling_images,json=pullingImages,proto3,enum=wsman.WorkspaceConditionBool" json:"pulling_images,omitempty"`
-	// service_exists denotes if the workspace theia-/ports- services exist. This condition will be true if either of the two services exist.
-	ServiceExists WorkspaceConditionBool `protobuf:"varint,4,opt,name=service_exists,json=serviceExists,proto3,enum=wsman.WorkspaceConditionBool" json:"service_exists,omitempty"`
 	// snapshot contains a snapshot URL if a snapshot was produced prior to shutting the workspace down. This condition is only used for headless workspaces.
 	Snapshot string `protobuf:"bytes,5,opt,name=snapshot,proto3" json:"snapshot,omitempty"`
 	// final_backup_complete determines if the last state of the workspace has been backed up to remote storage.
@@ -2113,13 +2102,6 @@ func (x *WorkspaceConditions) GetPullingImages() WorkspaceConditionBool {
 	return WorkspaceConditionBool_FALSE
 }
 
-func (x *WorkspaceConditions) GetServiceExists() WorkspaceConditionBool {
-	if x != nil {
-		return x.ServiceExists
-	}
-	return WorkspaceConditionBool_FALSE
-}
-
 func (x *WorkspaceConditions) GetSnapshot() string {
 	if x != nil {
 		return x.Snapshot
@@ -2637,6 +2619,55 @@ func (x *EnvironmentVariable) GetValue() string {
 	return ""
 }
 
+// ExposedPorts describes the exposed ports of a workspace
+type ExposedPorts struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// ports is the set of ports which ought to be exposed to the internet
+	Ports []*PortSpec `protobuf:"bytes,1,rep,name=ports,proto3" json:"ports,omitempty"`
+}
+
+func (x *ExposedPorts) Reset() {
+	*x = ExposedPorts{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_core_proto_msgTypes[34]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ExposedPorts) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ExposedPorts) ProtoMessage() {}
+
+func (x *ExposedPorts) ProtoReflect() protoreflect.Message {
+	mi := &file_core_proto_msgTypes[34]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ExposedPorts.ProtoReflect.Descriptor instead.
+func (*ExposedPorts) Descriptor() ([]byte, []int) {
+	return file_core_proto_rawDescGZIP(), []int{34}
+}
+
+func (x *ExposedPorts) GetPorts() []*PortSpec {
+	if x != nil {
+		return x.Ports
+	}
+	return nil
+}
+
 var File_core_proto protoreflect.FileDescriptor
 
 var file_core_proto_rawDesc = []byte{
@@ -2813,225 +2844,223 @@ var file_core_proto_rawDesc = []byte{
 	0x65, 0x6f, 0x75, 0x74, 0x12, 0x2c, 0x0a, 0x09, 0x69, 0x64, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67,
 	0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e,
 	0x49, 0x44, 0x45, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x08, 0x69, 0x64, 0x65, 0x49, 0x6d, 0x61,
-	0x67, 0x65, 0x22, 0x7f, 0x0a, 0x08, 0x50, 0x6f, 0x72, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x12,
+	0x67, 0x65, 0x22, 0x6d, 0x0a, 0x08, 0x50, 0x6f, 0x72, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x12,
 	0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f,
-	0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x0d, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x35, 0x0a, 0x0a, 0x76, 0x69,
-	0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15,
-	0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x56, 0x69, 0x73, 0x69, 0x62,
-	0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74,
-	0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
-	0x75, 0x72, 0x6c, 0x22, 0x93, 0x05, 0x0a, 0x13, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63,
-	0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x66,
-	0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x61, 0x69,
-	0x6c, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x44, 0x0a,
-	0x0e, 0x70, 0x75, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18,
-	0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x57, 0x6f,
-	0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,
-	0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0d, 0x70, 0x75, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x49, 0x6d, 0x61,
-	0x67, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x65,
-	0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x77, 0x73,
-	0x6d, 0x61, 0x6e, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e,
-	0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76,
-	0x69, 0x63, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x6e, 0x61,
-	0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x6e, 0x61,
-	0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x51, 0x0a, 0x15, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x62,
-	0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x06,
-	0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x57, 0x6f, 0x72,
-	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42,
-	0x6f, 0x6f, 0x6c, 0x52, 0x13, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70,
-	0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x39, 0x0a, 0x08, 0x64, 0x65, 0x70, 0x6c,
-	0x6f, 0x79, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x77, 0x73, 0x6d,
-	0x61, 0x6e, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64,
-	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x08, 0x64, 0x65, 0x70, 0x6c, 0x6f,
-	0x79, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x11, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6e,
-	0x6f, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d,
-	0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65,
-	0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x6e,
-	0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x6f, 0x74, 0x52, 0x65, 0x61, 0x64, 0x79, 0x12, 0x4a,
-	0x0a, 0x13, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74,
-	0x69, 0x76, 0x69, 0x74, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,
-	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69,
-	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x11, 0x66, 0x69, 0x72, 0x73, 0x74, 0x55, 0x73,
-	0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x68, 0x65,
-	0x61, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x66, 0x61, 0x69, 0x6c,
-	0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x68, 0x65, 0x61, 0x64, 0x6c, 0x65,
-	0x73, 0x73, 0x54, 0x61, 0x73, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x4b, 0x0a, 0x12,
-	0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e,
-	0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74,
-	0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x10, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64,
-	0x42, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x8a, 0x02, 0x0a, 0x11, 0x57, 0x6f,
-	0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12,
-	0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
-	0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x69, 0x64,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x61, 0x49, 0x64, 0x12, 0x39,
-	0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09,
-	0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x4b, 0x0a, 0x0b, 0x61, 0x6e, 0x6e,
-	0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29,
-	0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65,
-	0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74,
-	0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74,
-	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3e, 0x0a, 0x10, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61,
-	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65,
-	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05,
-	0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c,
-	0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x67, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70,
-	0x61, 0x63, 0x65, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b,
-	0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70,
-	0x6f, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70,
-	0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69,
-	0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x70, 0x22,
-	0x6f, 0x0a, 0x17, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68,
-	0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x09, 0x61, 0x64,
-	0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e,
-	0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x41, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c,
-	0x65, 0x76, 0x65, 0x6c, 0x52, 0x09, 0x61, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12,
-	0x1f, 0x0a, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e,
-	0x22, 0xd1, 0x04, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70,
-	0x61, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x27, 0x0a, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x73,
-	0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65,
-	0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x69,
-	0x64, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12,
-	0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x49, 0x64, 0x65, 0x49, 0x6d, 0x61,
-	0x67, 0x65, 0x12, 0x40, 0x0a, 0x0d, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x6c,
-	0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x77, 0x73, 0x6d, 0x61,
-	0x6e, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75,
-	0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x0c, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46,
-	0x6c, 0x61, 0x67, 0x73, 0x12, 0x46, 0x0a, 0x0b, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69,
-	0x7a, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74,
-	0x65, 0x6e, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73,
-	0x70, 0x61, 0x63, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x52,
-	0x0b, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x05,
-	0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x77, 0x73,
-	0x6d, 0x61, 0x6e, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x05, 0x70, 0x6f,
-	0x72, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x65, 0x6e, 0x76, 0x76, 0x61, 0x72, 0x73, 0x18, 0x06,
-	0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x45, 0x6e, 0x76,
-	0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,
-	0x52, 0x07, 0x65, 0x6e, 0x76, 0x76, 0x61, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x68, 0x65,
-	0x63, 0x6b, 0x6f, 0x75, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x4c, 0x6f,
-	0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70,
-	0x61, 0x63, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4c, 0x6f, 0x63,
-	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x03, 0x67, 0x69, 0x74, 0x18, 0x09, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x47, 0x69, 0x74, 0x53, 0x70,
-	0x65, 0x63, 0x52, 0x03, 0x67, 0x69, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f,
-	0x75, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,
-	0x74, 0x12, 0x33, 0x0a, 0x09, 0x61, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b,
-	0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x41, 0x64, 0x6d,
-	0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x09, 0x61, 0x64, 0x6d,
-	0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x09, 0x69, 0x64, 0x65, 0x5f, 0x69, 0x6d,
-	0x61, 0x67, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x77, 0x73, 0x6d, 0x61,
-	0x6e, 0x2e, 0x49, 0x44, 0x45, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x08, 0x69, 0x64, 0x65, 0x49,
-	0x6d, 0x61, 0x67, 0x65, 0x22, 0x3b, 0x0a, 0x07, 0x47, 0x69, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12,
-	0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65,
-	0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69,
-	0x6c, 0x22, 0x3f, 0x0a, 0x13, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
-	0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05,
-	0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c,
-	0x75, 0x65, 0x2a, 0x34, 0x0a, 0x13, 0x53, 0x74, 0x6f, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70,
-	0x61, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x4f, 0x52,
-	0x4d, 0x41, 0x4c, 0x4c, 0x59, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4d, 0x4d, 0x45, 0x44,
-	0x49, 0x41, 0x54, 0x45, 0x4c, 0x59, 0x10, 0x01, 0x2a, 0x3a, 0x0a, 0x0e, 0x41, 0x64, 0x6d, 0x69,
-	0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x44,
-	0x4d, 0x49, 0x54, 0x5f, 0x4f, 0x57, 0x4e, 0x45, 0x52, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x00,
-	0x12, 0x12, 0x0a, 0x0e, 0x41, 0x44, 0x4d, 0x49, 0x54, 0x5f, 0x45, 0x56, 0x45, 0x52, 0x59, 0x4f,
-	0x4e, 0x45, 0x10, 0x01, 0x2a, 0x49, 0x0a, 0x0e, 0x50, 0x6f, 0x72, 0x74, 0x56, 0x69, 0x73, 0x69,
-	0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x17, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x56,
-	0x49, 0x53, 0x49, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54,
-	0x45, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x56, 0x49, 0x53, 0x49,
-	0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x10, 0x01, 0x2a,
-	0x38, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64,
-	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x09, 0x0a, 0x05, 0x46, 0x41, 0x4c,
-	0x53, 0x45, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x52, 0x55, 0x45, 0x10, 0x01, 0x12, 0x09,
-	0x0a, 0x05, 0x45, 0x4d, 0x50, 0x54, 0x59, 0x10, 0x02, 0x2a, 0x83, 0x01, 0x0a, 0x0e, 0x57, 0x6f,
-	0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x68, 0x61, 0x73, 0x65, 0x12, 0x0b, 0x0a, 0x07,
-	0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e,
-	0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x45, 0x41, 0x54, 0x49,
-	0x4e, 0x47, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x49,
-	0x5a, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e,
-	0x47, 0x10, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x52, 0x55, 0x50, 0x54,
-	0x45, 0x44, 0x10, 0x07, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x49, 0x4e, 0x47,
-	0x10, 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x06, 0x2a,
-	0x68, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x46, 0x65, 0x61, 0x74,
-	0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10,
-	0x00, 0x12, 0x19, 0x0a, 0x15, 0x46, 0x55, 0x4c, 0x4c, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50,
-	0x41, 0x43, 0x45, 0x5f, 0x42, 0x41, 0x43, 0x4b, 0x55, 0x50, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f,
-	0x46, 0x49, 0x58, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x53, 0x10,
-	0x05, 0x22, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0x04, 0x08, 0x02, 0x10, 0x02, 0x22, 0x04, 0x08,
-	0x03, 0x10, 0x03, 0x22, 0x04, 0x08, 0x06, 0x10, 0x06, 0x2a, 0x50, 0x0a, 0x0d, 0x57, 0x6f, 0x72,
-	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45,
-	0x47, 0x55, 0x4c, 0x41, 0x52, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x52, 0x45, 0x42, 0x55,
-	0x49, 0x4c, 0x44, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x10, 0x02,
-	0x12, 0x09, 0x0a, 0x05, 0x47, 0x48, 0x4f, 0x53, 0x54, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x49,
-	0x4d, 0x41, 0x47, 0x45, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x10, 0x04, 0x32, 0xe5, 0x06, 0x0a, 0x10,
-	0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72,
-	0x12, 0x4c, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65,
-	0x73, 0x12, 0x1b, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72,
-	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c,
-	0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70,
-	0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f,
-	0x0a, 0x0e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65,
-	0x12, 0x1c, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f,
-	0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d,
-	0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b,
-	0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
-	0x4c, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65,
-	0x12, 0x1b, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x57, 0x6f, 0x72,
-	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e,
-	0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70,
-	0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a,
-	0x11, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61,
-	0x63, 0x65, 0x12, 0x1f, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72,
-	0x69, 0x62, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x44, 0x65, 0x73, 0x63,
-	0x72, 0x69, 0x62, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0f, 0x42, 0x61, 0x63, 0x6b, 0x75,
-	0x70, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x2e, 0x77, 0x73, 0x6d,
-	0x61, 0x6e, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61,
-	0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x77, 0x73, 0x6d, 0x61,
-	0x6e, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63,
-	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x09, 0x53,
-	0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x17, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e,
-	0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x1a, 0x18, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72,
-	0x69, 0x62, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12,
-	0x43, 0x0a, 0x0a, 0x4d, 0x61, 0x72, 0x6b, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x18, 0x2e,
-	0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e,
-	0x4d, 0x61, 0x72, 0x6b, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0a, 0x53, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f,
-	0x75, 0x74, 0x12, 0x18, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x53, 0x65, 0x74, 0x54, 0x69,
-	0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x77,
-	0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x53, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0b, 0x43, 0x6f, 0x6e,
-	0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e,
-	0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74,
-	0x72, 0x6f, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
-	0x00, 0x12, 0x49, 0x0a, 0x0c, 0x54, 0x61, 0x6b, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
-	0x74, 0x12, 0x1a, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x54, 0x61, 0x6b, 0x65, 0x53, 0x6e,
-	0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e,
-	0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x54, 0x61, 0x6b, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68,
-	0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x10,
-	0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x41, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e,
-	0x12, 0x1e, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c,
-	0x41, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x1f, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c,
-	0x41, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
-	0x6d, 0x2f, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2d, 0x69, 0x6f, 0x2f, 0x67, 0x69, 0x74, 0x70,
-	0x6f, 0x64, 0x2f, 0x77, 0x73, 0x2d, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2f, 0x61, 0x70,
-	0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x72, 0x74, 0x12, 0x35, 0x0a, 0x0a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x50,
+	0x6f, 0x72, 0x74, 0x56, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0a, 0x76,
+	0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x4a, 0x04, 0x08, 0x02, 0x10,
+	0x03, 0x22, 0xd3, 0x04, 0x0a, 0x13, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43,
+	0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x69,
+	0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65,
+	0x64, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x44, 0x0a, 0x0e, 0x70,
+	0x75, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x57, 0x6f, 0x72, 0x6b,
+	0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6f,
+	0x6f, 0x6c, 0x52, 0x0d, 0x70, 0x75, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x49, 0x6d, 0x61, 0x67, 0x65,
+	0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x05, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x51, 0x0a,
+	0x15, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x63, 0x6f,
+	0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x77,
+	0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f,
+	0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x13, 0x66, 0x69, 0x6e,
+	0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65,
+	0x12, 0x39, 0x0a, 0x08, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01,
+	0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73,
+	0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x6f,
+	0x6c, 0x52, 0x08, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x11, 0x6e,
+	0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79,
+	0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x57,
+	0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f,
+	0x6e, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x6f,
+	0x74, 0x52, 0x65, 0x61, 0x64, 0x79, 0x12, 0x4a, 0x0a, 0x13, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f,
+	0x75, 0x73, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x18, 0x09, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52,
+	0x11, 0x66, 0x69, 0x72, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69,
+	0x74, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x68, 0x65, 0x61, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x5f, 0x74,
+	0x61, 0x73, 0x6b, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x12, 0x68, 0x65, 0x61, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x54, 0x61, 0x73, 0x6b, 0x46, 0x61,
+	0x69, 0x6c, 0x65, 0x64, 0x12, 0x4b, 0x0a, 0x12, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f,
+	0x62, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e,
+	0x32, 0x1d, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61,
+	0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x6f, 0x6c, 0x52,
+	0x10, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x42, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x22, 0x8a, 0x02, 0x0a, 0x11, 0x57, 0x6f, 0x72, 0x6b,
+	0x73, 0x70, 0x61, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a,
+	0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77,
+	0x6e, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x69, 0x64, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x61, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a,
+	0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+	0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74,
+	0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x4b, 0x0a, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x77,
+	0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4d, 0x65,
+	0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3e, 0x0a, 0x10, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61,
+	0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
+	0x3a, 0x02, 0x38, 0x01, 0x22, 0x67, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63,
+	0x65, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, 0x0a, 0x09,
+	0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6f, 0x64,
+	0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64,
+	0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x70, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x70, 0x22, 0x6f, 0x0a,
+	0x17, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e,
+	0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x09, 0x61, 0x64, 0x6d, 0x69,
+	0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x77, 0x73,
+	0x6d, 0x61, 0x6e, 0x2e, 0x41, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76,
+	0x65, 0x6c, 0x52, 0x09, 0x61, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a,
+	0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xd1,
+	0x04, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63,
+	0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x27, 0x0a, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61,
+	0x63, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e,
+	0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x30,
+	0x0a, 0x14, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x65,
+	0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x64, 0x65,
+	0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x49, 0x64, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65,
+	0x12, 0x40, 0x0a, 0x0d, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x6c, 0x61, 0x67,
+	0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e,
+	0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
+	0x46, 0x6c, 0x61, 0x67, 0x52, 0x0c, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61,
+	0x67, 0x73, 0x12, 0x46, 0x0a, 0x0b, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65,
+	0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+	0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61,
+	0x63, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x52, 0x0b, 0x69,
+	0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x05, 0x70, 0x6f,
+	0x72, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x77, 0x73, 0x6d, 0x61,
+	0x6e, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74,
+	0x73, 0x12, 0x34, 0x0a, 0x07, 0x65, 0x6e, 0x76, 0x76, 0x61, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72,
+	0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x07,
+	0x65, 0x6e, 0x76, 0x76, 0x61, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x68, 0x65, 0x63, 0x6b,
+	0x6f, 0x75, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x4c, 0x6f, 0x63, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63,
+	0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x03, 0x67, 0x69, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x0e, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x47, 0x69, 0x74, 0x53, 0x70, 0x65, 0x63,
+	0x52, 0x03, 0x67, 0x69, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74,
+	0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12,
+	0x33, 0x0a, 0x09, 0x61, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01,
+	0x28, 0x0e, 0x32, 0x15, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x41, 0x64, 0x6d, 0x69, 0x73,
+	0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x09, 0x61, 0x64, 0x6d, 0x69, 0x73,
+	0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x09, 0x69, 0x64, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67,
+	0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e,
+	0x49, 0x44, 0x45, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x08, 0x69, 0x64, 0x65, 0x49, 0x6d, 0x61,
+	0x67, 0x65, 0x22, 0x3b, 0x0a, 0x07, 0x47, 0x69, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1a, 0x0a,
+	0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61,
+	0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22,
+	0x3f, 0x0a, 0x13, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61,
+	0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61,
+	0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
+	0x22, 0x35, 0x0a, 0x0c, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x73,
+	0x12, 0x25, 0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x0f, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x53, 0x70, 0x65, 0x63,
+	0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2a, 0x34, 0x0a, 0x13, 0x53, 0x74, 0x6f, 0x70, 0x57,
+	0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x0c,
+	0x0a, 0x08, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x4c, 0x59, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b,
+	0x49, 0x4d, 0x4d, 0x45, 0x44, 0x49, 0x41, 0x54, 0x45, 0x4c, 0x59, 0x10, 0x01, 0x2a, 0x3a, 0x0a,
+	0x0e, 0x41, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12,
+	0x14, 0x0a, 0x10, 0x41, 0x44, 0x4d, 0x49, 0x54, 0x5f, 0x4f, 0x57, 0x4e, 0x45, 0x52, 0x5f, 0x4f,
+	0x4e, 0x4c, 0x59, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x41, 0x44, 0x4d, 0x49, 0x54, 0x5f, 0x45,
+	0x56, 0x45, 0x52, 0x59, 0x4f, 0x4e, 0x45, 0x10, 0x01, 0x2a, 0x49, 0x0a, 0x0e, 0x50, 0x6f, 0x72,
+	0x74, 0x56, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x17, 0x50,
+	0x4f, 0x52, 0x54, 0x5f, 0x56, 0x49, 0x53, 0x49, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x50,
+	0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x4f, 0x52, 0x54,
+	0x5f, 0x56, 0x49, 0x53, 0x49, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x55, 0x42, 0x4c,
+	0x49, 0x43, 0x10, 0x01, 0x2a, 0x38, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63,
+	0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x09,
+	0x0a, 0x05, 0x46, 0x41, 0x4c, 0x53, 0x45, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x52, 0x55,
+	0x45, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x4d, 0x50, 0x54, 0x59, 0x10, 0x02, 0x2a, 0x83,
+	0x01, 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x68, 0x61, 0x73,
+	0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b,
+	0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x43,
+	0x52, 0x45, 0x41, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x49,
+	0x54, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x52,
+	0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x54, 0x45,
+	0x52, 0x52, 0x55, 0x50, 0x54, 0x45, 0x44, 0x10, 0x07, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x4f,
+	0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50,
+	0x45, 0x44, 0x10, 0x06, 0x2a, 0x68, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63,
+	0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x08, 0x0a, 0x04,
+	0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x46, 0x55, 0x4c, 0x4c, 0x5f, 0x57,
+	0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x42, 0x41, 0x43, 0x4b, 0x55, 0x50, 0x10,
+	0x04, 0x12, 0x13, 0x0a, 0x0f, 0x46, 0x49, 0x58, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55,
+	0x52, 0x43, 0x45, 0x53, 0x10, 0x05, 0x22, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0x04, 0x08, 0x02,
+	0x10, 0x02, 0x22, 0x04, 0x08, 0x03, 0x10, 0x03, 0x22, 0x04, 0x08, 0x06, 0x10, 0x06, 0x2a, 0x50,
+	0x0a, 0x0d, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12,
+	0x0b, 0x0a, 0x07, 0x52, 0x45, 0x47, 0x55, 0x4c, 0x41, 0x52, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08,
+	0x50, 0x52, 0x45, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x52,
+	0x4f, 0x42, 0x45, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x48, 0x4f, 0x53, 0x54, 0x10, 0x03,
+	0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x10, 0x04,
+	0x32, 0xe5, 0x06, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4d, 0x61,
+	0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x4c, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b,
+	0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x47,
+	0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x57,
+	0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b,
+	0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x53, 0x74,
+	0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x72,
+	0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, 0x57, 0x6f, 0x72, 0x6b,
+	0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x53, 0x74,
+	0x6f, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x57,
+	0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x00, 0x12, 0x58, 0x0a, 0x11, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x57, 0x6f,
+	0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e,
+	0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63,
+	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e,
+	0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61,
+	0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0f,
+	0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12,
+	0x1d, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x57, 0x6f,
+	0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e,
+	0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x57, 0x6f, 0x72,
+	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,
+	0x12, 0x42, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x17, 0x2e,
+	0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x53,
+	0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x00, 0x30, 0x01, 0x12, 0x43, 0x0a, 0x0a, 0x4d, 0x61, 0x72, 0x6b, 0x41, 0x63, 0x74, 0x69,
+	0x76, 0x65, 0x12, 0x18, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x41,
+	0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x77,
+	0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0a, 0x53, 0x65, 0x74,
+	0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x18, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e,
+	0x53, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x19, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x53, 0x65, 0x74, 0x54, 0x69, 0x6d,
+	0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x46,
+	0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x2e,
+	0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6f, 0x72,
+	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e,
+	0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0c, 0x54, 0x61, 0x6b, 0x65, 0x53, 0x6e,
+	0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x1a, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x54,
+	0x61, 0x6b, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x54, 0x61, 0x6b, 0x65, 0x53,
+	0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x00, 0x12, 0x55, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x41, 0x64, 0x6d, 0x69,
+	0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x43, 0x6f,
+	0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x41, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x43, 0x6f,
+	0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x41, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x68,
+	0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2d, 0x69, 0x6f,
+	0x2f, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2f, 0x77, 0x73, 0x2d, 0x6d, 0x61, 0x6e, 0x61, 0x67,
+	0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -3047,7 +3076,7 @@ func file_core_proto_rawDescGZIP() []byte {
 }
 
 var file_core_proto_enumTypes = make([]protoimpl.EnumInfo, 7)
-var file_core_proto_msgTypes = make([]protoimpl.MessageInfo, 37)
+var file_core_proto_msgTypes = make([]protoimpl.MessageInfo, 38)
 var file_core_proto_goTypes = []interface{}{
 	(StopWorkspacePolicy)(0),          // 0: wsman.StopWorkspacePolicy
 	(AdmissionLevel)(0),               // 1: wsman.AdmissionLevel
@@ -3090,15 +3119,16 @@ var file_core_proto_goTypes = []interface{}{
 	(*StartWorkspaceSpec)(nil),        // 38: wsman.StartWorkspaceSpec
 	(*GitSpec)(nil),                   // 39: wsman.GitSpec
 	(*EnvironmentVariable)(nil),       // 40: wsman.EnvironmentVariable
-	nil,                               // 41: wsman.MetadataFilter.AnnotationsEntry
-	nil,                               // 42: wsman.SubscribeResponse.HeaderEntry
-	nil,                               // 43: wsman.WorkspaceMetadata.AnnotationsEntry
-	(*api.GitStatus)(nil),             // 44: contentservice.GitStatus
-	(*timestamppb.Timestamp)(nil),     // 45: google.protobuf.Timestamp
-	(*api.WorkspaceInitializer)(nil),  // 46: contentservice.WorkspaceInitializer
+	(*ExposedPorts)(nil),              // 41: wsman.ExposedPorts
+	nil,                               // 42: wsman.MetadataFilter.AnnotationsEntry
+	nil,                               // 43: wsman.SubscribeResponse.HeaderEntry
+	nil,                               // 44: wsman.WorkspaceMetadata.AnnotationsEntry
+	(*api.GitStatus)(nil),             // 45: contentservice.GitStatus
+	(*timestamppb.Timestamp)(nil),     // 46: google.protobuf.Timestamp
+	(*api.WorkspaceInitializer)(nil),  // 47: contentservice.WorkspaceInitializer
 }
 var file_core_proto_depIdxs = []int32{
-	41, // 0: wsman.MetadataFilter.annotations:type_name -> wsman.MetadataFilter.AnnotationsEntry
+	42, // 0: wsman.MetadataFilter.annotations:type_name -> wsman.MetadataFilter.AnnotationsEntry
 	7,  // 1: wsman.GetWorkspacesRequest.must_match:type_name -> wsman.MetadataFilter
 	30, // 2: wsman.GetWorkspacesResponse.status:type_name -> wsman.WorkspaceStatus
 	35, // 3: wsman.StartWorkspaceRequest.metadata:type_name -> wsman.WorkspaceMetadata
@@ -3108,14 +3138,14 @@ var file_core_proto_depIdxs = []int32{
 	30, // 7: wsman.DescribeWorkspaceResponse.status:type_name -> wsman.WorkspaceStatus
 	7,  // 8: wsman.SubscribeRequest.must_match:type_name -> wsman.MetadataFilter
 	30, // 9: wsman.SubscribeResponse.status:type_name -> wsman.WorkspaceStatus
-	42, // 10: wsman.SubscribeResponse.header:type_name -> wsman.SubscribeResponse.HeaderEntry
+	43, // 10: wsman.SubscribeResponse.header:type_name -> wsman.SubscribeResponse.HeaderEntry
 	33, // 11: wsman.ControlPortRequest.spec:type_name -> wsman.PortSpec
 	1,  // 12: wsman.ControlAdmissionRequest.level:type_name -> wsman.AdmissionLevel
 	35, // 13: wsman.WorkspaceStatus.metadata:type_name -> wsman.WorkspaceMetadata
 	32, // 14: wsman.WorkspaceStatus.spec:type_name -> wsman.WorkspaceSpec
 	4,  // 15: wsman.WorkspaceStatus.phase:type_name -> wsman.WorkspacePhase
 	34, // 16: wsman.WorkspaceStatus.conditions:type_name -> wsman.WorkspaceConditions
-	44, // 17: wsman.WorkspaceStatus.repo:type_name -> contentservice.GitStatus
+	45, // 17: wsman.WorkspaceStatus.repo:type_name -> contentservice.GitStatus
 	36, // 18: wsman.WorkspaceStatus.runtime:type_name -> wsman.WorkspaceRuntimeInfo
 	37, // 19: wsman.WorkspaceStatus.auth:type_name -> wsman.WorkspaceAuthentication
 	33, // 20: wsman.WorkspaceSpec.exposed_ports:type_name -> wsman.PortSpec
@@ -3123,22 +3153,22 @@ var file_core_proto_depIdxs = []int32{
 	31, // 22: wsman.WorkspaceSpec.ide_image:type_name -> wsman.IDEImage
 	2,  // 23: wsman.PortSpec.visibility:type_name -> wsman.PortVisibility
 	3,  // 24: wsman.WorkspaceConditions.pulling_images:type_name -> wsman.WorkspaceConditionBool
-	3,  // 25: wsman.WorkspaceConditions.service_exists:type_name -> wsman.WorkspaceConditionBool
-	3,  // 26: wsman.WorkspaceConditions.final_backup_complete:type_name -> wsman.WorkspaceConditionBool
-	3,  // 27: wsman.WorkspaceConditions.deployed:type_name -> wsman.WorkspaceConditionBool
-	3,  // 28: wsman.WorkspaceConditions.network_not_ready:type_name -> wsman.WorkspaceConditionBool
-	45, // 29: wsman.WorkspaceConditions.first_user_activity:type_name -> google.protobuf.Timestamp
-	3,  // 30: wsman.WorkspaceConditions.stopped_by_request:type_name -> wsman.WorkspaceConditionBool
-	45, // 31: wsman.WorkspaceMetadata.started_at:type_name -> google.protobuf.Timestamp
-	43, // 32: wsman.WorkspaceMetadata.annotations:type_name -> wsman.WorkspaceMetadata.AnnotationsEntry
-	1,  // 33: wsman.WorkspaceAuthentication.admission:type_name -> wsman.AdmissionLevel
-	5,  // 34: wsman.StartWorkspaceSpec.feature_flags:type_name -> wsman.WorkspaceFeatureFlag
-	46, // 35: wsman.StartWorkspaceSpec.initializer:type_name -> contentservice.WorkspaceInitializer
-	33, // 36: wsman.StartWorkspaceSpec.ports:type_name -> wsman.PortSpec
-	40, // 37: wsman.StartWorkspaceSpec.envvars:type_name -> wsman.EnvironmentVariable
-	39, // 38: wsman.StartWorkspaceSpec.git:type_name -> wsman.GitSpec
-	1,  // 39: wsman.StartWorkspaceSpec.admission:type_name -> wsman.AdmissionLevel
-	31, // 40: wsman.StartWorkspaceSpec.ide_image:type_name -> wsman.IDEImage
+	3,  // 25: wsman.WorkspaceConditions.final_backup_complete:type_name -> wsman.WorkspaceConditionBool
+	3,  // 26: wsman.WorkspaceConditions.deployed:type_name -> wsman.WorkspaceConditionBool
+	3,  // 27: wsman.WorkspaceConditions.network_not_ready:type_name -> wsman.WorkspaceConditionBool
+	46, // 28: wsman.WorkspaceConditions.first_user_activity:type_name -> google.protobuf.Timestamp
+	3,  // 29: wsman.WorkspaceConditions.stopped_by_request:type_name -> wsman.WorkspaceConditionBool
+	46, // 30: wsman.WorkspaceMetadata.started_at:type_name -> google.protobuf.Timestamp
+	44, // 31: wsman.WorkspaceMetadata.annotations:type_name -> wsman.WorkspaceMetadata.AnnotationsEntry
+	1,  // 32: wsman.WorkspaceAuthentication.admission:type_name -> wsman.AdmissionLevel
+	5,  // 33: wsman.StartWorkspaceSpec.feature_flags:type_name -> wsman.WorkspaceFeatureFlag
+	47, // 34: wsman.StartWorkspaceSpec.initializer:type_name -> contentservice.WorkspaceInitializer
+	33, // 35: wsman.StartWorkspaceSpec.ports:type_name -> wsman.PortSpec
+	40, // 36: wsman.StartWorkspaceSpec.envvars:type_name -> wsman.EnvironmentVariable
+	39, // 37: wsman.StartWorkspaceSpec.git:type_name -> wsman.GitSpec
+	1,  // 38: wsman.StartWorkspaceSpec.admission:type_name -> wsman.AdmissionLevel
+	31, // 39: wsman.StartWorkspaceSpec.ide_image:type_name -> wsman.IDEImage
+	33, // 40: wsman.ExposedPorts.ports:type_name -> wsman.PortSpec
 	8,  // 41: wsman.WorkspaceManager.GetWorkspaces:input_type -> wsman.GetWorkspacesRequest
 	10, // 42: wsman.WorkspaceManager.StartWorkspace:input_type -> wsman.StartWorkspaceRequest
 	12, // 43: wsman.WorkspaceManager.StopWorkspace:input_type -> wsman.StopWorkspaceRequest
@@ -3582,6 +3612,18 @@ func file_core_proto_init() {
 				return nil
 			}
 		}
+		file_core_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ExposedPorts); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
@@ -3589,7 +3631,7 @@ func file_core_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_core_proto_rawDesc,
 			NumEnums:      7,
-			NumMessages:   37,
+			NumMessages:   38,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/components/ws-manager-api/go/exposed_ports.go b/components/ws-manager-api/go/exposed_ports.go
new file mode 100644
index 00000000000000..7ae91c09d12c91
--- /dev/null
+++ b/components/ws-manager-api/go/exposed_ports.go
@@ -0,0 +1,46 @@
+// Copyright (c) 2020 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 api
+
+import (
+	"encoding/base64"
+
+	"golang.org/x/xerrors"
+	"google.golang.org/protobuf/proto"
+)
+
+// ToBase64 marshals the image spec using protobuf and encodes it in base64
+func (spec *ExposedPorts) ToBase64() (res string, err error) {
+	if spec == nil {
+		return
+	}
+
+	rspec, err := proto.Marshal(spec)
+	if err != nil {
+		return "", xerrors.Errorf("cannot marshal image spec: %w", err)
+	}
+
+	return base64.StdEncoding.EncodeToString(rspec), nil
+}
+
+// ExposedPortsFromBase64 decodes an image specification from a base64 encoded protobuf message
+func ExposedPortsFromBase64(input string) (res *ExposedPorts, err error) {
+	if len(input) == 0 {
+		return
+	}
+
+	specPB, err := base64.StdEncoding.DecodeString(input)
+	if err != nil {
+		return nil, xerrors.Errorf("cannot decode image spec: %w", err)
+	}
+
+	var spec ExposedPorts
+	err = proto.Unmarshal(specPB, &spec)
+	if err != nil {
+		return nil, xerrors.Errorf("cannot unmarshal image spec: %w", err)
+	}
+
+	return &spec, nil
+}
diff --git a/components/ws-manager-api/typescript/src/core_pb.d.ts b/components/ws-manager-api/typescript/src/core_pb.d.ts
index 0337e842b3e4a7..f6a3c0f111d258 100644
--- a/components/ws-manager-api/typescript/src/core_pb.d.ts
+++ b/components/ws-manager-api/typescript/src/core_pb.d.ts
@@ -671,8 +671,6 @@ export namespace WorkspaceSpec {
 export class PortSpec extends jspb.Message {
     getPort(): number;
     setPort(value: number): PortSpec;
-    getTarget(): number;
-    setTarget(value: number): PortSpec;
     getVisibility(): PortVisibility;
     setVisibility(value: PortVisibility): PortSpec;
     getUrl(): string;
@@ -691,7 +689,6 @@ export class PortSpec extends jspb.Message {
 export namespace PortSpec {
     export type AsObject = {
         port: number,
-        target: number,
         visibility: PortVisibility,
         url: string,
     }
@@ -704,8 +701,6 @@ export class WorkspaceConditions extends jspb.Message {
     setTimeout(value: string): WorkspaceConditions;
     getPullingImages(): WorkspaceConditionBool;
     setPullingImages(value: WorkspaceConditionBool): WorkspaceConditions;
-    getServiceExists(): WorkspaceConditionBool;
-    setServiceExists(value: WorkspaceConditionBool): WorkspaceConditions;
     getSnapshot(): string;
     setSnapshot(value: string): WorkspaceConditions;
     getFinalBackupComplete(): WorkspaceConditionBool;
@@ -739,7 +734,6 @@ export namespace WorkspaceConditions {
         failed: string,
         timeout: string,
         pullingImages: WorkspaceConditionBool,
-        serviceExists: WorkspaceConditionBool,
         snapshot: string,
         finalBackupComplete: WorkspaceConditionBool,
         deployed: WorkspaceConditionBool,
@@ -947,6 +941,28 @@ export namespace EnvironmentVariable {
     }
 }
 
+export class ExposedPorts extends jspb.Message {
+    clearPortsList(): void;
+    getPortsList(): Array;
+    setPortsList(value: Array): ExposedPorts;
+    addPorts(value?: PortSpec, index?: number): PortSpec;
+
+    serializeBinary(): Uint8Array;
+    toObject(includeInstance?: boolean): ExposedPorts.AsObject;
+    static toObject(includeInstance: boolean, msg: ExposedPorts): ExposedPorts.AsObject;
+    static extensions: {[key: number]: jspb.ExtensionFieldInfo};
+    static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo};
+    static serializeBinaryToWriter(message: ExposedPorts, writer: jspb.BinaryWriter): void;
+    static deserializeBinary(bytes: Uint8Array): ExposedPorts;
+    static deserializeBinaryFromReader(message: ExposedPorts, reader: jspb.BinaryReader): ExposedPorts;
+}
+
+export namespace ExposedPorts {
+    export type AsObject = {
+        portsList: Array,
+    }
+}
+
 export enum StopWorkspacePolicy {
     NORMALLY = 0,
     IMMEDIATELY = 1,
diff --git a/components/ws-manager-api/typescript/src/core_pb.js b/components/ws-manager-api/typescript/src/core_pb.js
index 6d382e34f7a4b3..267bcc39dc8449 100644
--- a/components/ws-manager-api/typescript/src/core_pb.js
+++ b/components/ws-manager-api/typescript/src/core_pb.js
@@ -19,7 +19,13 @@
 
 var jspb = require('google-protobuf');
 var goog = jspb;
-var global = (function() { return this || window || global || self || Function('return this')(); }).call(null);
+var global = (function() {
+  if (this) { return this; }
+  if (typeof window !== 'undefined') { return window; }
+  if (typeof global !== 'undefined') { return global; }
+  if (typeof self !== 'undefined') { return self; }
+  return Function('return this')();
+}.call(null));
 
 var content$service$api_initializer_pb = require('@gitpod/content-service/lib');
 goog.object.extend(proto, content$service$api_initializer_pb);
@@ -35,6 +41,7 @@ goog.exportSymbol('proto.wsman.ControlPortResponse', null, global);
 goog.exportSymbol('proto.wsman.DescribeWorkspaceRequest', null, global);
 goog.exportSymbol('proto.wsman.DescribeWorkspaceResponse', null, global);
 goog.exportSymbol('proto.wsman.EnvironmentVariable', null, global);
+goog.exportSymbol('proto.wsman.ExposedPorts', null, global);
 goog.exportSymbol('proto.wsman.GetWorkspacesRequest', null, global);
 goog.exportSymbol('proto.wsman.GetWorkspacesResponse', null, global);
 goog.exportSymbol('proto.wsman.GitSpec', null, global);
@@ -780,6 +787,27 @@ if (goog.DEBUG && !COMPILED) {
    */
   proto.wsman.EnvironmentVariable.displayName = 'proto.wsman.EnvironmentVariable';
 }
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.wsman.ExposedPorts = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, proto.wsman.ExposedPorts.repeatedFields_, null);
+};
+goog.inherits(proto.wsman.ExposedPorts, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.wsman.ExposedPorts.displayName = 'proto.wsman.ExposedPorts';
+}
 
 
 
@@ -5398,7 +5426,6 @@ proto.wsman.PortSpec.prototype.toObject = function(opt_includeInstance) {
 proto.wsman.PortSpec.toObject = function(includeInstance, msg) {
   var f, obj = {
     port: jspb.Message.getFieldWithDefault(msg, 1, 0),
-    target: jspb.Message.getFieldWithDefault(msg, 2, 0),
     visibility: jspb.Message.getFieldWithDefault(msg, 3, 0),
     url: jspb.Message.getFieldWithDefault(msg, 4, "")
   };
@@ -5441,10 +5468,6 @@ proto.wsman.PortSpec.deserializeBinaryFromReader = function(msg, reader) {
       var value = /** @type {number} */ (reader.readUint32());
       msg.setPort(value);
       break;
-    case 2:
-      var value = /** @type {number} */ (reader.readUint32());
-      msg.setTarget(value);
-      break;
     case 3:
       var value = /** @type {!proto.wsman.PortVisibility} */ (reader.readEnum());
       msg.setVisibility(value);
@@ -5489,13 +5512,6 @@ proto.wsman.PortSpec.serializeBinaryToWriter = function(message, writer) {
       f
     );
   }
-  f = message.getTarget();
-  if (f !== 0) {
-    writer.writeUint32(
-      2,
-      f
-    );
-  }
   f = message.getVisibility();
   if (f !== 0.0) {
     writer.writeEnum(
@@ -5531,24 +5547,6 @@ proto.wsman.PortSpec.prototype.setPort = function(value) {
 };
 
 
-/**
- * optional uint32 target = 2;
- * @return {number}
- */
-proto.wsman.PortSpec.prototype.getTarget = function() {
-  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0));
-};
-
-
-/**
- * @param {number} value
- * @return {!proto.wsman.PortSpec} returns this
- */
-proto.wsman.PortSpec.prototype.setTarget = function(value) {
-  return jspb.Message.setProto3IntField(this, 2, value);
-};
-
-
 /**
  * optional PortVisibility visibility = 3;
  * @return {!proto.wsman.PortVisibility}
@@ -5620,7 +5618,6 @@ proto.wsman.WorkspaceConditions.toObject = function(includeInstance, msg) {
     failed: jspb.Message.getFieldWithDefault(msg, 1, ""),
     timeout: jspb.Message.getFieldWithDefault(msg, 2, ""),
     pullingImages: jspb.Message.getFieldWithDefault(msg, 3, 0),
-    serviceExists: jspb.Message.getFieldWithDefault(msg, 4, 0),
     snapshot: jspb.Message.getFieldWithDefault(msg, 5, ""),
     finalBackupComplete: jspb.Message.getFieldWithDefault(msg, 6, 0),
     deployed: jspb.Message.getFieldWithDefault(msg, 7, 0),
@@ -5676,10 +5673,6 @@ proto.wsman.WorkspaceConditions.deserializeBinaryFromReader = function(msg, read
       var value = /** @type {!proto.wsman.WorkspaceConditionBool} */ (reader.readEnum());
       msg.setPullingImages(value);
       break;
-    case 4:
-      var value = /** @type {!proto.wsman.WorkspaceConditionBool} */ (reader.readEnum());
-      msg.setServiceExists(value);
-      break;
     case 5:
       var value = /** @type {string} */ (reader.readString());
       msg.setSnapshot(value);
@@ -5759,13 +5752,6 @@ proto.wsman.WorkspaceConditions.serializeBinaryToWriter = function(message, writ
       f
     );
   }
-  f = message.getServiceExists();
-  if (f !== 0.0) {
-    writer.writeEnum(
-      4,
-      f
-    );
-  }
   f = message.getSnapshot();
   if (f.length > 0) {
     writer.writeString(
@@ -5873,24 +5859,6 @@ proto.wsman.WorkspaceConditions.prototype.setPullingImages = function(value) {
 };
 
 
-/**
- * optional WorkspaceConditionBool service_exists = 4;
- * @return {!proto.wsman.WorkspaceConditionBool}
- */
-proto.wsman.WorkspaceConditions.prototype.getServiceExists = function() {
-  return /** @type {!proto.wsman.WorkspaceConditionBool} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
-};
-
-
-/**
- * @param {!proto.wsman.WorkspaceConditionBool} value
- * @return {!proto.wsman.WorkspaceConditions} returns this
- */
-proto.wsman.WorkspaceConditions.prototype.setServiceExists = function(value) {
-  return jspb.Message.setProto3EnumField(this, 4, value);
-};
-
-
 /**
  * optional string snapshot = 5;
  * @return {string}
@@ -7547,6 +7515,166 @@ proto.wsman.EnvironmentVariable.prototype.setValue = function(value) {
 };
 
 
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array}
+ * @const
+ */
+proto.wsman.ExposedPorts.repeatedFields_ = [1];
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.wsman.ExposedPorts.prototype.toObject = function(opt_includeInstance) {
+  return proto.wsman.ExposedPorts.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.wsman.ExposedPorts} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.wsman.ExposedPorts.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    portsList: jspb.Message.toObjectList(msg.getPortsList(),
+    proto.wsman.PortSpec.toObject, includeInstance)
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.wsman.ExposedPorts}
+ */
+proto.wsman.ExposedPorts.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.wsman.ExposedPorts;
+  return proto.wsman.ExposedPorts.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.wsman.ExposedPorts} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.wsman.ExposedPorts}
+ */
+proto.wsman.ExposedPorts.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = new proto.wsman.PortSpec;
+      reader.readMessage(value,proto.wsman.PortSpec.deserializeBinaryFromReader);
+      msg.addPorts(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.wsman.ExposedPorts.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.wsman.ExposedPorts.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.wsman.ExposedPorts} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.wsman.ExposedPorts.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+  f = message.getPortsList();
+  if (f.length > 0) {
+    writer.writeRepeatedMessage(
+      1,
+      f,
+      proto.wsman.PortSpec.serializeBinaryToWriter
+    );
+  }
+};
+
+
+/**
+ * repeated PortSpec ports = 1;
+ * @return {!Array}
+ */
+proto.wsman.ExposedPorts.prototype.getPortsList = function() {
+  return /** @type{!Array} */ (
+    jspb.Message.getRepeatedWrapperField(this, proto.wsman.PortSpec, 1));
+};
+
+
+/**
+ * @param {!Array} value
+ * @return {!proto.wsman.ExposedPorts} returns this
+*/
+proto.wsman.ExposedPorts.prototype.setPortsList = function(value) {
+  return jspb.Message.setRepeatedWrapperField(this, 1, value);
+};
+
+
+/**
+ * @param {!proto.wsman.PortSpec=} opt_value
+ * @param {number=} opt_index
+ * @return {!proto.wsman.PortSpec}
+ */
+proto.wsman.ExposedPorts.prototype.addPorts = function(opt_value, opt_index) {
+  return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.wsman.PortSpec, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.wsman.ExposedPorts} returns this
+ */
+proto.wsman.ExposedPorts.prototype.clearPortsList = function() {
+  return this.setPortsList([]);
+};
+
+
 /**
  * @enum {number}
  */
diff --git a/components/ws-manager-bridge-api/go/cluster-service.pb.go b/components/ws-manager-bridge-api/go/cluster-service.pb.go
index 9b492a0168bbb2..10d6e13efca749 100644
--- a/components/ws-manager-bridge-api/go/cluster-service.pb.go
+++ b/components/ws-manager-bridge-api/go/cluster-service.pb.go
@@ -5,7 +5,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
 // 	protoc-gen-go v1.27.1
-// 	protoc        v3.19.0
+// 	protoc        v3.19.1
 // source: cluster-service.proto
 
 package api
diff --git a/components/ws-manager-bridge-api/typescript/src/cluster-service_pb.js b/components/ws-manager-bridge-api/typescript/src/cluster-service_pb.js
index fe0974b11d2228..5da8110080c53e 100644
--- a/components/ws-manager-bridge-api/typescript/src/cluster-service_pb.js
+++ b/components/ws-manager-bridge-api/typescript/src/cluster-service_pb.js
@@ -19,7 +19,13 @@
 
 var jspb = require('google-protobuf');
 var goog = jspb;
-var global = (function() { return this || window || global || self || Function('return this')(); }).call(null);
+var global = (function() {
+  if (this) { return this; }
+  if (typeof window !== 'undefined') { return window; }
+  if (typeof global !== 'undefined') { return global; }
+  if (typeof self !== 'undefined') { return self; }
+  return Function('return this')();
+}.call(null));
 
 goog.exportSymbol('proto.workspacemanagerbridge.AdmissionConstraint', null, global);
 goog.exportSymbol('proto.workspacemanagerbridge.AdmissionConstraint.ConstraintCase', null, global);
diff --git a/components/ws-manager-bridge/src/bridge.ts b/components/ws-manager-bridge/src/bridge.ts
index a874e34b0a4689..b70f13019592d8 100644
--- a/components/ws-manager-bridge/src/bridge.ts
+++ b/components/ws-manager-bridge/src/bridge.ts
@@ -144,7 +144,6 @@ export class WorkspaceManagerBridge implements Disposable {
                 instance.status.exposedPorts = status.spec.exposedPortsList.map(p => {
                     return {
                         port: p.port,
-                        targetPort: !!p.target ? p.target : undefined,
                         visibility: mapPortVisibility(p.visibility),
                         url: p.url,
                     };
@@ -161,7 +160,6 @@ export class WorkspaceManagerBridge implements Disposable {
             instance.status.timeout = status.spec.timeout;
             instance.status.conditions.failed = status.conditions.failed;
             instance.status.conditions.pullingImages = toBool(status.conditions.pullingImages!);
-            instance.status.conditions.serviceExists = toBool(status.conditions.serviceExists!);
             instance.status.conditions.deployed = toBool(status.conditions.deployed);
             instance.status.conditions.timeout = status.conditions.timeout;
             instance.status.conditions.firstUserActivity = mapFirstUserActivity(rawStatus.getConditions()!.getFirstUserActivity());
diff --git a/components/ws-manager/example-wsspec-probe.json b/components/ws-manager/example-wsspec-probe.json
index f67337e07cf6f7..c8829c443adc27 100644
--- a/components/ws-manager/example-wsspec-probe.json
+++ b/components/ws-manager/example-wsspec-probe.json
@@ -6,8 +6,7 @@
     },
     "ports": [
         {
-            "port": 8080,
-            "target": 38080
+            "port": 8080
         }
     ],
     "envvars": [
diff --git a/components/ws-manager/example-wsspec.json b/components/ws-manager/example-wsspec.json
index f142c49a084e6b..bfaef0efbc3540 100644
--- a/components/ws-manager/example-wsspec.json
+++ b/components/ws-manager/example-wsspec.json
@@ -8,8 +8,7 @@
     },
     "ports": [
         {
-            "port": 8080,
-            "target": 38080
+            "port": 8080
         }
     ],
     "envvars": [
diff --git a/components/ws-manager/pkg/manager/annotations.go b/components/ws-manager/pkg/manager/annotations.go
index 8aeca309f878ac..788421c2ee166c 100644
--- a/components/ws-manager/pkg/manager/annotations.go
+++ b/components/ws-manager/pkg/manager/annotations.go
@@ -23,9 +23,6 @@ const (
 	// servicePrefixAnnotation is the annotation on the WS pod which contains the service prefix
 	servicePrefixAnnotation = "gitpod/servicePrefix"
 
-	// workspaceURLAnnotation is the annotation on the WS pod which contains the public workspace URL
-	workspaceURLAnnotation = "gitpod/url"
-
 	// workspaceNeverReadyAnnotation marks a workspace as having never been ready. It's the inverse of the former workspaceReadyAnnotation
 	workspaceNeverReadyAnnotation = "gitpod/never-ready"
 
@@ -49,10 +46,6 @@ const (
 	//   https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/#attaching-metadata-to-objects
 	workspaceInitializerAnnotation = "gitpod/contentInitializer"
 
-	// workspaceImageSpecAnnotation contains the protobuf serialized image spec in base64 encoding. We need to keep this around post-request
-	// to provide this information to the registry facade later in the workspace's lifecycle.
-	workspaceImageSpecAnnotation = "gitpod/imageSpec"
-
 	// workspaceFailedBeforeStoppingAnnotation marks a workspace as failed even before we tried
 	// to stop it. We do not extract the failure state from this annotation, but just stabilize
 	// the state computation.
@@ -68,12 +61,6 @@ const (
 	// fullWorkspaceBackupAnnotation is set on workspaces which operate using a full workspace backup
 	fullWorkspaceBackupAnnotation = "gitpod/fullWorkspaceBackup"
 
-	// ownerTokenAnnotation contains the owner token of the workspace
-	ownerTokenAnnotation = "gitpod/ownerToken"
-
-	// workspaceAdmissionAnnotation determines the user admission to a workspace, i.e. if it can be accessed by everyone without token
-	workspaceAdmissionAnnotation = "gitpod/admission"
-
 	// gitpodFinalizerName is the name of the Gitpod finalizer we use to clean up a workspace
 	gitpodFinalizerName = "gitpod.io/finalizer"
 
diff --git a/components/ws-manager/pkg/manager/create.go b/components/ws-manager/pkg/manager/create.go
index 9232d144baf1df..0c3ad9ca207bb4 100644
--- a/components/ws-manager/pkg/manager/create.go
+++ b/components/ws-manager/pkg/manager/create.go
@@ -24,6 +24,7 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/util/intstr"
 
+	"github.com/gitpod-io/gitpod/common-go/kubernetes"
 	wsk8s "github.com/gitpod-io/gitpod/common-go/kubernetes"
 	"github.com/gitpod-io/gitpod/common-go/tracing"
 	regapi "github.com/gitpod-io/gitpod/registry-facade/api"
@@ -280,19 +281,19 @@ func (m *Manager) createDefiniteWorkspacePod(startContext *startWorkspaceContext
 	}
 
 	annotations := map[string]string{
-		"prometheus.io/scrape":               "true",
-		"prometheus.io/path":                 "/metrics",
-		"prometheus.io/port":                 strconv.Itoa(int(startContext.IDEPort)),
-		workspaceIDAnnotation:                req.Id,
-		servicePrefixAnnotation:              getServicePrefix(req),
-		workspaceURLAnnotation:               startContext.WorkspaceURL,
-		workspaceInitializerAnnotation:       initializerConfig,
-		workspaceNeverReadyAnnotation:        "true",
-		workspaceAdmissionAnnotation:         admissionLevel,
-		workspaceImageSpecAnnotation:         imageSpec,
-		ownerTokenAnnotation:                 startContext.OwnerToken,
-		wsk8s.TraceIDAnnotation:              startContext.TraceID,
-		wsk8s.RequiredNodeServicesAnnotation: "ws-daemon,registry-facade",
+		"prometheus.io/scrape":                  "true",
+		"prometheus.io/path":                    "/metrics",
+		"prometheus.io/port":                    strconv.Itoa(int(startContext.IDEPort)),
+		workspaceIDAnnotation:                   req.Id,
+		servicePrefixAnnotation:                 getServicePrefix(req),
+		kubernetes.WorkspaceURLAnnotation:       startContext.WorkspaceURL,
+		workspaceInitializerAnnotation:          initializerConfig,
+		workspaceNeverReadyAnnotation:           "true",
+		kubernetes.WorkspaceAdmissionAnnotation: admissionLevel,
+		kubernetes.WorkspaceImageSpecAnnotation: imageSpec,
+		kubernetes.OwnerTokenAnnotation:         startContext.OwnerToken,
+		wsk8s.TraceIDAnnotation:                 startContext.TraceID,
+		wsk8s.RequiredNodeServicesAnnotation:    "ws-daemon,registry-facade",
 		// TODO(cw): post Kubernetes 1.19 use GA form for settings those profiles
 		"container.apparmor.security.beta.kubernetes.io/workspace": "unconfined",
 		// We're using a custom seccomp profile for user namespaces to allow clone, mount and chroot.
@@ -663,58 +664,6 @@ func (m *Manager) createDefaultSecurityContext() (*corev1.SecurityContext, error
 	return res, nil
 }
 
-func (m *Manager) createPortsService(workspaceID string, metaID string, servicePrefix string, ports []*api.PortSpec) (*corev1.Service, error) {
-	annotations := make(map[string]string)
-
-	// create service ports
-	servicePorts := make([]corev1.ServicePort, len(ports))
-	for i, p := range ports {
-		servicePorts[i] = corev1.ServicePort{
-			Port:     int32(p.Port),
-			Protocol: corev1.ProtocolTCP,
-			Name:     portSpecToName(p),
-		}
-		if p.Target != 0 {
-			servicePorts[i].TargetPort = intstr.FromInt(int(p.Target))
-		}
-
-		url, err := config.RenderWorkspacePortURL(m.Config.WorkspacePortURLTemplate, config.PortURLContext{
-			Host:          m.Config.GitpodHostURL,
-			ID:            metaID,
-			IngressPort:   fmt.Sprint(p.Port),
-			Prefix:        servicePrefix,
-			WorkspacePort: fmt.Sprint(p.Port),
-		})
-		if err != nil {
-			return nil, xerrors.Errorf("cannot render public URL for %d: %w", p.Port, err)
-		}
-		annotations[fmt.Sprintf("gitpod/port-url-%d", p.Port)] = url
-	}
-
-	serviceName := getPortsServiceName(servicePrefix)
-	return &corev1.Service{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      serviceName,
-			Namespace: m.Config.Namespace,
-			Labels: map[string]string{
-				"workspaceID":          workspaceID,
-				wsk8s.MetaIDLabel:      metaID,
-				markerLabel:            "true",
-				wsk8s.ServiceTypeLabel: "ports",
-			},
-			Annotations: annotations,
-		},
-		Spec: corev1.ServiceSpec{
-			Type:  corev1.ServiceTypeClusterIP,
-			Ports: servicePorts,
-			Selector: map[string]string{
-				"workspaceID": workspaceID,
-				markerLabel:   "true",
-			},
-		},
-	}, nil
-}
-
 func (m *Manager) newStartWorkspaceContext(ctx context.Context, req *api.StartWorkspaceRequest) (res *startWorkspaceContext, err error) {
 	// we deliberately do not shadow ctx here as we need the original context later to extract the TraceID
 	span, ctx := tracing.FromContext(ctx, "newStartWorkspaceContext")
diff --git a/components/ws-manager/pkg/manager/imagespec.go b/components/ws-manager/pkg/manager/imagespec.go
index dee09392ed45a9..c3d9775ad07561 100644
--- a/components/ws-manager/pkg/manager/imagespec.go
+++ b/components/ws-manager/pkg/manager/imagespec.go
@@ -14,6 +14,7 @@ import (
 	"google.golang.org/grpc/status"
 	"google.golang.org/protobuf/proto"
 
+	"github.com/gitpod-io/gitpod/common-go/kubernetes"
 	wsk8s "github.com/gitpod-io/gitpod/common-go/kubernetes"
 	"github.com/gitpod-io/gitpod/common-go/tracing"
 	csapi "github.com/gitpod-io/gitpod/content-service/api"
@@ -44,7 +45,7 @@ func (m *Manager) GetImageSpec(ctx context.Context, req *regapi.GetImageSpecRequ
 		tracing.FinishSpan(span, &err)
 	}()
 
-	ispec, ok := pod.Annotations[workspaceImageSpecAnnotation]
+	ispec, ok := pod.Annotations[kubernetes.WorkspaceImageSpecAnnotation]
 	if !ok {
 		return nil, status.Error(codes.FailedPrecondition, "workspace has no image spec")
 	}
diff --git a/components/ws-manager/pkg/manager/manager.go b/components/ws-manager/pkg/manager/manager.go
index 33b2f45eaaeb5d..1184bec6b5caa8 100644
--- a/components/ws-manager/pkg/manager/manager.go
+++ b/components/ws-manager/pkg/manager/manager.go
@@ -8,7 +8,6 @@ import (
 	"context"
 	"encoding/json"
 	"fmt"
-	"net"
 	"net/http"
 	"strings"
 	"sync"
@@ -26,11 +25,7 @@ import (
 	k8serr "k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/labels"
-	"k8s.io/apimachinery/pkg/types"
-	"k8s.io/apimachinery/pkg/util/intstr"
-	"k8s.io/apimachinery/pkg/util/wait"
 	"k8s.io/client-go/kubernetes"
-	"k8s.io/client-go/util/retry"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	common_grpc "github.com/gitpod-io/gitpod/common-go/grpc"
@@ -81,8 +76,6 @@ type startWorkspaceContext struct {
 }
 
 const (
-	// theiaVolume is the name of the theia volume
-	theiaVolumeName = "vol-this-theia"
 	// workspaceVolume is the name of the workspace volume
 	workspaceVolumeName = "vol-this-workspace"
 	// workspaceDir is the path within all containers where workspaceVolume is mounted to
@@ -218,72 +211,6 @@ func (m *Manager) StartWorkspace(ctx context.Context, req *api.StartWorkspaceReq
 		OwnerToken: startContext.OwnerToken,
 	}
 
-	// mandatory Theia service
-	servicePrefix := getServicePrefix(req)
-	theiaServiceName := getTheiaServiceName(servicePrefix)
-	theiaServiceLabels := make(map[string]string, len(startContext.Labels)+1)
-	for k, v := range startContext.Labels {
-		theiaServiceLabels[k] = v
-	}
-	theiaServiceLabels[wsk8s.ServiceTypeLabel] = "ide"
-	theiaService := corev1.Service{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      theiaServiceName,
-			Namespace: m.Config.Namespace,
-			Labels:    startContext.Labels,
-		},
-		Spec: corev1.ServiceSpec{
-			Type: corev1.ServiceTypeClusterIP,
-			Ports: []corev1.ServicePort{
-				{
-					Name: "ide",
-					Port: startContext.IDEPort,
-				},
-				{
-					Name: "supervisor",
-					Port: startContext.SupervisorPort,
-				},
-			},
-			Selector: startContext.Labels,
-		},
-	}
-
-	var errorFn = func(err error) bool {
-		return strings.Contains(err.Error(), "object is being deleted")
-	}
-	// in some scenarios we could be recreating a service being deleted
-	err = retry.OnError(wait.Backoff{
-		Steps:    4,
-		Duration: 1 * time.Second,
-		Factor:   5.0,
-		Jitter:   0.1,
-	}, errorFn, func() error {
-		return m.Clientset.Create(ctx, &theiaService)
-	})
-	if err != nil {
-		clog.WithError(err).WithField("req", req).Error("was unable to start workspace")
-		// could not create Theia service
-		return nil, xerrors.Errorf("cannot create workspace's Theia service: %w", err)
-	}
-
-	span.LogKV("event", "theia service created")
-
-	// if we have ports configured already, create the ports service
-	if len(req.Spec.Ports) > 0 {
-		portService, err := m.createPortsService(req.Id, servicePrefix, req.Metadata.MetaId, req.Spec.Ports)
-		if err != nil {
-			return nil, xerrors.Errorf("cannot create workspace's public service: %w", err)
-		}
-
-		err = m.Clientset.Create(ctx, portService)
-		if err != nil {
-			clog.WithError(err).WithField("req", req).Error("was unable to start workspace")
-			// could not create ports service
-			return nil, xerrors.Errorf("cannot create workspace's public service: %w", err)
-		}
-		span.LogKV("event", "ports service created")
-	}
-
 	m.metrics.OnWorkspaceStarted(req.Type)
 
 	return okResponse, nil
@@ -420,41 +347,9 @@ func (m *Manager) stopWorkspace(ctx context.Context, workspaceID string, gracePe
 	workspaceSpan := opentracing.StartSpan("workspace-stop", opentracing.FollowsFrom(opentracing.SpanFromContext(ctx).Context()))
 	tracing.ApplyOWI(workspaceSpan, wsk8s.GetOWIFromObject(&pod.ObjectMeta))
 
-	servicePrefix, ok := pod.Annotations[servicePrefixAnnotation]
-	if !ok {
-		return xerrors.Errorf("stopWorkspace: pod %s has no %s annotation", pod.Name, servicePrefixAnnotation)
-	}
-
 	gracePeriodSeconds := int64(gracePeriod.Seconds())
 	propagationPolicy := metav1.DeletePropagationForeground
 
-	theiaServiceErr := m.Clientset.Delete(ctx,
-		&corev1.Service{
-			ObjectMeta: metav1.ObjectMeta{
-				Name:      getTheiaServiceName(servicePrefix),
-				Namespace: m.Config.Namespace,
-			},
-		},
-		&client.DeleteOptions{
-			GracePeriodSeconds: &gracePeriodSeconds,
-			PropagationPolicy:  &propagationPolicy,
-		},
-	)
-	span.LogKV("event", "theia service deleted")
-
-	portsServiceErr := m.Clientset.Delete(ctx, &corev1.Service{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      getPortsServiceName(servicePrefix),
-			Namespace: m.Config.Namespace,
-		},
-	},
-		&client.DeleteOptions{
-			GracePeriodSeconds: &gracePeriodSeconds,
-			PropagationPolicy:  &propagationPolicy,
-		},
-	)
-	span.LogKV("event", "ports service deleted")
-
 	podErr := m.Clientset.Delete(ctx,
 		&corev1.Pod{
 			ObjectMeta: metav1.ObjectMeta{
@@ -472,12 +367,7 @@ func (m *Manager) stopWorkspace(ctx context.Context, workspaceID string, gracePe
 	if podErr != nil {
 		return xerrors.Errorf("stopWorkspace: %w", podErr)
 	}
-	if theiaServiceErr != nil && !isKubernetesObjNotFoundError(theiaServiceErr) {
-		return xerrors.Errorf("stopWorkspace: %w", theiaServiceErr)
-	}
-	if portsServiceErr != nil && !isKubernetesObjNotFoundError(portsServiceErr) {
-		return xerrors.Errorf("stopWorkspace: %w", portsServiceErr)
-	}
+
 	return nil
 }
 
@@ -513,14 +403,6 @@ func getPodID(workspaceType, workspaceID string) string {
 	return fmt.Sprintf("%s-%s", strings.TrimSpace(strings.ToLower(workspaceType)), strings.TrimSpace(workspaceID))
 }
 
-func getPortsServiceName(servicePrefix string) string {
-	return fmt.Sprintf("ws-%s-ports", strings.TrimSpace(strings.ToLower(servicePrefix)))
-}
-
-func getTheiaServiceName(servicePrefix string) string {
-	return fmt.Sprintf("ws-%s-theia", strings.TrimSpace(strings.ToLower(servicePrefix)))
-}
-
 // MarkActive records a workspace as being active which prevents it from timing out
 func (m *Manager) MarkActive(ctx context.Context, req *api.MarkActiveRequest) (res *api.MarkActiveResponse, err error) {
 	//nolint:ineffassign
@@ -619,13 +501,12 @@ func (m *Manager) ControlPort(ctx context.Context, req *api.ControlPortRequest)
 		return nil, xerrors.Errorf("workspace pod %s has no service prefix annotation", pod.Name)
 	}
 
-	var service corev1.Service
 	notifyStatusChange := func() error {
 		// by modifying the ports service we have changed the workspace status. However, this status change is not propagated
 		// through the regular monitor mechanism as we did not modify the pod itself. We have to send out a status update
 		// outselves. Doing it ourselves lets us synchronize the status update with probing for actual availability, not just
 		// the service modification in Kubernetes.
-		wso := workspaceObjects{Pod: pod, PortsService: &service}
+		wso := workspaceObjects{Pod: pod}
 		err := m.completeWorkspaceObjects(ctx, &wso)
 		if err != nil {
 			return xerrors.Errorf("cannot update status: %w", err)
@@ -639,69 +520,13 @@ func (m *Manager) ControlPort(ctx context.Context, req *api.ControlPortRequest)
 		return nil
 	}
 
-	metaID := pod.ObjectMeta.Annotations[wsk8s.MetaIDLabel]
 	// dunno why in k8s IP ports are int32 not uint16
-	port := int32(req.Spec.Port)
-	// get ports service if it exists
-	err = m.Clientset.Get(ctx, types.NamespacedName{Namespace: m.Config.Namespace, Name: getPortsServiceName(servicePrefix)}, &service)
-	if isKubernetesObjNotFoundError(err) {
-		if !req.Expose {
-			// we're not asked to expose the port so there's nothing left to do here
-			return &api.ControlPortResponse{}, nil
-		}
+	port := req.Spec.Port
 
-		// service does not exist - create it
-		newService, err := m.createPortsService(req.Id, metaID, servicePrefix, []*api.PortSpec{req.Spec})
-		if err != nil {
-			return nil, xerrors.Errorf("cannot create workspace's public service: %w", err)
-		}
-		err = m.Clientset.Create(ctx, newService, &client.CreateOptions{})
-		if err != nil {
-			return nil, xerrors.Errorf("cannot create service: %w", err)
-		}
-		span.LogKV("event", "port service created")
-
-		service = *newService
-
-		// the KubeDNS need a short while to pick up the new service. When we can resolve the service name, so can the proxy
-		// which means the user won't get an error if they try to access the port.
-		host := fmt.Sprintf("%s.%s", service.Name, m.Config.Namespace)
-		for {
-			if m.Config.InitProbe.Disabled {
-				// In tests we'd like to mock net.LookupHost(host) instead of disabling the probe,
-				// but we can't (see https://github.com/golang/go/issues/12503 and https://groups.google.com/forum/#!topic/golang-codereviews/6jmR0F6BZVU)
-				break
-			}
-
-			_, err = net.LookupHost(host)
-			// There's no direct way to check if the host wasn't found in Go1.12: https://go-review.googlesource.com/c/go/+/168597/
-			// Thus we assume any error means we can't resolve the host yet.
-			if err == nil {
-				break
-			}
-
-			// abort if the context deadline is exceeded
-			if err := ctx.Err(); err != nil {
-				return nil, err
-			}
-		}
-		span.LogKV("event", "host available")
-
-		// we've successfully exposed the port by creating the service
-		err = notifyStatusChange()
-		if err != nil {
-			return nil, err
-		}
-		return &api.ControlPortResponse{}, nil
-	}
-	if err != nil {
-		return nil, xerrors.Errorf("cannot control port: %w", err)
-	}
+	exposedPorts := extractExposedPorts(pod)
 
-	// the service exists - let's modify it
-	spec := &service.Spec
 	existingPortSpecIdx := -1
-	for i, p := range service.Spec.Ports {
+	for i, p := range exposedPorts.Ports {
 		if p.Port == port {
 			existingPortSpecIdx = i
 			break
@@ -709,97 +534,58 @@ func (m *Manager) ControlPort(ctx context.Context, req *api.ControlPortRequest)
 	}
 
 	if req.Expose && existingPortSpecIdx < 0 {
-		// port is not exposed yet - patch the service
-		portSpec := corev1.ServicePort{
-			Name:     portSpecToName(req.Spec),
-			Port:     port,
-			Protocol: corev1.ProtocolTCP,
+		// port is not exposed yet - patch the pod
+		url, err := config.RenderWorkspacePortURL(m.Config.WorkspacePortURLTemplate, config.PortURLContext{
+			Host:          m.Config.GitpodHostURL,
+			ID:            req.Id,
+			IngressPort:   fmt.Sprint(port),
+			Prefix:        servicePrefix,
+			WorkspacePort: fmt.Sprint(port),
+		})
+		if err != nil {
+			return nil, xerrors.Errorf("cannot render public URL for %d: %w", port, err)
 		}
-		if req.Spec.Target != 0 {
-			portSpec.TargetPort = intstr.FromInt(int(req.Spec.Target))
+
+		portSpec := &api.PortSpec{
+			Port:       uint32(port),
+			Visibility: req.Spec.Visibility,
+			Url:        url,
 		}
-		spec.Ports = append(spec.Ports, portSpec)
+
+		exposedPorts.Ports = append(exposedPorts.Ports, portSpec)
 	} else if req.Expose && existingPortSpecIdx >= 0 {
-		service.Spec.Ports[existingPortSpecIdx].TargetPort = intstr.FromInt(int(req.Spec.Target))
-		service.Spec.Ports[existingPortSpecIdx].Name = portSpecToName(req.Spec)
+		exposedPorts.Ports[existingPortSpecIdx].Visibility = req.Spec.Visibility
 	} else if !req.Expose && existingPortSpecIdx < 0 {
 		// port isn't exposed already - we're done here
 		return &api.ControlPortResponse{}, nil
 	} else if !req.Expose && existingPortSpecIdx >= 0 {
 		// port is exposed but shouldn't be - remove it from the port list
-		spec.Ports = append(spec.Ports[:existingPortSpecIdx], spec.Ports[existingPortSpecIdx+1:]...)
+		exposedPorts.Ports = append(exposedPorts.Ports[:existingPortSpecIdx], exposedPorts.Ports[existingPortSpecIdx+1:]...)
 	}
 
-	if len(spec.Ports) == 0 {
-		// we don't have any ports exposed anymore: remove the service
-		propagationPolicy := metav1.DeletePropagationForeground
-		var zero int64 = 0
-		err = m.Clientset.Delete(ctx, &service, &client.DeleteOptions{
-			GracePeriodSeconds: &zero,
-			PropagationPolicy:  &propagationPolicy,
-		})
+	// update pod annotation
+	data, err := exposedPorts.ToBase64()
+	if err != nil {
+		return nil, xerrors.Errorf("cannot update status: %w", err)
+	}
 
-		span.LogKV("event", "port service deleted")
-	} else {
-		// we've made it here which means we need to actually patch the service
-		service.Spec = *spec
-
-		for _, p := range service.Spec.Ports {
-			url, err := config.RenderWorkspacePortURL(m.Config.WorkspacePortURLTemplate, config.PortURLContext{
-				Host:          m.Config.GitpodHostURL,
-				ID:            req.Id,
-				IngressPort:   fmt.Sprint(p.Port),
-				Prefix:        servicePrefix,
-				WorkspacePort: fmt.Sprint(p.Port),
-			})
-			if err != nil {
-				return nil, xerrors.Errorf("cannot render public URL for %d: %w", p.Port, err)
-			}
-			if service.Annotations == nil {
-				service.Annotations = map[string]string{}
-			}
-			service.Annotations[fmt.Sprintf("gitpod/port-url-%d", p.Port)] = url
-		}
+	if pod.Annotations[wsk8s.WorkspaceExposedPorts] != data {
+		log.WithField("ports", exposedPorts).Debug("updating exposed ports")
+		pod.Annotations[wsk8s.WorkspaceExposedPorts] = data
 
-		err = m.Clientset.Update(ctx, &service)
+		// update pod
+		err = m.Clientset.Update(ctx, pod)
 		if err != nil {
-			return nil, xerrors.Errorf("cannot update service: %w", err)
+			return nil, xerrors.Errorf("cannot update workspace pod: %w", err)
 		}
-		span.LogKV("event", "port service updated")
-	}
-	if err != nil {
-		return nil, xerrors.Errorf("cannot control port: %w", err)
 	}
 
 	err = notifyStatusChange()
 	if err != nil {
 		return nil, err
 	}
-	return &api.ControlPortResponse{}, nil
-}
-
-// portSpecToName generates a port name from the given PortSpec
-func portSpecToName(spec *api.PortSpec) string {
-	api.PortVisibility_PORT_VISIBILITY_PUBLIC.EnumDescriptor()
-	visibilityStr := strings.ToLower(strings.TrimPrefix(spec.Visibility.String(), "PORT_VISIBILITY_"))
-	return fmt.Sprintf("p%d-%s", spec.Port, visibilityStr)
-}
 
-// portNameToVisibility parses the port name with the pattern defined in PortSpecToName and return the ports visibility (or default value if not specified)
-func portNameToVisibility(s string) api.PortVisibility {
-	parts := strings.Split(s, "-")
-	if len(parts) != 2 {
-		// old or wrong port name: return default
-		return api.PortVisibility_PORT_VISIBILITY_PRIVATE
-	}
-
-	// parse (or public as fallback: important for backwards compatibility during rollout)
-	visibilitStr := fmt.Sprintf("PORT_VISIBILITY_%s", strings.ToUpper(parts[1]))
-	i32Value, present := api.PortVisibility_value[visibilitStr]
-	if !present {
-		return api.PortVisibility_PORT_VISIBILITY_PRIVATE
-	}
-	return api.PortVisibility(i32Value)
+	return &api.ControlPortResponse{}, nil
 }
 
 // DescribeWorkspace investigates a workspace and returns its status, and configuration
@@ -1082,10 +868,9 @@ func (m *Manager) getAllWorkspaceObjects(ctx context.Context) (objs []workspaceO
 	}
 
 	var (
-		wsoIndex          = make(map[string]*workspaceObjects)
-		theiaServiceIndex = make(map[string]*workspaceObjects)
-		portServiceIndex  = make(map[string]*workspaceObjects)
+		wsoIndex = make(map[string]*workspaceObjects)
 	)
+
 	for _, pod := range pods.Items {
 		id, ok := pod.Annotations[workspaceIDAnnotation]
 		if !ok {
@@ -1100,24 +885,6 @@ func (m *Manager) getAllWorkspaceObjects(ctx context.Context) (objs []workspaceO
 		wso := &workspaceObjects{Pod: &podcopy}
 
 		wsoIndex[id] = wso
-		if sp, ok := pod.Annotations[servicePrefixAnnotation]; ok {
-			theiaServiceIndex[getTheiaServiceName(sp)] = wso
-			portServiceIndex[getPortsServiceName(sp)] = wso
-		}
-	}
-
-	for _, service := range services.Items {
-		// don't references to loop variables - they magically change their value
-		serviceCopy := service
-
-		if wso, ok := theiaServiceIndex[service.Name]; ok {
-			wso.TheiaService = &serviceCopy
-			continue
-		}
-		if wso, ok := portServiceIndex[service.Name]; ok {
-			wso.PortsService = &serviceCopy
-			continue
-		}
 	}
 
 	var i int
@@ -1126,6 +893,7 @@ func (m *Manager) getAllWorkspaceObjects(ctx context.Context) (objs []workspaceO
 		result[i] = *wso
 		i++
 	}
+
 	return result, nil
 }
 
@@ -1279,3 +1047,12 @@ func checkWSDaemonEndpoint(namespace string, clientset client.Client) func(strin
 		return false
 	}
 }
+
+func extractExposedPorts(pod *corev1.Pod) *api.ExposedPorts {
+	if data, ok := pod.Annotations[wsk8s.WorkspaceExposedPorts]; ok {
+		ports, _ := api.ExposedPortsFromBase64(data)
+		return ports
+	}
+
+	return &api.ExposedPorts{}
+}
diff --git a/components/ws-manager/pkg/manager/manager_ee.go b/components/ws-manager/pkg/manager/manager_ee.go
index 88f5be870acda2..3e91e5af167b11 100644
--- a/components/ws-manager/pkg/manager/manager_ee.go
+++ b/components/ws-manager/pkg/manager/manager_ee.go
@@ -16,6 +16,7 @@ import (
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/status"
 
+	"github.com/gitpod-io/gitpod/common-go/kubernetes"
 	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"
@@ -109,7 +110,7 @@ func (m *Manager) ControlAdmission(ctx context.Context, req *api.ControlAdmissio
 	// lowercase is just for vanity's sake
 	val = strings.ToLower(val)
 
-	err = m.markWorkspace(ctx, req.Id, addMark(workspaceAdmissionAnnotation, val))
+	err = m.markWorkspace(ctx, req.Id, addMark(kubernetes.WorkspaceAdmissionAnnotation, val))
 	if err != nil {
 		return nil, status.Errorf(codes.Internal, "cannot change workspace admission level: %q", err)
 	}
diff --git a/components/ws-manager/pkg/manager/manager_test.go b/components/ws-manager/pkg/manager/manager_test.go
index 64c19007e29aa3..5cb6f71c675755 100644
--- a/components/ws-manager/pkg/manager/manager_test.go
+++ b/components/ws-manager/pkg/manager/manager_test.go
@@ -17,7 +17,6 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/labels"
-	"k8s.io/apimachinery/pkg/types"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
 )
@@ -60,7 +59,6 @@ func TestControlPort(t *testing.T) {
 	}
 	type gold struct {
 		Error            string                   `json:"error,omitempty"`
-		PortsService     *corev1.Service          `json:"portsService,omitempty"`
 		Response         *api.ControlPortResponse `json:"response,omitempty"`
 		PostChangeStatus []*api.PortSpec          `json:"postChangeStatus,omitempty"`
 	}
@@ -110,31 +108,6 @@ func TestControlPort(t *testing.T) {
 			// wait for informer sync of any change introduced by ControlPort
 			time.Sleep(500 * time.Millisecond)
 
-			var svc corev1.Service
-			_ = manager.Clientset.Get(context.Background(), types.NamespacedName{
-				Namespace: manager.Config.Namespace,
-				Name:      getPortsServiceName(startCtx.Request.ServicePrefix),
-			}, &svc)
-
-			cleanTemporalAttributes := func(svc *corev1.Service) *corev1.Service {
-				// only process services from the API server
-				if svc.ResourceVersion == "" {
-					return nil
-				}
-
-				copy := svc.DeepCopy()
-				copy.ObjectMeta.SelfLink = ""
-				copy.ObjectMeta.ResourceVersion = ""
-				copy.ObjectMeta.SetCreationTimestamp(metav1.Time{})
-				copy.ObjectMeta.UID = ""
-				copy.Spec.ClusterIP = ""
-				copy.Spec.SessionAffinity = ""
-
-				return copy
-			}
-
-			result.PortsService = cleanTemporalAttributes(&svc)
-
 			return &result
 		},
 		Fixture: func() interface{} { return &fixture{} },
diff --git a/components/ws-manager/pkg/manager/monitor.go b/components/ws-manager/pkg/manager/monitor.go
index 2ef93cbf42616d..4aabff83058656 100644
--- a/components/ws-manager/pkg/manager/monitor.go
+++ b/components/ws-manager/pkg/manager/monitor.go
@@ -22,12 +22,11 @@ import (
 	grpc_status "google.golang.org/grpc/status"
 	"google.golang.org/protobuf/proto"
 	corev1 "k8s.io/api/core/v1"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/labels"
-	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/apimachinery/pkg/watch"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
+	"github.com/gitpod-io/gitpod/common-go/kubernetes"
 	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"
@@ -420,11 +419,6 @@ func (m *Monitor) doHousekeeping(ctx context.Context) {
 	if err != nil {
 		m.OnError(err)
 	}
-
-	err = m.deleteDanglingServices(ctx)
-	if err != nil {
-		m.OnError(err)
-	}
 }
 
 // writeEventTraceLog writes an event trace log if one is configured. This function is written in
@@ -601,9 +595,9 @@ func (m *Monitor) probeWorkspaceReady(ctx context.Context, pod *corev1.Pod) (res
 	if !ok {
 		return nil, xerrors.Errorf("pod %s has no %s annotation", pod.Name, workspaceIDAnnotation)
 	}
-	wsurl, ok := pod.Annotations[workspaceURLAnnotation]
+	wsurl, ok := pod.Annotations[kubernetes.WorkspaceURLAnnotation]
 	if !ok {
-		return nil, xerrors.Errorf("pod %s has no %s annotation", pod.Name, workspaceURLAnnotation)
+		return nil, xerrors.Errorf("pod %s has no %s annotation", pod.Name, kubernetes.WorkspaceURLAnnotation)
 	}
 	workspaceURL, err := url.Parse(wsurl)
 	if err != nil {
@@ -977,63 +971,6 @@ func (m *Monitor) finalizeWorkspaceContent(ctx context.Context, wso *workspaceOb
 	}
 }
 
-// deleteDanglingServices removes services for which there is no corresponding workspace pod anymore
-func (m *Monitor) deleteDanglingServices(ctx context.Context) error {
-	var services corev1.ServiceList
-	err := m.manager.Clientset.List(ctx, &services, workspaceObjectListOptions(m.manager.Config.Namespace))
-	if err != nil {
-		return xerrors.Errorf("deleteDanglingServices: %w", err)
-	}
-
-	var zero int64 = 0
-	propagationPolicy := metav1.DeletePropagationForeground
-
-	for _, service := range services.Items {
-		var endpoints corev1.Endpoints
-		err := m.manager.Clientset.Get(ctx, types.NamespacedName{Namespace: service.Namespace, Name: service.Name}, &endpoints)
-		if err != nil {
-			return xerrors.Errorf("deleteDanglingServices: %w", err)
-		}
-
-		hasReadyEndpoint := false
-		for _, s := range endpoints.Subsets {
-			hasReadyEndpoint = len(s.Addresses) > 0
-		}
-		if hasReadyEndpoint {
-			continue
-		}
-
-		workspaceID, ok := endpoints.Labels[wsk8s.WorkspaceIDLabel]
-		if !ok {
-			m.OnError(xerrors.Errorf("service endpoint %s does not have %s label", service.Name, wsk8s.WorkspaceIDLabel))
-			continue
-		}
-
-		_, err = m.manager.findWorkspacePod(ctx, workspaceID)
-		if !isKubernetesObjNotFoundError(err) {
-			continue
-		}
-
-		if m.manager.Config.DryRun {
-			log.WithFields(log.OWI("", "", workspaceID)).WithField("name", service.Name).Info("should have deleted dangling service but this is a dry run")
-			continue
-		}
-
-		// this relies on the Kubernetes convention that endpoints have the same name as their services
-		err = m.manager.Clientset.Delete(ctx, &service, &client.DeleteOptions{
-			GracePeriodSeconds: &zero,
-			PropagationPolicy:  &propagationPolicy,
-		})
-		if err != nil && !isKubernetesObjNotFoundError(err) {
-			m.OnError(xerrors.Errorf("deleteDanglingServices: %w", err))
-			continue
-		}
-		log.WithFields(log.OWI("", "", workspaceID)).WithField("name", service.Name).Info("deleted dangling service")
-	}
-
-	return nil
-}
-
 // markTimedoutWorkspaces finds workspaces which haven't been active recently and marks them as timed out
 func (m *Monitor) markTimedoutWorkspaces(ctx context.Context) (err error) {
 	span, ctx := tracing.FromContext(ctx, "markTimedoutWorkspaces")
diff --git a/components/ws-manager/pkg/manager/status.go b/components/ws-manager/pkg/manager/status.go
index d8aecb17e416dd..c391f95e423975 100644
--- a/components/ws-manager/pkg/manager/status.go
+++ b/components/ws-manager/pkg/manager/status.go
@@ -18,8 +18,8 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
-	"k8s.io/apimachinery/pkg/types"
 
+	"github.com/gitpod-io/gitpod/common-go/kubernetes"
 	wsk8s "github.com/gitpod-io/gitpod/common-go/kubernetes"
 	"github.com/gitpod-io/gitpod/common-go/log"
 	"github.com/gitpod-io/gitpod/common-go/util"
@@ -52,10 +52,8 @@ func init() {
 
 // workspaceObjects contains all Kubernetes objects required to compute the status of a workspace
 type workspaceObjects struct {
-	Pod          *corev1.Pod     `json:"pod"`
-	TheiaService *corev1.Service `json:"theiaService,omitempty"`
-	PortsService *corev1.Service `json:"portsService,omitempty"`
-	Events       []corev1.Event  `json:"events,omitempty"`
+	Pod    *corev1.Pod    `json:"pod"`
+	Events []corev1.Event `json:"events,omitempty"`
 }
 
 // GetOWI produces the owner, workspace, instance tripple that we use for tracing and logging
@@ -158,48 +156,14 @@ func (m *Manager) completeWorkspaceObjects(ctx context.Context, wso *workspaceOb
 		return xerrors.Errorf("completeWorkspaceObjects: need either pod or lifecycle independent state")
 	}
 
-	// find our service prefix to see if the services still exist
-	servicePrefix := ""
-	if wso.Pod != nil {
-		servicePrefix = wso.Pod.Annotations[servicePrefixAnnotation]
-	}
-	if servicePrefix == "" {
-		return xerrors.Errorf("completeWorkspaceObjects: no service prefix found")
-	}
-	if wso.TheiaService == nil {
-		var service corev1.Service
-		err := m.Clientset.Get(ctx, types.NamespacedName{Namespace: m.Config.Namespace, Name: getTheiaServiceName(servicePrefix)}, &service)
-		if err == nil {
-			wso.TheiaService = &service
-		}
-
-		if !isKubernetesObjNotFoundError(err) && err != nil {
-			return xerrors.Errorf("completeWorkspaceObjects: %w", err)
-		}
-	}
-	if wso.PortsService == nil {
-		var service corev1.Service
-		err := m.Clientset.Get(ctx, types.NamespacedName{Namespace: m.Config.Namespace, Name: getPortsServiceName(servicePrefix)}, &service)
-		if err == nil {
-			wso.PortsService = &service
-		}
-
-		if !isKubernetesObjNotFoundError(err) && err != nil {
+	if wso.Events == nil {
+		events, err := m.RawClient.CoreV1().Events(m.Config.Namespace).Search(scheme, wso.Pod)
+		if err != nil {
 			return xerrors.Errorf("completeWorkspaceObjects: %w", err)
 		}
-	}
-
-	// find pod events - this only makes sense if we still have a pod
-	if wso.Pod != nil {
-		if wso.Events == nil && wso.Pod != nil {
-			events, err := m.RawClient.CoreV1().Events(m.Config.Namespace).Search(scheme, wso.Pod)
-			if err != nil {
-				return xerrors.Errorf("completeWorkspaceObjects: %w", err)
-			}
 
-			wso.Events = make([]corev1.Event, len(events.Items))
-			copy(wso.Events, events.Items)
-		}
+		wso.Events = make([]corev1.Event, len(events.Items))
+		copy(wso.Events, events.Items)
 	}
 
 	return nil
@@ -222,9 +186,9 @@ func (m *Manager) getWorkspaceStatus(wso workspaceObjects) (*api.WorkspaceStatus
 		return nil, xerrors.Errorf("workspace pod for %s is degenerate - does not have workspace container", id)
 	}
 
-	wsurl, ok := wso.Pod.Annotations[workspaceURLAnnotation]
+	wsurl, ok := wso.Pod.Annotations[kubernetes.WorkspaceURLAnnotation]
 	if !ok {
-		return nil, xerrors.Errorf("pod %s has no %s annotation", wso.Pod.Name, workspaceURLAnnotation)
+		return nil, xerrors.Errorf("pod %s has no %s annotation", wso.Pod.Name, kubernetes.WorkspaceURLAnnotation)
 	}
 
 	tpe, err := wso.WorkspaceType()
@@ -245,7 +209,7 @@ func (m *Manager) getWorkspaceStatus(wso workspaceObjects) (*api.WorkspaceStatus
 		ideImage        string
 		desktopIdeImage string
 	)
-	if ispec, ok := wso.Pod.Annotations[workspaceImageSpecAnnotation]; ok {
+	if ispec, ok := wso.Pod.Annotations[kubernetes.WorkspaceImageSpecAnnotation]; ok {
 		spec, err := regapi.ImageSpecFromBase64(ispec)
 		if err != nil {
 			return nil, xerrors.Errorf("invalid image spec: %w", err)
@@ -255,12 +219,12 @@ func (m *Manager) getWorkspaceStatus(wso workspaceObjects) (*api.WorkspaceStatus
 		desktopIdeImage = spec.DesktopIdeRef
 	}
 
-	ownerToken, ok := wso.Pod.Annotations[ownerTokenAnnotation]
+	ownerToken, ok := wso.Pod.Annotations[kubernetes.OwnerTokenAnnotation]
 	if !ok {
 		log.WithFields(wso.GetOWI()).Warn("pod has no owner token. is this a legacy pod?")
 	}
 	admission := api.AdmissionLevel_ADMIT_OWNER_ONLY
-	if av, ok := api.AdmissionLevel_value[strings.ToUpper(wso.Pod.Annotations[workspaceAdmissionAnnotation])]; ok {
+	if av, ok := api.AdmissionLevel_value[strings.ToUpper(wso.Pod.Annotations[kubernetes.WorkspaceAdmissionAnnotation])]; ok {
 		admission = api.AdmissionLevel(av)
 	}
 
@@ -299,42 +263,6 @@ func (m *Manager) getWorkspaceStatus(wso workspaceObjects) (*api.WorkspaceStatus
 		return nil, xerrors.Errorf("cannot get workspace status: %w", err)
 	}
 
-	exposedPorts := []*api.PortSpec{}
-	if wso.PortsService != nil {
-		service := wso.PortsService
-
-		for _, p := range service.Spec.Ports {
-			port := &api.PortSpec{
-				Port:       uint32(p.Port),
-				Target:     uint32(p.TargetPort.IntValue()),
-				Visibility: portNameToVisibility(p.Name),
-				Url:        service.Annotations[fmt.Sprintf("gitpod/port-url-%d", p.Port)],
-			}
-
-			// enforce the cannonical form where target defaults to port
-			if port.Port == port.Target {
-				port.Target = 0
-			}
-
-			exposedPorts = append(exposedPorts, port)
-		}
-	}
-	status.Spec.ExposedPorts = exposedPorts
-
-	var serviceExists api.WorkspaceConditionBool
-	if wso.TheiaService != nil || wso.PortsService != nil {
-		serviceExists = api.WorkspaceConditionBool_TRUE
-	} else {
-		serviceExists = api.WorkspaceConditionBool_FALSE
-	}
-	status.Conditions.ServiceExists = serviceExists
-
-	if wso.Pod == nil {
-		status.Conditions.Deployed = api.WorkspaceConditionBool_FALSE
-	} else {
-		status.Conditions.Deployed = api.WorkspaceConditionBool_TRUE
-	}
-
 	return status, nil
 }
 
@@ -368,6 +296,8 @@ func getWorkspaceMetadata(pod *corev1.Pod) *api.WorkspaceMetadata {
 func (m *Manager) extractStatusFromPod(result *api.WorkspaceStatus, wso workspaceObjects) error {
 	pod := wso.Pod
 
+	result.Spec.ExposedPorts = extractExposedPorts(pod).Ports
+
 	// check failure states, i.e. determine value of result.Failed
 	failure, phase := extractFailure(wso)
 	result.Conditions.Failed = failure
@@ -666,9 +596,7 @@ func extractFailure(wso workspaceObjects) (string, *api.WorkspacePhase) {
 		}
 
 		// ideally we do not just use evt.Message as failure reason because it contains internal paths and is not useful for the user
-		if strings.Contains(evt.Message, theiaVolumeName) {
-			return "cannot mount Theia", nil
-		} else if strings.Contains(evt.Message, workspaceVolumeName) {
+		if strings.Contains(evt.Message, workspaceVolumeName) {
 			return "cannot mount workspace", nil
 		} else {
 			// if this happens we did not do a good job because that means we've introduced another volume to the pod
diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_broken_resource_request.json b/components/ws-manager/pkg/manager/testdata/cdwp_broken_resource_request.json
index 36ca53f13fc72c..14b60d55095864 100644
--- a/components/ws-manager/pkg/manager/testdata/cdwp_broken_resource_request.json
+++ b/components/ws-manager/pkg/manager/testdata/cdwp_broken_resource_request.json
@@ -11,8 +11,7 @@
         },
         "ports": [
             {
-                "port": 8080,
-                "target": 38080
+                "port": 8080
             }
         ],
         "envvars": [
diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_empty_resource_req.json b/components/ws-manager/pkg/manager/testdata/cdwp_empty_resource_req.json
index 8b592d209a1c14..698ba2c531c570 100644
--- a/components/ws-manager/pkg/manager/testdata/cdwp_empty_resource_req.json
+++ b/components/ws-manager/pkg/manager/testdata/cdwp_empty_resource_req.json
@@ -11,8 +11,7 @@
         },
         "ports": [
             {
-                "port": 8080,
-                "target": 38080
+                "port": 8080
             }
         ],
         "envvars": [
diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_fixedresources.json b/components/ws-manager/pkg/manager/testdata/cdwp_fixedresources.json
index 265f3f68839995..8134a4207d7532 100644
--- a/components/ws-manager/pkg/manager/testdata/cdwp_fixedresources.json
+++ b/components/ws-manager/pkg/manager/testdata/cdwp_fixedresources.json
@@ -15,8 +15,7 @@
         },
         "ports": [
             {
-                "port": 8080,
-                "target": 38080
+                "port": 8080
             }
         ],
         "envvars": [
diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_fullworkspacebackup.json b/components/ws-manager/pkg/manager/testdata/cdwp_fullworkspacebackup.json
index 5040155bdf7790..3ae41153e1ee37 100644
--- a/components/ws-manager/pkg/manager/testdata/cdwp_fullworkspacebackup.json
+++ b/components/ws-manager/pkg/manager/testdata/cdwp_fullworkspacebackup.json
@@ -15,8 +15,7 @@
         },
         "ports": [
             {
-                "port": 8080,
-                "target": 38080
+                "port": 8080
             }
         ],
         "envvars": [
diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_ghost.json b/components/ws-manager/pkg/manager/testdata/cdwp_ghost.json
index 85993dedf2d5e5..6aca87bda7802c 100644
--- a/components/ws-manager/pkg/manager/testdata/cdwp_ghost.json
+++ b/components/ws-manager/pkg/manager/testdata/cdwp_ghost.json
@@ -19,8 +19,7 @@
           },
           "ports": [
               {
-                  "port": 8080,
-                  "target": 38080
+                  "port": 8080
               }
           ],
           "envvars": [
diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_imagebuild.json b/components/ws-manager/pkg/manager/testdata/cdwp_imagebuild.json
index 36f86836145cf5..a607e96d4f00b5 100644
--- a/components/ws-manager/pkg/manager/testdata/cdwp_imagebuild.json
+++ b/components/ws-manager/pkg/manager/testdata/cdwp_imagebuild.json
@@ -19,8 +19,7 @@
           },
           "ports": [
               {
-                  "port": 8080,
-                  "target": 38080
+                  "port": 8080
               }
           ],
           "envvars": [
diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_imagebuild_template.json b/components/ws-manager/pkg/manager/testdata/cdwp_imagebuild_template.json
index 7f691d0727002c..cb8666944d5840 100644
--- a/components/ws-manager/pkg/manager/testdata/cdwp_imagebuild_template.json
+++ b/components/ws-manager/pkg/manager/testdata/cdwp_imagebuild_template.json
@@ -69,8 +69,7 @@
             },
             "ports": [
                 {
-                    "port": 8080,
-                    "target": 38080
+                    "port": 8080
                 }
             ],
             "envvars": [
diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_no_ideimage.json b/components/ws-manager/pkg/manager/testdata/cdwp_no_ideimage.json
index 940e8e8f26d8ae..5f2659696b7fe1 100644
--- a/components/ws-manager/pkg/manager/testdata/cdwp_no_ideimage.json
+++ b/components/ws-manager/pkg/manager/testdata/cdwp_no_ideimage.json
@@ -8,8 +8,7 @@
     },
     "ports": [
       {
-        "port": 8080,
-        "target": 38080
+        "port": 8080
       }
     ],
     "envvars": [
diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_prebuild.json b/components/ws-manager/pkg/manager/testdata/cdwp_prebuild.json
index 9b44805ded8561..99849dcac0d301 100644
--- a/components/ws-manager/pkg/manager/testdata/cdwp_prebuild.json
+++ b/components/ws-manager/pkg/manager/testdata/cdwp_prebuild.json
@@ -20,8 +20,7 @@
             },
             "ports": [
                 {
-                    "port": 8080,
-                    "target": 38080
+                    "port": 8080
                 }
             ],
             "envvars": [
diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_prebuild_template.json b/components/ws-manager/pkg/manager/testdata/cdwp_prebuild_template.json
index bef391b1c4b87a..fc613f02b1cc43 100644
--- a/components/ws-manager/pkg/manager/testdata/cdwp_prebuild_template.json
+++ b/components/ws-manager/pkg/manager/testdata/cdwp_prebuild_template.json
@@ -69,8 +69,7 @@
             },
             "ports": [
                 {
-                    "port": 8080,
-                    "target": 38080
+                    "port": 8080
                 }
             ],
             "envvars": [
diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_prebuild_template_override_resources.json b/components/ws-manager/pkg/manager/testdata/cdwp_prebuild_template_override_resources.json
index 76fc1f88415f71..4d9b862d954869 100644
--- a/components/ws-manager/pkg/manager/testdata/cdwp_prebuild_template_override_resources.json
+++ b/components/ws-manager/pkg/manager/testdata/cdwp_prebuild_template_override_resources.json
@@ -88,8 +88,7 @@
       },
       "ports": [
         {
-          "port": 8080,
-          "target": 38080
+          "port": 8080
         }
       ],
       "envvars": [
diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_probe.json b/components/ws-manager/pkg/manager/testdata/cdwp_probe.json
index 11d9da439ddd89..bb3e3573d916b5 100644
--- a/components/ws-manager/pkg/manager/testdata/cdwp_probe.json
+++ b/components/ws-manager/pkg/manager/testdata/cdwp_probe.json
@@ -20,8 +20,7 @@
             },
             "ports": [
                 {
-                    "port": 8080,
-                    "target": 38080
+                    "port": 8080
                 }
             ],
             "envvars": [
diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_readinessprobe.json b/components/ws-manager/pkg/manager/testdata/cdwp_readinessprobe.json
index ab1806e539f092..c8863aeb35be76 100644
--- a/components/ws-manager/pkg/manager/testdata/cdwp_readinessprobe.json
+++ b/components/ws-manager/pkg/manager/testdata/cdwp_readinessprobe.json
@@ -25,8 +25,7 @@
         },
         "ports": [
             {
-                "port": 8080,
-                "target": 38080
+                "port": 8080
             }
         ],
         "envvars": [
diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_template.json b/components/ws-manager/pkg/manager/testdata/cdwp_template.json
index 6a06ad19db783b..900c6ee326ea2a 100644
--- a/components/ws-manager/pkg/manager/testdata/cdwp_template.json
+++ b/components/ws-manager/pkg/manager/testdata/cdwp_template.json
@@ -57,8 +57,7 @@
         },
         "ports": [
             {
-                "port": 8080,
-                "target": 38080
+                "port": 8080
             }
         ],
         "envvars": [
diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_userns.json b/components/ws-manager/pkg/manager/testdata/cdwp_userns.json
index 4d0899814b9d45..828fe2efa1a79c 100644
--- a/components/ws-manager/pkg/manager/testdata/cdwp_userns.json
+++ b/components/ws-manager/pkg/manager/testdata/cdwp_userns.json
@@ -12,8 +12,7 @@
         },
         "ports": [
             {
-                "port": 8080,
-                "target": 38080
+                "port": 8080
             }
         ],
         "envvars": [
diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_withaffinity_regular.json b/components/ws-manager/pkg/manager/testdata/cdwp_withaffinity_regular.json
index 6e4ba6cc147d4e..3cf16cdf340dbc 100644
--- a/components/ws-manager/pkg/manager/testdata/cdwp_withaffinity_regular.json
+++ b/components/ws-manager/pkg/manager/testdata/cdwp_withaffinity_regular.json
@@ -12,8 +12,7 @@
         },
         "ports": [
             {
-                "port": 8080,
-                "target": 38080
+                "port": 8080
             }
         ],
         "envvars": [
diff --git a/components/ws-manager/pkg/manager/testdata/cdwp_withaffinityheadless.json b/components/ws-manager/pkg/manager/testdata/cdwp_withaffinityheadless.json
index 9f23c7ef081417..c92d209fcbb63f 100644
--- a/components/ws-manager/pkg/manager/testdata/cdwp_withaffinityheadless.json
+++ b/components/ws-manager/pkg/manager/testdata/cdwp_withaffinityheadless.json
@@ -20,8 +20,7 @@
             },
             "ports": [
                 {
-                    "port": 8080,
-                    "target": 38080
+                    "port": 8080
                 }
             ],
             "envvars": [
diff --git a/components/ws-manager/pkg/manager/testdata/controlPort_changeTargetPort.nt.golden b/components/ws-manager/pkg/manager/testdata/controlPort_changeTargetPort.nt.golden
index a22b42c654a652..d355758d28b239 100644
--- a/components/ws-manager/pkg/manager/testdata/controlPort_changeTargetPort.nt.golden
+++ b/components/ws-manager/pkg/manager/testdata/controlPort_changeTargetPort.nt.golden
@@ -1,45 +1,10 @@
 {
-    "portsService": {
-        "metadata": {
-            "name": "ws-serviceprefix-ports",
-            "namespace": "default",
-            "creationTimestamp": null,
-            "labels": {
-                "gpwsman": "true",
-                "metaID": "",
-                "serviceType": "ports",
-                "workspaceID": "foobar"
-            },
-            "annotations": {
-                "gitpod/port-url-3000": "3000--servicePrefix-gitpod.io"
-            }
-        },
-        "spec": {
-            "ports": [
-                {
-                    "name": "p3000-public",
-                    "protocol": "TCP",
-                    "port": 3000,
-                    "targetPort": 38080
-                }
-            ],
-            "selector": {
-                "gpwsman": "true",
-                "workspaceID": "foobar"
-            },
-            "type": "ClusterIP"
-        },
-        "status": {
-            "loadBalancer": {}
-        }
-    },
     "response": {},
     "postChangeStatus": [
         {
             "port": 3000,
-            "target": 38080,
             "visibility": 1,
-            "url": "3000--servicePrefix-gitpod.io"
+            "url": "3000-foobar-servicePrefix-gitpod.io"
         }
     ]
 }
\ No newline at end of file
diff --git a/components/ws-manager/pkg/manager/testdata/controlPort_changeTargetPort.nt.json b/components/ws-manager/pkg/manager/testdata/controlPort_changeTargetPort.nt.json
index d79751fb89d647..1b3611b97fcf46 100644
--- a/components/ws-manager/pkg/manager/testdata/controlPort_changeTargetPort.nt.json
+++ b/components/ws-manager/pkg/manager/testdata/controlPort_changeTargetPort.nt.json
@@ -16,8 +16,7 @@
                 {
                     "name": "p3000",
                     "protocol": "TCP",
-                    "port": 3000,
-                    "targetPort": 3000
+                    "port": 3000
                 }
             ],
             "selector": {
@@ -35,7 +34,6 @@
         "expose": true,
         "spec": {
             "port": 3000,
-            "target": 38080,
             "visibility": 1
         }
     }
diff --git a/components/ws-manager/pkg/manager/testdata/controlPort_changeVisibility.golden b/components/ws-manager/pkg/manager/testdata/controlPort_changeVisibility.golden
index 4412501ce77ab0..e9e381e751deae 100644
--- a/components/ws-manager/pkg/manager/testdata/controlPort_changeVisibility.golden
+++ b/components/ws-manager/pkg/manager/testdata/controlPort_changeVisibility.golden
@@ -1,36 +1,4 @@
 {
-    "portsService": {
-        "metadata": {
-            "name": "ws-serviceprefix-ports",
-            "namespace": "default",
-            "creationTimestamp": null,
-            "labels": {
-                "gpwsman": "true",
-                "workspaceID": "foobar"
-            },
-            "annotations": {
-                "gitpod/port-url-3000": "3000-foobar-servicePrefix-gitpod.io"
-            }
-        },
-        "spec": {
-            "ports": [
-                {
-                    "name": "p3000-private",
-                    "protocol": "TCP",
-                    "port": 3000,
-                    "targetPort": 3000
-                }
-            ],
-            "selector": {
-                "gpwsman": "true",
-                "workspaceID": "foobar"
-            },
-            "type": "ClusterIP"
-        },
-        "status": {
-            "loadBalancer": {}
-        }
-    },
     "response": {},
     "postChangeStatus": [
         {
diff --git a/components/ws-manager/pkg/manager/testdata/controlPort_createPrivate.golden b/components/ws-manager/pkg/manager/testdata/controlPort_createPrivate.golden
index f7e36096309b40..e9e381e751deae 100644
--- a/components/ws-manager/pkg/manager/testdata/controlPort_createPrivate.golden
+++ b/components/ws-manager/pkg/manager/testdata/controlPort_createPrivate.golden
@@ -1,43 +1,9 @@
 {
-    "portsService": {
-        "metadata": {
-            "name": "ws-serviceprefix-ports",
-            "namespace": "default",
-            "creationTimestamp": null,
-            "labels": {
-                "gpwsman": "true",
-                "metaID": "",
-                "serviceType": "ports",
-                "workspaceID": "foobar"
-            },
-            "annotations": {
-                "gitpod/port-url-3000": "3000--servicePrefix-gitpod.io"
-            }
-        },
-        "spec": {
-            "ports": [
-                {
-                    "name": "p3000-private",
-                    "protocol": "TCP",
-                    "port": 3000,
-                    "targetPort": 3000
-                }
-            ],
-            "selector": {
-                "gpwsman": "true",
-                "workspaceID": "foobar"
-            },
-            "type": "ClusterIP"
-        },
-        "status": {
-            "loadBalancer": {}
-        }
-    },
     "response": {},
     "postChangeStatus": [
         {
             "port": 3000,
-            "url": "3000--servicePrefix-gitpod.io"
+            "url": "3000-foobar-servicePrefix-gitpod.io"
         }
     ]
 }
\ No newline at end of file
diff --git a/components/ws-manager/pkg/manager/testdata/controlPort_firstClose.json b/components/ws-manager/pkg/manager/testdata/controlPort_firstClose.json
index e3292c6682ebaa..0f4ed805947f3d 100644
--- a/components/ws-manager/pkg/manager/testdata/controlPort_firstClose.json
+++ b/components/ws-manager/pkg/manager/testdata/controlPort_firstClose.json
@@ -15,8 +15,7 @@
                 {
                     "name": "p3000",
                     "protocol": "TCP",
-                    "port": 3000,
-                    "targetPort": 3000
+                    "port": 3000
                 }
             ],
             "selector": {
diff --git a/components/ws-manager/pkg/manager/testdata/controlPort_firstOpen_withTargetPort.golden b/components/ws-manager/pkg/manager/testdata/controlPort_firstOpen_withTargetPort.golden
index 3121dd8ec336c4..908dd405b0c3e9 100644
--- a/components/ws-manager/pkg/manager/testdata/controlPort_firstOpen_withTargetPort.golden
+++ b/components/ws-manager/pkg/manager/testdata/controlPort_firstOpen_withTargetPort.golden
@@ -1,45 +1,10 @@
 {
-    "portsService": {
-        "metadata": {
-            "name": "ws-serviceprefix-ports",
-            "namespace": "default",
-            "creationTimestamp": null,
-            "labels": {
-                "gpwsman": "true",
-                "metaID": "",
-                "serviceType": "ports",
-                "workspaceID": "foobar"
-            },
-            "annotations": {
-                "gitpod/port-url-8080": "8080--servicePrefix-gitpod.io"
-            }
-        },
-        "spec": {
-            "ports": [
-                {
-                    "name": "p8080-public",
-                    "protocol": "TCP",
-                    "port": 8080,
-                    "targetPort": 38080
-                }
-            ],
-            "selector": {
-                "gpwsman": "true",
-                "workspaceID": "foobar"
-            },
-            "type": "ClusterIP"
-        },
-        "status": {
-            "loadBalancer": {}
-        }
-    },
     "response": {},
     "postChangeStatus": [
         {
             "port": 8080,
-            "target": 38080,
             "visibility": 1,
-            "url": "8080--servicePrefix-gitpod.io"
+            "url": "8080-foobar-servicePrefix-gitpod.io"
         }
     ]
 }
\ No newline at end of file
diff --git a/components/ws-manager/pkg/manager/testdata/controlPort_firstOpen_withTargetPort.json b/components/ws-manager/pkg/manager/testdata/controlPort_firstOpen_withTargetPort.json
index d233c242e50445..76c5026f323227 100644
--- a/components/ws-manager/pkg/manager/testdata/controlPort_firstOpen_withTargetPort.json
+++ b/components/ws-manager/pkg/manager/testdata/controlPort_firstOpen_withTargetPort.json
@@ -4,7 +4,6 @@
         "expose": true,
         "spec": {
             "port": 8080,
-            "target": 38080,
             "visibility": 1
         }
     }
diff --git a/components/ws-manager/pkg/manager/testdata/controlPort_secondOpen_withTargetPort.golden b/components/ws-manager/pkg/manager/testdata/controlPort_secondOpen_withTargetPort.golden
index 97e1ed9042e5ec..908dd405b0c3e9 100644
--- a/components/ws-manager/pkg/manager/testdata/controlPort_secondOpen_withTargetPort.golden
+++ b/components/ws-manager/pkg/manager/testdata/controlPort_secondOpen_withTargetPort.golden
@@ -1,54 +1,8 @@
 {
-    "portsService": {
-        "metadata": {
-            "name": "ws-serviceprefix-ports",
-            "namespace": "default",
-            "creationTimestamp": null,
-            "labels": {
-                "gpwsman": "true",
-                "workspaceID": "foobar",
-                "workspaceType": "regular"
-            },
-            "annotations": {
-                "gitpod/port-url-3000": "3000-foobar-servicePrefix-gitpod.io",
-                "gitpod/port-url-8080": "8080-foobar-servicePrefix-gitpod.io"
-            }
-        },
-        "spec": {
-            "ports": [
-                {
-                    "name": "p3000-public",
-                    "protocol": "TCP",
-                    "port": 3000,
-                    "targetPort": 3000
-                },
-                {
-                    "name": "p8080-public",
-                    "protocol": "TCP",
-                    "port": 8080,
-                    "targetPort": 38080
-                }
-            ],
-            "selector": {
-                "gpwsman": "true",
-                "workspaceID": "foobar"
-            },
-            "type": "ClusterIP"
-        },
-        "status": {
-            "loadBalancer": {}
-        }
-    },
     "response": {},
     "postChangeStatus": [
-        {
-            "port": 3000,
-            "visibility": 1,
-            "url": "3000-foobar-servicePrefix-gitpod.io"
-        },
         {
             "port": 8080,
-            "target": 38080,
             "visibility": 1,
             "url": "8080-foobar-servicePrefix-gitpod.io"
         }
diff --git a/components/ws-manager/pkg/manager/testdata/controlPort_secondOpen_withTargetPort.json b/components/ws-manager/pkg/manager/testdata/controlPort_secondOpen_withTargetPort.json
index c411c0db02f0fb..7825335b58d23b 100644
--- a/components/ws-manager/pkg/manager/testdata/controlPort_secondOpen_withTargetPort.json
+++ b/components/ws-manager/pkg/manager/testdata/controlPort_secondOpen_withTargetPort.json
@@ -15,8 +15,7 @@
                 {
                     "name": "p3000-public",
                     "protocol": "TCP",
-                    "port": 3000,
-                    "targetPort": 3000
+                    "port": 3000
                 }
             ],
             "selector": {
@@ -34,7 +33,6 @@
         "expose": true,
         "spec": {
             "port": 8080,
-            "target": 38080,
             "visibility": 1
         }
     }
diff --git a/components/ws-manager/pkg/manager/testdata/getWorkspaces_podOnly.json b/components/ws-manager/pkg/manager/testdata/getWorkspaces_podOnly.json
index c2f64c3d3df572..f42ceb32fbbba9 100644
--- a/components/ws-manager/pkg/manager/testdata/getWorkspaces_podOnly.json
+++ b/components/ws-manager/pkg/manager/testdata/getWorkspaces_podOnly.json
@@ -193,11 +193,6 @@
               {
                 "mountPath": "/workspace",
                 "name": "vol-this-workspace"
-              },
-              {
-                "mountPath": "/theia",
-                "name": "vol-this-theia",
-                "readOnly": true
               }
             ]
           }
@@ -243,13 +238,6 @@
           }
         ],
         "volumes": [
-          {
-            "hostPath": {
-              "path": "/mnt/disks/ssd0/theia/theia-master.2049",
-              "type": "Directory"
-            },
-            "name": "vol-this-theia"
-          },
           {
             "hostPath": {
               "path": "/mnt/disks/ssd0/workspaces/d6835d33-116f-4d3f-aeb6-ad628f4004b6",
diff --git a/components/ws-manager/pkg/manager/testdata/status_brokenScheduler_UNKNOWN00.golden b/components/ws-manager/pkg/manager/testdata/status_brokenScheduler_UNKNOWN00.golden
index fc9a3a3ac95797..0c4d564147b57d 100644
--- a/components/ws-manager/pkg/manager/testdata/status_brokenScheduler_UNKNOWN00.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_brokenScheduler_UNKNOWN00.golden
@@ -15,9 +15,7 @@
             "ide_image": {}
         },
         "conditions": {
-            "failed": "MatchNodeSelector: Pod Predicate MatchNodeSelector failed",
-            "service_exists": 1,
-            "deployed": 1
+            "failed": "MatchNodeSelector: Pod Predicate MatchNodeSelector failed"
         },
         "runtime": {
             "node_name": "gke-gitpod-dev-default-pool-b25aa276-3tl2",
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 2f3f9bc2d9f912..cb87dfe84e80b0 100644
--- a/components/ws-manager/pkg/manager/testdata/status_brokenScheduler_UNKNOWN00.json
+++ b/components/ws-manager/pkg/manager/testdata/status_brokenScheduler_UNKNOWN00.json
@@ -31,13 +31,6 @@
         },
         "spec": {
             "volumes": [
-                {
-                    "name": "vol-this-theia",
-                    "hostPath": {
-                        "path": "/mnt/disks/ssd0/theia/theia-cw-scheduler.17",
-                        "type": "Directory"
-                    }
-                },
                 {
                     "name": "vol-this-workspace",
                     "hostPath": {
@@ -143,11 +136,6 @@
                         {
                             "name": "vol-this-workspace",
                             "mountPath": "/workspace"
-                        },
-                        {
-                            "name": "vol-this-theia",
-                            "readOnly": true,
-                            "mountPath": "/theia"
                         }
                     ],
                     "livenessProbe": {
diff --git a/components/ws-manager/pkg/manager/testdata/status_cannotPull_004_CREATING00.golden b/components/ws-manager/pkg/manager/testdata/status_cannotPull_004_CREATING00.golden
index 668e89ee3af00e..fcf1e41f8305a8 100644
--- a/components/ws-manager/pkg/manager/testdata/status_cannotPull_004_CREATING00.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_cannotPull_004_CREATING00.golden
@@ -26,9 +26,7 @@
         },
         "phase": 2,
         "conditions": {
-            "failed": "cannot pull image: rpc error: code = FailedPrecondition desc = failed to pull and unpack image \"reg.gitpod.io:31001/remote/5031df46-db5e-43ae-91bd-1448305c001d:latest\": failed commit on ref \"layer-sha256:6633ce2524dfae110cac2159a4f8490d198612d12abc1420486c52fbcf30b8b1\": \"layer-sha256:6633ce2524dfae110cac2159a4f8490d198612d12abc1420486c52fbcf30b8b1\" failed size validation: 33554502 != 64598931: failed precondition",
-            "service_exists": 1,
-            "deployed": 1
+            "failed": "cannot pull image: rpc error: code = FailedPrecondition desc = failed to pull and unpack image \"reg.gitpod.io:31001/remote/5031df46-db5e-43ae-91bd-1448305c001d:latest\": failed commit on ref \"layer-sha256:6633ce2524dfae110cac2159a4f8490d198612d12abc1420486c52fbcf30b8b1\": \"layer-sha256:6633ce2524dfae110cac2159a4f8490d198612d12abc1420486c52fbcf30b8b1\" failed size validation: 33554502 != 64598931: failed precondition"
         },
         "runtime": {
             "node_name": "gke-gp-prod-ws-us14-us-workspace-pool-61eed5be-kq0k",
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 18efbef0d70496..9d3e7e7f8b8fb5 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
@@ -181,6 +181,7 @@
         "container.apparmor.security.beta.kubernetes.io/workspace": "unconfined",
         "gitpod/never-ready": "true",
         "gitpod/imageSpec": "CmZldS5nY3IuaW8vZ2l0cG9kLWRldi93b3Jrc3BhY2UtaW1hZ2VzOjAxYWJiMzFkZDc2YTFlMjg4NWVhMWQ1YzNiMDZhNGVhZDEwYWUzNjJlZTIxMzQ4NDI4ODM1ZDBjOGIyODZlM2ESWGV1Lmdjci5pby9naXRwb2QtY29yZS1kZXYvYnVpbGQvaWRlL2NvZGU6Y29tbWl0LTA5NDFhMDgwNWRjM2M3MzQ1YzQ1YmQ5MjYzMTdlYWYwNDVkNGI3ZmI=",
+        "gitpod/exposedPorts": "CjwIuBciN2h0dHBzOi8vMzAwMC1zaWx2ZXItZG9ybW91c2UtaXM3MzNwcmcud3MtdXMxNC5naXRwb2QuaW8=",
         "prometheus.io/path": "/metrics",
         "cni.projectcalico.org/podIPs": "10.4.35.173/32",
         "gitpod/contentInitializer": "[redacted]",
diff --git a/components/ws-manager/pkg/manager/testdata/status_cannotPull_005_STOPPED00.golden b/components/ws-manager/pkg/manager/testdata/status_cannotPull_005_STOPPED00.golden
index 9423f919504718..b99d818387e483 100644
--- a/components/ws-manager/pkg/manager/testdata/status_cannotPull_005_STOPPED00.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_cannotPull_005_STOPPED00.golden
@@ -26,9 +26,7 @@
         },
         "phase": 6,
         "conditions": {
-            "failed": "cannot pull image: Back-off pulling image \"reg.gitpod.io:31001/remote/5031df46-db5e-43ae-91bd-1448305c001d\"",
-            "service_exists": 1,
-            "deployed": 1
+            "failed": "cannot pull image: Back-off pulling image \"reg.gitpod.io:31001/remote/5031df46-db5e-43ae-91bd-1448305c001d\""
         },
         "runtime": {
             "node_name": "gke-gp-prod-ws-us14-us-workspace-pool-61eed5be-kq0k",
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 948c2d8a94d9d1..c89fc24f7ede92 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
@@ -12,6 +12,7 @@
         "gitpod/contentInitializer": "[redacted]",
         "kubernetes.io/psp": "default-ns-workspace",
         "gitpod/imageSpec": "CmZldS5nY3IuaW8vZ2l0cG9kLWRldi93b3Jrc3BhY2UtaW1hZ2VzOjAxYWJiMzFkZDc2YTFlMjg4NWVhMWQ1YzNiMDZhNGVhZDEwYWUzNjJlZTIxMzQ4NDI4ODM1ZDBjOGIyODZlM2ESWGV1Lmdjci5pby9naXRwb2QtY29yZS1kZXYvYnVpbGQvaWRlL2NvZGU6Y29tbWl0LTA5NDFhMDgwNWRjM2M3MzQ1YzQ1YmQ5MjYzMTdlYWYwNDVkNGI3ZmI=",
+        "gitpod/exposedPorts": "CjwIuBciN2h0dHBzOi8vMzAwMC1zaWx2ZXItZG9ybW91c2UtaXM3MzNwcmcud3MtdXMxNC5naXRwb2QuaW8=",
         "prometheus.io/scrape": "true",
         "cluster-autoscaler.kubernetes.io/safe-to-evict": "false",
         "gitpod/url": "https://silver-dormouse-is733prg.ws-us14.gitpod.io",
diff --git a/components/ws-manager/pkg/manager/testdata/status_containerd4214_STOPPING00.golden b/components/ws-manager/pkg/manager/testdata/status_containerd4214_STOPPING00.golden
index 3016207ea2ee29..cf3e2351c6078e 100644
--- a/components/ws-manager/pkg/manager/testdata/status_containerd4214_STOPPING00.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_containerd4214_STOPPING00.golden
@@ -20,8 +20,7 @@
         },
         "phase": 6,
         "conditions": {
-            "final_backup_complete": 1,
-            "deployed": 1
+            "final_backup_complete": 1
         },
         "repo": {
             "branch": "master",
diff --git a/components/ws-manager/pkg/manager/testdata/status_contentInitFailed_005_STOPPED00.golden b/components/ws-manager/pkg/manager/testdata/status_contentInitFailed_005_STOPPED00.golden
index be4ea00fa78eb7..d52550775de1a4 100644
--- a/components/ws-manager/pkg/manager/testdata/status_contentInitFailed_005_STOPPED00.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_contentInitFailed_005_STOPPED00.golden
@@ -21,8 +21,7 @@
         },
         "phase": 6,
         "conditions": {
-            "failed": "cannot initialize workspace: cannot initialize workspace: content initializer failed",
-            "deployed": 1
+            "failed": "cannot initialize workspace: cannot initialize workspace: content initializer failed"
         },
         "runtime": {
             "node_name": "gke-gp-prod-ws-us15-us--headless-pool-64a87cf8-bw7v",
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 48d48015ac9205..199d06ad2d26ac 100644
--- a/components/ws-manager/pkg/manager/testdata/status_degenerate_noContainers.json
+++ b/components/ws-manager/pkg/manager/testdata/status_degenerate_noContainers.json
@@ -34,13 +34,6 @@
             "type": "DirectoryOrCreate"
           }
         },
-        {
-          "name": "vol-this-theia",
-          "hostPath": {
-            "path": "/tmp/theia/theia-xyz",
-            "type": "Directory"
-          }
-        },
         {
           "name": "default-token-6qnvx",
           "secret": {
diff --git a/components/ws-manager/pkg/manager/testdata/status_degenerate_noWorkspaceID.json b/components/ws-manager/pkg/manager/testdata/status_degenerate_noWorkspaceID.json
index 181e598b41374b..6af7fda796a853 100644
--- a/components/ws-manager/pkg/manager/testdata/status_degenerate_noWorkspaceID.json
+++ b/components/ws-manager/pkg/manager/testdata/status_degenerate_noWorkspaceID.json
@@ -31,13 +31,6 @@
             "type": "DirectoryOrCreate"
           }
         },
-        {
-          "name": "vol-this-theia",
-          "hostPath": {
-            "path": "/tmp/theia/theia-xyz",
-            "type": "Directory"
-          }
-        },
         {
           "name": "default-token-6qnvx",
           "secret": {
@@ -109,10 +102,6 @@
               "name": "vol-this-workspace",
               "mountPath": "/workspace"
             },
-            {
-              "name": "vol-this-theia",
-              "mountPath": "/theia"
-            },
             {
               "name": "default-token-6qnvx",
               "readOnly": true,
diff --git a/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED01.golden b/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED01.golden
index 852f4f8ebd81bc..5bd411f79a11f9 100644
--- a/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED01.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED01.golden
@@ -21,8 +21,7 @@
         "phase": 6,
         "conditions": {
             "failed": "last backup failed: testing the backup failure mode. Please contact support if you need the workspace data.",
-            "final_backup_complete": 1,
-            "deployed": 1
+            "final_backup_complete": 1
         },
         "runtime": {
             "node_name": "gke-dev-workload-1-49d27f81-n6zr",
diff --git a/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED02.golden b/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED02.golden
index 8eecbd1db1a369..6150d817593dda 100644
--- a/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED02.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED02.golden
@@ -20,8 +20,7 @@
         },
         "phase": 6,
         "conditions": {
-            "final_backup_complete": 1,
-            "deployed": 1
+            "final_backup_complete": 1
         },
         "repo": {
             "branch": "master",
diff --git a/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED03.golden b/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED03.golden
index 481757dafff4f4..837e60135b5515 100644
--- a/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED03.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED03.golden
@@ -32,9 +32,7 @@
         },
         "phase": 6,
         "conditions": {
-            "service_exists": 1,
-            "final_backup_complete": 1,
-            "deployed": 1
+            "final_backup_complete": 1
         },
         "repo": {
             "branch": "master",
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 087b44dd17fcbe..2a52ebe756148b 100644
--- a/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED03.json
+++ b/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPED03.json
@@ -33,6 +33,7 @@
         "gitpod/firstUserActivity": "2021-03-19T08:48:16.844313148Z",
         "gitpod/id": "7bc61b1f-60ae-4bfb-b01c-6339a018b3e8",
         "gitpod/imageSpec": "CnRldS5nY3IuaW8vZ2l0cG9kLWNvcmUtZGV2L3JlZ2lzdHJ5L3dvcmtzcGFjZS1pbWFnZXM6NGQzZmFhMzMyMmE3ZWNiYTgyNDg5ODZkMGJjMWE1MjkzYjIwZmRjYzNjZjFkZWI1YzJiZjZmZDgwYzEyNGQxMhI3ZXUuZ2NyLmlvL2dpdHBvZC1jb3JlLWRldi9idWlsZC9pZGUvdGhlaWE6Y3ctbm8tcGxpcy4xNw==",
+        "gitpod/exposedPorts": "ClQIiCcYASJNaHR0cHM6Ly81MDAwLWdyZWVuLW1vc3F1aXRvLWd2a2xveWZ5LndzLWRldi5jdy1uby1wbGlzLnN0YWdpbmcuZ2l0cG9kLWRldi5jb20KVgiRlwIYASJOaHR0cHM6Ly8zNTcyOS1ncmVlbi1tb3NxdWl0by1ndmtsb3lmeS53cy1kZXYuY3ctbm8tcGxpcy5zdGFnaW5nLmdpdHBvZC1kZXYuY29t",
         "gitpod/ownerToken": "k#C;]\u003ek8GvN=[3X2_}hVY$Z\u0026E-VV)Dux",
         "gitpod/servicePrefix": "green-mosquito-gvkloyfy",
         "gitpod/url": "https://green-mosquito-gvkloyfy.ws-dev.cw-no-plis.staging.gitpod-dev.com",
diff --git a/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPING01.golden b/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPING01.golden
index b8eb7174575101..7228299dbfffef 100644
--- a/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPING01.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPING01.golden
@@ -16,7 +16,7 @@
             "exposed_ports": [
                 {
                     "port": 5000,
-                    "target": 60000,
+                    "visibility": 1,
                     "url": "https://5000-green-mosquito-gvkloyfy.ws-dev.cw-no-plis.staging.gitpod-dev.com"
                 },
                 {
@@ -31,10 +31,7 @@
             }
         },
         "phase": 5,
-        "conditions": {
-            "service_exists": 1,
-            "deployed": 1
-        },
+        "conditions": {},
         "runtime": {
             "node_name": "gke-dev-workload-1-49d27f81-n6zr",
             "pod_name": "ws-60a694b3-ac7d-4a24-8ad9-2d8d5eb56de0",
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 2c72228d034f7d..fdc7a7cc5d81f6 100644
--- a/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPING01.json
+++ b/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPING01.json
@@ -32,6 +32,7 @@
         "gitpod/firstUserActivity": "2021-03-19T08:36:23.689992601Z",
         "gitpod/id": "60a694b3-ac7d-4a24-8ad9-2d8d5eb56de0",
         "gitpod/imageSpec": "CnRldS5nY3IuaW8vZ2l0cG9kLWNvcmUtZGV2L3JlZ2lzdHJ5L3dvcmtzcGFjZS1pbWFnZXM6NGQzZmFhMzMyMmE3ZWNiYTgyNDg5ODZkMGJjMWE1MjkzYjIwZmRjYzNjZjFkZWI1YzJiZjZmZDgwYzEyNGQxMhI3ZXUuZ2NyLmlvL2dpdHBvZC1jb3JlLWRldi9idWlsZC9pZGUvdGhlaWE6Y3ctbm8tcGxpcy4xNw==",
+        "gitpod/exposedPorts": "ClQIiCcYASJNaHR0cHM6Ly81MDAwLWdyZWVuLW1vc3F1aXRvLWd2a2xveWZ5LndzLWRldi5jdy1uby1wbGlzLnN0YWdpbmcuZ2l0cG9kLWRldi5jb20KVgiRlwIYASJOaHR0cHM6Ly8zNTcyOS1ncmVlbi1tb3NxdWl0by1ndmtsb3lmeS53cy1kZXYuY3ctbm8tcGxpcy5zdGFnaW5nLmdpdHBvZC1kZXYuY29t",
         "gitpod/ownerToken": "XB|7vczG;Z.A^#ea[1=YDXU_Y,Q%UlOl",
         "gitpod/servicePrefix": "green-mosquito-gvkloyfy",
         "gitpod/url": "https://green-mosquito-gvkloyfy.ws-dev.cw-no-plis.staging.gitpod-dev.com",
diff --git a/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPING02.golden b/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPING02.golden
index 6fd64e728beb21..298b6b74e220ac 100644
--- a/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPING02.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_disposal_STOPPING02.golden
@@ -20,8 +20,7 @@
         },
         "phase": 6,
         "conditions": {
-            "final_backup_complete": 1,
-            "deployed": 1
+            "final_backup_complete": 1
         },
         "repo": {
             "branch": "master",
diff --git a/components/ws-manager/pkg/manager/testdata/status_errimgpull.golden b/components/ws-manager/pkg/manager/testdata/status_errimgpull.golden
index 0f3ef2359fdf6f..b2fd2c1261bc1e 100644
--- a/components/ws-manager/pkg/manager/testdata/status_errimgpull.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_errimgpull.golden
@@ -16,9 +16,7 @@
         },
         "phase": 2,
         "conditions": {
-            "failed": "cannot pull image: rpc error: code = Unknown desc = Error response from daemon: Get https://registry.staging-cw-minio-core.svc.cluster.local/v1/_ping: dial tcp: lookup registry.staging-cw-minio-core.svc.cluster.local: no such host",
-            "service_exists": 1,
-            "deployed": 1
+            "failed": "cannot pull image: rpc error: code = Unknown desc = Error response from daemon: Get https://registry.staging-cw-minio-core.svc.cluster.local/v1/_ping: dial tcp: lookup registry.staging-cw-minio-core.svc.cluster.local: no such host"
         },
         "runtime": {
             "node_name": "gke-gitpod-dev-worker-pool-2-184c607e-wl2d",
diff --git a/components/ws-manager/pkg/manager/testdata/status_errimgpull.json b/components/ws-manager/pkg/manager/testdata/status_errimgpull.json
index d37b7f45dc7cc1..f9d86dab820872 100644
--- a/components/ws-manager/pkg/manager/testdata/status_errimgpull.json
+++ b/components/ws-manager/pkg/manager/testdata/status_errimgpull.json
@@ -33,13 +33,6 @@
     },
     "spec": {
       "volumes": [
-        {
-          "name": "vol-this-theia",
-          "hostPath": {
-            "path": "/mnt/disks/ssd0/theia/theia-cw-minio-core.24",
-            "type": "Directory"
-          }
-        },
         {
           "name": "vol-this-workspace",
           "hostPath": {
@@ -130,11 +123,6 @@
             {
               "name": "vol-this-workspace",
               "mountPath": "/workspace"
-            },
-            {
-              "name": "vol-this-theia",
-              "readOnly": true,
-              "mountPath": "/theia"
             }
           ],
           "livenessProbe": {
diff --git a/components/ws-manager/pkg/manager/testdata/status_errimgpull_CREATING01.golden b/components/ws-manager/pkg/manager/testdata/status_errimgpull_CREATING01.golden
index c82e7920eb7e13..481a83ed0b592d 100644
--- a/components/ws-manager/pkg/manager/testdata/status_errimgpull_CREATING01.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_errimgpull_CREATING01.golden
@@ -20,8 +20,7 @@
         },
         "phase": 6,
         "conditions": {
-            "failed": "cannot pull image: Back-off pulling image \"reg.gitpod.io:227/i/79be1e8b-a6de-4572-8627-99ef12303a88:latest\"",
-            "deployed": 1
+            "failed": "cannot pull image: Back-off pulling image \"reg.gitpod.io:227/i/79be1e8b-a6de-4572-8627-99ef12303a88:latest\""
         },
         "runtime": {
             "node_name": "gke-gitpod-dev-worker-pool-1-f039fa9e-2jrb",
diff --git a/components/ws-manager/pkg/manager/testdata/status_failedBeforeStopping_explicitFail.golden b/components/ws-manager/pkg/manager/testdata/status_failedBeforeStopping_explicitFail.golden
index bd604ea0a5f475..e823c25b6056b4 100644
--- a/components/ws-manager/pkg/manager/testdata/status_failedBeforeStopping_explicitFail.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_failedBeforeStopping_explicitFail.golden
@@ -16,8 +16,7 @@
         },
         "phase": 6,
         "conditions": {
-            "failed": "cannot init workspace content: rpc error: code = Internal desc = cannot initialize workspace",
-            "deployed": 1
+            "failed": "cannot init workspace content: rpc error: code = Internal desc = cannot initialize workspace"
         },
         "runtime": {
             "node_name": "gke-gitpod-dev-worker-pool-2-184c607e-fltt",
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 669e58cf44553a..db9b9935c5940b 100644
--- a/components/ws-manager/pkg/manager/testdata/status_failedBeforeStopping_explicitFail.json
+++ b/components/ws-manager/pkg/manager/testdata/status_failedBeforeStopping_explicitFail.json
@@ -37,13 +37,6 @@
     },
     "spec": {
       "volumes": [
-        {
-          "name": "vol-this-theia",
-          "hostPath": {
-            "path": "/mnt/disks/ssd0/theia/theia-gh-2510.63",
-            "type": "Directory"
-          }
-        },
         {
           "name": "vol-this-workspace",
           "hostPath": {
@@ -142,11 +135,6 @@
             {
               "name": "vol-this-workspace",
               "mountPath": "/workspace"
-            },
-            {
-              "name": "vol-this-theia",
-              "readOnly": true,
-              "mountPath": "/theia"
             }
           ],
           "livenessProbe": {
@@ -341,37 +329,6 @@
       "reportingComponent": "",
       "reportingInstance": ""
     },
-    {
-      "metadata": {
-        "name": "ws-4f8ea7b8-b87d-42f2-b8dd-1a32fdbdf0d4.15a986d87a0f948d",
-        "namespace": "staging-gh-2510",
-        "selfLink": "/api/v1/namespaces/staging-gh-2510/events/ws-4f8ea7b8-b87d-42f2-b8dd-1a32fdbdf0d4.15a986d87a0f948d",
-        "uid": "7b206bc8-925e-11e9-97df-42010a8402a0",
-        "resourceVersion": "3503610",
-        "creationTimestamp": "2019-06-19T06:50:10Z"
-      },
-      "involvedObject": {
-        "kind": "Pod",
-        "namespace": "staging-gh-2510",
-        "name": "ws-4f8ea7b8-b87d-42f2-b8dd-1a32fdbdf0d4",
-        "uid": "7b002c5e-925e-11e9-97df-42010a8402a0",
-        "apiVersion": "v1",
-        "resourceVersion": "109986295"
-      },
-      "reason": "SuccessfulMountVolume",
-      "message": "MountVolume.SetUp succeeded for volume \"vol-this-theia\" ",
-      "source": {
-        "component": "kubelet",
-        "host": "gke-gitpod-dev-worker-pool-2-184c607e-fltt"
-      },
-      "firstTimestamp": "2019-06-19T06:50:10Z",
-      "lastTimestamp": "2019-06-19T06:50:10Z",
-      "count": 1,
-      "type": "Normal",
-      "eventTime": null,
-      "reportingComponent": "",
-      "reportingInstance": ""
-    },
     {
       "metadata": {
         "name": "ws-4f8ea7b8-b87d-42f2-b8dd-1a32fdbdf0d4.15a986d87a11aacc",
diff --git a/components/ws-manager/pkg/manager/testdata/status_failedLogs_RUNNING00.golden b/components/ws-manager/pkg/manager/testdata/status_failedLogs_RUNNING00.golden
index 25f1a0845de4c5..4da8240449ca27 100644
--- a/components/ws-manager/pkg/manager/testdata/status_failedLogs_RUNNING00.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_failedLogs_RUNNING00.golden
@@ -27,9 +27,7 @@
         },
         "phase": 4,
         "conditions": {
-            "failed": "IDE failed to start: fork/exec /theia/node_modules/@gitpod/gitpod-ide/startup.sh: no such file or directory",
-            "service_exists": 1,
-            "deployed": 1
+            "failed": "IDE failed to start: fork/exec /theia/node_modules/@gitpod/gitpod-ide/startup.sh: no such file or directory"
         },
         "runtime": {
             "node_name": "gke-dev-workload-7fd27879-kn1v",
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 c47388c9eb3f82..58d812fd04f40b 100644
--- a/components/ws-manager/pkg/manager/testdata/status_failedLogs_RUNNING00.json
+++ b/components/ws-manager/pkg/manager/testdata/status_failedLogs_RUNNING00.json
@@ -25,6 +25,7 @@
         "gitpod/customTimeout": "30m",
         "gitpod/id": "f07f0f2e-08fb-433a-8282-fef07b596909",
         "gitpod/imageSpec": "CnRldS5nY3IuaW8vZ2l0cG9kLWNvcmUtZGV2L3JlZ2lzdHJ5L3dvcmtzcGFjZS1pbWFnZXM6NWM3YzJkMjhkNTM5OTBkMGVjNmI3NmY3MzkxOGIyYTlhZjZlYjJkYmQwNjA4MjI5ODZhYmFkMWJhOTUxMmFhZhJEZXUuZ2NyLmlvL2dpdHBvZC1jb3JlLWRldi9idWlsZC90aGVpYS1pZGU6Y3ctZGVidWctcmVnaXN0cnktZmFjYWRlLjY=",
+        "gitpod/exposedPorts": "Cm8IkD8YASJoaHR0cHM6Ly84MDgwLWJhODI2ZGI5LTlkOTMtNGYzYi1hMTBlLThiYzA4YmJiOTlmMS53cy1kZXYuY3ctZGVidWctcmVnaXN0cnktZmFjYWRlLnN0YWdpbmcuZ2l0cG9kLWRldi5jb20=",
         "gitpod/never-ready": "true",
         "gitpod/ownerToken": "l\u003cM3U,%$Fe3/Y/515B;/*D:1HhQAaq0c",
         "gitpod/servicePrefix": "ba826db9-9d93-4f3b-a10e-8bc08bbb99f1",
diff --git a/components/ws-manager/pkg/manager/testdata/status_failedPending_evicted_UNKNOWN01.golden b/components/ws-manager/pkg/manager/testdata/status_failedPending_evicted_UNKNOWN01.golden
index ab7cb4f8389a0b..3489c328886bf1 100644
--- a/components/ws-manager/pkg/manager/testdata/status_failedPending_evicted_UNKNOWN01.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_failedPending_evicted_UNKNOWN01.golden
@@ -16,9 +16,7 @@
             "ide_image": {}
         },
         "conditions": {
-            "failed": "Evicted: Pod The node was low on resource: [DiskPressure]. ",
-            "service_exists": 1,
-            "deployed": 1
+            "failed": "Evicted: Pod The node was low on resource: [DiskPressure]. "
         },
         "runtime": {
             "node_name": "gke-production--gitp-workspace-pool-2-a3afc0b4-nmbw",
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 2b0e94604ea357..bf1a391eb1e258 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
@@ -37,13 +37,6 @@
     },
     "spec": {
       "volumes": [
-        {
-          "name": "vol-this-theia",
-          "hostPath": {
-            "path": "/mnt/disks/ssd0/theia/theia-hotfix-2020-02-08.0",
-            "type": "Directory"
-          }
-        },
         {
           "name": "vol-this-workspace",
           "hostPath": {
@@ -76,11 +69,6 @@
             {
               "name": "vol-this-workspace",
               "mountPath": "/workspace"
-            },
-            {
-              "name": "vol-this-theia",
-              "readOnly": true,
-              "mountPath": "/theia"
             }
           ],
           "readinessProbe": {
diff --git a/components/ws-manager/pkg/manager/testdata/status_failedPending_evicted_UNKNOWN02.golden b/components/ws-manager/pkg/manager/testdata/status_failedPending_evicted_UNKNOWN02.golden
index 4ec766893e0863..e21562351b5a5e 100644
--- a/components/ws-manager/pkg/manager/testdata/status_failedPending_evicted_UNKNOWN02.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_failedPending_evicted_UNKNOWN02.golden
@@ -17,9 +17,7 @@
         },
         "phase": 6,
         "conditions": {
-            "failed": "Evicted: Pod The node was low on resource: [DiskPressure]. ",
-            "service_exists": 1,
-            "deployed": 1
+            "failed": "Evicted: Pod The node was low on resource: [DiskPressure]. "
         },
         "runtime": {
             "node_name": "gke-production--gitp-workspace-pool-2-a3afc0b4-nmbw",
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 ce92c924e1e811..2aa61ff428a986 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
@@ -42,13 +42,6 @@
     },
     "spec": {
       "volumes": [
-        {
-          "name": "vol-this-theia",
-          "hostPath": {
-            "path": "/mnt/disks/ssd0/theia/theia-hotfix-2020-02-08.0",
-            "type": "Directory"
-          }
-        },
         {
           "name": "vol-this-workspace",
           "hostPath": {
@@ -81,11 +74,6 @@
             {
               "name": "vol-this-workspace",
               "mountPath": "/workspace"
-            },
-            {
-              "name": "vol-this-theia",
-              "readOnly": true,
-              "mountPath": "/theia"
             }
           ],
           "readinessProbe": {
diff --git a/components/ws-manager/pkg/manager/testdata/status_failedTheiaMount_PENDING00.golden b/components/ws-manager/pkg/manager/testdata/status_failedTheiaMount_PENDING00.golden
deleted file mode 100644
index 50abf3e5f99f6f..00000000000000
--- a/components/ws-manager/pkg/manager/testdata/status_failedTheiaMount_PENDING00.golden
+++ /dev/null
@@ -1,29 +0,0 @@
-{
-    "status": {
-        "id": "b3242d9b-6920-41b5-8e72-c3d5637ca148",
-        "status_version": 65536,
-        "metadata": {
-            "owner": "1ef0e007-4247-4501-bcf9-8c5711f422b6",
-            "meta_id": "d4562d0d-46ae-4a4b-b0a4-a5e94ea4a2f3",
-            "started_at": {
-                "seconds": 1559033178
-            }
-        },
-        "spec": {
-            "workspace_image": "eu.gcr.io/gitpod-dev/workspace-images/edf0748dca3905f46a5fcf841db2a36f277d9b79/eu.gcr.io/gitpod-dev/workspace-full:sha256-4543f6df3549a443f1109779878540a635163ef86da30c959464a61256bfc569",
-            "url": "http://d4562d0d-46ae-4a4b-b0a4-a5e94ea4a2f3.ws-eu.cw-fail-on-mount-failure.staging.gitpod.io",
-            "ide_image": {}
-        },
-        "phase": 1,
-        "conditions": {
-            "failed": "cannot mount Theia",
-            "deployed": 1
-        },
-        "message": "pod is pending",
-        "runtime": {
-            "node_name": "gke-gitpod-dev-worker-pool-2-184c607e-1wgf",
-            "pod_name": "ws-b3242d9b-6920-41b5-8e72-c3d5637ca148"
-        },
-        "auth": {}
-    }
-}
\ No newline at end of file
diff --git a/components/ws-manager/pkg/manager/testdata/status_failedTheiaMount_PENDING00.json b/components/ws-manager/pkg/manager/testdata/status_failedTheiaMount_PENDING00.json
deleted file mode 100644
index 5d01477d214f6a..00000000000000
--- a/components/ws-manager/pkg/manager/testdata/status_failedTheiaMount_PENDING00.json
+++ /dev/null
@@ -1,398 +0,0 @@
-{
-  "pod": {
-    "metadata": {
-      "name": "ws-b3242d9b-6920-41b5-8e72-c3d5637ca148",
-      "namespace": "staging-cw-fail-on-mount-failure",
-      "selfLink": "/api/v1/namespaces/staging-cw-fail-on-mount-failure/pods/ws-b3242d9b-6920-41b5-8e72-c3d5637ca148",
-      "uid": "0f8383f0-8125-11e9-8a1b-42010a840224",
-      "resourceVersion": "103359526",
-      "creationTimestamp": "2019-05-28T08:46:18Z",
-      "labels": {
-        "app": "gitpod",
-        "component": "workspace",
-        "gitpod.io/networkpolicy": "default",
-        "gpwsman": "true",
-        "headless": "false",
-        "metaID": "d4562d0d-46ae-4a4b-b0a4-a5e94ea4a2f3",
-        "owner": "1ef0e007-4247-4501-bcf9-8c5711f422b6",
-        "workspaceID": "b3242d9b-6920-41b5-8e72-c3d5637ca148",
-        "workspaceType": "regular"
-      },
-      "annotations": {
-        "gitpod/id": "b3242d9b-6920-41b5-8e72-c3d5637ca148",
-        "gitpod/servicePrefix": "d4562d0d-46ae-4a4b-b0a4-a5e94ea4a2f3",
-        "gitpod/traceid": "AAAAAAAAAAAKKiUk7m4PY1BOxC/NSqfQCUjtNDaUFjkBAAAAAA==",
-        "gitpod/url": "http://d4562d0d-46ae-4a4b-b0a4-a5e94ea4a2f3.ws-eu.cw-fail-on-mount-failure.staging.gitpod.io",
-        "gitpod/never-ready": "true",
-        "prometheus.io/path": "/metrics",
-        "prometheus.io/port": "23000",
-        "prometheus.io/scrape": "true"
-      }
-    },
-    "spec": {
-      "volumes": [
-        {
-          "name": "vol-this-theia",
-          "hostPath": {
-            "path": "/mnt/disks/ssd0/theia/theia-cw-fail-on-mount-failure.2/bogus",
-            "type": "Directory"
-          }
-        },
-        {
-          "name": "vol-this-workspace",
-          "hostPath": {
-            "path": "/mnt/disks/ssd0/workspaces/b3242d9b-6920-41b5-8e72-c3d5637ca148",
-            "type": "DirectoryOrCreate"
-          }
-        },
-        {
-          "name": "vol-sync-tmp",
-          "hostPath": {
-            "path": "/mnt/disks/ssd0/workspaces/sync-tmp",
-            "type": "DirectoryOrCreate"
-          }
-        }
-      ],
-      "containers": [
-        {
-          "name": "workspace",
-          "image": "eu.gcr.io/gitpod-dev/workspace-images/edf0748dca3905f46a5fcf841db2a36f277d9b79/eu.gcr.io/gitpod-dev/workspace-full:sha256-4543f6df3549a443f1109779878540a635163ef86da30c959464a61256bfc569",
-          "ports": [
-            {
-              "containerPort": 23000,
-              "protocol": "TCP"
-            }
-          ],
-          "env": [
-            {
-              "name": "GITPOD_REPO_ROOT",
-              "value": "/workspace/bel"
-            },
-            {
-              "name": "GITPOD_CLI_APITOKEN",
-              "value": "f0af6840-29b6-406a-819c-c51840ee275d"
-            },
-            {
-              "name": "GITPOD_WORKSPACE_ID",
-              "value": "d4562d0d-46ae-4a4b-b0a4-a5e94ea4a2f3"
-            },
-            {
-              "name": "GITPOD_INSTANCE_ID",
-              "value": "b3242d9b-6920-41b5-8e72-c3d5637ca148"
-            },
-            {
-              "name": "GITPOD_GIT_USER_NAME",
-              "value": "Christian Weichel"
-            },
-            {
-              "name": "GITPOD_GIT_USER_EMAIL",
-              "value": "some@user.com"
-            },
-            {
-              "name": "GITPOD_THEIA_PORT",
-              "value": "23000"
-            },
-            {
-              "name": "THEIA_WORKSPACE_ROOT",
-              "value": "/workspace"
-            },
-            {
-              "name": "GITPOD_HOST",
-              "value": "http://cw-fail-on-mount-failure.staging.gitpod.io"
-            },
-            {
-              "name": "GITPOD_WSSYNC_APITOKEN",
-              "value": "0d777ed9-7989-4028-a5f9-503da6839d0c"
-            },
-            {
-              "name": "GITPOD_WSSYNC_APIPORT",
-              "value": "44444"
-            },
-            {
-              "name": "GITPOD_WORKSPACE_URL",
-              "value": "http://d4562d0d-46ae-4a4b-b0a4-a5e94ea4a2f3.ws-eu.cw-fail-on-mount-failure.staging.gitpod.io"
-            },
-            {
-              "name": "GITPOD_INTERVAL",
-              "value": "30000"
-            },
-            {
-              "name": "GITPOD_MEMORY",
-              "value": "3403"
-            },
-            {
-              "name": "GITPOD_TASKS",
-              "value": "[{\"init\":\"cd /workspace/bel \u0026\u0026 go get -v \u0026\u0026 go test -v ./...\",\"command\":\"cd /workspace/bel \u0026\u0026 go run examples/*\"}]"
-            }
-          ],
-          "resources": {
-            "limits": {
-              "cpu": "7",
-              "memory": "3246Mi"
-            },
-            "requests": {
-              "cpu": "1m",
-              "memory": "3246Mi"
-            }
-          },
-          "volumeMounts": [
-            {
-              "name": "vol-this-workspace",
-              "mountPath": "/workspace"
-            },
-            {
-              "name": "vol-this-theia",
-              "readOnly": true,
-              "mountPath": "/theia"
-            }
-          ],
-          "livenessProbe": {
-            "httpGet": {
-              "path": "/",
-              "port": 23000,
-              "scheme": "HTTP"
-            },
-            "timeoutSeconds": 1,
-            "periodSeconds": 30,
-            "successThreshold": 1,
-            "failureThreshold": 3
-          },
-          "readinessProbe": {
-            "httpGet": {
-              "path": "/",
-              "port": 23000,
-              "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"
-              ],
-              "drop": [
-                "SETPCAP",
-                "CHOWN",
-                "NET_RAW",
-                "DAC_OVERRIDE",
-                "FOWNER",
-                "SYS_CHROOT",
-                "SETFCAP",
-                "SETUID",
-                "SETGID"
-              ]
-            },
-            "privileged": false,
-            "runAsUser": 33333,
-            "runAsNonRoot": true,
-            "readOnlyRootFilesystem": false,
-            "allowPrivilegeEscalation": false
-          }
-        }
-      ],
-      "restartPolicy": "Always",
-      "terminationGracePeriodSeconds": 30,
-      "dnsPolicy": "None",
-      "serviceAccountName": "workspace",
-      "serviceAccount": "workspace",
-      "automountServiceAccountToken": false,
-      "nodeName": "gke-gitpod-dev-worker-pool-2-184c607e-1wgf",
-      "securityContext": {},
-      "imagePullSecrets": [
-        {
-          "name": "dockerhub-typefox"
-        },
-        {
-          "name": "eu.gcr.io-gitpod"
-        }
-      ],
-      "affinity": {
-        "nodeAffinity": {
-          "requiredDuringSchedulingIgnoredDuringExecution": {
-            "nodeSelectorTerms": [
-              {
-                "matchExpressions": [
-                  {
-                    "key": "gitpod.io/workload_workspace",
-                    "operator": "In",
-                    "values": [
-                      "true"
-                    ]
-                  }
-                ]
-              }
-            ]
-          }
-        }
-      },
-      "schedulerName": "default-scheduler",
-      "tolerations": [
-        {
-          "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"
-        ]
-      }
-    },
-    "status": {
-      "phase": "Pending",
-      "conditions": [
-        {
-          "type": "PodScheduled",
-          "status": "True",
-          "lastProbeTime": null,
-          "lastTransitionTime": "2019-05-28T08:46:18Z"
-        }
-      ],
-      "qosClass": "Burstable"
-    }
-  },
-  "events": [
-    {
-      "metadata": {
-        "name": "ws-b3242d9b-6920-41b5-8e72-c3d5637ca148.15a2cc6a72571730",
-        "namespace": "staging-cw-fail-on-mount-failure",
-        "selfLink": "/api/v1/namespaces/staging-cw-fail-on-mount-failure/events/ws-b3242d9b-6920-41b5-8e72-c3d5637ca148.15a2cc6a72571730",
-        "uid": "0f876b0f-8125-11e9-8a1b-42010a840224",
-        "resourceVersion": "3354499",
-        "creationTimestamp": "2019-05-28T08:46:18Z"
-      },
-      "involvedObject": {
-        "kind": "Pod",
-        "namespace": "staging-cw-fail-on-mount-failure",
-        "name": "ws-b3242d9b-6920-41b5-8e72-c3d5637ca148",
-        "uid": "0f8383f0-8125-11e9-8a1b-42010a840224",
-        "apiVersion": "v1",
-        "resourceVersion": "103359524"
-      },
-      "reason": "Scheduled",
-      "message": "Successfully assigned staging-cw-fail-on-mount-failure/ws-b3242d9b-6920-41b5-8e72-c3d5637ca148 to gke-gitpod-dev-worker-pool-2-184c607e-1wgf",
-      "source": {
-        "component": "default-scheduler"
-      },
-      "firstTimestamp": "2019-05-28T08:46:18Z",
-      "lastTimestamp": "2019-05-28T08:46:18Z",
-      "count": 1,
-      "type": "Normal",
-      "eventTime": null,
-      "reportingComponent": "",
-      "reportingInstance": ""
-    },
-    {
-      "metadata": {
-        "name": "ws-b3242d9b-6920-41b5-8e72-c3d5637ca148.15a2cc6a7d01c15f",
-        "namespace": "staging-cw-fail-on-mount-failure",
-        "selfLink": "/api/v1/namespaces/staging-cw-fail-on-mount-failure/events/ws-b3242d9b-6920-41b5-8e72-c3d5637ca148.15a2cc6a7d01c15f",
-        "uid": "0fa34f04-8125-11e9-8a1b-42010a840224",
-        "resourceVersion": "3354501",
-        "creationTimestamp": "2019-05-28T08:46:18Z"
-      },
-      "involvedObject": {
-        "kind": "Pod",
-        "namespace": "staging-cw-fail-on-mount-failure",
-        "name": "ws-b3242d9b-6920-41b5-8e72-c3d5637ca148",
-        "uid": "0f8383f0-8125-11e9-8a1b-42010a840224",
-        "apiVersion": "v1",
-        "resourceVersion": "103359526"
-      },
-      "reason": "SuccessfulMountVolume",
-      "message": "MountVolume.SetUp succeeded for volume \"vol-sync-tmp\" ",
-      "source": {
-        "component": "kubelet",
-        "host": "gke-gitpod-dev-worker-pool-2-184c607e-1wgf"
-      },
-      "firstTimestamp": "2019-05-28T08:46:18Z",
-      "lastTimestamp": "2019-05-28T08:46:18Z",
-      "count": 1,
-      "type": "Normal",
-      "eventTime": null,
-      "reportingComponent": "",
-      "reportingInstance": ""
-    },
-    {
-      "metadata": {
-        "name": "ws-b3242d9b-6920-41b5-8e72-c3d5637ca148.15a2cc6a7d01c163",
-        "namespace": "staging-cw-fail-on-mount-failure",
-        "selfLink": "/api/v1/namespaces/staging-cw-fail-on-mount-failure/events/ws-b3242d9b-6920-41b5-8e72-c3d5637ca148.15a2cc6a7d01c163",
-        "uid": "0fa3ff54-8125-11e9-8a1b-42010a840224",
-        "resourceVersion": "3354504",
-        "creationTimestamp": "2019-05-28T08:46:18Z"
-      },
-      "involvedObject": {
-        "kind": "Pod",
-        "namespace": "staging-cw-fail-on-mount-failure",
-        "name": "ws-b3242d9b-6920-41b5-8e72-c3d5637ca148",
-        "uid": "0f8383f0-8125-11e9-8a1b-42010a840224",
-        "apiVersion": "v1",
-        "resourceVersion": "103359526"
-      },
-      "reason": "FailedMount",
-      "message": "MountVolume.SetUp failed for volume \"vol-this-theia\" : hostPath type check failed: /mnt/disks/ssd0/theia/theia-cw-fail-on-mount-failure.2/bogus is not a directory",
-      "source": {
-        "component": "kubelet",
-        "host": "gke-gitpod-dev-worker-pool-2-184c607e-1wgf"
-      },
-      "firstTimestamp": "2019-05-28T08:46:18Z",
-      "lastTimestamp": "2019-05-28T08:46:20Z",
-      "count": 3,
-      "type": "Warning",
-      "eventTime": null,
-      "reportingComponent": "",
-      "reportingInstance": ""
-    },
-    {
-      "metadata": {
-        "name": "ws-b3242d9b-6920-41b5-8e72-c3d5637ca148.15a2cc6a7d02287f",
-        "namespace": "staging-cw-fail-on-mount-failure",
-        "selfLink": "/api/v1/namespaces/staging-cw-fail-on-mount-failure/events/ws-b3242d9b-6920-41b5-8e72-c3d5637ca148.15a2cc6a7d02287f",
-        "uid": "0fa2b56f-8125-11e9-8a1b-42010a840224",
-        "resourceVersion": "3354500",
-        "creationTimestamp": "2019-05-28T08:46:18Z"
-      },
-      "involvedObject": {
-        "kind": "Pod",
-        "namespace": "staging-cw-fail-on-mount-failure",
-        "name": "ws-b3242d9b-6920-41b5-8e72-c3d5637ca148",
-        "uid": "0f8383f0-8125-11e9-8a1b-42010a840224",
-        "apiVersion": "v1",
-        "resourceVersion": "103359526"
-      },
-      "reason": "SuccessfulMountVolume",
-      "message": "MountVolume.SetUp succeeded for volume \"vol-this-workspace\" ",
-      "source": {
-        "component": "kubelet",
-        "host": "gke-gitpod-dev-worker-pool-2-184c607e-1wgf"
-      },
-      "firstTimestamp": "2019-05-28T08:46:18Z",
-      "lastTimestamp": "2019-05-28T08:46:18Z",
-      "count": 1,
-      "type": "Normal",
-      "eventTime": null,
-      "reportingComponent": "",
-      "reportingInstance": ""
-    }
-  ]
-}
\ No newline at end of file
diff --git a/components/ws-manager/pkg/manager/testdata/status_failedWorkspaceMount_PENDING00.golden b/components/ws-manager/pkg/manager/testdata/status_failedWorkspaceMount_PENDING00.golden
index 03cd4588bdb16a..fda348dfd90a79 100644
--- a/components/ws-manager/pkg/manager/testdata/status_failedWorkspaceMount_PENDING00.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_failedWorkspaceMount_PENDING00.golden
@@ -16,8 +16,7 @@
         },
         "phase": 1,
         "conditions": {
-            "failed": "cannot mount workspace",
-            "deployed": 1
+            "failed": "cannot mount workspace"
         },
         "message": "pod is pending",
         "runtime": {
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 79a0455bd9cb61..cc638fd66a7abd 100644
--- a/components/ws-manager/pkg/manager/testdata/status_failedWorkspaceMount_PENDING00.json
+++ b/components/ws-manager/pkg/manager/testdata/status_failedWorkspaceMount_PENDING00.json
@@ -31,13 +31,6 @@
     },
     "spec": {
       "volumes": [
-        {
-          "name": "vol-this-theia",
-          "hostPath": {
-            "path": "/mnt/disks/ssd0/theia/theia-cw-fail-on-mount-failure.2/bogus",
-            "type": "Directory"
-          }
-        },
         {
           "name": "vol-this-workspace",
           "hostPath": {
@@ -139,11 +132,6 @@
             {
               "name": "vol-this-workspace",
               "mountPath": "/workspace"
-            },
-            {
-              "name": "vol-this-theia",
-              "readOnly": true,
-              "mountPath": "/theia"
             }
           ],
           "livenessProbe": {
diff --git a/components/ws-manager/pkg/manager/testdata/status_firstUserActivity_RUNNING.golden b/components/ws-manager/pkg/manager/testdata/status_firstUserActivity_RUNNING.golden
index 1ebc8e6ab64207..d963b3257062e6 100644
--- a/components/ws-manager/pkg/manager/testdata/status_firstUserActivity_RUNNING.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_firstUserActivity_RUNNING.golden
@@ -15,57 +15,46 @@
             "exposed_ports": [
                 {
                     "port": 1337,
-                    "target": 31337,
                     "visibility": 1
                 },
                 {
                     "port": 3000,
-                    "target": 33000,
                     "visibility": 1
                 },
                 {
                     "port": 3001,
-                    "target": 33001,
                     "visibility": 1
                 },
                 {
                     "port": 4000,
-                    "target": 34000,
                     "visibility": 1
                 },
                 {
                     "port": 9229,
-                    "target": 39229,
                     "visibility": 1
                 },
                 {
                     "port": 5900,
-                    "target": 35900,
                     "visibility": 1
                 },
                 {
                     "port": 6080,
-                    "target": 36080,
                     "visibility": 1
                 },
                 {
                     "port": 9999,
-                    "target": 39999,
                     "visibility": 1
                 },
                 {
                     "port": 13001,
-                    "target": 43001,
                     "visibility": 1
                 },
                 {
                     "port": 7777,
-                    "target": 37777,
                     "visibility": 1
                 },
                 {
                     "port": 13444,
-                    "target": 43444,
                     "visibility": 1
                 }
             ],
@@ -74,8 +63,6 @@
         },
         "phase": 4,
         "conditions": {
-            "service_exists": 1,
-            "deployed": 1,
             "first_user_activity": {
                 "seconds": 1582886676,
                 "nanos": 995133911
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 9fe210efc2a2f5..181c419bf98b5c 100644
--- a/components/ws-manager/pkg/manager/testdata/status_firstUserActivity_RUNNING.json
+++ b/components/ws-manager/pkg/manager/testdata/status_firstUserActivity_RUNNING.json
@@ -27,6 +27,7 @@
         "gitpod/ready": "true",
         "gitpod/servicePrefix": "c372bd58-ef61-4fc0-9083-bd61ef96ad9f",
         "gitpod/url": "https://c372bd58-ef61-4fc0-9083-bd61ef96ad9f.ws-eu01.gitpod-staging.com",
+        "gitpod/exposedPorts": "CgUIuQoYAQoFCLgXGAEKBQi5FxgBCgUIoB8YAQoFCI1IGAEKBQiMLhgBCgUIwC8YAQoFCI9OGAEKBQjJZRgBCgUI4TwYAQoFCIRpGAE=",
         "kubernetes.io/psp": "default-ns-privileged-unconfined",
         "prometheus.io/path": "/metrics",
         "prometheus.io/port": "23000",
@@ -36,13 +37,6 @@
     },
     "spec": {
       "volumes": [
-        {
-          "name": "vol-this-theia",
-          "hostPath": {
-            "path": "/mnt/disks/ssd0/theia/theia-master.2437",
-            "type": "Directory"
-          }
-        },
         {
           "name": "vol-this-workspace",
           "hostPath": {
@@ -78,11 +72,6 @@
               "name": "vol-this-workspace",
               "mountPath": "/workspace",
               "mountPropagation": "HostToContainer"
-            },
-            {
-              "name": "vol-this-theia",
-              "readOnly": true,
-              "mountPath": "/theia"
             }
           ],
           "readinessProbe": {
diff --git a/components/ws-manager/pkg/manager/testdata/status_headlessTaskFailed_STOPPING00.golden b/components/ws-manager/pkg/manager/testdata/status_headlessTaskFailed_STOPPING00.golden
index 8de89a62003e2d..d52ad25a219746 100644
--- a/components/ws-manager/pkg/manager/testdata/status_headlessTaskFailed_STOPPING00.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_headlessTaskFailed_STOPPING00.golden
@@ -21,8 +21,6 @@
         },
         "phase": 5,
         "conditions": {
-            "service_exists": 1,
-            "deployed": 1,
             "headless_task_failed": "headless task failed"
         },
         "message": "headless workspace is stopping",
diff --git a/components/ws-manager/pkg/manager/testdata/status_headless_STOPPING00.golden b/components/ws-manager/pkg/manager/testdata/status_headless_STOPPING00.golden
index 30025a64243c1b..4ecee525da23a1 100644
--- a/components/ws-manager/pkg/manager/testdata/status_headless_STOPPING00.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_headless_STOPPING00.golden
@@ -25,10 +25,7 @@
             }
         },
         "phase": 5,
-        "conditions": {
-            "service_exists": 1,
-            "deployed": 1
-        },
+        "conditions": {},
         "message": "headless workspace is stopping",
         "runtime": {
             "node_name": "gke-dev-workload-1-49d27f81-8s5c",
diff --git a/components/ws-manager/pkg/manager/testdata/status_ideFailedToStart_005_RUNNING00.golden b/components/ws-manager/pkg/manager/testdata/status_ideFailedToStart_005_RUNNING00.golden
index ec433322962e00..98b66c113235b5 100644
--- a/components/ws-manager/pkg/manager/testdata/status_ideFailedToStart_005_RUNNING00.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_ideFailedToStart_005_RUNNING00.golden
@@ -20,9 +20,7 @@
         },
         "phase": 4,
         "conditions": {
-            "failed": "IDE failed to start: exit status 127",
-            "service_exists": 1,
-            "deployed": 1
+            "failed": "IDE failed to start: exit status 127"
         },
         "runtime": {
             "node_name": "gke-gp-prod-ws-eu14-eu-workspace-pool-b6e0759a-3lb1",
diff --git a/components/ws-manager/pkg/manager/testdata/status_imagespec_RUNNING00.golden b/components/ws-manager/pkg/manager/testdata/status_imagespec_RUNNING00.golden
index 52d92976b9004d..ab3ebfe11606f1 100644
--- a/components/ws-manager/pkg/manager/testdata/status_imagespec_RUNNING00.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_imagespec_RUNNING00.golden
@@ -16,7 +16,6 @@
             "exposed_ports": [
                 {
                     "port": 8080,
-                    "target": 38080,
                     "visibility": 1
                 }
             ],
@@ -27,8 +26,6 @@
         },
         "phase": 4,
         "conditions": {
-            "service_exists": 1,
-            "deployed": 1,
             "first_user_activity": {
                 "seconds": 1583767886,
                 "nanos": 855961185
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 a3c494e6b1d2e5..c35262a8d4b273 100644
--- a/components/ws-manager/pkg/manager/testdata/status_imagespec_RUNNING00.json
+++ b/components/ws-manager/pkg/manager/testdata/status_imagespec_RUNNING00.json
@@ -29,6 +29,7 @@
         "gitpod/ready": "true",
         "gitpod/servicePrefix": "db334047-3c4b-49cc-a5fb-a089bff656e0",
         "gitpod/url": "http://db334047-3c4b-49cc-a5fb-a089bff656e0.ws-dev.cw-registry.staging.gitpod-dev.com",
+        "gitpod/exposedPorts": "CgUIkD8YAQ==",
         "kubernetes.io/psp": "staging-cw-registry-ns-workspace",
         "prometheus.io/path": "/metrics",
         "prometheus.io/port": "23000",
diff --git a/components/ws-manager/pkg/manager/testdata/status_interrupted.golden b/components/ws-manager/pkg/manager/testdata/status_interrupted.golden
index 9e4dc909549379..add5c7212207cc 100644
--- a/components/ws-manager/pkg/manager/testdata/status_interrupted.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_interrupted.golden
@@ -14,21 +14,16 @@
             "url": "https://b246b28e-4776-47d5-961d-10548ffac9a8.ws-eu0.gitpod-staging.com",
             "exposed_ports": [
                 {
-                    "port": 5900,
-                    "target": 35900
+                    "port": 5900
                 },
                 {
-                    "port": 8080,
-                    "target": 38080
+                    "port": 8080
                 }
             ],
             "ide_image": {}
         },
         "phase": 7,
-        "conditions": {
-            "service_exists": 1,
-            "deployed": 1
-        },
+        "conditions": {},
         "message": "container workspace was terminated unexpectedly - workspace should recover",
         "runtime": {
             "node_name": "gke-gitpod-staging-e-workspace-pool-2-2eb903d0-g86k",
diff --git a/components/ws-manager/pkg/manager/testdata/status_interrupted.json b/components/ws-manager/pkg/manager/testdata/status_interrupted.json
index b9990608b52768..16f20702b450aa 100644
--- a/components/ws-manager/pkg/manager/testdata/status_interrupted.json
+++ b/components/ws-manager/pkg/manager/testdata/status_interrupted.json
@@ -26,6 +26,7 @@
         "gitpod/ready": "true",
         "gitpod/servicePrefix": "b246b28e-4776-47d5-961d-10548ffac9a8",
         "gitpod/url": "https://b246b28e-4776-47d5-961d-10548ffac9a8.ws-eu0.gitpod-staging.com",
+        "gitpod/exposedPorts": "CgMIjC4KAwiQPw==",
         "kubernetes.io/psp": "workspace",
         "prometheus.io/path": "/metrics",
         "prometheus.io/port": "23000",
@@ -35,13 +36,6 @@
     },
     "spec": {
       "volumes": [
-        {
-          "name": "vol-this-theia",
-          "hostPath": {
-            "path": "/mnt/disks/ssd0/theia/theia-master.1605",
-            "type": "Directory"
-          }
-        },
         {
           "name": "vol-this-workspace",
           "hostPath": {
@@ -128,11 +122,6 @@
             {
               "name": "vol-this-workspace",
               "mountPath": "/workspace"
-            },
-            {
-              "name": "vol-this-theia",
-              "readOnly": true,
-              "mountPath": "/theia"
             }
           ],
           "livenessProbe": {
diff --git a/components/ws-manager/pkg/manager/testdata/status_interrupted_CREATING00.golden b/components/ws-manager/pkg/manager/testdata/status_interrupted_CREATING00.golden
index c36b43ad9eea6e..d7b1ed5df891c3 100644
--- a/components/ws-manager/pkg/manager/testdata/status_interrupted_CREATING00.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_interrupted_CREATING00.golden
@@ -15,10 +15,7 @@
             "ide_image": {}
         },
         "phase": 7,
-        "conditions": {
-            "service_exists": 1,
-            "deployed": 1
-        },
+        "conditions": {},
         "message": "container workspace was terminated unexpectedly - workspace is recovering",
         "runtime": {
             "node_name": "gke-gitpod-dev-worker-pool-2-184c607e-rl94",
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 5e272a8304b5db..0c492a4dc845e5 100644
--- a/components/ws-manager/pkg/manager/testdata/status_interrupted_CREATING00.json
+++ b/components/ws-manager/pkg/manager/testdata/status_interrupted_CREATING00.json
@@ -32,13 +32,6 @@
     },
     "spec": {
       "volumes": [
-        {
-          "name": "vol-this-theia",
-          "hostPath": {
-            "path": "/mnt/disks/ssd0/theia/theia-cw-gh-2720.5",
-            "type": "Directory"
-          }
-        },
         {
           "name": "vol-this-workspace",
           "hostPath": {
@@ -125,11 +118,6 @@
             {
               "name": "vol-this-workspace",
               "mountPath": "/workspace"
-            },
-            {
-              "name": "vol-this-theia",
-              "readOnly": true,
-              "mountPath": "/theia"
             }
           ],
           "livenessProbe": {
@@ -380,37 +368,6 @@
       "reportingComponent": "",
       "reportingInstance": ""
     },
-    {
-      "metadata": {
-        "name": "ws-4bf2e82d-cdc7-4764-b8ad-6973e3c4a629.15b19029ffa1d912",
-        "namespace": "staging-cw-gh-2720",
-        "selfLink": "/api/v1/namespaces/staging-cw-gh-2720/events/ws-4bf2e82d-cdc7-4764-b8ad-6973e3c4a629.15b19029ffa1d912",
-        "uid": "375790ec-a6f1-11e9-9f0a-42010a840008",
-        "resourceVersion": "3657306",
-        "creationTimestamp": "2019-07-15T11:10:55Z"
-      },
-      "involvedObject": {
-        "kind": "Pod",
-        "namespace": "staging-cw-gh-2720",
-        "name": "ws-4bf2e82d-cdc7-4764-b8ad-6973e3c4a629",
-        "uid": "374220c1-a6f1-11e9-9f0a-42010a840008",
-        "apiVersion": "v1",
-        "resourceVersion": "118293107"
-      },
-      "reason": "SuccessfulMountVolume",
-      "message": "MountVolume.SetUp succeeded for volume \"vol-this-theia\" ",
-      "source": {
-        "component": "kubelet",
-        "host": "gke-gitpod-dev-worker-pool-2-184c607e-rl94"
-      },
-      "firstTimestamp": "2019-07-15T11:10:55Z",
-      "lastTimestamp": "2019-07-15T11:10:55Z",
-      "count": 1,
-      "type": "Normal",
-      "eventTime": null,
-      "reportingComponent": "",
-      "reportingInstance": ""
-    },
     {
       "metadata": {
         "name": "ws-4bf2e82d-cdc7-4764-b8ad-6973e3c4a629.15b19029ffa28a95",
diff --git a/components/ws-manager/pkg/manager/testdata/status_interrupted_networkNotReady_1_event_only.golden b/components/ws-manager/pkg/manager/testdata/status_interrupted_networkNotReady_1_event_only.golden
index b165e3c66f5a76..1c0fbca8e4507a 100644
--- a/components/ws-manager/pkg/manager/testdata/status_interrupted_networkNotReady_1_event_only.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_interrupted_networkNotReady_1_event_only.golden
@@ -15,7 +15,6 @@
             "exposed_ports": [
                 {
                     "port": 3000,
-                    "target": 33000,
                     "visibility": 1
                 }
             ],
@@ -23,10 +22,7 @@
             "ide_image": {}
         },
         "phase": 4,
-        "conditions": {
-            "service_exists": 1,
-            "deployed": 1
-        },
+        "conditions": {},
         "runtime": {
             "node_name": "gke-production--gitp-workspace-pool-1-ee6c94af-h6lj",
             "pod_name": "ws-da9ffbf1-a12d-4a58-8593-475394eedb00",
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 b401dcaed1add3..6392aec5ac26a9 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
@@ -27,6 +27,7 @@
         "gitpod/ready": "true",
         "gitpod/servicePrefix": "c0eabd01-6315-4fc4-8f60-1b008e100743",
         "gitpod/url": "https://c0eabd01-6315-4fc4-8f60-1b008e100743.ws-eu01.gitpod.io",
+        "gitpod/exposedPorts": "CgUIuBcYAQ==",
         "kubernetes.io/psp": "default-ns-workspace",
         "prometheus.io/path": "/metrics",
         "prometheus.io/port": "23000",
@@ -36,13 +37,6 @@
     },
     "spec": {
       "volumes": [
-        {
-          "name": "vol-this-theia",
-          "hostPath": {
-            "path": "/mnt/disks/ssd0/theia/theia-master.2231",
-            "type": "Directory"
-          }
-        },
         {
           "name": "vol-this-workspace",
           "hostPath": {
@@ -76,11 +70,6 @@
             {
               "name": "vol-this-workspace",
               "mountPath": "/workspace"
-            },
-            {
-              "name": "vol-this-theia",
-              "readOnly": true,
-              "mountPath": "/theia"
             }
           ],
           "readinessProbe": {
diff --git a/components/ws-manager/pkg/manager/testdata/status_interrupted_networkNotReady_2_event_and_exitcode.golden b/components/ws-manager/pkg/manager/testdata/status_interrupted_networkNotReady_2_event_and_exitcode.golden
index a8b1c247d5763d..7079e08e94512d 100644
--- a/components/ws-manager/pkg/manager/testdata/status_interrupted_networkNotReady_2_event_and_exitcode.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_interrupted_networkNotReady_2_event_and_exitcode.golden
@@ -15,7 +15,6 @@
             "exposed_ports": [
                 {
                     "port": 8080,
-                    "target": 38080,
                     "visibility": 1
                 }
             ],
@@ -24,8 +23,6 @@
         },
         "phase": 7,
         "conditions": {
-            "service_exists": 1,
-            "deployed": 1,
             "network_not_ready": 1
         },
         "message": "container network not ready - workspace should recover shortly",
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 3b94bddccda79e..a7a12ef13a5ea1 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
@@ -27,6 +27,7 @@
         "gitpod/ready": "true",
         "gitpod/servicePrefix": "d6427c17-62b8-4bb5-a974-f97f77b370dc",
         "gitpod/url": "https://d6427c17-62b8-4bb5-a974-f97f77b370dc.ws-eu01.gitpod.io",
+        "gitpod/exposedPorts": "CgUIkD8YAQ==",
         "kubernetes.io/psp": "default-ns-workspace",
         "prometheus.io/path": "/metrics",
         "prometheus.io/port": "23000",
@@ -36,13 +37,6 @@
     },
     "spec": {
       "volumes": [
-        {
-          "name": "vol-this-theia",
-          "hostPath": {
-            "path": "/mnt/disks/ssd0/theia/theia-master.2231",
-            "type": "Directory"
-          }
-        },
         {
           "name": "vol-this-workspace",
           "hostPath": {
@@ -141,11 +135,6 @@
             {
               "name": "vol-this-workspace",
               "mountPath": "/workspace"
-            },
-            {
-              "name": "vol-this-theia",
-              "readOnly": true,
-              "mountPath": "/theia"
             }
           ],
           "readinessProbe": {
diff --git a/components/ws-manager/pkg/manager/testdata/status_interrupted_networkNotReady_3_recovered_CONSTRUCTED.golden b/components/ws-manager/pkg/manager/testdata/status_interrupted_networkNotReady_3_recovered_CONSTRUCTED.golden
index b80a6e1143982e..63c0c29797532a 100644
--- a/components/ws-manager/pkg/manager/testdata/status_interrupted_networkNotReady_3_recovered_CONSTRUCTED.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_interrupted_networkNotReady_3_recovered_CONSTRUCTED.golden
@@ -15,7 +15,6 @@
             "exposed_ports": [
                 {
                     "port": 8080,
-                    "target": 38080,
                     "visibility": 1
                 }
             ],
@@ -23,10 +22,7 @@
             "ide_image": {}
         },
         "phase": 4,
-        "conditions": {
-            "service_exists": 1,
-            "deployed": 1
-        },
+        "conditions": {},
         "runtime": {
             "node_name": "gke-production--gitp-workspace-pool-1-c73d13c7-fzbk",
             "pod_name": "ws-0c5a8ef3-052b-44a7-b11c-3542a0928076",
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 e8fa776bacdc97..d354a3d9270969 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
@@ -27,6 +27,7 @@
         "gitpod/ready": "true",
         "gitpod/servicePrefix": "d6427c17-62b8-4bb5-a974-f97f77b370dc",
         "gitpod/url": "https://d6427c17-62b8-4bb5-a974-f97f77b370dc.ws-eu01.gitpod.io",
+        "gitpod/exposedPorts": "CgUIkD8YAQ==",
         "kubernetes.io/psp": "default-ns-workspace",
         "prometheus.io/path": "/metrics",
         "prometheus.io/port": "23000",
@@ -36,13 +37,6 @@
     },
     "spec": {
       "volumes": [
-        {
-          "name": "vol-this-theia",
-          "hostPath": {
-            "path": "/mnt/disks/ssd0/theia/theia-master.2231",
-            "type": "Directory"
-          }
-        },
         {
           "name": "vol-this-workspace",
           "hostPath": {
@@ -141,11 +135,6 @@
             {
               "name": "vol-this-workspace",
               "mountPath": "/workspace"
-            },
-            {
-              "name": "vol-this-theia",
-              "readOnly": true,
-              "mountPath": "/theia"
             }
           ],
           "readinessProbe": {
diff --git a/components/ws-manager/pkg/manager/testdata/status_metadata.golden b/components/ws-manager/pkg/manager/testdata/status_metadata.golden
index 5ec60ff2535b6e..f824c45a885cc9 100644
--- a/components/ws-manager/pkg/manager/testdata/status_metadata.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_metadata.golden
@@ -23,10 +23,7 @@
             "ide_image": {}
         },
         "phase": 4,
-        "conditions": {
-            "service_exists": 1,
-            "deployed": 1
-        },
+        "conditions": {},
         "runtime": {
             "node_name": "minikube",
             "pod_name": "ws-foobas",
diff --git a/components/ws-manager/pkg/manager/testdata/status_metadata.json b/components/ws-manager/pkg/manager/testdata/status_metadata.json
index 88f4a8b6b3dbbd..13b714f7e5283c 100644
--- a/components/ws-manager/pkg/manager/testdata/status_metadata.json
+++ b/components/ws-manager/pkg/manager/testdata/status_metadata.json
@@ -20,6 +20,7 @@
         "gitpod/id": "foobas",
         "gitpod/servicePrefix": "foobas",
         "gitpod/url": "http://10.0.0.114:8082",
+        "gitpod/exposedPorts": "CgMIkD8=",
         "prometheus.io/path": "/metrics",
         "prometheus.io/port": "23000",
         "prometheus.io/scrape": "true"
@@ -34,13 +35,6 @@
             "type": "DirectoryOrCreate"
           }
         },
-        {
-          "name": "vol-this-theia",
-          "hostPath": {
-            "path": "/tmp/theia/theia-xyz",
-            "type": "Directory"
-          }
-        },
         {
           "name": "vol-sync-tmp",
           "hostPath": {
@@ -127,10 +121,6 @@
               "name": "vol-this-workspace",
               "mountPath": "/workspace"
             },
-            {
-              "name": "vol-this-theia",
-              "mountPath": "/theia"
-            },
             {
               "name": "default-token-6qnvx",
               "readOnly": true,
diff --git a/components/ws-manager/pkg/manager/testdata/status_ownerToken.golden b/components/ws-manager/pkg/manager/testdata/status_ownerToken.golden
index 4796e9023153e0..3914b85fe9c698 100644
--- a/components/ws-manager/pkg/manager/testdata/status_ownerToken.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_ownerToken.golden
@@ -15,57 +15,46 @@
             "exposed_ports": [
                 {
                     "port": 1337,
-                    "target": 31337,
                     "visibility": 1
                 },
                 {
                     "port": 3000,
-                    "target": 33000,
                     "visibility": 1
                 },
                 {
                     "port": 3001,
-                    "target": 33001,
                     "visibility": 1
                 },
                 {
                     "port": 4000,
-                    "target": 34000,
                     "visibility": 1
                 },
                 {
                     "port": 9229,
-                    "target": 39229,
                     "visibility": 1
                 },
                 {
                     "port": 5900,
-                    "target": 35900,
                     "visibility": 1
                 },
                 {
                     "port": 6080,
-                    "target": 36080,
                     "visibility": 1
                 },
                 {
                     "port": 9999,
-                    "target": 39999,
                     "visibility": 1
                 },
                 {
                     "port": 13001,
-                    "target": 43001,
                     "visibility": 1
                 },
                 {
                     "port": 7777,
-                    "target": 37777,
                     "visibility": 1
                 },
                 {
                     "port": 13444,
-                    "target": 43444,
                     "visibility": 1
                 }
             ],
@@ -74,8 +63,6 @@
         },
         "phase": 4,
         "conditions": {
-            "service_exists": 1,
-            "deployed": 1,
             "first_user_activity": {
                 "seconds": 1582886676,
                 "nanos": 995133911
diff --git a/components/ws-manager/pkg/manager/testdata/status_ownerToken.json b/components/ws-manager/pkg/manager/testdata/status_ownerToken.json
index f93dd52a1de39e..255b92899686da 100644
--- a/components/ws-manager/pkg/manager/testdata/status_ownerToken.json
+++ b/components/ws-manager/pkg/manager/testdata/status_ownerToken.json
@@ -27,6 +27,7 @@
         "gitpod/ready": "true",
         "gitpod/servicePrefix": "c372bd58-ef61-4fc0-9083-bd61ef96ad9f",
         "gitpod/url": "https://c372bd58-ef61-4fc0-9083-bd61ef96ad9f.ws-eu01.gitpod-staging.com",
+        "gitpod/exposedPorts": "CgUIuQoYAQoFCLgXGAEKBQi5FxgBCgUIoB8YAQoFCI1IGAEKBQiMLhgBCgUIwC8YAQoFCI9OGAEKBQjJZRgBCgUI4TwYAQoFCIRpGAE=",
         "gitpod/ownerToken": "hello world",
         "gitpod/admission": "admit_everyone",
         "kubernetes.io/psp": "default-ns-privileged-unconfined",
@@ -38,13 +39,6 @@
     },
     "spec": {
       "volumes": [
-        {
-          "name": "vol-this-theia",
-          "hostPath": {
-            "path": "/mnt/disks/ssd0/theia/theia-master.2437",
-            "type": "Directory"
-          }
-        },
         {
           "name": "vol-this-workspace",
           "hostPath": {
@@ -80,11 +74,6 @@
               "name": "vol-this-workspace",
               "mountPath": "/workspace",
               "mountPropagation": "HostToContainer"
-            },
-            {
-              "name": "vol-this-theia",
-              "readOnly": true,
-              "mountPath": "/theia"
             }
           ],
           "readinessProbe": {
diff --git a/components/ws-manager/pkg/manager/testdata/status_prebuildFail_STOPPED00.golden b/components/ws-manager/pkg/manager/testdata/status_prebuildFail_STOPPED00.golden
index 5f1f7835e438f2..1f2c59353a6817 100644
--- a/components/ws-manager/pkg/manager/testdata/status_prebuildFail_STOPPED00.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_prebuildFail_STOPPED00.golden
@@ -82,10 +82,8 @@
         },
         "phase": 6,
         "conditions": {
-            "service_exists": 1,
             "snapshot": "workspaces/gray-lemming-0wlyvzy5/snapshot-1622467387276004249.tar@gitpod-user-a0dfe7e6-351b-4fd8-80c2-5ed45814f44a",
-            "final_backup_complete": 1,
-            "deployed": 1
+            "final_backup_complete": 1
         },
         "runtime": {
             "node_name": "gke-dev-workload-1-49d27f81-3xfh",
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 5088d884e4822f..5643746cd7fd04 100644
--- a/components/ws-manager/pkg/manager/testdata/status_prebuildFail_STOPPED00.json
+++ b/components/ws-manager/pkg/manager/testdata/status_prebuildFail_STOPPED00.json
@@ -31,6 +31,7 @@
         "gitpod/contentInitializer": "[redacted]",
         "gitpod/id": "dbc45dce-611a-49a8-bd76-7afda76a1e24",
         "gitpod/imageSpec": "CnRldS5nY3IuaW8vZ2l0cG9kLWNvcmUtZGV2L3JlZ2lzdHJ5L3dvcmtzcGFjZS1pbWFnZXM6ODFjNGZiNjAyYTU0MGQyNjFmMjEwY2ZjOGJhMDQzNWI2M2IyNDIzOGMxNzYyZWMwMjlkOGVkYWVjODE2YWZiNhJCZXUuZ2NyLmlvL2dpdHBvZC1jb3JlLWRldi9idWlsZC9pZGUvY29kZTpncGwtaGVhZGxlc3MtbG9nLXdzbWFuLjI1",
+        "gitpod/exposedPorts": "Cl4IuQoYASJXaHR0cHM6Ly8xMzM3LWdyYXktbGVtbWluZy0wd2x5dnp5NS53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IuBcYASJXaHR0cHM6Ly8zMDAwLWdyYXktbGVtbWluZy0wd2x5dnp5NS53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IuRcYASJXaHR0cHM6Ly8zMDAxLWdyYXktbGVtbWluZy0wd2x5dnp5NS53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4I6hkYASJXaHR0cHM6Ly8zMzA2LWdyYXktbGVtbWluZy0wd2x5dnp5NS53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IoB8YASJXaHR0cHM6Ly80MDAwLWdyYXktbGVtbWluZy0wd2x5dnp5NS53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IjC4YASJXaHR0cHM6Ly81OTAwLWdyYXktbGVtbWluZy0wd2x5dnp5NS53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tClwIwC8iV2h0dHBzOi8vNjA4MC1ncmF5LWxlbW1pbmctMHdseXZ6eTUud3MtZGV2LmdwbC1oZWFkbGVzcy1sb2ctd3NtYW4uc3RhZ2luZy5naXRwb2QtZGV2LmNvbQpeCI1IGAEiV2h0dHBzOi8vOTIyOS1ncmF5LWxlbW1pbmctMHdseXZ6eTUud3MtZGV2LmdwbC1oZWFkbGVzcy1sb2ctd3NtYW4uc3RhZ2luZy5naXRwb2QtZGV2LmNvbQpeCI9OGAEiV2h0dHBzOi8vOTk5OS1ncmF5LWxlbW1pbmctMHdseXZ6eTUud3MtZGV2LmdwbC1oZWFkbGVzcy1sb2ctd3NtYW4uc3RhZ2luZy5naXRwb2QtZGV2LmNvbQpfCMllGAEiWGh0dHBzOi8vMTMwMDEtZ3JheS1sZW1taW5nLTB3bHl2enk1LndzLWRldi5ncGwtaGVhZGxlc3MtbG9nLXdzbWFuLnN0YWdpbmcuZ2l0cG9kLWRldi5jb20KXgjhPBgBIldodHRwczovLzc3NzctZ3JheS1sZW1taW5nLTB3bHl2enk1LndzLWRldi5ncGwtaGVhZGxlc3MtbG9nLXdzbWFuLnN0YWdpbmcuZ2l0cG9kLWRldi5jb20KXwiEaRgBIlhodHRwczovLzEzNDQ0LWdyYXktbGVtbWluZy0wd2x5dnp5NS53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29t",
         "gitpod/ownerToken": "y5-JYhqDzGGprABkr36-fTas8PCeA4sZ",
         "gitpod/servicePrefix": "gray-lemming-0wlyvzy5",
         "gitpod/snapshot": "workspaces/gray-lemming-0wlyvzy5/snapshot-1622467387276004249.tar@gitpod-user-a0dfe7e6-351b-4fd8-80c2-5ed45814f44a",
diff --git a/components/ws-manager/pkg/manager/testdata/status_prebuildFail_STOPPING00.golden b/components/ws-manager/pkg/manager/testdata/status_prebuildFail_STOPPING00.golden
index b98de97e661566..80d4decca7fdfd 100644
--- a/components/ws-manager/pkg/manager/testdata/status_prebuildFail_STOPPING00.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_prebuildFail_STOPPING00.golden
@@ -81,10 +81,7 @@
             }
         },
         "phase": 5,
-        "conditions": {
-            "service_exists": 1,
-            "deployed": 1
-        },
+        "conditions": {},
         "message": "headless workspace is stopping",
         "runtime": {
             "node_name": "gke-dev-workload-1-49d27f81-3xfh",
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 99a70e1ecc3009..eafdf70b81325a 100644
--- a/components/ws-manager/pkg/manager/testdata/status_prebuildFail_STOPPING00.json
+++ b/components/ws-manager/pkg/manager/testdata/status_prebuildFail_STOPPING00.json
@@ -28,6 +28,7 @@
         "gitpod/contentInitializer": "[redacted]",
         "gitpod/id": "dbc45dce-611a-49a8-bd76-7afda76a1e24",
         "gitpod/imageSpec": "CnRldS5nY3IuaW8vZ2l0cG9kLWNvcmUtZGV2L3JlZ2lzdHJ5L3dvcmtzcGFjZS1pbWFnZXM6ODFjNGZiNjAyYTU0MGQyNjFmMjEwY2ZjOGJhMDQzNWI2M2IyNDIzOGMxNzYyZWMwMjlkOGVkYWVjODE2YWZiNhJCZXUuZ2NyLmlvL2dpdHBvZC1jb3JlLWRldi9idWlsZC9pZGUvY29kZTpncGwtaGVhZGxlc3MtbG9nLXdzbWFuLjI1",
+        "gitpod/exposedPorts": "Cl4IuQoYASJXaHR0cHM6Ly8xMzM3LWdyYXktbGVtbWluZy0wd2x5dnp5NS53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IuBcYASJXaHR0cHM6Ly8zMDAwLWdyYXktbGVtbWluZy0wd2x5dnp5NS53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IuRcYASJXaHR0cHM6Ly8zMDAxLWdyYXktbGVtbWluZy0wd2x5dnp5NS53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4I6hkYASJXaHR0cHM6Ly8zMzA2LWdyYXktbGVtbWluZy0wd2x5dnp5NS53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IoB8YASJXaHR0cHM6Ly80MDAwLWdyYXktbGVtbWluZy0wd2x5dnp5NS53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tCl4IjC4YASJXaHR0cHM6Ly81OTAwLWdyYXktbGVtbWluZy0wd2x5dnp5NS53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29tClwIwC8iV2h0dHBzOi8vNjA4MC1ncmF5LWxlbW1pbmctMHdseXZ6eTUud3MtZGV2LmdwbC1oZWFkbGVzcy1sb2ctd3NtYW4uc3RhZ2luZy5naXRwb2QtZGV2LmNvbQpeCI1IGAEiV2h0dHBzOi8vOTIyOS1ncmF5LWxlbW1pbmctMHdseXZ6eTUud3MtZGV2LmdwbC1oZWFkbGVzcy1sb2ctd3NtYW4uc3RhZ2luZy5naXRwb2QtZGV2LmNvbQpeCI9OGAEiV2h0dHBzOi8vOTk5OS1ncmF5LWxlbW1pbmctMHdseXZ6eTUud3MtZGV2LmdwbC1oZWFkbGVzcy1sb2ctd3NtYW4uc3RhZ2luZy5naXRwb2QtZGV2LmNvbQpfCMllGAEiWGh0dHBzOi8vMTMwMDEtZ3JheS1sZW1taW5nLTB3bHl2enk1LndzLWRldi5ncGwtaGVhZGxlc3MtbG9nLXdzbWFuLnN0YWdpbmcuZ2l0cG9kLWRldi5jb20KXgjhPBgBIldodHRwczovLzc3NzctZ3JheS1sZW1taW5nLTB3bHl2enk1LndzLWRldi5ncGwtaGVhZGxlc3MtbG9nLXdzbWFuLnN0YWdpbmcuZ2l0cG9kLWRldi5jb20KXwiEaRgBIlhodHRwczovLzEzNDQ0LWdyYXktbGVtbWluZy0wd2x5dnp5NS53cy1kZXYuZ3BsLWhlYWRsZXNzLWxvZy13c21hbi5zdGFnaW5nLmdpdHBvZC1kZXYuY29t",
         "gitpod/ownerToken": "y5-JYhqDzGGprABkr36-fTas8PCeA4sZ",
         "gitpod/servicePrefix": "gray-lemming-0wlyvzy5",
         "gitpod/url": "https://gray-lemming-0wlyvzy5.ws-dev.gpl-headless-log-wsman.staging.gitpod-dev.com",
diff --git a/components/ws-manager/pkg/manager/testdata/status_prebuildSuccess2_CREATING01.golden b/components/ws-manager/pkg/manager/testdata/status_prebuildSuccess2_CREATING01.golden
index 7c639a1730467f..efb49c148a5eb6 100644
--- a/components/ws-manager/pkg/manager/testdata/status_prebuildSuccess2_CREATING01.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_prebuildSuccess2_CREATING01.golden
@@ -82,9 +82,7 @@
         },
         "phase": 2,
         "conditions": {
-            "pulling_images": 1,
-            "service_exists": 1,
-            "deployed": 1
+            "pulling_images": 1
         },
         "message": "containers are being created",
         "runtime": {
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 7026a0766246a2..c2b4c8d488acee 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/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"}]}]}}},"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
diff --git a/components/ws-manager/pkg/manager/testdata/status_prebuildSuccess_STOPPED00.golden b/components/ws-manager/pkg/manager/testdata/status_prebuildSuccess_STOPPED00.golden
index df7ede3e62e76f..e59590b9d641ff 100644
--- a/components/ws-manager/pkg/manager/testdata/status_prebuildSuccess_STOPPED00.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_prebuildSuccess_STOPPED00.golden
@@ -82,10 +82,8 @@
         },
         "phase": 6,
         "conditions": {
-            "service_exists": 1,
             "snapshot": "workspaces/green-wombat-62dzneud/snapshot-1622206186881521445.tar@gitpod-user-d98c5b92-2066-4fce-bea6-1e08b58642ab",
-            "final_backup_complete": 1,
-            "deployed": 1
+            "final_backup_complete": 1
         },
         "runtime": {
             "node_name": "gke-dev-workload-1-49d27f81-pd35",
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 af127fd21bc7dc..63e124bc3945d7 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/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"}]}]}}},"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
diff --git a/components/ws-manager/pkg/manager/testdata/status_prebuildSuccess_STOPPING00.golden b/components/ws-manager/pkg/manager/testdata/status_prebuildSuccess_STOPPING00.golden
index 52fdbc355253c3..ead95109504f62 100644
--- a/components/ws-manager/pkg/manager/testdata/status_prebuildSuccess_STOPPING00.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_prebuildSuccess_STOPPING00.golden
@@ -81,10 +81,7 @@
             }
         },
         "phase": 5,
-        "conditions": {
-            "service_exists": 1,
-            "deployed": 1
-        },
+        "conditions": {},
         "message": "headless workspace is stopping",
         "runtime": {
             "node_name": "gke-dev-workload-1-49d27f81-pd35",
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 3c5d5553aa5158..24251bb29526ce 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/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"}]}]}}},"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
diff --git a/components/ws-manager/pkg/manager/testdata/status_regularStart_Initializing00.golden b/components/ws-manager/pkg/manager/testdata/status_regularStart_Initializing00.golden
index 48d6d94aecc806..f89402ad06f65f 100644
--- a/components/ws-manager/pkg/manager/testdata/status_regularStart_Initializing00.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_regularStart_Initializing00.golden
@@ -12,18 +12,10 @@
         "spec": {
             "workspace_image": "nginx:latest",
             "url": "http://10.0.0.114:8082",
-            "exposed_ports": [
-                {
-                    "port": 8080
-                }
-            ],
             "ide_image": {}
         },
         "phase": 3,
-        "conditions": {
-            "service_exists": 1,
-            "deployed": 1
-        },
+        "conditions": {},
         "message": "workspace initializer is running",
         "runtime": {
             "node_name": "minikube",
diff --git a/components/ws-manager/pkg/manager/testdata/status_regularStart_Initializing00.json b/components/ws-manager/pkg/manager/testdata/status_regularStart_Initializing00.json
index 8daa81cde33902..38f3bb11674155 100644
--- a/components/ws-manager/pkg/manager/testdata/status_regularStart_Initializing00.json
+++ b/components/ws-manager/pkg/manager/testdata/status_regularStart_Initializing00.json
@@ -34,13 +34,6 @@
             "type": "DirectoryOrCreate"
           }
         },
-        {
-          "name": "vol-this-theia",
-          "hostPath": {
-            "path": "/tmp/theia/theia-xyz",
-            "type": "Directory"
-          }
-        },
         {
           "name": "vol-sync-tmp",
           "hostPath": {
@@ -127,10 +120,6 @@
               "name": "vol-this-workspace",
               "mountPath": "/workspace"
             },
-            {
-              "name": "vol-this-theia",
-              "mountPath": "/theia"
-            },
             {
               "name": "default-token-6qnvx",
               "readOnly": true,
diff --git a/components/ws-manager/pkg/manager/testdata/status_stoppedByRequest_000_RUNNING00.golden b/components/ws-manager/pkg/manager/testdata/status_stoppedByRequest_000_RUNNING00.golden
index 5d74ef46395d2f..6c352200c7ca67 100644
--- a/components/ws-manager/pkg/manager/testdata/status_stoppedByRequest_000_RUNNING00.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_stoppedByRequest_000_RUNNING00.golden
@@ -20,12 +20,10 @@
                 },
                 {
                     "port": 27017,
-                    "target": 60000,
                     "url": "https://27017-lime-opossum-3jftf65i.ws-dev.cw-fix-6213.staging.gitpod-dev.com"
                 },
                 {
                     "port": 9229,
-                    "target": 59999,
                     "url": "https://9229-lime-opossum-3jftf65i.ws-dev.cw-fix-6213.staging.gitpod-dev.com"
                 }
             ],
@@ -36,8 +34,6 @@
         },
         "phase": 4,
         "conditions": {
-            "service_exists": 1,
-            "deployed": 1,
             "first_user_activity": {
                 "seconds": 1634238703,
                 "nanos": 983492544
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 500549824d391d..e71c09ab43eb62 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
@@ -29,6 +29,7 @@
         "gitpod.io/stoppedByRequest": "42s",
         "gitpod/admission": "admit_owner_only",
         "gitpod/contentInitializer": "[redacted]",
+        "gitpod/exposedPorts": "ClEIuBciTGh0dHBzOi8vMzAwMC1saW1lLW9wb3NzdW0tM2pmdGY2NWkud3MtZGV2LmN3LWZpeC02MjEzLnN0YWdpbmcuZ2l0cG9kLWRldi5jb20KUwiJ0wEiTWh0dHBzOi8vMjcwMTctbGltZS1vcG9zc3VtLTNqZnRmNjVpLndzLWRldi5jdy1maXgtNjIxMy5zdGFnaW5nLmdpdHBvZC1kZXYuY29tClEIjUgiTGh0dHBzOi8vOTIyOS1saW1lLW9wb3NzdW0tM2pmdGY2NWkud3MtZGV2LmN3LWZpeC02MjEzLnN0YWdpbmcuZ2l0cG9kLWRldi5jb20=",
         "gitpod/customTimeout": "60m",
         "gitpod/firstUserActivity": "2021-10-14T19:11:43.983492544Z",
         "gitpod/id": "18f99de5-090f-4318-9759-05f5ef0277f7",
diff --git a/components/ws-manager/pkg/manager/testdata/status_stuckInCreating_CREATING00.golden b/components/ws-manager/pkg/manager/testdata/status_stuckInCreating_CREATING00.golden
index de370ac8e42e54..7dcf270b10df54 100644
--- a/components/ws-manager/pkg/manager/testdata/status_stuckInCreating_CREATING00.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_stuckInCreating_CREATING00.golden
@@ -17,9 +17,7 @@
         },
         "phase": 4,
         "conditions": {
-            "timeout": "workspace timed out after I've meddled with this test data set",
-            "service_exists": 1,
-            "deployed": 1
+            "timeout": "workspace timed out after I've meddled with this test data set"
         },
         "runtime": {
             "node_name": "gke-production--gitp-workspace-pool-2-a3afc0b4-tmz8",
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 5c9cc402e12594..c8d1aea3a0330a 100644
--- a/components/ws-manager/pkg/manager/testdata/status_stuckInCreating_CREATING00.json
+++ b/components/ws-manager/pkg/manager/testdata/status_stuckInCreating_CREATING00.json
@@ -37,13 +37,6 @@
     },
     "spec": {
       "volumes": [
-        {
-          "name": "vol-this-theia",
-          "hostPath": {
-            "path": "/mnt/disks/ssd0/theia/theia-master.2424",
-            "type": "Directory"
-          }
-        },
         {
           "name": "vol-this-workspace",
           "hostPath": {
@@ -78,11 +71,6 @@
               "name": "vol-this-workspace",
               "mountPath": "/workspace",
               "mountPropagation": "HostToContainer"
-            },
-            {
-              "name": "vol-this-theia",
-              "readOnly": true,
-              "mountPath": "/theia"
             }
           ],
           "readinessProbe": {
diff --git a/components/ws-manager/pkg/manager/testdata/status_stuckInStopping_RUNNING00.golden b/components/ws-manager/pkg/manager/testdata/status_stuckInStopping_RUNNING00.golden
index e1c9bc96ed1041..1e0eca48364508 100644
--- a/components/ws-manager/pkg/manager/testdata/status_stuckInStopping_RUNNING00.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_stuckInStopping_RUNNING00.golden
@@ -30,9 +30,7 @@
         },
         "phase": 4,
         "conditions": {
-            "failed": "container workspace ran with an error: exit code 1",
-            "service_exists": 1,
-            "deployed": 1
+            "failed": "container workspace ran with an error: exit code 1"
         },
         "runtime": {
             "node_name": "gke-gp-prod-ws-us14-us-workspace-pool-67d93ed3-l67s",
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 7f6fd2836ab06d..d49a71d84970bf 100644
--- a/components/ws-manager/pkg/manager/testdata/status_stuckInStopping_RUNNING00.json
+++ b/components/ws-manager/pkg/manager/testdata/status_stuckInStopping_RUNNING00.json
@@ -981,6 +981,7 @@
                 "prometheus.io/scrape": "true",
                 "gitpod/url": "https://purple-raven-cu9cj532.ws-us14.gitpod.io",
                 "gitpod/imageSpec": "CmZldS5nY3IuaW8vZ2l0cG9kLWRldi93b3Jrc3BhY2UtaW1hZ2VzOjY4YzYxZWIwYmI0ZThmYmFmZDE2Yjg3NjM5MGZjMmM3OGE3ODg3ODY2ZWYwYmQ1MzUzNGJiOGZmYzI2ODJiZGMSWGV1Lmdjci5pby9naXRwb2QtY29yZS1kZXYvYnVpbGQvaWRlL2NvZGU6Y29tbWl0LTA5NDFhMDgwNWRjM2M3MzQ1YzQ1YmQ5MjYzMTdlYWYwNDVkNGI3ZmI=",
+                "gitpod/exposedPorts": "CjkIwD4iNGh0dHBzOi8vODAwMC1wdXJwbGUtcmF2ZW4tY3U5Y2o1MzIud3MtdXMxNC5naXRwb2QuaW8KOwj9+QEiNWh0dHBzOi8vMzE5OTctcHVycGxlLXJhdmVuLWN1OWNqNTMyLndzLXVzMTQuZ2l0cG9kLmlv",
                 "prometheus.io/path": "/metrics",
                 "gitpod/servicePrefix": "purple-raven-cu9cj532",
                 "gitpod/ownerToken": "T.DhLiYyx1ZfeOgyf5zYE4MYLnCMBJ8p",
diff --git a/components/ws-manager/pkg/manager/testdata/status_stuckInStopping_STOPPING00.golden b/components/ws-manager/pkg/manager/testdata/status_stuckInStopping_STOPPING00.golden
index 8b84dc0d73e187..0555ab2f92d100 100644
--- a/components/ws-manager/pkg/manager/testdata/status_stuckInStopping_STOPPING00.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_stuckInStopping_STOPPING00.golden
@@ -13,26 +13,13 @@
             "workspace_image": "eu.gcr.io/gitpod-dev/workspace-images:68c61eb0bb4e8fbafd16b876390fc2c78a7887866ef0bd53534bb8ffc2682bdc",
             "deprecated_ide_image": "eu.gcr.io/gitpod-core-dev/build/ide/code:commit-0941a0805dc3c7345c45bd926317eaf045d4b7fb",
             "url": "https://purple-raven-cu9cj532.ws-us14.gitpod.io",
-            "exposed_ports": [
-                {
-                    "port": 8000,
-                    "url": "https://8000-purple-raven-cu9cj532.ws-us14.gitpod.io"
-                },
-                {
-                    "port": 31997,
-                    "url": "https://31997-purple-raven-cu9cj532.ws-us14.gitpod.io"
-                }
-            ],
             "timeout": "30m",
             "ide_image": {
                 "web_ref": "eu.gcr.io/gitpod-core-dev/build/ide/code:commit-0941a0805dc3c7345c45bd926317eaf045d4b7fb"
             }
         },
         "phase": 6,
-        "conditions": {
-            "service_exists": 1,
-            "deployed": 1
-        },
+        "conditions": {},
         "runtime": {
             "node_name": "gke-gp-prod-ws-us14-us-workspace-pool-67d93ed3-l67s",
             "pod_name": "ws-48f13cc4-6311-48c2-950a-4b7ddedc3037",
diff --git a/components/ws-manager/pkg/manager/testdata/status_wsstartup_Creating00.golden b/components/ws-manager/pkg/manager/testdata/status_wsstartup_Creating00.golden
index a7264461ea0b2b..c2f031f8d81735 100644
--- a/components/ws-manager/pkg/manager/testdata/status_wsstartup_Creating00.golden
+++ b/components/ws-manager/pkg/manager/testdata/status_wsstartup_Creating00.golden
@@ -12,18 +12,11 @@
         "spec": {
             "workspace_image": "eu.gcr.io/gitpod-dev/workspace-images/ac1c0755007966e4d6e090ea821729ac747d22ac/eu.gcr.io/gitpod-dev/workspace-base-images/github.com/typefox/gitpod:80a7d427a1fcd346d420603d80a31d57cf75a7af",
             "url": "http://10.0.0.114:8082",
-            "exposed_ports": [
-                {
-                    "port": 8080
-                }
-            ],
             "ide_image": {}
         },
         "phase": 2,
         "conditions": {
-            "failed": "container sync completed; containers of a workspace pod are not supposed to do that",
-            "service_exists": 1,
-            "deployed": 1
+            "failed": "container sync completed; containers of a workspace pod are not supposed to do that"
         },
         "message": "containers are starting",
         "runtime": {
diff --git a/components/ws-manager/pkg/manager/testdata/status_wsstartup_Creating00.json b/components/ws-manager/pkg/manager/testdata/status_wsstartup_Creating00.json
index ad211290e3bf47..3f57fddf7400f4 100644
--- a/components/ws-manager/pkg/manager/testdata/status_wsstartup_Creating00.json
+++ b/components/ws-manager/pkg/manager/testdata/status_wsstartup_Creating00.json
@@ -34,13 +34,6 @@
             "type": "DirectoryOrCreate"
           }
         },
-        {
-          "name": "vol-this-theia",
-          "hostPath": {
-            "path": "/tmp/theia/theia-xyz",
-            "type": "Directory"
-          }
-        },
         {
           "name": "vol-sync-tmp",
           "hostPath": {
@@ -131,11 +124,6 @@
               "name": "vol-this-workspace",
               "mountPath": "/workspace"
             },
-            {
-              "name": "vol-this-theia",
-              "readOnly": true,
-              "mountPath": "/theia"
-            },
             {
               "name": "default-token-n8csj",
               "readOnly": true,
diff --git a/components/ws-manager/pkg/manager/testdata/stopping_basic.json b/components/ws-manager/pkg/manager/testdata/stopping_basic.json
index ef1b2740a856e8..017189692894df 100644
--- a/components/ws-manager/pkg/manager/testdata/stopping_basic.json
+++ b/components/ws-manager/pkg/manager/testdata/stopping_basic.json
@@ -38,13 +38,6 @@
             },
             "spec": {
                 "volumes": [
-                    {
-                        "name": "vol-this-theia",
-                        "hostPath": {
-                            "path": "/mnt/disks/ssd0/theia/theia-master.2437",
-                            "type": "Directory"
-                        }
-                    },
                     {
                         "name": "vol-this-workspace",
                         "hostPath": {
@@ -79,11 +72,6 @@
                                 "name": "vol-this-workspace",
                                 "mountPath": "/workspace",
                                 "mountPropagation": "HostToContainer"
-                            },
-                            {
-                                "name": "vol-this-theia",
-                                "readOnly": true,
-                                "mountPath": "/theia"
                             }
                         ],
                         "readinessProbe": {
diff --git a/components/ws-manager/pkg/manager/testdata/timeout_customTimeout_invalidValue.json b/components/ws-manager/pkg/manager/testdata/timeout_customTimeout_invalidValue.json
index 114739a476e456..3debf59aeb3c93 100644
--- a/components/ws-manager/pkg/manager/testdata/timeout_customTimeout_invalidValue.json
+++ b/components/ws-manager/pkg/manager/testdata/timeout_customTimeout_invalidValue.json
@@ -37,13 +37,6 @@
                             "type": "DirectoryOrCreate"
                         }
                     },
-                    {
-                        "name": "vol-this-theia",
-                        "hostPath": {
-                            "path": "/tmp/theia/theia-xyz",
-                            "type": "Directory"
-                        }
-                    },
                     {
                         "name": "vol-sync-tmp",
                         "hostPath": {
@@ -130,11 +123,6 @@
                                 "name": "vol-this-workspace",
                                 "mountPath": "/workspace"
                             },
-                            {
-                                "name": "vol-this-theia",
-                                "readOnly": true,
-                                "mountPath": "/theia"
-                            },
                             {
                                 "name": "default-token-6qnvx",
                                 "readOnly": true,
diff --git a/components/ws-manager/pkg/manager/testdata/timeout_customTimeout_noActivity.json b/components/ws-manager/pkg/manager/testdata/timeout_customTimeout_noActivity.json
index 3eab4ba7a24914..56f56943950608 100644
--- a/components/ws-manager/pkg/manager/testdata/timeout_customTimeout_noActivity.json
+++ b/components/ws-manager/pkg/manager/testdata/timeout_customTimeout_noActivity.json
@@ -37,13 +37,6 @@
                             "type": "DirectoryOrCreate"
                         }
                     },
-                    {
-                        "name": "vol-this-theia",
-                        "hostPath": {
-                            "path": "/tmp/theia/theia-xyz",
-                            "type": "Directory"
-                        }
-                    },
                     {
                         "name": "vol-sync-tmp",
                         "hostPath": {
@@ -130,11 +123,6 @@
                                 "name": "vol-this-workspace",
                                 "mountPath": "/workspace"
                             },
-                            {
-                                "name": "vol-this-theia",
-                                "readOnly": true,
-                                "mountPath": "/theia"
-                            },
                             {
                                 "name": "default-token-6qnvx",
                                 "readOnly": true,
diff --git a/components/ws-manager/pkg/manager/testdata/timeout_customTimeout_validValue.json b/components/ws-manager/pkg/manager/testdata/timeout_customTimeout_validValue.json
index 8173a323b8a05e..0c56ca18cae70b 100644
--- a/components/ws-manager/pkg/manager/testdata/timeout_customTimeout_validValue.json
+++ b/components/ws-manager/pkg/manager/testdata/timeout_customTimeout_validValue.json
@@ -38,13 +38,6 @@
                             "type": "DirectoryOrCreate"
                         }
                     },
-                    {
-                        "name": "vol-this-theia",
-                        "hostPath": {
-                            "path": "/tmp/theia/theia-xyz",
-                            "type": "Directory"
-                        }
-                    },
                     {
                         "name": "vol-sync-tmp",
                         "hostPath": {
@@ -131,11 +124,6 @@
                                 "name": "vol-this-workspace",
                                 "mountPath": "/workspace"
                             },
-                            {
-                                "name": "vol-this-theia",
-                                "readOnly": true,
-                                "mountPath": "/theia"
-                            },
                             {
                                 "name": "default-token-6qnvx",
                                 "readOnly": true,
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 3913d9f8a3f5b7..261ff81a7340fc 100644
--- a/components/ws-manager/pkg/manager/testdata/timeout_interrupted_noActivity.json
+++ b/components/ws-manager/pkg/manager/testdata/timeout_interrupted_noActivity.json
@@ -37,13 +37,6 @@
       },
       "spec": {
         "volumes": [
-          {
-            "name": "vol-this-theia",
-            "hostPath": {
-              "path": "/mnt/disks/ssd0/theia/theia-master.1605",
-              "type": "Directory"
-            }
-          },
           {
             "name": "vol-this-workspace",
             "hostPath": {
@@ -130,11 +123,6 @@
               {
                 "name": "vol-this-workspace",
                 "mountPath": "/workspace"
-              },
-              {
-                "name": "vol-this-theia",
-                "readOnly": true,
-                "mountPath": "/theia"
               }
             ],
             "livenessProbe": {
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 07fa2ac6388bc8..c62ec926c46369 100644
--- a/components/ws-manager/pkg/manager/testdata/timeout_interrupted_withActivity.json
+++ b/components/ws-manager/pkg/manager/testdata/timeout_interrupted_withActivity.json
@@ -38,13 +38,6 @@
       },
       "spec": {
         "volumes": [
-          {
-            "name": "vol-this-theia",
-            "hostPath": {
-              "path": "/mnt/disks/ssd0/theia/theia-master.1605",
-              "type": "Directory"
-            }
-          },
           {
             "name": "vol-this-workspace",
             "hostPath": {
@@ -131,11 +124,6 @@
               {
                 "name": "vol-this-workspace",
                 "mountPath": "/workspace"
-              },
-              {
-                "name": "vol-this-theia",
-                "readOnly": true,
-                "mountPath": "/theia"
               }
             ],
             "livenessProbe": {
diff --git a/components/ws-manager/pkg/manager/testdata/timeout_prebuild_Creating00.json b/components/ws-manager/pkg/manager/testdata/timeout_prebuild_Creating00.json
index abc8f99e38e8a4..f462de00cdb8f6 100644
--- a/components/ws-manager/pkg/manager/testdata/timeout_prebuild_Creating00.json
+++ b/components/ws-manager/pkg/manager/testdata/timeout_prebuild_Creating00.json
@@ -36,13 +36,6 @@
                             "type": "DirectoryOrCreate"
                         }
                     },
-                    {
-                        "name": "vol-this-theia",
-                        "hostPath": {
-                            "path": "/tmp/theia/theia-xyz",
-                            "type": "Directory"
-                        }
-                    },
                     {
                         "name": "vol-sync-tmp",
                         "hostPath": {
@@ -133,11 +126,6 @@
                                 "name": "vol-this-workspace",
                                 "mountPath": "/workspace"
                             },
-                            {
-                                "name": "vol-this-theia",
-                                "readOnly": true,
-                                "mountPath": "/theia"
-                            },
                             {
                                 "name": "default-token-6qnvx",
                                 "readOnly": true,
diff --git a/components/ws-manager/pkg/manager/testdata/timeout_prebuild_Pending00.json b/components/ws-manager/pkg/manager/testdata/timeout_prebuild_Pending00.json
index 80000a41693659..94149144902199 100644
--- a/components/ws-manager/pkg/manager/testdata/timeout_prebuild_Pending00.json
+++ b/components/ws-manager/pkg/manager/testdata/timeout_prebuild_Pending00.json
@@ -35,13 +35,6 @@
                             "type": "DirectoryOrCreate"
                         }
                     },
-                    {
-                        "name": "vol-this-theia",
-                        "hostPath": {
-                            "path": "/tmp/theia/theia-xyz",
-                            "type": "Directory"
-                        }
-                    },
                     {
                         "name": "vol-sync-tmp",
                         "hostPath": {
@@ -132,11 +125,6 @@
                                 "name": "vol-this-workspace",
                                 "mountPath": "/workspace"
                             },
-                            {
-                                "name": "vol-this-theia",
-                                "readOnly": true,
-                                "mountPath": "/theia"
-                            },
                             {
                                 "name": "default-token-6qnvx",
                                 "readOnly": true,
diff --git a/components/ws-manager/pkg/manager/testdata/timeout_prebuild_customTimeout.json b/components/ws-manager/pkg/manager/testdata/timeout_prebuild_customTimeout.json
index 7435e98a6d1256..cafd747562b8aa 100644
--- a/components/ws-manager/pkg/manager/testdata/timeout_prebuild_customTimeout.json
+++ b/components/ws-manager/pkg/manager/testdata/timeout_prebuild_customTimeout.json
@@ -37,13 +37,6 @@
                             "type": "DirectoryOrCreate"
                         }
                     },
-                    {
-                        "name": "vol-this-theia",
-                        "hostPath": {
-                            "path": "/tmp/theia/theia-xyz",
-                            "type": "Directory"
-                        }
-                    },
                     {
                         "name": "vol-sync-tmp",
                         "hostPath": {
@@ -130,11 +123,6 @@
                                 "name": "vol-this-workspace",
                                 "mountPath": "/workspace"
                             },
-                            {
-                                "name": "vol-this-theia",
-                                "readOnly": true,
-                                "mountPath": "/theia"
-                            },
                             {
                                 "name": "default-token-6qnvx",
                                 "readOnly": true,
diff --git a/components/ws-manager/pkg/manager/testdata/timeout_prebuild_overdue.json b/components/ws-manager/pkg/manager/testdata/timeout_prebuild_overdue.json
index 344159d6dce017..bde7ad45ae13ba 100644
--- a/components/ws-manager/pkg/manager/testdata/timeout_prebuild_overdue.json
+++ b/components/ws-manager/pkg/manager/testdata/timeout_prebuild_overdue.json
@@ -36,13 +36,6 @@
                             "type": "DirectoryOrCreate"
                         }
                     },
-                    {
-                        "name": "vol-this-theia",
-                        "hostPath": {
-                            "path": "/tmp/theia/theia-xyz",
-                            "type": "Directory"
-                        }
-                    },
                     {
                         "name": "vol-sync-tmp",
                         "hostPath": {
@@ -129,11 +122,6 @@
                                 "name": "vol-this-workspace",
                                 "mountPath": "/workspace"
                             },
-                            {
-                                "name": "vol-this-theia",
-                                "readOnly": true,
-                                "mountPath": "/theia"
-                            },
                             {
                                 "name": "default-token-6qnvx",
                                 "readOnly": true,
diff --git a/components/ws-manager/pkg/manager/testdata/timeout_probe_Creating00.json b/components/ws-manager/pkg/manager/testdata/timeout_probe_Creating00.json
index a86de6af62f9ed..81947a00be9959 100644
--- a/components/ws-manager/pkg/manager/testdata/timeout_probe_Creating00.json
+++ b/components/ws-manager/pkg/manager/testdata/timeout_probe_Creating00.json
@@ -36,13 +36,6 @@
                             "type": "DirectoryOrCreate"
                         }
                     },
-                    {
-                        "name": "vol-this-theia",
-                        "hostPath": {
-                            "path": "/tmp/theia/theia-xyz",
-                            "type": "Directory"
-                        }
-                    },
                     {
                         "name": "vol-sync-tmp",
                         "hostPath": {
@@ -133,11 +126,6 @@
                                 "name": "vol-this-workspace",
                                 "mountPath": "/workspace"
                             },
-                            {
-                                "name": "vol-this-theia",
-                                "readOnly": true,
-                                "mountPath": "/theia"
-                            },
                             {
                                 "name": "default-token-6qnvx",
                                 "readOnly": true,
diff --git a/components/ws-manager/pkg/manager/testdata/timeout_regular_closed.json b/components/ws-manager/pkg/manager/testdata/timeout_regular_closed.json
index 84e4329c978ed5..bc24ea8c083702 100644
--- a/components/ws-manager/pkg/manager/testdata/timeout_regular_closed.json
+++ b/components/ws-manager/pkg/manager/testdata/timeout_regular_closed.json
@@ -38,13 +38,6 @@
                             "type": "DirectoryOrCreate"
                         }
                     },
-                    {
-                        "name": "vol-this-theia",
-                        "hostPath": {
-                            "path": "/tmp/theia/theia-xyz",
-                            "type": "Directory"
-                        }
-                    },
                     {
                         "name": "vol-sync-tmp",
                         "hostPath": {
@@ -131,11 +124,6 @@
                                 "name": "vol-this-workspace",
                                 "mountPath": "/workspace"
                             },
-                            {
-                                "name": "vol-this-theia",
-                                "readOnly": true,
-                                "mountPath": "/theia"
-                            },
                             {
                                 "name": "default-token-6qnvx",
                                 "readOnly": true,
diff --git a/components/ws-manager/pkg/manager/testdata/timeout_regular_noActivity.json b/components/ws-manager/pkg/manager/testdata/timeout_regular_noActivity.json
index 8bf3b149106b2a..bd2b8c5ecc79d3 100644
--- a/components/ws-manager/pkg/manager/testdata/timeout_regular_noActivity.json
+++ b/components/ws-manager/pkg/manager/testdata/timeout_regular_noActivity.json
@@ -36,13 +36,6 @@
                             "type": "DirectoryOrCreate"
                         }
                     },
-                    {
-                        "name": "vol-this-theia",
-                        "hostPath": {
-                            "path": "/tmp/theia/theia-xyz",
-                            "type": "Directory"
-                        }
-                    },
                     {
                         "name": "vol-sync-tmp",
                         "hostPath": {
@@ -129,11 +122,6 @@
                                 "name": "vol-this-workspace",
                                 "mountPath": "/workspace"
                             },
-                            {
-                                "name": "vol-this-theia",
-                                "readOnly": true,
-                                "mountPath": "/theia"
-                            },
                             {
                                 "name": "default-token-6qnvx",
                                 "readOnly": true,
diff --git a/components/ws-manager/pkg/manager/testdata/timeout_regular_withActivityOK.json b/components/ws-manager/pkg/manager/testdata/timeout_regular_withActivityOK.json
index a8b221156a744e..5a161e98cbf9dc 100644
--- a/components/ws-manager/pkg/manager/testdata/timeout_regular_withActivityOK.json
+++ b/components/ws-manager/pkg/manager/testdata/timeout_regular_withActivityOK.json
@@ -37,13 +37,6 @@
                             "type": "DirectoryOrCreate"
                         }
                     },
-                    {
-                        "name": "vol-this-theia",
-                        "hostPath": {
-                            "path": "/tmp/theia/theia-xyz",
-                            "type": "Directory"
-                        }
-                    },
                     {
                         "name": "vol-sync-tmp",
                         "hostPath": {
@@ -130,11 +123,6 @@
                                 "name": "vol-this-workspace",
                                 "mountPath": "/workspace"
                             },
-                            {
-                                "name": "vol-this-theia",
-                                "readOnly": true,
-                                "mountPath": "/theia"
-                            },
                             {
                                 "name": "default-token-6qnvx",
                                 "readOnly": true,
diff --git a/components/ws-manager/pkg/manager/testdata/validateStartReq_duplicatePort.json b/components/ws-manager/pkg/manager/testdata/validateStartReq_duplicatePort.json
index fcd97b3160adfe..aef6a27d0bfaed 100644
--- a/components/ws-manager/pkg/manager/testdata/validateStartReq_duplicatePort.json
+++ b/components/ws-manager/pkg/manager/testdata/validateStartReq_duplicatePort.json
@@ -26,73 +26,59 @@
             "theia_version": "master.2507",
             "ports": [
                 {
-                    "target": 31337,
                     "port": 1337,
                     "visibility": 1
                 },
                 {
                     "port": 3000,
-                    "visibility": 1,
-                    "target": 33000
+                    "visibility": 1
                 },
                 {
                     "port": 3001,
-                    "visibility": 1,
-                    "target": 33001
+                    "visibility": 1
                 },
                 {
-                    "target": 33306,
                     "port": 3306,
                     "visibility": 1
                 },
                 {
                     "port": 4000,
-                    "visibility": 1,
-                    "target": 34000
+                    "visibility": 1
                 },
                 {
                     "visibility": 1,
-                    "target": 35900,
                     "port": 5900
                 },
                 {
                     "port": 6080,
-                    "visibility": 1,
-                    "target": 36080
+                    "visibility": 1
                 },
                 {
-                    "target": 39229,
                     "port": 9229,
                     "visibility": 1
                 },
                 {
                     "port": 5900,
-                    "visibility": 1,
-                    "target": 35900
+                    "visibility": 1
                 },
                 {
-                    "target": 36080,
                     "port": 6080,
                     "visibility": 1
                 },
                 {
                     "port": 9999,
-                    "visibility": 1,
-                    "target": 39999
+                    "visibility": 1
                 },
                 {
                     "port": 13001,
-                    "visibility": 1,
-                    "target": 43001
+                    "visibility": 1
                 },
                 {
                     "visibility": 1,
-                    "target": 37777,
                     "port": 7777
                 },
                 {
                     "visibility": 1,
-                    "target": 43444,
                     "port": 13444
                 }
             ],
diff --git a/components/ws-manager/pkg/manager/testdata/validateStartReq_invalidType.json b/components/ws-manager/pkg/manager/testdata/validateStartReq_invalidType.json
index c21ead744f2bd6..b74c5edc864c33 100644
--- a/components/ws-manager/pkg/manager/testdata/validateStartReq_invalidType.json
+++ b/components/ws-manager/pkg/manager/testdata/validateStartReq_invalidType.json
@@ -22,8 +22,7 @@
             },
             "ports": [
                 {
-                    "port": 8080,
-                    "target": 38080
+                    "port": 8080
                 }
             ],
             "envvars": [
diff --git a/components/ws-manager/pkg/manager/testdata/validateStartReq_valid.json b/components/ws-manager/pkg/manager/testdata/validateStartReq_valid.json
index 95c5dabb9bf6e3..706afa562da976 100644
--- a/components/ws-manager/pkg/manager/testdata/validateStartReq_valid.json
+++ b/components/ws-manager/pkg/manager/testdata/validateStartReq_valid.json
@@ -22,8 +22,7 @@
             },
             "ports": [
                 {
-                    "port": 8080,
-                    "target": 38080
+                    "port": 8080
                 }
             ],
             "envvars": [
diff --git a/components/ws-proxy/cmd/root.go b/components/ws-proxy/cmd/root.go
index 877a2b12ce28e3..b5cfe6c28dffe6 100644
--- a/components/ws-proxy/cmd/root.go
+++ b/components/ws-proxy/cmd/root.go
@@ -8,19 +8,20 @@ import (
 	"fmt"
 	"os"
 
+	"github.com/spf13/cobra"
+
 	"github.com/gitpod-io/gitpod/common-go/log"
 	"github.com/gitpod-io/gitpod/common-go/tracing"
-	"github.com/spf13/cobra"
 )
 
 var (
-	// ServiceName is the name we use for tracing/logging
+	// ServiceName is the name we use for tracing/logging.
 	ServiceName = "ws-proxy"
-	// Version of this service - set during build
+	// Version of this service - set during build.
 	Version = ""
 )
 
-// rootCmd represents the base command when called without any subcommands
+// rootCmd represents the base command when called without any subcommands.
 var rootCmd = &cobra.Command{
 	Use:   "ws-proxy",
 	Short: "This acts as reverse-proxy for all workspace-bound requests",
diff --git a/components/ws-proxy/cmd/run.go b/components/ws-proxy/cmd/run.go
index ff6d3bd6e04882..58f8fae476f310 100644
--- a/components/ws-proxy/cmd/run.go
+++ b/components/ws-proxy/cmd/run.go
@@ -5,28 +5,26 @@
 package cmd
 
 import (
-	"github.com/gitpod-io/gitpod/ws-proxy/pkg/config"
-	"net/http"
-	"os"
-	"os/signal"
-	"syscall"
-	"time"
-
-	"github.com/prometheus/client_golang/prometheus"
-	"github.com/prometheus/client_golang/prometheus/collectors"
-	"github.com/prometheus/client_golang/prometheus/promhttp"
+	"github.com/bombsimon/logrusr"
 	"github.com/spf13/cobra"
+	"k8s.io/apimachinery/pkg/runtime"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	clientgoscheme "k8s.io/client-go/kubernetes/scheme"
+	ctrl "sigs.k8s.io/controller-runtime"
+	"sigs.k8s.io/controller-runtime/pkg/healthz"
 
-	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-proxy/pkg/config"
 	"github.com/gitpod-io/gitpod/ws-proxy/pkg/proxy"
 )
 
-var jsonLog bool
-var verbose bool
+var (
+	jsonLog bool
+	verbose bool
+)
 
-// runCmd represents the run command
+// runCmd represents the run command.
 var runCmd = &cobra.Command{
 	Use:   "run ",
 	Short: "Starts ws-proxy",
@@ -37,80 +35,58 @@ var runCmd = &cobra.Command{
 			log.WithError(err).WithField("filename", args[0]).Fatal("cannot load config")
 		}
 
-		common_grpc.SetupLogging()
+		ctrl.SetLogger(logrusr.NewLogger(log.Log))
+
+		opts := ctrl.Options{
+			Scheme:                 scheme,
+			Namespace:              cfg.Namespace,
+			HealthProbeBindAddress: cfg.ReadinessProbeAddr,
+			LeaderElection:         false,
+		}
+
 		if cfg.PrometheusAddr != "" {
-			reg := prometheus.NewRegistry()
-			reg.MustRegister(
-				collectors.NewGoCollector(),
-				collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}),
-				common_grpc.ClientMetrics(),
-			)
-
-			handler := http.NewServeMux()
-			handler.Handle("/metrics", promhttp.HandlerFor(reg, promhttp.HandlerOpts{}))
-
-			go func() {
-				err := http.ListenAndServe(cfg.PrometheusAddr, handler)
-				if err != nil {
-					log.WithError(err).Error("Prometheus metrics server failed")
-				}
-			}()
-			log.WithField("addr", cfg.PrometheusAddr).Info("started Prometheus metrics server")
+			opts.MetricsBindAddress = cfg.PrometheusAddr
 		}
+
+		mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), opts)
+		if err != nil {
+			log.WithError(err).Fatal(err, "unable to start manager")
+		}
+
+		if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil {
+			log.WithError(err).Fatal("unable to set up health check")
+		}
+		if err := mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil {
+			log.WithError(err).Fatal(err, "unable to set up ready check")
+		}
+
 		if cfg.PProfAddr != "" {
 			go pprof.Serve(cfg.PProfAddr)
 		}
 
-		const wsmanConnectionAttempts = 5
-		workspaceInfoProvider := proxy.NewRemoteWorkspaceInfoProvider(cfg.WorkspaceInfoProviderConfig)
-		for i := 0; i < wsmanConnectionAttempts; i++ {
-			err = workspaceInfoProvider.Run()
-			if err == nil {
-				break
-			}
-			if i == wsmanConnectionAttempts-1 {
-				continue
-			}
-
-			log.WithError(err).Error("cannot start workspace info provider - will retry in 10 seconds")
-			time.Sleep(10 * time.Second)
-		}
+		workspaceInfoProvider := proxy.NewRemoteWorkspaceInfoProvider(mgr.GetClient(), mgr.GetScheme())
+		err = workspaceInfoProvider.SetupWithManager(mgr)
 		if err != nil {
-			log.WithError(err).Fatal("cannot start workspace info provider")
+			log.WithError(err).Fatal(err, "unable to create controller", "controller", "Pod")
 		}
+
 		log.Infof("workspace info provider started")
 
 		go proxy.NewWorkspaceProxy(cfg.Ingress, cfg.Proxy, proxy.HostBasedRouter(cfg.Ingress.Header, cfg.Proxy.GitpodInstallation.WorkspaceHostSuffix, cfg.Proxy.GitpodInstallation.WorkspaceHostSuffixRegex), workspaceInfoProvider).MustServe()
-		log.Infof("started proxying on %s", cfg.Ingress.HttpAddress)
-
-		if cfg.ReadinessProbeAddr != "" {
-			go func() {
-				err = http.ListenAndServe(cfg.ReadinessProbeAddr, http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
-					if workspaceInfoProvider.Ready() {
-						resp.WriteHeader(http.StatusOK)
-					} else {
-						resp.WriteHeader(http.StatusServiceUnavailable)
-					}
-				}))
-
-				if err != nil {
-					log.WithError(err).Fatal("readiness endpoint server failed")
-				}
-			}()
-		}
+		log.Infof("started proxying on %s", cfg.Ingress.HTTPAddress)
 
 		log.Info("🚪 ws-proxy is up and running")
-		sigChan := make(chan os.Signal, 1)
-		signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)
-		<-sigChan
-		log.Info("received SIGTERM, ws-proxy is stopping...")
-
-		defer func() {
-			log.Info("ws-proxy stopped.")
-		}()
+		if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
+			log.WithError(err).Fatal(err, "problem starting ws-proxy")
+		}
+
+		log.Info("Received SIGINT - shutting down")
 	},
 }
 
 func init() {
+	utilruntime.Must(clientgoscheme.AddToScheme(scheme))
 	rootCmd.AddCommand(runCmd)
 }
+
+var scheme = runtime.NewScheme()
diff --git a/components/ws-proxy/example-config.json b/components/ws-proxy/example-config.json
index d847f22728a8ea..f43abce7463513 100644
--- a/components/ws-proxy/example-config.json
+++ b/components/ws-proxy/example-config.json
@@ -1,13 +1,10 @@
 {
+  "namespace": "default",
   "ingress": {
     "address": "8080",
     "https": false,
     "header": "x-wsproxy-host"
   },
-  "workspaceInfoProviderConfig": {
-    "wsManagerAddr": "ws-manager:8080",
-    "reconnectInterval": "3s"
-  },
   "proxy": {
     "transportConfig": {
       "connectTimeout": "10s",
@@ -22,8 +19,6 @@
       "workspaceHostSuffixRegex": "\\.ws[^\\.]*\\.gpl-portal\\.staging\\.gitpod-dev\\.com"
     },
     "workspacePodConfig": {
-      "serviceTemplate": "http://ws-{{ .workspaceID }}-theia.staging-gpl-portal.svc.cluster.local:{{ .port }}",
-      "portServiceTemplate": "http://ws-{{ .workspaceID }}-ports.staging-gpl-portal.svc.cluster.local:{{ .port }}",
       "theiaPort": 23000,
       "supervisorPort": 22999
     },
diff --git a/components/ws-proxy/go.mod b/components/ws-proxy/go.mod
index b22e8e4ba50d81..ac9b7760e5c8ec 100644
--- a/components/ws-proxy/go.mod
+++ b/components/ws-proxy/go.mod
@@ -3,36 +3,49 @@ module github.com/gitpod-io/gitpod/ws-proxy
 go 1.17
 
 require (
+	github.com/bombsimon/logrusr v1.1.0
 	github.com/gitpod-io/gitpod/common-go v0.0.0-00010101000000-000000000000
+	github.com/gitpod-io/gitpod/registry-facade/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/gorilla/handlers v1.5.1
 	github.com/gorilla/mux v1.8.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/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
+	sigs.k8s.io/controller-runtime v0.10.2
 )
 
 require (
-	github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // 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/felixge/httpsnoop v1.0.1 // indirect
+	github.com/fsnotify/fsnotify v1.4.9 // indirect
 	github.com/gitpod-io/gitpod/content-service/api v0.0.0-00010101000000-000000000000 // indirect
+	github.com/go-logr/logr v0.4.0 // indirect
+	github.com/gogo/protobuf v1.3.2 // indirect
+	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
 	github.com/golang/protobuf v1.5.2 // 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/google/gofuzz v1.1.0 // indirect
+	github.com/google/uuid v1.1.2 // indirect
+	github.com/googleapis/gnostic v0.5.5 // indirect
+	github.com/imdario/mergo v0.3.12 // indirect
 	github.com/inconshreveable/mousetrap v1.0.0 // indirect
-	github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
+	github.com/json-iterator/go v1.1.11 // indirect
+	github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // 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/opentracing/opentracing-go v1.2.0 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
+	github.com/prometheus/client_golang v1.11.0 // 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
@@ -41,10 +54,26 @@ require (
 	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/sys v0.0.0-20210616094352-59db8d763f22 // indirect
+	golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d // indirect
+	golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2 // indirect
+	golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d // indirect
 	golang.org/x/text v0.3.6 // indirect
-	golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect
-	google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154 // indirect
+	golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
+	gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect
+	google.golang.org/appengine v1.6.7 // indirect
+	google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c // indirect
+	google.golang.org/grpc v1.39.1 // indirect
+	google.golang.org/protobuf v1.27.1 // 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/apiextensions-apiserver v0.22.2 // indirect
+	k8s.io/component-base v0.22.2 // 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
diff --git a/components/ws-proxy/go.sum b/components/ws-proxy/go.sum
index 14afa167ed3f92..8d3ddb4d50cc2b 100644
--- a/components/ws-proxy/go.sum
+++ b/components/ws-proxy/go.sum
@@ -5,16 +5,40 @@ cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6A
 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/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-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
+github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
+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/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/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=
@@ -24,69 +48,123 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd
 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-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/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/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
+github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
 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/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
+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/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/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=
+github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=
+github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=
 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-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
 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/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
 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/creack/pty v1.1.11/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/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
+github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
+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/emicklei/go-restful v2.9.5+incompatible/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.20210217033140-668b12f5399d/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 v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ=
+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/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ=
 github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
+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/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=
 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.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
+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-logr/zapr v0.4.0 h1:uc1uML3hRYL9/ZZPdgHS/n8Nzo+eaYL/Efxkkamf7OM=
+github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk=
+github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
+github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
+github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
+github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg=
+github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
+github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
 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/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
+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/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 h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
+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.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
-github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
+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/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=
@@ -96,10 +174,12 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD
 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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
 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=
@@ -110,23 +190,32 @@ 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 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/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=
 github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=
 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 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=
@@ -150,31 +239,50 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO
 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/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
+github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
+github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
 github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
+github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
 github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
+github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
+github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
 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.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
 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.2/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/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 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/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
+github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
 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=
@@ -184,13 +292,36 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4
 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/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A=
 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/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/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/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
+github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
+github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
 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/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
+github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc=
+github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
+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/onsi/gomega v1.15.0 h1:WjP/FQ/sk43MRmnEcT+MlDw2TFvkrXlprrPST/IudjU=
+github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0=
 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=
@@ -200,6 +331,7 @@ github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+
 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=
@@ -207,6 +339,7 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
 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/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
 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=
@@ -241,31 +374,39 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV
 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.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
 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/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0=
 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 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
 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=
+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/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/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=
@@ -275,14 +416,43 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
 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.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=
+go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
+go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
+go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
+go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0=
+go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE=
+go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc=
+go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4=
 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/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4=
+go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=
+go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM=
+go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=
+go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=
+go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=
+go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE=
+go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE=
+go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=
 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 h1:CUhrE4N1rqSE6FM9ecihEjRkLQu8cDfgDyoOs83mEY4=
 go.uber.org/atomic v1.8.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0=
+go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
 go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
+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=
+go.uber.org/zap v1.19.0 h1:mZQZefskPPCMIBCSEH0v2/iUqqLrYtaeqwD6FUGUnFE=
+go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
 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=
@@ -290,11 +460,18 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U
 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=
@@ -304,15 +481,23 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl
 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/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug=
+golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/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=
@@ -326,16 +511,29 @@ golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn
 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-20201202161906-c7110b5ffcbb/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-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
 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=
@@ -349,6 +547,7 @@ 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-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -360,32 +559,61 @@ golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7w
 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-20200124204421-9fbb57f87de9/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-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/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-20210112080510-489259a85091/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-20210403161142-5e06dd20ab57/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/sys v0.0.0-20210817190340-bfb29a6856f2 h1:c8PlLMqBbOHoqtjteWm5/kbe6rNY2pbRfbIMVnepueo=
+golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2/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.5/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-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/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-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-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
@@ -397,29 +625,58 @@ golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBn
 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-20190624222133-a101b041ded4/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-20191108193012-7d206e10da11/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-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+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 h1:kRBLX7v7Af8W7Gdbbc908OJcdgtK8bOz9Uaj8/F1ACA=
+golang.org/x/tools v0.1.2/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=
+gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY=
+gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY=
 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/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
+google.golang.org/appengine v1.6.7/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=
@@ -429,20 +686,34 @@ google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98
 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/genproto v0.0.0-20210602131652-f16073e35f0c h1:wtujag7C+4D6KMoulW9YauvK2lgdvCMS260jsqqBXr0=
+google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
 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.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
+google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
 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=
@@ -463,21 +734,70 @@ 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 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/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/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=
 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=
+gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
+gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=
 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/apiextensions-apiserver v0.22.2 h1:zK7qI8Ery7j2CaN23UCFaC1hj7dMiI87n01+nKuewd4=
+k8s.io/apiextensions-apiserver v0.22.2/go.mod h1:2E0Ve/isxNl7tWLSUDgi6+cmwHi5fQRdwGVCxbC+KFA=
+k8s.io/apimachinery v0.22.2 h1:ejz6y/zNma8clPVfNDLnPbleBo6MpoFy/HBiBqCouVk=
+k8s.io/apimachinery v0.22.2/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0=
+k8s.io/apiserver v0.22.2/go.mod h1:vrpMmbyjWrgdyOvZTSpsusQq5iigKNWv9o9KlDAbBHI=
+k8s.io/client-go v0.22.2 h1:DaSQgs02aCC1QcwUdkKZWOeaVsQjYvWv8ZazcZ6JcHc=
+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/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
+k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
+k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
+k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
+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/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
+sigs.k8s.io/controller-runtime v0.10.2 h1:jW8qiY+yMnnPx6O9hu63tgcwaKzd1yLYui+mpvClOOc=
+sigs.k8s.io/controller-runtime v0.10.2/go.mod h1:CQp8eyUQZ/Q7PJvnIrB6/hgfTC1kBkGylwsLgOQi1WY=
+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/ws-proxy/pkg/config/config.go b/components/ws-proxy/pkg/config/config.go
index e07f1fc9b08cf9..934b3a2775631a 100644
--- a/components/ws-proxy/pkg/config/config.go
+++ b/components/ws-proxy/pkg/config/config.go
@@ -6,37 +6,37 @@ package config
 
 import (
 	"encoding/json"
-	"github.com/gitpod-io/gitpod/ws-proxy/pkg/proxy"
-	"golang.org/x/xerrors"
 	"os"
+
+	"golang.org/x/xerrors"
+
+	"github.com/gitpod-io/gitpod/ws-proxy/pkg/proxy"
 )
 
-// Config configures this service
+// Config configures this service.
 type Config struct {
-	Ingress                     proxy.HostBasedIngressConfig      `json:"ingress"`
-	Proxy                       proxy.Config                      `json:"proxy"`
-	WorkspaceInfoProviderConfig proxy.WorkspaceInfoProviderConfig `json:"workspaceInfoProviderConfig"`
-	PProfAddr                   string                            `json:"pprofAddr"`
-	PrometheusAddr              string                            `json:"prometheusAddr"`
-	ReadinessProbeAddr          string                            `json:"readinessProbeAddr"`
+	Ingress            proxy.HostBasedIngressConfig `json:"ingress"`
+	Proxy              proxy.Config                 `json:"proxy"`
+	PProfAddr          string                       `json:"pprofAddr"`
+	PrometheusAddr     string                       `json:"prometheusAddr"`
+	ReadinessProbeAddr string                       `json:"readinessProbeAddr"`
+	Namespace          string                       `json:"namespace"`
 }
 
-// Validate validates the configuration to catch issues during startup and not at runtime
+// Validate validates the configuration to catch issues during startup and not at runtime.
 func (c *Config) Validate() error {
 	if err := c.Ingress.Validate(); err != nil {
 		return err
 	}
+
 	if err := c.Proxy.Validate(); err != nil {
 		return err
 	}
-	if err := c.WorkspaceInfoProviderConfig.Validate(); err != nil {
-		return err
-	}
 
 	return nil
 }
 
-// GetConfig loads and validates the configuration
+// GetConfig loads and validates the configuration.
 func GetConfig(fn string) (*Config, error) {
 	fc, err := os.ReadFile(fn)
 	if err != nil {
diff --git a/components/ws-proxy/pkg/proxy/auth.go b/components/ws-proxy/pkg/proxy/auth.go
index 11d5b59e2df18a..17368b3b1c5735 100644
--- a/components/ws-proxy/pkg/proxy/auth.go
+++ b/components/ws-proxy/pkg/proxy/auth.go
@@ -16,7 +16,7 @@ import (
 	"github.com/gitpod-io/gitpod/ws-manager/api"
 )
 
-// WorkspaceAuthHandler rejects requests which are not authenticated or authorized to access a workspace
+// WorkspaceAuthHandler rejects requests which are not authenticated or authorized to access a workspace.
 func WorkspaceAuthHandler(domain string, info WorkspaceInfoProvider) mux.MiddlewareFunc {
 	return func(h http.Handler) http.Handler {
 		cookiePrefix := domain
@@ -35,19 +35,22 @@ func WorkspaceAuthHandler(domain string, info WorkspaceInfoProvider) mux.Middlew
 			if wsID == "" {
 				log.Warn("workspace request without workspace ID")
 				resp.WriteHeader(http.StatusForbidden)
+
 				return
 			}
 
-			ws := info.WorkspaceInfo(req.Context(), wsID)
+			ws := info.WorkspaceInfo(wsID)
 			if ws == nil {
 				log.WithField("workspaceId", wsID).Warn("did not find workspace info")
 				resp.WriteHeader(http.StatusNotFound)
+
 				return
 			}
 
 			if ws.Auth != nil && ws.Auth.Admission == api.AdmissionLevel_ADMIT_EVERYONE {
 				// workspace is free for all - no tokens or cookies matter
 				h.ServeHTTP(resp, req)
+
 				return
 			}
 
@@ -64,6 +67,7 @@ func WorkspaceAuthHandler(domain string, info WorkspaceInfoProvider) mux.Middlew
 					for _, p := range ws.Ports {
 						if p.Port == uint32(prt) {
 							isPublic = p.Visibility == api.PortVisibility_PORT_VISIBILITY_PUBLIC
+
 							break
 						}
 					}
@@ -72,6 +76,7 @@ func WorkspaceAuthHandler(domain string, info WorkspaceInfoProvider) mux.Middlew
 				if isPublic {
 					// workspace port is free for all - no tokens or cookies matter
 					h.ServeHTTP(resp, req)
+
 					return
 				}
 
@@ -85,6 +90,7 @@ func WorkspaceAuthHandler(domain string, info WorkspaceInfoProvider) mux.Middlew
 				if err != nil {
 					log.WithField("cookieName", cn).Debug("no owner cookie present")
 					resp.WriteHeader(http.StatusUnauthorized)
+
 					return
 				}
 
@@ -94,12 +100,14 @@ func WorkspaceAuthHandler(domain string, info WorkspaceInfoProvider) mux.Middlew
 			if err != nil {
 				log.WithError(err).Warn("cannot decode owner token")
 				resp.WriteHeader(http.StatusBadRequest)
+
 				return
 			}
 
 			if tkn != ws.Auth.OwnerToken {
 				log.Warn("owner token mismatch")
 				resp.WriteHeader(http.StatusForbidden)
+
 				return
 			}
 
diff --git a/components/ws-proxy/pkg/proxy/auth_test.go b/components/ws-proxy/pkg/proxy/auth_test.go
index 8e3e0ccda74725..c56243a39985c7 100644
--- a/components/ws-proxy/pkg/proxy/auth_test.go
+++ b/components/ws-proxy/pkg/proxy/auth_test.go
@@ -42,7 +42,7 @@ func TestWorkspaceAuthHandler(t *testing.T) {
 					Admission:  api.AdmissionLevel_ADMIT_OWNER_ONLY,
 					OwnerToken: ownerToken,
 				},
-				Ports: []PortInfo{{PortSpec: api.PortSpec{Port: testPort, Visibility: api.PortVisibility_PORT_VISIBILITY_PRIVATE}}},
+				Ports: []*api.PortSpec{{Port: testPort, Visibility: api.PortVisibility_PORT_VISIBILITY_PRIVATE}},
 			},
 		}
 		publicPortInfos = map[string]*WorkspaceInfo{
@@ -53,7 +53,7 @@ func TestWorkspaceAuthHandler(t *testing.T) {
 					Admission:  api.AdmissionLevel_ADMIT_OWNER_ONLY,
 					OwnerToken: ownerToken,
 				},
-				Ports: []PortInfo{{PortSpec: api.PortSpec{Port: testPort, Visibility: api.PortVisibility_PORT_VISIBILITY_PUBLIC}}},
+				Ports: []*api.PortSpec{{Port: testPort, Visibility: api.PortVisibility_PORT_VISIBILITY_PUBLIC}},
 			},
 		}
 		admitEveryoneInfos = map[string]*WorkspaceInfo{
@@ -251,7 +251,6 @@ func TestWorkspaceAuthHandler(t *testing.T) {
 	}
 }
 
-func setOwnerTokenCookie(r *http.Request, instanceID, token string) *http.Request {
+func setOwnerTokenCookie(r *http.Request, instanceID, token string) {
 	r.AddCookie(&http.Cookie{Name: "_test_domain_com_ws_" + instanceID + "_owner_", Value: token})
-	return r
 }
diff --git a/components/ws-proxy/pkg/proxy/config.go b/components/ws-proxy/pkg/proxy/config.go
index b82335e7ba7036..77d8bfdedb1a4d 100644
--- a/components/ws-proxy/pkg/proxy/config.go
+++ b/components/ws-proxy/pkg/proxy/config.go
@@ -14,7 +14,7 @@ import (
 	"github.com/gitpod-io/gitpod/common-go/util"
 )
 
-// Config is the configuration for a WorkspaceProxy
+// Config is the configuration for a WorkspaceProxy.
 type Config struct {
 	HTTPS struct {
 		Key         string `json:"key"`
@@ -29,7 +29,7 @@ type Config struct {
 	BuiltinPages BuiltinPagesConfig `json:"builtinPages"`
 }
 
-// Validate validates the configuration to catch issues during startup and not at runtime
+// Validate validates the configuration to catch issues during startup and not at runtime.
 func (c *Config) Validate() error {
 	type validatable interface {
 		Validate() error
@@ -49,51 +49,51 @@ func (c *Config) Validate() error {
 	return nil
 }
 
-// HostBasedIngressConfig configures the host-based ingress
+// HostBasedIngressConfig configures the host-based ingress.
 type HostBasedIngressConfig struct {
-	HttpAddress  string `json:"httpAddress"`
-	HttpsAddress string `json:"httpsAddress"`
+	HTTPAddress  string `json:"httpAddress"`
+	HTTPSAddress string `json:"httpsAddress"`
 	Header       string `json:"header"`
 }
 
-// Validate validates this config
+// Validate validates this config.
 func (c *HostBasedIngressConfig) Validate() error {
 	if c == nil {
 		return xerrors.Errorf("host based ingress config is mandatory")
 	}
 	return validation.ValidateStruct(c,
-		validation.Field(&c.HttpAddress, validation.Required),
-		validation.Field(&c.HttpsAddress, validation.Required),
+		validation.Field(&c.HTTPAddress, validation.Required),
+		validation.Field(&c.HTTPSAddress, validation.Required),
 		validation.Field(&c.Header, validation.Required),
 	)
 }
 
-// WorkspacePodConfig contains config around the workspace pod
+// WorkspacePodConfig contains config around the workspace pod.
 type WorkspacePodConfig struct {
-	ServiceTemplate     string `json:"serviceTemplate"`
-	PortServiceTemplate string `json:"portServiceTemplate"`
-	TheiaPort           uint16 `json:"theiaPort"`
-	SupervisorPort      uint16 `json:"supervisorPort"`
-	SupervisorImage     string `json:"supervisorImage"`
+	TheiaPort       uint16 `json:"theiaPort"`
+	SupervisorPort  uint16 `json:"supervisorPort"`
+	SupervisorImage string `json:"supervisorImage"`
 }
 
-// Validate validates the configuration to catch issues during startup and not at runtime
+// Validate validates the configuration to catch issues during startup and not at runtime.
 func (c *WorkspacePodConfig) Validate() error {
 	if c == nil {
 		return xerrors.Errorf("WorkspacePodConfig not configured")
 	}
 
 	err := validation.ValidateStruct(c,
-		validation.Field(&c.ServiceTemplate, validation.Required),
-		validation.Field(&c.PortServiceTemplate, validation.Required),
 		validation.Field(&c.TheiaPort, validation.Required),
 		validation.Field(&c.SupervisorPort, validation.Required),
 		validation.Field(&c.SupervisorImage, validation.Required),
 	)
-	return err
+	if err != nil {
+		return err
+	}
+
+	return nil
 }
 
-// GitpodInstallation contains config regarding the Gitpod installation
+// GitpodInstallation contains config regarding the Gitpod installation.
 type GitpodInstallation struct {
 	Scheme                   string `json:"scheme"`
 	HostName                 string `json:"hostName"`
@@ -101,7 +101,7 @@ type GitpodInstallation struct {
 	WorkspaceHostSuffixRegex string `json:"workspaceHostSuffixRegex"`
 }
 
-// Validate validates the configuration to catch issues during startup and not at runtime
+// Validate validates the configuration to catch issues during startup and not at runtime.
 func (c *GitpodInstallation) Validate() error {
 	if c == nil {
 		return xerrors.Errorf("GitpodInstallation not configured")
@@ -114,13 +114,13 @@ func (c *GitpodInstallation) Validate() error {
 	)
 }
 
-// BlobServerConfig configures where to serve the IDE from
+// BlobServerConfig configures where to serve the IDE from.
 type BlobServerConfig struct {
 	Scheme string `json:"scheme"`
 	Host   string `json:"host"`
 }
 
-// Validate validates the configuration to catch issues during startup and not at runtime
+// Validate validates the configuration to catch issues during startup and not at runtime.
 func (c *BlobServerConfig) Validate() error {
 	if c == nil {
 		return xerrors.Errorf("BlobServer not configured")
@@ -136,7 +136,7 @@ func (c *BlobServerConfig) Validate() error {
 	return nil
 }
 
-// TransportConfig configures the way how ws-proxy connects to it's backend services
+// TransportConfig configures the way how ws-proxy connects to it's backend services.
 type TransportConfig struct {
 	ConnectTimeout      util.Duration `json:"connectTimeout"`
 	IdleConnTimeout     util.Duration `json:"idleConnTimeout"`
@@ -144,7 +144,7 @@ type TransportConfig struct {
 	MaxIdleConnsPerHost int           `json:"maxIdleConnsPerHost"`
 }
 
-// Validate validates the configuration to catch issues during startup and not at runtime
+// Validate validates the configuration to catch issues during startup and not at runtime.
 func (c *TransportConfig) Validate() error {
 	if c == nil {
 		return xerrors.Errorf("TransportConfig not configured")
@@ -158,12 +158,12 @@ func (c *TransportConfig) Validate() error {
 	)
 }
 
-// BuiltinPagesConfig configures pages served directly by ws-proxy
+// BuiltinPagesConfig configures pages served directly by ws-proxy.
 type BuiltinPagesConfig struct {
 	Location string `json:"location"`
 }
 
-// Validate validates the configuration to catch issues during startup and not at runtime
+// Validate validates the configuration to catch issues during startup and not at runtime.
 func (c *BuiltinPagesConfig) Validate() error {
 	if c == nil {
 		return xerrors.Errorf("BuiltinPagesConfig not configured")
diff --git a/components/ws-proxy/pkg/proxy/cookies.go b/components/ws-proxy/pkg/proxy/cookies.go
index 8344c83a419996..b7c1f23688ec6f 100644
--- a/components/ws-proxy/pkg/proxy/cookies.go
+++ b/components/ws-proxy/pkg/proxy/cookies.go
@@ -20,7 +20,7 @@ import (
 // readCookies parses all "Cookie" values from the header h and
 // returns the successfully parsed Cookies.
 //
-// if filter isn't empty, only cookies of that name are returned
+// if filter isn't empty, only cookies of that name are returned.
 func readCookies(h http.Header, filter string) []*http.Cookie {
 	lines := h["Cookie"]
 	if len(lines) == 0 {
diff --git a/components/ws-proxy/pkg/proxy/infoprovider.go b/components/ws-proxy/pkg/proxy/infoprovider.go
index 98c8fb8b63d305..778cbe0cee1e84 100644
--- a/components/ws-proxy/pkg/proxy/infoprovider.go
+++ b/components/ws-proxy/pkg/proxy/infoprovider.go
@@ -6,65 +6,44 @@ package proxy
 
 import (
 	"context"
-	"io"
 	"net/url"
-	"strconv"
-	"sync"
+	"strings"
 	"time"
 
-	validation "github.com/go-ozzo/ozzo-validation"
 	"golang.org/x/xerrors"
-	"google.golang.org/grpc"
-	"google.golang.org/grpc/credentials"
-
-	common_grpc "github.com/gitpod-io/gitpod/common-go/grpc"
+	corev1 "k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/api/errors"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/client-go/tools/cache"
+	ctrl "sigs.k8s.io/controller-runtime"
+	"sigs.k8s.io/controller-runtime/pkg/builder"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/predicate"
+	"sigs.k8s.io/controller-runtime/pkg/reconcile"
+
+	"github.com/gitpod-io/gitpod/common-go/kubernetes"
 	"github.com/gitpod-io/gitpod/common-go/log"
-	"github.com/gitpod-io/gitpod/common-go/util"
+	regapi "github.com/gitpod-io/gitpod/registry-facade/api"
+	"github.com/gitpod-io/gitpod/ws-manager/api"
 	wsapi "github.com/gitpod-io/gitpod/ws-manager/api"
 )
 
-// WorkspaceCoords represents the coordinates of a workspace (port)
+// WorkspaceCoords represents the coordinates of a workspace (port).
 type WorkspaceCoords struct {
 	// The workspace ID
 	ID string
-	// The workspace port. "" in case of Theia
+	// The workspace port
 	Port string
 }
 
-// WorkspaceInfoProvider is an entity that is able to provide workspaces related information
+// WorkspaceInfoProvider is an entity that is able to provide workspaces related information.
 type WorkspaceInfoProvider interface {
 	// WorkspaceInfo returns the workspace information of a workspace using it's workspace ID
-	WorkspaceInfo(ctx context.Context, workspaceID string) *WorkspaceInfo
-
-	// WorkspaceCoords provides workspace coordinates for a workspace using the public port
-	// exposed by this service.
-	WorkspaceCoords(publicPort string) *WorkspaceCoords
-}
-
-// WorkspaceInfoProviderConfig configures a WorkspaceInfoProvider
-type WorkspaceInfoProviderConfig struct {
-	WsManagerAddr     string        `json:"wsManagerAddr"`
-	ReconnectInterval util.Duration `json:"reconnectInterval"`
-	TLS               struct {
-		CA   string `json:"ca"`
-		Cert string `json:"crt"`
-		Key  string `json:"key"`
-	} `json:"tls"`
-}
-
-// Validate validates the configuration to catch issues during startup and not at runtime
-func (c *WorkspaceInfoProviderConfig) Validate() error {
-	if c == nil {
-		return xerrors.Errorf("WorkspaceInfoProviderConfig not configured")
-	}
-
-	err := validation.ValidateStruct(c,
-		validation.Field(&c.WsManagerAddr, validation.Required),
-	)
-	return err
+	WorkspaceInfo(workspaceID string) *WorkspaceInfo
 }
 
-// WorkspaceInfo is all the infos ws-proxy needs to know about a workspace
+// WorkspaceInfo is all the infos ws-proxy needs to know about a workspace.
 type WorkspaceInfo struct {
 	WorkspaceID string
 	InstanceID  string
@@ -75,264 +54,129 @@ type WorkspaceInfo struct {
 	// (parsed from URL)
 	IDEPublicPort string
 
-	Ports     []PortInfo
-	Auth      *wsapi.WorkspaceAuthentication
-	Phase     wsapi.WorkspacePhase
-	StartedAt time.Time
-}
+	IPAddress string
 
-// PortInfo contains all information ws-proxy needs to know about a workspace port
-type PortInfo struct {
-	wsapi.PortSpec
+	Ports []*api.PortSpec
 
-	// The publicly visible proxy port it is exposed on
-	PublicPort string
+	Auth      *wsapi.WorkspaceAuthentication
+	StartedAt time.Time
 }
 
-// RemoteWorkspaceInfoProvider provides (cached) infos about running workspaces that it queries from ws-manager
+// RemoteWorkspaceInfoProvider provides (cached) infos about running workspaces that it queries from ws-manager.
 type RemoteWorkspaceInfoProvider struct {
-	Config WorkspaceInfoProviderConfig
-	Dialer WSManagerDialer
+	client.Client
+	Scheme *runtime.Scheme
 
-	stop  chan struct{}
-	ready bool
-	mu    sync.Mutex
-	cache *workspaceInfoCache
+	store cache.ThreadSafeStore
 }
 
-// WSManagerDialer dials out to a ws-manager instance
-type WSManagerDialer func(target string, dialOption grpc.DialOption) (io.Closer, wsapi.WorkspaceManagerClient, error)
+const (
+	workspaceIndex = "workspaceIndex"
+)
 
-// NewRemoteWorkspaceInfoProvider creates a fresh WorkspaceInfoProvider
-func NewRemoteWorkspaceInfoProvider(config WorkspaceInfoProviderConfig) *RemoteWorkspaceInfoProvider {
-	return &RemoteWorkspaceInfoProvider{
-		Config: config,
-		Dialer: defaultWsmanagerDialer,
-		cache:  newWorkspaceInfoCache(),
-		stop:   make(chan struct{}),
-	}
-}
+// NewRemoteWorkspaceInfoProvider creates a fresh WorkspaceInfoProvider.
+func NewRemoteWorkspaceInfoProvider(client client.Client, scheme *runtime.Scheme) *RemoteWorkspaceInfoProvider {
+	// create custom indexer for searches
+	indexers := cache.Indexers{
+		workspaceIndex: func(obj interface{}) ([]string, error) {
+			if workspaceInfo, ok := obj.(*WorkspaceInfo); ok {
+				return []string{workspaceInfo.WorkspaceID}, nil
+			}
 
-// Close prevents the info provider from connecting
-func (p *RemoteWorkspaceInfoProvider) Close() {
-	close(p.stop)
-}
+			return nil, xerrors.Errorf("object is not a WorkspaceInfo")
+		},
+	}
 
-func defaultWsmanagerDialer(target string, dialOption grpc.DialOption) (io.Closer, wsapi.WorkspaceManagerClient, error) {
-	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
-	defer cancel()
+	return &RemoteWorkspaceInfoProvider{
+		Client: client,
+		Scheme: scheme,
 
-	grpcOpts := common_grpc.DefaultClientOptions()
-	grpcOpts = append(grpcOpts, dialOption)
-	conn, err := grpc.DialContext(ctx, target, grpcOpts...)
-	if err != nil {
-		return nil, nil, err
+		store: cache.NewThreadSafeStore(indexers, cache.Indices{}),
 	}
-
-	client := wsapi.NewWorkspaceManagerClient(conn)
-	return conn, client, err
 }
 
-// Run is meant to be called as a go-routine and streams the current state of all workspace statuus from ws-manager,
-// transforms the relevent pieces into WorkspaceInfos and stores them in the cache
-func (p *RemoteWorkspaceInfoProvider) Run() (err error) {
-	// create initial connection
-	target := p.Config.WsManagerAddr
-	dialOption := grpc.WithInsecure()
-	if p.Config.TLS.CA != "" && p.Config.TLS.Cert != "" && p.Config.TLS.Key != "" {
-		tlsConfig, err := common_grpc.ClientAuthTLSConfig(
-			p.Config.TLS.CA, p.Config.TLS.Cert, p.Config.TLS.Key,
-			common_grpc.WithSetRootCAs(true),
-			common_grpc.WithServerName("ws-manager"),
-		)
-		if err != nil {
-			log.WithField("config", p.Config.TLS).Error("Cannot load ws-manager certs - this is a configuration issue.")
-			return xerrors.Errorf("cannot load ws-manager certs: %w", err)
-		}
+func (r *RemoteWorkspaceInfoProvider) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
+	var pod corev1.Pod
+	err := r.Client.Get(context.Background(), req.NamespacedName, &pod)
+	if errors.IsNotFound(err) {
+		// pod is gone - that's ok
+		r.store.Delete(req.Name)
+		log.WithField("workspace", req.Name).Debug("removing workspace from store")
 
-		dialOption = grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig))
+		return reconcile.Result{}, nil
 	}
-	conn, client, err := p.Dialer(target, dialOption)
-	if err != nil {
-		return xerrors.Errorf("error while connecting to ws-manager: %w", err)
-	}
-
-	// do the initial fetching synchronously
-	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
-	defer cancel()
-	infos, err := p.fetchInitialWorkspaceInfo(ctx, client)
-	if err != nil {
-		return err
-	}
-	p.cache.Reinit(infos)
-
-	// maintain connection and stream workspace statuus
-	go func(conn io.Closer, client wsapi.WorkspaceManagerClient) {
-		for {
-			p.mu.Lock()
-			p.ready = true
-			p.mu.Unlock()
-
-			err := p.listen(client)
-			if xerrors.Is(err, io.EOF) {
-				log.Warn("ws-manager closed the connection, reconnecting after timeout...")
-			} else if err != nil {
-				log.WithError(err).Warnf("error while listening for workspace status updates, reconnecting after timeout")
-			}
 
-			conn.Close()
-			p.mu.Lock()
-			p.ready = false
-			p.mu.Unlock()
+	// extract workspace details from pod and store
+	workspaceInfo := mapPodToWorkspaceInfo(&pod)
+	r.store.Update(req.Name, workspaceInfo)
+	log.WithField("workspace", req.Name).WithField("details", workspaceInfo).Debug("adding/updating workspace details")
 
-			var stop bool
-			select {
-			case <-p.stop:
-				stop = true
-			default:
-			}
-			if stop {
-				break
-			}
-
-			for {
-				time.Sleep(time.Duration(p.Config.ReconnectInterval))
-
-				conn, client, err = p.Dialer(target, dialOption)
-				if err != nil {
-					log.WithError(err).Warnf("error while connecting to ws-manager, reconnecting after timeout...")
-					continue
-				}
-				break
-			}
-		}
-	}(conn, client)
-
-	return nil
+	return ctrl.Result{}, nil
 }
 
-// Ready returns true if the info provider is up and running
-func (p *RemoteWorkspaceInfoProvider) Ready() bool {
-	p.mu.Lock()
-	defer p.mu.Unlock()
-
-	return p.ready
-}
-
-// listen starts listening to WorkspaceStatus updates from ws-manager
-func (p *RemoteWorkspaceInfoProvider) listen(client wsapi.WorkspaceManagerClient) (err error) {
-	defer func() {
-		if err != nil {
-			err = xerrors.Errorf("error while starting streaming status updates from ws-manager: %w", err)
-		}
-	}()
-
-	// rebuild entire cache on (re-)connect
-	ctx := context.Background()
-	infos, err := p.fetchInitialWorkspaceInfo(ctx, client)
-	if err != nil {
-		return err
-	}
-	p.cache.Reinit(infos)
-
-	// start streaming status updates
-	stream, err := client.Subscribe(ctx, &wsapi.SubscribeRequest{})
+// SetupWithManager sets up the controller with the Manager.
+func (r *RemoteWorkspaceInfoProvider) SetupWithManager(mgr ctrl.Manager) error {
+	podWorkspaceSelector, err := predicate.LabelSelectorPredicate(metav1.LabelSelector{
+		MatchLabels: map[string]string{
+			"app":           "gitpod",
+			"component":     "workspace",
+			"headless":      "false",
+			"workspaceType": "regular",
+		},
+	})
 	if err != nil {
 		return err
 	}
-	for {
-		resp, err := stream.Recv()
-		if err != nil {
-			return err
-		}
-
-		status := resp.GetStatus()
-		if status == nil {
-			// some subscription responses contain log output rather than status updates.
-			continue
-		}
 
-		if status.Phase == wsapi.WorkspacePhase_STOPPED {
-			p.cache.Delete(status.Metadata.MetaId, status.Id)
-		} else {
-			info := mapWorkspaceStatusToInfo(status)
-			p.cache.Insert(info)
-		}
-	}
+	return ctrl.NewControllerManagedBy(mgr).
+		Named("pod").
+		WithEventFilter(predicate.ResourceVersionChangedPredicate{}).
+		For(
+			&corev1.Pod{},
+			builder.WithPredicates(podWorkspaceSelector),
+		).
+		Complete(r)
 }
 
-// fetchInitialWorkspaceInfo retrieves initial WorkspaceStatus' from ws-manager and maps them into WorkspaceInfos
-func (p *RemoteWorkspaceInfoProvider) fetchInitialWorkspaceInfo(ctx context.Context, client wsapi.WorkspaceManagerClient) ([]*WorkspaceInfo, error) {
-	initialResp, err := client.GetWorkspaces(ctx, &wsapi.GetWorkspacesRequest{})
-	if err != nil {
-		return nil, xerrors.Errorf("error while retrieving initial state from ws-manager: %w", err)
+func mapPodToWorkspaceInfo(pod *corev1.Pod) *WorkspaceInfo {
+	ownerToken := pod.Annotations[kubernetes.OwnerTokenAnnotation]
+	admission := wsapi.AdmissionLevel_ADMIT_OWNER_ONLY
+	if av, ok := wsapi.AdmissionLevel_value[strings.ToUpper(pod.Annotations[kubernetes.WorkspaceAdmissionAnnotation])]; ok {
+		admission = wsapi.AdmissionLevel(av)
 	}
 
-	var infos []*WorkspaceInfo
-	for _, status := range initialResp.GetStatus() {
-		infos = append(infos, mapWorkspaceStatusToInfo(status))
-	}
-	return infos, nil
-}
-
-func mapWorkspaceStatusToInfo(status *wsapi.WorkspaceStatus) *WorkspaceInfo {
-	var portInfos []PortInfo
-	for _, spec := range status.Spec.ExposedPorts {
-		proxyPort := getPortStr(spec.Url)
-		if proxyPort == "" {
-			continue
-		}
+	imageSpec, _ := regapi.ImageSpecFromBase64(pod.Annotations[kubernetes.WorkspaceImageSpecAnnotation])
 
-		portInfos = append(portInfos, PortInfo{
-			PortSpec:   *spec,
-			PublicPort: proxyPort,
-		})
-	}
-
-	ideImage := status.Spec.DeprecatedIdeImage
-	if len(status.Spec.IdeImage.WebRef) > 0 {
-		ideImage = status.Spec.IdeImage.WebRef
-	}
+	workspaceURL := pod.Annotations[kubernetes.WorkspaceURLAnnotation]
 
 	return &WorkspaceInfo{
-		WorkspaceID:   status.Metadata.MetaId,
-		InstanceID:    status.Id,
-		URL:           status.Spec.Url,
-		IDEImage:      ideImage,
-		IDEPublicPort: getPortStr(status.Spec.Url),
-		Ports:         portInfos,
-		Auth:          status.Auth,
-		Phase:         status.Phase,
-		StartedAt:     status.Metadata.StartedAt.AsTime(),
+		WorkspaceID:   pod.Labels[kubernetes.MetaIDLabel],
+		InstanceID:    pod.Labels[kubernetes.WorkspaceIDLabel],
+		URL:           workspaceURL,
+		IDEImage:      imageSpec.IdeRef,
+		IDEPublicPort: getPortStr(workspaceURL),
+		IPAddress:     pod.Status.PodIP,
+		Ports:         extractExposedPorts(pod).Ports,
+		Auth:          &wsapi.WorkspaceAuthentication{Admission: admission, OwnerToken: ownerToken},
+		StartedAt:     pod.CreationTimestamp.Time,
 	}
 }
 
 // WorkspaceInfo return the WorkspaceInfo available for the given workspaceID.
-// Callers should make sure their context gets canceled properly. For good measure
-// this function will timeout by itself as well.
-func (p *RemoteWorkspaceInfoProvider) WorkspaceInfo(ctx context.Context, workspaceID string) *WorkspaceInfo {
-	// In case the parent context does not cancel for some reason, we want to make sure
-	// we clean up after ourselves to not leak Go routines.
-	ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
-	defer cancel()
-
-	info, present := p.cache.WaitFor(ctx, workspaceID)
-	if !present {
+func (r *RemoteWorkspaceInfoProvider) WorkspaceInfo(workspaceID string) *WorkspaceInfo {
+	workspaces, err := r.store.ByIndex(workspaceIndex, workspaceID)
+	if err != nil {
 		return nil
 	}
-	return info
-}
 
-// WorkspaceCoords returns the WorkspaceCoords the given publicPort is associated with
-func (p *RemoteWorkspaceInfoProvider) WorkspaceCoords(publicPort string) *WorkspaceCoords {
-	coords, present := p.cache.GetCoordsByPublicPort(publicPort)
-	if !present {
-		return nil
+	if len(workspaces) == 1 {
+		return workspaces[0].(*WorkspaceInfo)
 	}
-	return coords
+
+	return nil
 }
 
-// getPortStr extracts the port part from a given URL string. Returns "" if parsing fails or port is not specified
+// getPortStr extracts the port part from a given URL string. Returns "" if parsing fails or port is not specified.
 func getPortStr(urlStr string) string {
 	portURL, err := url.Parse(urlStr)
 	if err != nil {
@@ -347,198 +191,27 @@ func getPortStr(urlStr string) string {
 			return "443"
 		}
 	}
-	return portURL.Port()
-}
-
-// TODO(rl): type def workspaceID and instanceID throughout for better readability and type safety?
-type workspaceInfosByInstance map[string]*WorkspaceInfo
-type instanceInfosByWorkspace map[string]workspaceInfosByInstance
-
-// workspaceInfoCache stores WorkspaceInfo in a manner which is easy to query for WorkspaceInfoProvider
-type workspaceInfoCache struct {
-	// WorkspaceInfos indexed by workspaceID and then instanceID
-	infos instanceInfosByWorkspace
-	// WorkspaceCoords indexed by public (proxy) port (string)
-	coordsByPublicPort map[string]*WorkspaceCoords
-
-	// cond signals the arrival of new workspace info
-	cond *sync.Cond
-	// mu is cond's Locker
-	mu *sync.RWMutex
-}
-
-func newWorkspaceInfoCache() *workspaceInfoCache {
-	var mu sync.RWMutex
-	return &workspaceInfoCache{
-		infos:              make(map[string]workspaceInfosByInstance),
-		coordsByPublicPort: make(map[string]*WorkspaceCoords),
-		mu:                 &mu,
-		cond:               sync.NewCond(&mu),
-	}
-}
-
-func (c *workspaceInfoCache) Reinit(infos []*WorkspaceInfo) {
-	c.cond.L.Lock()
-	defer c.cond.L.Unlock()
-
-	c.infos = make(map[string]workspaceInfosByInstance, len(infos))
-	c.coordsByPublicPort = make(map[string]*WorkspaceCoords, len(c.coordsByPublicPort))
-
-	for _, info := range infos {
-		c.doInsert(info)
-	}
-	c.cond.Broadcast()
-}
-
-func (c *workspaceInfoCache) Insert(info *WorkspaceInfo) {
-	c.cond.L.Lock()
-	defer c.cond.L.Unlock()
-
-	c.doInsert(info)
-	c.cond.Broadcast()
-}
-
-func (c *workspaceInfoCache) doInsert(info *WorkspaceInfo) {
-	existingInfos, ok := c.infos[info.WorkspaceID]
-	if !ok {
-		existingInfos = make(map[string]*WorkspaceInfo)
-	}
-	existingInfos[info.InstanceID] = info
-	c.infos[info.WorkspaceID] = existingInfos
-
-	// NOTE: in the unlikely event that a subsequent insert changes the port
-	//       then we add it here assuming that the delete will remove it
-	c.coordsByPublicPort[info.IDEPublicPort] = &WorkspaceCoords{
-		ID: info.WorkspaceID,
-	}
-
-	for _, p := range info.Ports {
-		c.coordsByPublicPort[p.PublicPort] = &WorkspaceCoords{
-			ID:   info.WorkspaceID,
-			Port: strconv.Itoa(int(p.Port)),
-		}
-	}
-}
-
-func (c *workspaceInfoCache) Delete(workspaceID string, instanceID string) {
-	c.cond.L.Lock()
-	defer c.cond.L.Unlock()
-
-	infos, present := c.infos[workspaceID]
-	if !present || infos == nil {
-		return
-	}
 
-	// Keep only the active instances and public port(s) for the workspace id
-	var instanceIDEPublicPort string
-	if info, ok := infos[instanceID]; ok {
-		delete(infos, instanceID)
-		instanceIDEPublicPort = info.IDEPublicPort
-	}
-
-	if len(infos) == 0 {
-		delete(c.infos, workspaceID)
-	} else {
-		c.infos[workspaceID] = infos
-	}
-
-	// Clean up the public port if port no longer active
-	activePublicPorts := make(map[string]interface{})
-	for _, info := range infos {
-		activePublicPorts[info.IDEPublicPort] = true
-	}
-
-	if _, ok := activePublicPorts[instanceIDEPublicPort]; !ok {
-		delete(c.coordsByPublicPort, instanceIDEPublicPort)
-	}
-}
-
-// WaitFor waits for workspace info until that info is available or the context is canceled.
-func (c *workspaceInfoCache) WaitFor(ctx context.Context, workspaceID string) (w *WorkspaceInfo, ok bool) {
-	c.mu.RLock()
-	existing, ok := c.infos[workspaceID]
-	c.mu.RUnlock()
-
-	getCandidate := func(infos map[string]*WorkspaceInfo) *WorkspaceInfo {
-		// Find the *best* candidate i.e. prefer any instance running over stopping/stopped
-		// If there are >1 instances in running state it will pick the most recently started
-		// as opposed to the random iteration order (which is harder to test)
-		// NOTE: Yes, these is a potential issue with clock drift
-		//       but this scenario is extremely unlikely to happen in the wild
-		var candidate *WorkspaceInfo
-		for _, info := range infos {
-			if candidate == nil ||
-				(info.Phase == wsapi.WorkspacePhase_RUNNING &&
-					(candidate.Phase != info.Phase || info.StartedAt.After(candidate.StartedAt))) ||
-				(candidate.Phase > wsapi.WorkspacePhase_RUNNING && candidate.Phase < info.Phase) {
-				candidate = info
-			}
-		}
-		return candidate
-	}
-
-	if ok {
-		return getCandidate(existing), true
-	}
-
-	inc := make(chan *WorkspaceInfo)
-	go func() {
-		defer close(inc)
-
-		c.cond.L.Lock()
-		defer c.cond.L.Unlock()
-		for {
-			c.cond.Wait()
-			if ctx.Err() != nil {
-				return
-			}
-
-			infos, ok := c.infos[workspaceID]
-			if !ok {
-				continue
-			}
-
-			inc <- getCandidate(infos)
-			return
-		}
-	}()
-
-	select {
-	case w = <-inc:
-		if w == nil {
-			return nil, false
-		}
-		return w, true
-	case <-ctx.Done():
-		return nil, false
-	}
-}
-
-func (c *workspaceInfoCache) GetCoordsByPublicPort(wsProxyPort string) (*WorkspaceCoords, bool) {
-	c.mu.RLock()
-	defer c.mu.RUnlock()
-
-	coords, ok := c.coordsByPublicPort[wsProxyPort]
-	return coords, ok
+	return portURL.Port()
 }
 
 type fixedInfoProvider struct {
-	Infos  map[string]*WorkspaceInfo
-	Coords map[string]*WorkspaceCoords
+	Infos map[string]*WorkspaceInfo
 }
 
-// WorkspaceInfo returns the workspace information of a workspace using it's workspace ID
-func (fp *fixedInfoProvider) WorkspaceInfo(ctx context.Context, workspaceID string) *WorkspaceInfo {
+// WorkspaceInfo returns the workspace information of a workspace using it's workspace ID.
+func (fp *fixedInfoProvider) WorkspaceInfo(workspaceID string) *WorkspaceInfo {
 	if fp.Infos == nil {
 		return nil
 	}
 	return fp.Infos[workspaceID]
 }
 
-// WorkspaceCoords provides workspace coordinates for a workspace using the public port exposed by this service.
-func (fp *fixedInfoProvider) WorkspaceCoords(publicPort string) *WorkspaceCoords {
-	if fp.Coords == nil {
-		return nil
+func extractExposedPorts(pod *corev1.Pod) *api.ExposedPorts {
+	if data, ok := pod.Annotations[kubernetes.WorkspaceExposedPorts]; ok {
+		ports, _ := api.ExposedPortsFromBase64(data)
+		return ports
 	}
-	return fp.Coords[publicPort]
+
+	return &api.ExposedPorts{}
 }
diff --git a/components/ws-proxy/pkg/proxy/infoprovider_test.go b/components/ws-proxy/pkg/proxy/infoprovider_test.go
deleted file mode 100644
index 40d4cb5c712232..00000000000000
--- a/components/ws-proxy/pkg/proxy/infoprovider_test.go
+++ /dev/null
@@ -1,1026 +0,0 @@
-// Copyright (c) 2020 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 proxy
-
-import (
-	"context"
-	"fmt"
-	"io"
-	"testing"
-	"time"
-
-	wsapi "github.com/gitpod-io/gitpod/ws-manager/api"
-	wsmock "github.com/gitpod-io/gitpod/ws-manager/api/mock"
-	"github.com/golang/mock/gomock"
-	"github.com/google/go-cmp/cmp"
-	"github.com/google/go-cmp/cmp/cmpopts"
-	"google.golang.org/grpc"
-	"google.golang.org/protobuf/types/known/timestamppb"
-)
-
-func TestRemoteInfoProvider(t *testing.T) {
-	type Expectation struct {
-		WorkspaceInfo *WorkspaceInfo
-	}
-	type Step struct {
-		Update      *wsapi.SubscribeResponse
-		Action      func(*testing.T, WorkspaceInfoProvider) *Expectation
-		Expectation *Expectation
-		Parallel    bool
-		DelayUpdate time.Duration
-	}
-	tests := []struct {
-		Name  string
-		Steps []Step
-	}{
-		{
-			Name: "direct get",
-			Steps: []Step{
-				{
-					Update: &wsapi.SubscribeResponse{
-						Status: testWorkspaceStatus,
-					},
-				},
-				{
-					Action: func(t *testing.T, prov WorkspaceInfoProvider) *Expectation {
-						ctx, cancel := context.WithTimeout(context.Background(), 200*time.Millisecond)
-						nfo := prov.WorkspaceInfo(ctx, testWorkspaceStatus.Metadata.MetaId)
-						cancel()
-
-						return &Expectation{
-							WorkspaceInfo: nfo,
-						}
-					},
-					Expectation: &Expectation{
-						WorkspaceInfo: testWorkspaceInfo,
-					},
-				},
-			},
-		},
-		{
-			Name: "wait for it",
-			Steps: []Step{
-				{
-					Parallel: true,
-					Action: func(t *testing.T, prov WorkspaceInfoProvider) *Expectation {
-						ctx, cancel := context.WithTimeout(context.Background(), 1000*time.Millisecond)
-						nfo := prov.WorkspaceInfo(ctx, testWorkspaceStatus.Metadata.MetaId)
-						cancel()
-
-						return &Expectation{
-							WorkspaceInfo: nfo,
-						}
-					},
-					Expectation: &Expectation{
-						WorkspaceInfo: testWorkspaceInfo,
-					},
-				},
-				{
-					Parallel:    true,
-					DelayUpdate: 10 * time.Millisecond,
-					Update: &wsapi.SubscribeResponse{
-						Status: testWorkspaceStatus,
-					},
-				},
-			},
-		},
-		{
-			Name: "not waiting for it",
-			Steps: []Step{
-				{
-					Parallel: true,
-					Action: func(t *testing.T, prov WorkspaceInfoProvider) *Expectation {
-						ctx, cancel := context.WithTimeout(context.Background(), 1*time.Millisecond)
-						nfo := prov.WorkspaceInfo(ctx, testWorkspaceStatus.Metadata.MetaId)
-						cancel()
-
-						return &Expectation{
-							WorkspaceInfo: nfo,
-						}
-					},
-					Expectation: &Expectation{},
-				},
-				{
-					Parallel:    true,
-					DelayUpdate: 10 * time.Millisecond,
-					Update: &wsapi.SubscribeResponse{
-						Status: testWorkspaceStatus,
-					},
-				},
-			},
-		},
-	}
-
-	for _, test := range tests {
-		t.Run(test.Name, func(t *testing.T) {
-			clients := make(chan wsapi.WorkspaceManagerClient, 1)
-			defer close(clients)
-
-			ctrl := gomock.NewController(t)
-			defer ctrl.Finish()
-
-			updates := make(chan *wsapi.SubscribeResponse)
-			srv := wsmock.NewMockWorkspaceManager_SubscribeClient(ctrl)
-			srv.EXPECT().Recv().DoAndReturn(func() (*wsapi.SubscribeResponse, error) {
-				u := <-updates
-				if u == nil {
-					return nil, io.EOF
-				}
-
-				return u, nil
-			}).AnyTimes()
-			cl := wsmock.NewMockWorkspaceManagerClient(ctrl)
-			cl.EXPECT().Subscribe(gomock.Any(), gomock.Any()).Return(srv, nil).AnyTimes()
-			cl.EXPECT().GetWorkspaces(gomock.Any(), gomock.Any()).Return(&wsapi.GetWorkspacesResponse{}, nil).AnyTimes()
-
-			prov := NewRemoteWorkspaceInfoProvider(WorkspaceInfoProviderConfig{WsManagerAddr: "target"})
-			prov.Dialer = func(target string, dialOptions grpc.DialOption) (io.Closer, wsapi.WorkspaceManagerClient, error) {
-				return io.NopCloser(nil), cl, nil
-			}
-			err := prov.Run()
-			if err != nil {
-				t.Fatal(err)
-			}
-			defer prov.Close()
-
-			for i, step := range test.Steps {
-				// copy step because we capture the loop variable in the Run() function
-				step := step
-
-				t.Run(fmt.Sprintf("%03d", i), func(t *testing.T) {
-					if step.Parallel {
-						t.Parallel()
-					}
-					if step.Update != nil {
-						if step.DelayUpdate > 0 {
-							time.Sleep(step.DelayUpdate)
-						}
-
-						updates <- step.Update
-						// Give the update some time to propagate.
-						// This is not the most elegant way of doing that, but in > 10k tests it didn't fail once.
-						time.Sleep(1 * time.Millisecond)
-					}
-
-					if step.Action != nil {
-						act := step.Action(t, prov)
-						if diff := cmp.Diff(step.Expectation, act, cmpopts.IgnoreUnexported(wsapi.PortSpec{}, wsapi.WorkspaceAuthentication{})); diff != "" {
-							t.Errorf("%s Expectation mismatch (-want +got):\n%s", t.Name(), diff)
-						}
-					}
-				})
-			}
-		})
-	}
-
-}
-
-func Test_workspaceInfoCache_Insert(t *testing.T) {
-	type existing struct {
-		infos              instanceInfosByWorkspace
-		coordsByPublicPort map[string]*WorkspaceCoords
-	}
-	type args struct {
-		newInfo *WorkspaceInfo
-	}
-	type expected struct {
-		info               *WorkspaceInfo
-		coordsByPublicPort map[string]*WorkspaceCoords
-	}
-	tests := []struct {
-		name     string
-		existing existing
-		args     args
-		expected expected
-	}{
-		{
-			name:     "from scratch",
-			existing: existing{},
-			args: args{
-				newInfo: &WorkspaceInfo{
-					IDEImage:      testWorkspaceStatus.Spec.IdeImage.WebRef,
-					Auth:          testWorkspaceStatus.Auth,
-					IDEPublicPort: "443",
-					InstanceID:    testWorkspaceStatus.Id,
-					Ports: []PortInfo{
-						{
-							PortSpec:   *testWorkspaceStatus.Spec.ExposedPorts[0],
-							PublicPort: "443",
-						},
-					},
-					URL:         testWorkspaceStatus.Spec.Url,
-					WorkspaceID: testWorkspaceStatus.Metadata.MetaId,
-					Phase:       wsapi.WorkspacePhase_UNKNOWN,
-					StartedAt:   startedNow,
-				},
-			},
-			expected: expected{
-				info: &WorkspaceInfo{
-					IDEImage:      testWorkspaceStatus.Spec.IdeImage.WebRef,
-					Auth:          testWorkspaceStatus.Auth,
-					IDEPublicPort: "443",
-					InstanceID:    testWorkspaceStatus.Id,
-					Ports: []PortInfo{
-						{
-							PortSpec:   *testWorkspaceStatus.Spec.ExposedPorts[0],
-							PublicPort: "443",
-						},
-					},
-					URL:         testWorkspaceStatus.Spec.Url,
-					WorkspaceID: testWorkspaceStatus.Metadata.MetaId,
-					Phase:       wsapi.WorkspacePhase_UNKNOWN,
-					StartedAt:   startedNow,
-				},
-				coordsByPublicPort: map[string]*WorkspaceCoords{
-					"443": {
-						ID:   testWorkspaceStatus.Metadata.MetaId,
-						Port: "8080",
-					},
-				},
-			},
-		},
-
-		{
-			name: "new instance for same workspace should prefer running",
-			existing: existing{
-				infos: map[string]workspaceInfosByInstance{
-					testWorkspaceInfo.WorkspaceID: {
-						testWorkspaceInfo.InstanceID: testWorkspaceInfo,
-					},
-				},
-				coordsByPublicPort: map[string]*WorkspaceCoords{
-					"443": {
-						ID:   testWorkspaceStatus.Metadata.MetaId,
-						Port: "8080",
-					},
-				},
-			},
-			args: args{
-				newInfo: &WorkspaceInfo{
-					IDEImage:      testWorkspaceStatus.Spec.IdeImage.WebRef,
-					Auth:          testWorkspaceStatus.Auth,
-					IDEPublicPort: "443",
-					// NOTE: different ID
-					InstanceID: "e63cb5ff-f4e4-4065-8554-b431a32c0001",
-					Ports: []PortInfo{
-						{
-							PortSpec:   *testWorkspaceStatus.Spec.ExposedPorts[0],
-							PublicPort: "443",
-						},
-					},
-					URL:         testWorkspaceStatus.Spec.Url,
-					WorkspaceID: testWorkspaceStatus.Metadata.MetaId,
-					Phase:       wsapi.WorkspacePhase_UNKNOWN,
-					StartedAt:   startedLater,
-				},
-			},
-			expected: expected{
-				info: testWorkspaceInfo,
-				coordsByPublicPort: map[string]*WorkspaceCoords{
-					"443": {
-						ID:   testWorkspaceStatus.Metadata.MetaId,
-						Port: "8080",
-					},
-				},
-			},
-		},
-
-		{
-			name: "initializing instance for same workspace should prefer running",
-			existing: existing{
-				infos: instanceInfosByWorkspace{
-					testWorkspaceInfo.WorkspaceID: {
-						testWorkspaceInfo.InstanceID: testWorkspaceInfo,
-					},
-				},
-				coordsByPublicPort: map[string]*WorkspaceCoords{
-					"443": {
-						ID:   testWorkspaceStatus.Metadata.MetaId,
-						Port: "8080",
-					},
-				},
-			},
-			args: args{
-				newInfo: &WorkspaceInfo{
-					IDEImage:      testWorkspaceStatus.Spec.IdeImage.WebRef,
-					Auth:          testWorkspaceStatus.Auth,
-					IDEPublicPort: "443",
-					// NOTE: different ID
-					InstanceID: "e63cb5ff-f4e4-4065-8554-b431a32c0001",
-					Ports: []PortInfo{
-						{
-							PortSpec:   *testWorkspaceStatus.Spec.ExposedPorts[0],
-							PublicPort: "443",
-						},
-					},
-					URL:         testWorkspaceStatus.Spec.Url,
-					WorkspaceID: testWorkspaceStatus.Metadata.MetaId,
-					Phase:       wsapi.WorkspacePhase_INITIALIZING,
-					StartedAt:   startedLater,
-				},
-			},
-			expected: expected{
-				info: testWorkspaceInfo,
-				coordsByPublicPort: map[string]*WorkspaceCoords{
-					"443": {
-						ID:   testWorkspaceStatus.Metadata.MetaId,
-						Port: "8080",
-					},
-				},
-			},
-		},
-
-		{
-			name: "stopping instance for workspace should be active",
-			existing: existing{
-				infos: instanceInfosByWorkspace{
-					testWorkspaceInfo.WorkspaceID: {
-						testWorkspaceInfo.InstanceID: testWorkspaceInfo,
-					},
-				},
-				coordsByPublicPort: map[string]*WorkspaceCoords{
-					"443": {
-						ID:   testWorkspaceStatus.Metadata.MetaId,
-						Port: "8080",
-					},
-				},
-			},
-			args: args{
-				newInfo: &WorkspaceInfo{
-					IDEImage:      testWorkspaceStatus.Spec.IdeImage.WebRef,
-					Auth:          testWorkspaceStatus.Auth,
-					IDEPublicPort: "443",
-					// NOTE: same ID
-					InstanceID: "e63cb5ff-f4e4-4065-8554-b431a32c0000",
-					Ports: []PortInfo{
-						{
-							PortSpec:   *testWorkspaceStatus.Spec.ExposedPorts[0],
-							PublicPort: "443",
-						},
-					},
-					URL:         testWorkspaceStatus.Spec.Url,
-					WorkspaceID: testWorkspaceStatus.Metadata.MetaId,
-					Phase:       wsapi.WorkspacePhase_STOPPING,
-					StartedAt:   startedLater,
-				},
-			},
-			expected: expected{
-				info: &WorkspaceInfo{
-					IDEImage:      testWorkspaceStatus.Spec.IdeImage.WebRef,
-					Auth:          testWorkspaceStatus.Auth,
-					IDEPublicPort: "443",
-					// NOTE: same ID
-					InstanceID: "e63cb5ff-f4e4-4065-8554-b431a32c0000",
-					Ports: []PortInfo{
-						{
-							PortSpec:   *testWorkspaceStatus.Spec.ExposedPorts[0],
-							PublicPort: "443",
-						},
-					},
-					URL:         testWorkspaceStatus.Spec.Url,
-					WorkspaceID: testWorkspaceStatus.Metadata.MetaId,
-					Phase:       wsapi.WorkspacePhase_STOPPING,
-					StartedAt:   startedLater,
-				},
-				coordsByPublicPort: map[string]*WorkspaceCoords{
-					"443": {
-						ID:   testWorkspaceStatus.Metadata.MetaId,
-						Port: "8080",
-					},
-				},
-			},
-		},
-
-		{
-			name: "update existing instance for same workspace with 2 instances same ports",
-			existing: existing{
-				infos: instanceInfosByWorkspace{
-					testWorkspaceInfo.WorkspaceID: {
-						testWorkspaceInfo.InstanceID: testWorkspaceInfo,
-						"e63cb5ff-f4e4-4065-8554-b431a32c0001": &WorkspaceInfo{
-							IDEImage:      testWorkspaceStatus.Spec.IdeImage.WebRef,
-							Auth:          testWorkspaceStatus.Auth,
-							IDEPublicPort: "443",
-							// NOTE: different ID
-							InstanceID: "e63cb5ff-f4e4-4065-8554-b431a32c0001",
-							Ports: []PortInfo{
-								{
-									PortSpec:   *testWorkspaceStatus.Spec.ExposedPorts[0],
-									PublicPort: "443",
-								},
-							},
-							URL:         testWorkspaceStatus.Spec.Url,
-							WorkspaceID: testWorkspaceStatus.Metadata.MetaId,
-							Phase:       wsapi.WorkspacePhase_UNKNOWN,
-							StartedAt:   startedLater,
-						},
-					},
-				},
-				coordsByPublicPort: map[string]*WorkspaceCoords{
-					"443": {
-						ID:   testWorkspaceStatus.Metadata.MetaId,
-						Port: "8080",
-					},
-				},
-			},
-			args: args{
-				newInfo: &WorkspaceInfo{
-					IDEImage:      testWorkspaceStatus.Spec.IdeImage.WebRef,
-					Auth:          testWorkspaceStatus.Auth,
-					IDEPublicPort: "443",
-					// NOTE: different ID
-					InstanceID: "e63cb5ff-f4e4-4065-8554-b431a32c0001",
-					Ports: []PortInfo{
-						{
-							PortSpec:   *testWorkspaceStatus.Spec.ExposedPorts[0],
-							PublicPort: "443",
-						},
-					},
-					URL:         testWorkspaceStatus.Spec.Url,
-					WorkspaceID: testWorkspaceStatus.Metadata.MetaId,
-					Phase:       wsapi.WorkspacePhase_RUNNING,
-					StartedAt:   startedLater,
-				},
-			},
-			expected: expected{
-				info: &WorkspaceInfo{
-					IDEImage:      testWorkspaceStatus.Spec.IdeImage.WebRef,
-					Auth:          testWorkspaceStatus.Auth,
-					IDEPublicPort: "443",
-					// NOTE: different ID
-					InstanceID: "e63cb5ff-f4e4-4065-8554-b431a32c0001",
-					Ports: []PortInfo{
-						{
-							PortSpec:   *testWorkspaceStatus.Spec.ExposedPorts[0],
-							PublicPort: "443",
-						},
-					},
-					URL:         testWorkspaceStatus.Spec.Url,
-					WorkspaceID: testWorkspaceStatus.Metadata.MetaId,
-					Phase:       wsapi.WorkspacePhase_RUNNING,
-					StartedAt:   startedLater,
-				},
-				coordsByPublicPort: map[string]*WorkspaceCoords{
-					"443": {
-						ID:   testWorkspaceStatus.Metadata.MetaId,
-						Port: "8080",
-					},
-				},
-			},
-		},
-
-		{
-			name: "update existing instance for same workspace with 2 instances different ports",
-			existing: existing{
-				infos: instanceInfosByWorkspace{
-					testWorkspaceInfo.WorkspaceID: {
-						testWorkspaceInfo.InstanceID: testWorkspaceInfo,
-						"e63cb5ff-f4e4-4065-8554-b431a32c0001": &WorkspaceInfo{
-							IDEImage:      testWorkspaceStatus.Spec.IdeImage.WebRef,
-							Auth:          testWorkspaceStatus.Auth,
-							IDEPublicPort: "443",
-							// NOTE: different ID
-							InstanceID: "e63cb5ff-f4e4-4065-8554-b431a32c0001",
-							Ports: []PortInfo{
-								{
-									PortSpec:   *testWorkspaceStatus.Spec.ExposedPorts[0],
-									PublicPort: "443",
-								},
-							},
-							URL:         testWorkspaceStatus.Spec.Url,
-							WorkspaceID: testWorkspaceStatus.Metadata.MetaId,
-							Phase:       wsapi.WorkspacePhase_UNKNOWN,
-							StartedAt:   startedLater,
-						},
-					},
-				},
-				coordsByPublicPort: map[string]*WorkspaceCoords{
-					"443": {
-						ID:   testWorkspaceStatus.Metadata.MetaId,
-						Port: "8080",
-					},
-				},
-			},
-			args: args{
-				newInfo: &WorkspaceInfo{
-					IDEImage:      testWorkspaceStatus.Spec.IdeImage.WebRef,
-					Auth:          testWorkspaceStatus.Auth,
-					IDEPublicPort: "444",
-					// NOTE: different ID
-					InstanceID: "e63cb5ff-f4e4-4065-8554-b431a32c0001",
-					Ports: []PortInfo{
-						{
-							PortSpec:   *testWorkspaceStatus.Spec.ExposedPorts[0],
-							PublicPort: "444",
-						},
-					},
-					URL:         testWorkspaceStatus.Spec.Url,
-					WorkspaceID: testWorkspaceStatus.Metadata.MetaId,
-					Phase:       wsapi.WorkspacePhase_RUNNING,
-					StartedAt:   startedLater,
-				},
-			},
-			expected: expected{
-				info: &WorkspaceInfo{
-					IDEImage:      testWorkspaceStatus.Spec.IdeImage.WebRef,
-					Auth:          testWorkspaceStatus.Auth,
-					IDEPublicPort: "444",
-					// NOTE: different ID
-					InstanceID: "e63cb5ff-f4e4-4065-8554-b431a32c0001",
-					Ports: []PortInfo{
-						{
-							PortSpec:   *testWorkspaceStatus.Spec.ExposedPorts[0],
-							PublicPort: "444",
-						},
-					},
-					URL:         testWorkspaceStatus.Spec.Url,
-					WorkspaceID: testWorkspaceStatus.Metadata.MetaId,
-					Phase:       wsapi.WorkspacePhase_RUNNING,
-					StartedAt:   startedLater,
-				},
-				coordsByPublicPort: map[string]*WorkspaceCoords{
-					"443": {
-						ID:   testWorkspaceStatus.Metadata.MetaId,
-						Port: "8080",
-					},
-					"444": {
-						ID:   testWorkspaceStatus.Metadata.MetaId,
-						Port: "8080",
-					},
-				},
-			},
-		},
-
-		{
-			name: "running instance for same workspace takes precedence",
-			existing: existing{
-				infos: instanceInfosByWorkspace{
-					testWorkspaceInfo.WorkspaceID: {
-						testWorkspaceInfo.InstanceID: testWorkspaceInfo,
-						"e63cb5ff-f4e4-4065-8554-b431a32c0001": &WorkspaceInfo{
-							IDEImage:      testWorkspaceStatus.Spec.IdeImage.WebRef,
-							Auth:          testWorkspaceStatus.Auth,
-							IDEPublicPort: "443",
-							// NOTE: different ID
-							InstanceID: "e63cb5ff-f4e4-4065-8554-b431a32c0001",
-							Ports: []PortInfo{
-								{
-									PortSpec:   *testWorkspaceStatus.Spec.ExposedPorts[0],
-									PublicPort: "443",
-								},
-							},
-							URL:         testWorkspaceStatus.Spec.Url,
-							WorkspaceID: testWorkspaceStatus.Metadata.MetaId,
-							Phase:       wsapi.WorkspacePhase_INITIALIZING,
-							StartedAt:   startedNow,
-						},
-					},
-				},
-				coordsByPublicPort: map[string]*WorkspaceCoords{
-					"443": {
-						ID:   testWorkspaceStatus.Metadata.MetaId,
-						Port: "8080",
-					},
-				},
-			},
-			args: args{
-				newInfo: testWorkspaceInfo,
-			},
-			expected: expected{
-				info: testWorkspaceInfo,
-				coordsByPublicPort: map[string]*WorkspaceCoords{
-					"443": {
-						ID:   testWorkspaceStatus.Metadata.MetaId,
-						Port: "8080",
-					},
-				},
-			},
-		},
-
-		{
-			name: "running instance for same workspace takes precedence over stopping/stopped",
-			existing: existing{
-				infos: instanceInfosByWorkspace{
-					testWorkspaceInfo.WorkspaceID: {
-						"e63cb5ff-f4e4-4065-8554-b431a32c0001": &WorkspaceInfo{
-							IDEImage:      testWorkspaceStatus.Spec.IdeImage.WebRef,
-							Auth:          testWorkspaceStatus.Auth,
-							IDEPublicPort: "443",
-							// NOTE: different ID
-							InstanceID: "e63cb5ff-f4e4-4065-8554-b431a32c0001",
-							Ports: []PortInfo{
-								{
-									PortSpec:   *testWorkspaceStatus.Spec.ExposedPorts[0],
-									PublicPort: "443",
-								},
-							},
-							URL:         testWorkspaceStatus.Spec.Url,
-							WorkspaceID: testWorkspaceStatus.Metadata.MetaId,
-							Phase:       wsapi.WorkspacePhase_STOPPING,
-							StartedAt:   startedNow,
-						},
-						"e63cb5ff-f4e4-4065-8554-b431a32c0002": &WorkspaceInfo{
-							IDEImage:      testWorkspaceStatus.Spec.IdeImage.WebRef,
-							Auth:          testWorkspaceStatus.Auth,
-							IDEPublicPort: "443",
-							// NOTE: different ID
-							InstanceID: "e63cb5ff-f4e4-4065-8554-b431a32c0002",
-							Ports: []PortInfo{
-								{
-									PortSpec:   *testWorkspaceStatus.Spec.ExposedPorts[0],
-									PublicPort: "443",
-								},
-							},
-							URL:         testWorkspaceStatus.Spec.Url,
-							WorkspaceID: testWorkspaceStatus.Metadata.MetaId,
-							Phase:       wsapi.WorkspacePhase_STOPPED,
-							StartedAt:   startedNow,
-						},
-					},
-				},
-				coordsByPublicPort: map[string]*WorkspaceCoords{
-					"443": {
-						ID:   testWorkspaceStatus.Metadata.MetaId,
-						Port: "8080",
-					},
-				},
-			},
-			args: args{
-				newInfo: &WorkspaceInfo{
-					IDEImage:      testWorkspaceStatus.Spec.IdeImage.WebRef,
-					Auth:          testWorkspaceStatus.Auth,
-					IDEPublicPort: "443",
-					// NOTE: different ID
-					InstanceID: "e63cb5ff-f4e4-4065-8554-b431a32c0003",
-					Ports: []PortInfo{
-						{
-							PortSpec:   *testWorkspaceStatus.Spec.ExposedPorts[0],
-							PublicPort: "443",
-						},
-					},
-					URL:         testWorkspaceStatus.Spec.Url,
-					WorkspaceID: testWorkspaceStatus.Metadata.MetaId,
-					Phase:       wsapi.WorkspacePhase_RUNNING,
-					StartedAt:   startedLater,
-				},
-			},
-			expected: expected{
-				info: &WorkspaceInfo{
-					IDEImage:      testWorkspaceStatus.Spec.IdeImage.WebRef,
-					Auth:          testWorkspaceStatus.Auth,
-					IDEPublicPort: "443",
-					// NOTE: different ID
-					InstanceID: "e63cb5ff-f4e4-4065-8554-b431a32c0003",
-					Ports: []PortInfo{
-						{
-							PortSpec:   *testWorkspaceStatus.Spec.ExposedPorts[0],
-							PublicPort: "443",
-						},
-					},
-					URL:         testWorkspaceStatus.Spec.Url,
-					WorkspaceID: testWorkspaceStatus.Metadata.MetaId,
-					Phase:       wsapi.WorkspacePhase_RUNNING,
-					StartedAt:   startedLater,
-				},
-				coordsByPublicPort: map[string]*WorkspaceCoords{
-					"443": {
-						ID:   testWorkspaceStatus.Metadata.MetaId,
-						Port: "8080",
-					},
-				},
-			},
-		},
-
-		{
-			name: "interrupted instance for same workspace takes precedence over stopping/stopped",
-			existing: existing{
-				infos: instanceInfosByWorkspace{
-					testWorkspaceInfo.WorkspaceID: {
-						"e63cb5ff-f4e4-4065-8554-b431a32c0001": &WorkspaceInfo{
-							IDEImage:      testWorkspaceStatus.Spec.IdeImage.WebRef,
-							Auth:          testWorkspaceStatus.Auth,
-							IDEPublicPort: "443",
-							// NOTE: different ID
-							InstanceID: "e63cb5ff-f4e4-4065-8554-b431a32c0001",
-							Ports: []PortInfo{
-								{
-									PortSpec:   *testWorkspaceStatus.Spec.ExposedPorts[0],
-									PublicPort: "443",
-								},
-							},
-							URL:         testWorkspaceStatus.Spec.Url,
-							WorkspaceID: testWorkspaceStatus.Metadata.MetaId,
-							Phase:       wsapi.WorkspacePhase_STOPPING,
-							StartedAt:   startedNow,
-						},
-						"e63cb5ff-f4e4-4065-8554-b431a32c0002": &WorkspaceInfo{
-							IDEImage:      testWorkspaceStatus.Spec.IdeImage.WebRef,
-							Auth:          testWorkspaceStatus.Auth,
-							IDEPublicPort: "443",
-							// NOTE: different ID
-							InstanceID: "e63cb5ff-f4e4-4065-8554-b431a32c0002",
-							Ports: []PortInfo{
-								{
-									PortSpec:   *testWorkspaceStatus.Spec.ExposedPorts[0],
-									PublicPort: "443",
-								},
-							},
-							URL:         testWorkspaceStatus.Spec.Url,
-							WorkspaceID: testWorkspaceStatus.Metadata.MetaId,
-							Phase:       wsapi.WorkspacePhase_STOPPED,
-							StartedAt:   startedNow,
-						},
-					},
-				},
-				coordsByPublicPort: map[string]*WorkspaceCoords{
-					"443": {
-						ID:   testWorkspaceStatus.Metadata.MetaId,
-						Port: "8080",
-					},
-				},
-			},
-			args: args{
-				newInfo: &WorkspaceInfo{
-					IDEImage:      testWorkspaceStatus.Spec.IdeImage.WebRef,
-					Auth:          testWorkspaceStatus.Auth,
-					IDEPublicPort: "443",
-					// NOTE: different ID
-					InstanceID: "e63cb5ff-f4e4-4065-8554-b431a32c0003",
-					Ports: []PortInfo{
-						{
-							PortSpec:   *testWorkspaceStatus.Spec.ExposedPorts[0],
-							PublicPort: "443",
-						},
-					},
-					URL:         testWorkspaceStatus.Spec.Url,
-					WorkspaceID: testWorkspaceStatus.Metadata.MetaId,
-					Phase:       wsapi.WorkspacePhase_INTERRUPTED,
-					StartedAt:   startedLater,
-				},
-			},
-			expected: expected{
-				info: &WorkspaceInfo{
-					IDEImage:      testWorkspaceStatus.Spec.IdeImage.WebRef,
-					Auth:          testWorkspaceStatus.Auth,
-					IDEPublicPort: "443",
-					// NOTE: different ID
-					InstanceID: "e63cb5ff-f4e4-4065-8554-b431a32c0003",
-					Ports: []PortInfo{
-						{
-							PortSpec:   *testWorkspaceStatus.Spec.ExposedPorts[0],
-							PublicPort: "443",
-						},
-					},
-					URL:         testWorkspaceStatus.Spec.Url,
-					WorkspaceID: testWorkspaceStatus.Metadata.MetaId,
-					Phase:       wsapi.WorkspacePhase_INTERRUPTED,
-					StartedAt:   startedLater,
-				},
-				coordsByPublicPort: map[string]*WorkspaceCoords{
-					"443": {
-						ID:   testWorkspaceStatus.Metadata.MetaId,
-						Port: "8080",
-					},
-				},
-			},
-		},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			act := newWorkspaceInfoCache()
-			if tt.existing.infos != nil {
-				act.infos = tt.existing.infos
-			}
-			if tt.existing.coordsByPublicPort != nil {
-				act.coordsByPublicPort = tt.existing.coordsByPublicPort
-			}
-			act.Insert(tt.args.newInfo)
-			ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond)
-			defer cancel()
-			info, present := act.WaitFor(ctx, tt.args.newInfo.WorkspaceID)
-			if tt.expected.info != nil && !present {
-				t.Errorf("%s expected info result but not present:\n", t.Name())
-			}
-			if tt.expected.info == nil && present {
-				t.Errorf("%s expected no info result but %v was present:\n", t.Name(), info)
-			}
-			if diff := cmp.Diff(tt.expected.info, info, cmpopts.IgnoreUnexported(wsapi.PortSpec{}, wsapi.WorkspaceAuthentication{})); diff != "" {
-				t.Errorf("%s Infos expectation mismatch (-want +got):\n%s", t.Name(), diff)
-			}
-			for port, expCoords := range tt.expected.coordsByPublicPort {
-				coords, present := act.GetCoordsByPublicPort(port)
-				if !present {
-					t.Errorf("%s expected coords result but not present:\n", t.Name())
-				}
-				if diff := cmp.Diff(expCoords, coords, cmpopts.IgnoreUnexported(wsapi.PortSpec{}, wsapi.WorkspaceAuthentication{})); diff != "" {
-					t.Errorf("%s coords expectation mismatch (-want +got):\n%s", t.Name(), diff)
-				}
-			}
-		})
-	}
-}
-
-func Test_workspaceInfoCache_Delete(t *testing.T) {
-	type existing struct {
-		infos              instanceInfosByWorkspace
-		coordsByPublicPort map[string]*WorkspaceCoords
-	}
-	type args struct {
-		workspaceID string
-		instanceID  string
-	}
-	type expected struct {
-		info               *WorkspaceInfo
-		coordsByPublicPort map[string]*WorkspaceCoords
-	}
-	tests := []struct {
-		name     string
-		existing existing
-		args     args
-		expected expected
-	}{
-		{
-			name: "deletes existing",
-			existing: existing{
-				infos: instanceInfosByWorkspace{
-					testWorkspaceInfo.WorkspaceID: {
-						testWorkspaceInfo.InstanceID: testWorkspaceInfo,
-					},
-				},
-				coordsByPublicPort: map[string]*WorkspaceCoords{
-					"443": {
-						ID:   testWorkspaceStatus.Metadata.MetaId,
-						Port: "8080",
-					},
-				},
-			},
-			args: args{
-				workspaceID: testWorkspaceInfo.WorkspaceID,
-				instanceID:  testWorkspaceInfo.InstanceID,
-			},
-		},
-
-		{
-			name: "ignores delete of non-existing",
-			existing: existing{
-				infos: instanceInfosByWorkspace{
-					testWorkspaceInfo.WorkspaceID: {
-						testWorkspaceInfo.InstanceID: testWorkspaceInfo,
-					},
-				},
-				coordsByPublicPort: map[string]*WorkspaceCoords{
-					"443": {
-						ID:   testWorkspaceStatus.Metadata.MetaId,
-						Port: "8080",
-					},
-				},
-			},
-			args: args{
-				workspaceID: testWorkspaceInfo.WorkspaceID,
-				instanceID:  "non-existing",
-			},
-			expected: expected{
-				info: testWorkspaceInfo,
-				coordsByPublicPort: map[string]*WorkspaceCoords{
-					"443": {
-						ID:   testWorkspaceStatus.Metadata.MetaId,
-						Port: "8080",
-					},
-				},
-			},
-		},
-
-		{
-			name: "only deletes specific instance",
-			existing: existing{
-				infos: instanceInfosByWorkspace{
-					testWorkspaceInfo.WorkspaceID: {
-						testWorkspaceInfo.InstanceID: testWorkspaceInfo,
-						"e63cb5ff-f4e4-4065-8554-b431a32c0001": &WorkspaceInfo{
-							IDEImage:      testWorkspaceStatus.Spec.IdeImage.WebRef,
-							Auth:          testWorkspaceStatus.Auth,
-							IDEPublicPort: "443",
-							// NOTE: different ID
-							InstanceID: "e63cb5ff-f4e4-4065-8554-b431a32c0001",
-							Ports: []PortInfo{
-								{
-									PortSpec:   *testWorkspaceStatus.Spec.ExposedPorts[0],
-									PublicPort: "443",
-								},
-							},
-							URL:         testWorkspaceStatus.Spec.Url,
-							WorkspaceID: testWorkspaceStatus.Metadata.MetaId,
-							Phase:       wsapi.WorkspacePhase_UNKNOWN,
-							StartedAt:   startedNow,
-						},
-					},
-				},
-				coordsByPublicPort: map[string]*WorkspaceCoords{
-					"443": {
-						ID:   testWorkspaceStatus.Metadata.MetaId,
-						Port: "8080",
-					},
-				},
-			},
-			args: args{
-				workspaceID: testWorkspaceInfo.WorkspaceID,
-				instanceID:  "e63cb5ff-f4e4-4065-8554-b431a32c0001",
-			},
-			expected: expected{
-				info: testWorkspaceInfo,
-				coordsByPublicPort: map[string]*WorkspaceCoords{
-					"443": {
-						ID:   testWorkspaceStatus.Metadata.MetaId,
-						Port: "8080",
-					},
-				},
-			},
-		},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			act := newWorkspaceInfoCache()
-			if tt.existing.infos != nil {
-				act.infos = tt.existing.infos
-			}
-			if tt.existing.coordsByPublicPort != nil {
-				act.coordsByPublicPort = tt.existing.coordsByPublicPort
-			}
-			act.Delete(tt.args.workspaceID, tt.args.instanceID)
-			ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond)
-			defer cancel()
-			info, present := act.WaitFor(ctx, tt.args.workspaceID)
-			if tt.expected.info != nil && !present {
-				t.Errorf("%s expected info result but not present:\n", t.Name())
-			}
-			if tt.expected.info == nil && present {
-				t.Errorf("%s expected no info result but %v was present:\n", t.Name(), info)
-			}
-			if diff := cmp.Diff(tt.expected.info, info, cmpopts.IgnoreUnexported(wsapi.PortSpec{}, wsapi.WorkspaceAuthentication{})); diff != "" {
-				t.Errorf("%s Infos expectation mismatch (-want +got):\n%s", t.Name(), diff)
-			}
-			// We have to look inside the black box for this
-			if tt.expected.coordsByPublicPort == nil && len(act.coordsByPublicPort) != 0 {
-				t.Errorf("%s coords should be empty got%#v\n", t.Name(), act.coordsByPublicPort)
-			}
-			for port, expCoords := range tt.expected.coordsByPublicPort {
-				coords, present := act.GetCoordsByPublicPort(port)
-				if !present {
-					t.Errorf("%s expected coords result but not present:\n", t.Name())
-				}
-				if diff := cmp.Diff(expCoords, coords, cmpopts.IgnoreUnexported(wsapi.PortSpec{}, wsapi.WorkspaceAuthentication{})); diff != "" {
-					t.Errorf("%s coords expectation mismatch (-want +got):\n%s", t.Name(), diff)
-				}
-			}
-		})
-	}
-}
-
-var (
-	startedNow          = time.Now()
-	startedLater        = startedNow.Add(1 * time.Second)
-	testWorkspaceStatus = &wsapi.WorkspaceStatus{
-		Id: "e63cb5ff-f4e4-4065-8554-b431a32c0000",
-		Metadata: &wsapi.WorkspaceMetadata{
-			MetaId:    "e63cb5ff-f4e4-4065-8554-b431a32c2714",
-			StartedAt: timestamppb.New(startedNow),
-		},
-		Auth: &wsapi.WorkspaceAuthentication{
-			Admission:  wsapi.AdmissionLevel_ADMIT_OWNER_ONLY,
-			OwnerToken: "testWorkspaceOwnerToken",
-		},
-		Phase: wsapi.WorkspacePhase_RUNNING,
-		Spec: &wsapi.WorkspaceSpec{
-			IdeImage: &wsapi.IDEImage{WebRef: "testWorkspaceIDEImage"},
-			Headless: false,
-			Type:     wsapi.WorkspaceType_REGULAR,
-			Url:      "https://e63cb5ff-f4e4-4065-8554-b431a32c2714.ws-eu02.gitpod.io",
-			ExposedPorts: []*wsapi.PortSpec{
-				{
-					Port:       8080,
-					Target:     38080,
-					Url:        "https://8080-e63cb5ff-f4e4-4065-8554-b431a32c2714.ws-eu02.gitpod.io/",
-					Visibility: wsapi.PortVisibility_PORT_VISIBILITY_PUBLIC,
-				},
-			},
-		},
-	}
-	testWorkspaceInfo = &WorkspaceInfo{
-		IDEImage:      testWorkspaceStatus.Spec.IdeImage.WebRef,
-		Auth:          testWorkspaceStatus.Auth,
-		IDEPublicPort: "443",
-		InstanceID:    testWorkspaceStatus.Id,
-		Ports: []PortInfo{
-			{
-				PortSpec:   *testWorkspaceStatus.Spec.ExposedPorts[0],
-				PublicPort: "443",
-			},
-		},
-		URL:         testWorkspaceStatus.Spec.Url,
-		WorkspaceID: testWorkspaceStatus.Metadata.MetaId,
-		Phase:       wsapi.WorkspacePhase_RUNNING,
-		StartedAt:   startedNow,
-	}
-)
diff --git a/components/ws-proxy/pkg/proxy/pass.go b/components/ws-proxy/pkg/proxy/pass.go
index a3a23096910507..5c1a1d0eb1d466 100644
--- a/components/ws-proxy/pkg/proxy/pass.go
+++ b/components/ws-proxy/pkg/proxy/pass.go
@@ -5,7 +5,6 @@
 package proxy
 
 import (
-	"errors"
 	"fmt"
 	"net"
 	"net/http"
@@ -22,7 +21,7 @@ import (
 	"github.com/gitpod-io/gitpod/common-go/log"
 )
 
-// ProxyPassConfig is used as intermediate struct to assemble a configurable proxy
+// ProxyPassConfig is used as intermediate struct to assemble a configurable proxy.
 type proxyPassConfig struct {
 	TargetResolver  targetResolver
 	ResponseHandler []responseHandler
@@ -34,19 +33,19 @@ func (ppc *proxyPassConfig) appendResponseHandler(handler responseHandler) {
 	ppc.ResponseHandler = append(ppc.ResponseHandler, handler)
 }
 
-// proxyPassOpt allows to compose ProxyHandler options
+// proxyPassOpt allows to compose ProxyHandler options.
 type proxyPassOpt func(h *proxyPassConfig)
 
-// errorHandler is a function that handles an error that occurred during proxying of a HTTP request
+// errorHandler is a function that handles an error that occurred during proxying of a HTTP request.
 type errorHandler func(http.ResponseWriter, *http.Request, error)
 
-// targetResolver is a function that determines to which target to forward the given HTTP request to
-type targetResolver func(*Config, *http.Request) (*url.URL, error)
+// targetResolver is a function that determines to which target to forward the given HTTP request to.
+type targetResolver func(*Config, WorkspaceInfoProvider, *http.Request) (*url.URL, error)
 
 type responseHandler func(*http.Response, *http.Request) error
 
-// proxyPass is the function that assembles a ProxyHandler from the config, a resolver and various options and returns a http.HandlerFunc
-func proxyPass(config *RouteHandlerConfig, resolver targetResolver, opts ...proxyPassOpt) http.HandlerFunc {
+// proxyPass is the function that assembles a ProxyHandler from the config, a resolver and various options and returns a http.HandlerFunc.
+func proxyPass(config *RouteHandlerConfig, infoProvider WorkspaceInfoProvider, resolver targetResolver, opts ...proxyPassOpt) http.HandlerFunc {
 	h := proxyPassConfig{
 		Transport: config.DefaultTransport,
 	}
@@ -64,7 +63,7 @@ func proxyPass(config *RouteHandlerConfig, resolver targetResolver, opts ...prox
 	}
 
 	return func(w http.ResponseWriter, req *http.Request) {
-		targetURL, err := h.TargetResolver(config.Config, req)
+		targetURL, err := h.TargetResolver(config.Config, infoProvider, req)
 		if err != nil {
 			if h.ErrorHandler != nil {
 				h.ErrorHandler(w, req, err)
@@ -74,7 +73,7 @@ func proxyPass(config *RouteHandlerConfig, resolver targetResolver, opts ...prox
 			return
 		}
 
-		var originalURL = *req.URL
+		originalURL := *req.URL
 
 		// TODO(cw): we should cache the proxy for some time for each target URL
 		proxy := httputil.NewSingleHostReverseProxy(targetURL)
@@ -108,9 +107,7 @@ func proxyPass(config *RouteHandlerConfig, resolver targetResolver, opts ...prox
 				return
 			}
 
-			var dnsError *net.DNSError
-			if !errors.As(err, &dnsError) && !strings.HasPrefix(originalURL.Path, "/_supervisor/") {
-				// skip "no such host" errors (workspace service not available, yet) and not
+			if !strings.HasPrefix(originalURL.Path, "/_supervisor/") {
 				log.WithField("url", originalURL.String()).WithError(err).Debug("proxied request failed")
 			}
 
@@ -175,13 +172,14 @@ func createDefaultTransport(config *TransportConfig) *http.Transport {
 	}
 }
 
-// tell the browser to cache for 1 year and don't ask the server during this period
+// tell the browser to cache for 1 year and don't ask the server during this period.
 func withLongTermCaching() proxyPassOpt {
 	return func(cfg *proxyPassConfig) {
 		cfg.appendResponseHandler(func(resp *http.Response, req *http.Request) error {
 			if resp.StatusCode < http.StatusBadRequest {
 				resp.Header.Set("Cache-Control", "public, max-age=31536000")
 			}
+
 			return nil
 		})
 	}
diff --git a/components/ws-proxy/pkg/proxy/proxy.go b/components/ws-proxy/pkg/proxy/proxy.go
index 606e2bf949ad80..77ec1572276965 100644
--- a/components/ws-proxy/pkg/proxy/proxy.go
+++ b/components/ws-proxy/pkg/proxy/proxy.go
@@ -14,7 +14,7 @@ import (
 	"github.com/gitpod-io/gitpod/common-go/log"
 )
 
-// WorkspaceProxy is the entity which forwards all inbound requests to the relevant workspace pods
+// WorkspaceProxy is the entity which forwards all inbound requests to the relevant workspace pods.
 type WorkspaceProxy struct {
 	Ingress               HostBasedIngressConfig
 	Config                Config
@@ -22,7 +22,7 @@ type WorkspaceProxy struct {
 	WorkspaceInfoProvider WorkspaceInfoProvider
 }
 
-// NewWorkspaceProxy creates a new workspace proxy
+// NewWorkspaceProxy creates a new workspace proxy.
 func NewWorkspaceProxy(ingress HostBasedIngressConfig, config Config, workspaceRouter WorkspaceRouter, workspaceInfoProvider WorkspaceInfoProvider) *WorkspaceProxy {
 	return &WorkspaceProxy{
 		Ingress:               ingress,
@@ -32,7 +32,7 @@ func NewWorkspaceProxy(ingress HostBasedIngressConfig, config Config, workspaceR
 	}
 }
 
-func redirectToHttps(w http.ResponseWriter, r *http.Request) {
+func redirectToHTTPS(w http.ResponseWriter, r *http.Request) {
 	target := "https://" + r.Host + r.URL.Path
 	if len(r.URL.RawQuery) > 0 {
 		target += "?" + r.URL.RawQuery
@@ -41,14 +41,14 @@ func redirectToHttps(w http.ResponseWriter, r *http.Request) {
 	http.Redirect(w, r, target, http.StatusTemporaryRedirect)
 }
 
-// MustServe starts the proxy and ends the process if doing so fails
+// MustServe starts the proxy and ends the process if doing so fails.
 func (p *WorkspaceProxy) MustServe() {
 	handler, err := p.Handler()
 	if err != nil {
 		log.WithError(err).Fatal("cannot initialize proxy - this is likely a configuration issue")
 		return
 	}
-	srv := &http.Server{Addr: p.Ingress.HttpsAddress, Handler: handler}
+	srv := &http.Server{Addr: p.Ingress.HTTPSAddress, Handler: handler}
 
 	var (
 		crt = p.Config.HTTPS.Certificate
@@ -59,7 +59,7 @@ func (p *WorkspaceProxy) MustServe() {
 		key = filepath.Join(tproot, key)
 	}
 	go func() {
-		err := http.ListenAndServe(p.Ingress.HttpAddress, http.HandlerFunc(redirectToHttps))
+		err := http.ListenAndServe(p.Ingress.HTTPAddress, http.HandlerFunc(redirectToHTTPS))
 		if err != nil {
 			log.WithError(err).Fatal("cannot start http proxy")
 		}
@@ -72,7 +72,7 @@ func (p *WorkspaceProxy) MustServe() {
 	}
 }
 
-// Handler returns the HTTP handler that serves the proxy routes
+// Handler returns the HTTP handler that serves the proxy routes.
 func (p *WorkspaceProxy) Handler() (http.Handler, error) {
 	r := mux.NewRouter()
 
@@ -83,10 +83,10 @@ func (p *WorkspaceProxy) Handler() (http.Handler, error) {
 	}
 	ideRouter, portRouter, blobserveRouter := p.WorkspaceRouter(r, p.WorkspaceInfoProvider)
 	installWorkspaceRoutes(ideRouter, handlerConfig, p.WorkspaceInfoProvider)
-	err = installWorkspacePortRoutes(portRouter, handlerConfig)
+	err = installWorkspacePortRoutes(portRouter, handlerConfig, p.WorkspaceInfoProvider)
 	if err != nil {
 		return nil, err
 	}
-	installBlobserveRoutes(blobserveRouter, handlerConfig)
+	installBlobserveRoutes(blobserveRouter, handlerConfig, p.WorkspaceInfoProvider)
 	return r, nil
 }
diff --git a/components/ws-proxy/pkg/proxy/routes.go b/components/ws-proxy/pkg/proxy/routes.go
index 3eb04208b41294..b190de11046eb8 100644
--- a/components/ws-proxy/pkg/proxy/routes.go
+++ b/components/ws-proxy/pkg/proxy/routes.go
@@ -17,7 +17,6 @@ import (
 	"path/filepath"
 	"regexp"
 	"strings"
-	"text/template"
 	"time"
 
 	"github.com/gorilla/handlers"
@@ -28,7 +27,7 @@ import (
 	"github.com/gitpod-io/gitpod/common-go/log"
 )
 
-// RouteHandlerConfig configures a RouteHandler
+// RouteHandlerConfig configures a RouteHandler.
 type RouteHandlerConfig struct {
 	Config               *Config
 	DefaultTransport     http.RoundTripper
@@ -36,17 +35,17 @@ type RouteHandlerConfig struct {
 	WorkspaceAuthHandler mux.MiddlewareFunc
 }
 
-// RouteHandlerConfigOpt modifies the router handler config
+// RouteHandlerConfigOpt modifies the router handler config.
 type RouteHandlerConfigOpt func(*Config, *RouteHandlerConfig)
 
-// WithDefaultAuth enables workspace access authentication
+// WithDefaultAuth enables workspace access authentication.
 func WithDefaultAuth(infoprov WorkspaceInfoProvider) RouteHandlerConfigOpt {
 	return func(config *Config, c *RouteHandlerConfig) {
 		c.WorkspaceAuthHandler = WorkspaceAuthHandler(config.GitpodInstallation.HostName, infoprov)
 	}
 }
 
-// NewRouteHandlerConfig creates a new instance
+// NewRouteHandlerConfig creates a new instance.
 func NewRouteHandlerConfig(config *Config, opts ...RouteHandlerConfigOpt) (*RouteHandlerConfig, error) {
 	corsHandler, err := corsHandler(config.GitpodInstallation.Scheme, config.GitpodInstallation.HostName)
 	if err != nil {
@@ -65,10 +64,10 @@ func NewRouteHandlerConfig(config *Config, opts ...RouteHandlerConfigOpt) (*Rout
 	return cfg, nil
 }
 
-// RouteHandler is a function that handles a HTTP route
+// RouteHandler is a function that handles a HTTP route.
 type RouteHandler = func(r *mux.Router, config *RouteHandlerConfig)
 
-// installWorkspaceRoutes configures routing of workspace and IDE requests
+// installWorkspaceRoutes configures routing of workspace and IDE requests.
 func installWorkspaceRoutes(r *mux.Router, config *RouteHandlerConfig, ip WorkspaceInfoProvider) {
 	r.Use(logHandler)
 
@@ -140,7 +139,7 @@ func (ir *ideRoutes) HandleDirectIDERoute(route *mux.Route) {
 	r.Use(ir.Config.WorkspaceAuthHandler)
 	r.Use(ir.workspaceMustExistHandler)
 
-	r.NewRoute().HandlerFunc(proxyPass(ir.Config, workspacePodResolver, withWorkspaceTransport()))
+	r.NewRoute().HandlerFunc(proxyPass(ir.Config, ir.InfoProvider, workspacePodResolver, withWorkspaceTransport()))
 }
 
 func (ir *ideRoutes) HandleDirectSupervisorRoute(route *mux.Route, authenticated bool) {
@@ -152,7 +151,7 @@ func (ir *ideRoutes) HandleDirectSupervisorRoute(route *mux.Route, authenticated
 		r.Use(ir.Config.WorkspaceAuthHandler)
 	}
 
-	r.NewRoute().HandlerFunc(proxyPass(ir.Config, workspacePodSupervisorResolver))
+	r.NewRoute().HandlerFunc(proxyPass(ir.Config, ir.InfoProvider, workspacePodSupervisorResolver))
 }
 
 func (ir *ideRoutes) HandleSupervisorFrontendRoute(route *mux.Route) {
@@ -172,7 +171,7 @@ func (ir *ideRoutes) HandleSupervisorFrontendRoute(route *mux.Route) {
 		})
 	})
 	// always hit the blobserver to ensure that blob is downloaded
-	r.NewRoute().HandlerFunc(proxyPass(ir.Config, func(cfg *Config, req *http.Request) (*url.URL, error) {
+	r.NewRoute().HandlerFunc(proxyPass(ir.Config, ir.InfoProvider, func(cfg *Config, _ WorkspaceInfoProvider, req *http.Request) (*url.URL, error) {
 		return resolveSupervisorURL(cfg), nil
 	}, func(h *proxyPassConfig) {
 		h.Transport = &blobserveTransport{
@@ -213,10 +212,10 @@ func (ir *ideRoutes) HandleRoot(route *mux.Route) {
 	r.Use(ir.workspaceMustExistHandler)
 
 	workspaceIDEPass := ir.Config.WorkspaceAuthHandler(
-		proxyPass(ir.Config, workspacePodResolver),
+		proxyPass(ir.Config, ir.InfoProvider, workspacePodResolver),
 	)
 	// always hit the blobserver to ensure that blob is downloaded
-	r.NewRoute().HandlerFunc(proxyPass(ir.Config, dynamicIDEResolver, func(h *proxyPassConfig) {
+	r.NewRoute().HandlerFunc(proxyPass(ir.Config, ir.InfoProvider, dynamicIDEResolver, func(h *proxyPassConfig) {
 		h.Transport = &blobserveTransport{
 			transport: h.Transport,
 			Config:    ir.Config.Config,
@@ -234,7 +233,7 @@ func (ir *ideRoutes) HandleRoot(route *mux.Route) {
 				// blobserve can inline static links in index.html for IDE and supervisor to avoid redirects for each resource
 				// but it has to know exposed URLs in the context of current workspace cluster
 				// so first we ask blobserve to preload the supervisor image
-				// and if it is succesful we pass exposed URLs to IDE and supervisor to blobserve for inlining
+				// and if it is successful we pass exposed URLs to IDE and supervisor to blobserve for inlining
 				supervisorURL := resolveSupervisorURL(t.Config).String() + "/main.js"
 				preloadSupervisorReq, err := http.NewRequest("GET", supervisorURL, nil)
 				if err != nil {
@@ -272,7 +271,7 @@ func (ir *ideRoutes) HandleRoot(route *mux.Route) {
 const imagePathSeparator = "/__files__"
 
 // installBlobserveRoutes  implements long-lived caching with versioned URLs, see https://web.dev/http-cache/#versioned-urls
-func installBlobserveRoutes(r *mux.Router, config *RouteHandlerConfig) {
+func installBlobserveRoutes(r *mux.Router, config *RouteHandlerConfig, infoProvider WorkspaceInfoProvider) {
 	r.Use(logHandler)
 	r.Use(handlers.CompressHandler)
 	r.Use(logRouteHandlerHandler("BlobserveRootHandler"))
@@ -282,7 +281,7 @@ func installBlobserveRoutes(r *mux.Router, config *RouteHandlerConfig) {
 		handlers.AllowedMethods([]string{"GET", "OPTIONS"}),
 	))
 
-	targetResolver := func(cfg *Config, req *http.Request) (tgt *url.URL, err error) {
+	targetResolver := func(cfg *Config, infoProvider WorkspaceInfoProvider, req *http.Request) (tgt *url.URL, err error) {
 		segments := strings.SplitN(req.URL.Path, imagePathSeparator, 2)
 		if len(segments) < 2 {
 			return nil, xerrors.Errorf("invalid URL")
@@ -298,11 +297,11 @@ func installBlobserveRoutes(r *mux.Router, config *RouteHandlerConfig) {
 		dst.Path = image
 		return &dst, nil
 	}
-	r.NewRoute().Handler(proxyPass(config, targetResolver, withLongTermCaching()))
+	r.NewRoute().Handler(proxyPass(config, infoProvider, targetResolver, withLongTermCaching()))
 }
 
-// installWorkspacePortRoutes configures routing for exposed ports
-func installWorkspacePortRoutes(r *mux.Router, config *RouteHandlerConfig) error {
+// installWorkspacePortRoutes configures routing for exposed ports.
+func installWorkspacePortRoutes(r *mux.Router, config *RouteHandlerConfig, infoProvider WorkspaceInfoProvider) error {
 	showPortNotFoundPage, err := servePortNotFoundPage(config.Config)
 	if err != nil {
 		return err
@@ -328,6 +327,7 @@ func installWorkspacePortRoutes(r *mux.Router, config *RouteHandlerConfig) error
 			r.Header.Add("X-Forwarded-Host", r.Host+":443")
 			proxyPass(
 				config,
+				infoProvider,
 				workspacePodPortResolver,
 				withHTTPErrorHandler(showPortNotFoundPage),
 				withXFrameOptionsFilter(),
@@ -339,25 +339,28 @@ func installWorkspacePortRoutes(r *mux.Router, config *RouteHandlerConfig) error
 	return nil
 }
 
-// workspacePodResolver resolves to the workspace pod's url from the given request
-func workspacePodResolver(config *Config, req *http.Request) (url *url.URL, err error) {
+// workspacePodResolver resolves to the workspace pod's url from the given request.
+func workspacePodResolver(config *Config, infoProvider WorkspaceInfoProvider, req *http.Request) (url *url.URL, err error) {
 	coords := getWorkspaceCoords(req)
-	return buildWorkspacePodURL(config.WorkspacePodConfig.ServiceTemplate, coords.ID, fmt.Sprint(config.WorkspacePodConfig.TheiaPort))
+	workspaceInfo := infoProvider.WorkspaceInfo(coords.ID)
+	return buildWorkspacePodURL(workspaceInfo.IPAddress, fmt.Sprint(config.WorkspacePodConfig.TheiaPort))
 }
 
-// workspacePodPortResolver resolves to the workspace pods ports
-func workspacePodPortResolver(config *Config, req *http.Request) (url *url.URL, err error) {
+// workspacePodPortResolver resolves to the workspace pods ports.
+func workspacePodPortResolver(config *Config, infoProvider WorkspaceInfoProvider, req *http.Request) (url *url.URL, err error) {
 	coords := getWorkspaceCoords(req)
-	return buildWorkspacePodURL(config.WorkspacePodConfig.PortServiceTemplate, coords.ID, coords.Port)
+	workspaceInfo := infoProvider.WorkspaceInfo(coords.ID)
+	return buildWorkspacePodURL(workspaceInfo.IPAddress, coords.Port)
 }
 
-// workspacePodSupervisorResolver resolves to the workspace pods Supervisor url from the given request
-func workspacePodSupervisorResolver(config *Config, req *http.Request) (url *url.URL, err error) {
+// workspacePodSupervisorResolver resolves to the workspace pods Supervisor url from the given request.
+func workspacePodSupervisorResolver(config *Config, infoProvider WorkspaceInfoProvider, req *http.Request) (url *url.URL, err error) {
 	coords := getWorkspaceCoords(req)
-	return buildWorkspacePodURL(config.WorkspacePodConfig.ServiceTemplate, coords.ID, fmt.Sprint(config.WorkspacePodConfig.SupervisorPort))
+	workspaceInfo := infoProvider.WorkspaceInfo(coords.ID)
+	return buildWorkspacePodURL(workspaceInfo.IPAddress, fmt.Sprint(config.WorkspacePodConfig.SupervisorPort))
 }
 
-func dynamicIDEResolver(config *Config, req *http.Request) (res *url.URL, err error) {
+func dynamicIDEResolver(config *Config, infoProvider WorkspaceInfoProvider, req *http.Request) (res *url.URL, err error) {
 	info := getWorkspaceInfoFromContext(req.Context())
 	if info == nil {
 		log.WithFields(log.OWI("", getWorkspaceCoords(req).ID, "")).Warn("no workspace info available - cannot resolve Theia route")
@@ -372,26 +375,11 @@ func dynamicIDEResolver(config *Config, req *http.Request) (res *url.URL, err er
 	return &dst, nil
 }
 
-// TODO(gpl) This is currently executed per request: cache/use more performant solution?
-func buildWorkspacePodURL(tmpl string, workspaceID string, port string) (*url.URL, error) {
-	tpl, err := template.New("host").Parse(tmpl)
-	if err != nil {
-		return nil, err
-	}
-
-	var out bytes.Buffer
-	err = tpl.Execute(&out, map[string]string{
-		"workspaceID": workspaceID,
-		"port":        port,
-	})
-	if err != nil {
-		return nil, err
-	}
-
-	return url.Parse(out.String())
+func buildWorkspacePodURL(ipAddress string, port string) (*url.URL, error) {
+	return url.Parse(fmt.Sprintf("http://%v:%v", ipAddress, port))
 }
 
-// corsHandler produces the CORS handler for workspaces
+// corsHandler produces the CORS handler for workspaces.
 func corsHandler(scheme, hostname string) (mux.MiddlewareFunc, error) {
 	origin := fmt.Sprintf("%s://%s", scheme, hostname)
 
@@ -526,7 +514,7 @@ func workspaceMustExistHandler(config *Config, infoProvider WorkspaceInfoProvide
 	return func(h http.Handler) http.Handler {
 		return http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
 			coords := getWorkspaceCoords(req)
-			info := infoProvider.WorkspaceInfo(req.Context(), coords.ID)
+			info := infoProvider.WorkspaceInfo(coords.ID)
 			if info == nil {
 				log.WithFields(log.OWI("", coords.ID, "")).Info("no workspace info found - redirecting to start")
 				redirectURL := fmt.Sprintf("%s://%s/start/#%s", config.GitpodInstallation.Scheme, config.GitpodInstallation.HostName, coords.ID)
@@ -539,7 +527,7 @@ func workspaceMustExistHandler(config *Config, infoProvider WorkspaceInfoProvide
 	}
 }
 
-// getWorkspaceInfoFromContext retrieves workspace information put there by the workspaceMustExistHandler
+// getWorkspaceInfoFromContext retrieves workspace information put there by the workspaceMustExistHandler.
 func getWorkspaceInfoFromContext(ctx context.Context) *WorkspaceInfo {
 	r := ctx.Value(infoContextValueKey)
 	rl, ok := r.(*WorkspaceInfo)
@@ -579,7 +567,7 @@ func removeSensitiveCookies(cookies []*http.Cookie, domain string) []*http.Cooki
 	return cookies[:n]
 }
 
-// region blobserve transport
+// region blobserve transport.
 type blobserveTransport struct {
 	transport    http.RoundTripper
 	Config       *Config
@@ -713,6 +701,6 @@ func servePortNotFoundPage(config *Config) (http.Handler, error) {
 
 	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 		w.WriteHeader(http.StatusNotFound)
-		w.Write(page)
+		_, _ = w.Write(page)
 	}), nil
 }
diff --git a/components/ws-proxy/pkg/proxy/routes_test.go b/components/ws-proxy/pkg/proxy/routes_test.go
index 3eb0506dda53a5..1cb76d665de959 100644
--- a/components/ws-proxy/pkg/proxy/routes_test.go
+++ b/components/ws-proxy/pkg/proxy/routes_test.go
@@ -40,8 +40,8 @@ var (
 			},
 			IDEPublicPort: "23000",
 			InstanceID:    "1943c611-a014-4f4d-bf5d-14ccf0123c60",
-			Ports: []PortInfo{
-				{PortSpec: api.PortSpec{Port: 28080, Target: 38080, Url: "https://28080-amaranth-smelt-9ba20cc1.test-domain.com/", Visibility: api.PortVisibility_PORT_VISIBILITY_PUBLIC}},
+			Ports: []*api.PortSpec{
+				{Port: 28080, Url: "https://28080-amaranth-smelt-9ba20cc1.test-domain.com/", Visibility: api.PortVisibility_PORT_VISIBILITY_PUBLIC},
 			},
 			URL:         "https://amaranth-smelt-9ba20cc1.test-domain.com/",
 			WorkspaceID: "amaranth-smelt-9ba20cc1",
@@ -72,11 +72,9 @@ var (
 			Scheme: "http",
 		},
 		WorkspacePodConfig: &WorkspacePodConfig{
-			ServiceTemplate:     "http://localhost:{{ .port }}",
-			PortServiceTemplate: "http://localhost:{{ .port }}",
-			TheiaPort:           workspacePort,
-			SupervisorPort:      supervisorPort,
-			SupervisorImage:     "gitpod-io/supervisor:latest",
+			TheiaPort:       workspacePort,
+			SupervisorPort:  supervisorPort,
+			SupervisorImage: "gitpod-io/supervisor:latest",
 		},
 		BuiltinPages: BuiltinPagesConfig{
 			Location: "../../public",
@@ -88,6 +86,7 @@ type Target struct {
 	Status  int
 	Handler func(w http.ResponseWriter, r *http.Request, requestCount uint8)
 }
+
 type testTarget struct {
 	Target       *Target
 	RequestCount uint8
@@ -96,12 +95,14 @@ type testTarget struct {
 }
 
 func (tt *testTarget) Close() {
-	tt.listener.Close()
-	tt.server.Shutdown(context.Background())
+	_ = tt.listener.Close()
+	_ = tt.server.Shutdown(context.Background())
 }
 
-// startTestTarget starts a new HTTP server that serves as some test target during the unit tests
+// startTestTarget starts a new HTTP server that serves as some test target during the unit tests.
 func startTestTarget(t *testing.T, host, name string) *testTarget {
+	t.Helper()
+
 	l, err := net.Listen("tcp", host)
 	if err != nil {
 		t.Fatalf("cannot start fake IDE host: %q", err)
@@ -147,7 +148,7 @@ func startTestTarget(t *testing.T, host, name string) *testTarget {
 		}
 		w.WriteHeader(http.StatusOK)
 	})}
-	go srv.Serve(l)
+	go func() { _ = srv.Serve(l) }()
 	tt.server = srv
 
 	return tt
@@ -477,7 +478,7 @@ func TestRoutes(t *testing.T) {
 				Handler: func(w http.ResponseWriter, r *http.Request, requestCount uint8) {
 					if requestCount == 0 {
 						w.WriteHeader(http.StatusServiceUnavailable)
-						io.WriteString(w, "timeout")
+						_, _ = io.WriteString(w, "timeout")
 						return
 					}
 					w.WriteHeader(http.StatusOK)
@@ -646,6 +647,10 @@ func TestRoutes(t *testing.T) {
 			cfg := config
 			if test.Config != nil {
 				cfg = *test.Config
+				err := cfg.Validate()
+				if err != nil {
+					t.Fatalf("invalid configuration: %q", err)
+				}
 			}
 			router := HostBasedRouter(hostBasedHeader, wsHostSuffix, wsHostNameRegex)
 			if test.Router != nil {
@@ -653,8 +658,8 @@ func TestRoutes(t *testing.T) {
 			}
 
 			ingress := HostBasedIngressConfig{
-				HttpAddress:  "8080",
-				HttpsAddress: "9090",
+				HTTPAddress:  "8080",
+				HTTPSAddress: "9090",
 				Header:       "",
 			}
 
@@ -695,8 +700,8 @@ type fakeWsInfoProvider struct {
 	infos []WorkspaceInfo
 }
 
-// GetWsInfoByID returns the workspace for the given ID
-func (p *fakeWsInfoProvider) WorkspaceInfo(ctx context.Context, workspaceID string) *WorkspaceInfo {
+// GetWsInfoByID returns the workspace for the given ID.
+func (p *fakeWsInfoProvider) WorkspaceInfo(workspaceID string) *WorkspaceInfo {
 	for _, nfo := range p.infos {
 		if nfo.WorkspaceID == workspaceID {
 			return &nfo
@@ -706,7 +711,7 @@ func (p *fakeWsInfoProvider) WorkspaceInfo(ctx context.Context, workspaceID stri
 	return nil
 }
 
-// WorkspaceCoords returns the workspace coords for a public port
+// WorkspaceCoords returns the workspace coords for a public port.
 func (p *fakeWsInfoProvider) WorkspaceCoords(wsProxyPort string) *WorkspaceCoords {
 	for _, info := range p.infos {
 		if info.IDEPublicPort == wsProxyPort {
@@ -717,7 +722,7 @@ func (p *fakeWsInfoProvider) WorkspaceCoords(wsProxyPort string) *WorkspaceCoord
 		}
 
 		for _, portInfo := range info.Ports {
-			if portInfo.PublicPort == wsProxyPort {
+			if fmt.Sprint(portInfo.Port) == wsProxyPort {
 				return &WorkspaceCoords{
 					ID:   info.WorkspaceID,
 					Port: strconv.Itoa(int(portInfo.Port)),
@@ -777,7 +782,6 @@ func TestSensitiveCookieHandler(t *testing.T) {
 	}
 	for _, test := range tests {
 		t.Run(test.Name, func(t *testing.T) {
-
 			req := httptest.NewRequest("GET", "http://"+domain, nil)
 			if test.Input != "" {
 				req.Header.Set("cookie", test.Input)
diff --git a/components/ws-proxy/pkg/proxy/workspacerouter.go b/components/ws-proxy/pkg/proxy/workspacerouter.go
index adc843e17446b2..73e3663c6bdbb7 100644
--- a/components/ws-proxy/pkg/proxy/workspacerouter.go
+++ b/components/ws-proxy/pkg/proxy/workspacerouter.go
@@ -15,35 +15,34 @@ import (
 )
 
 const (
-	// Used as key for storing the workspace port in the requests mux.Vars() map
+	// Used as key for storing the workspace port in the requests mux.Vars() map.
 	workspacePortIdentifier = "workspacePort"
 
-	// Used as key for storing the workspace ID in the requests mux.Vars() map
+	// Used as key for storing the workspace ID in the requests mux.Vars() map.
 	workspaceIDIdentifier = "workspaceID"
 
-	// Used as key for storing the origin to fetch foreign content
+	// Used as key for storing the origin to fetch foreign content.
 	foreignOriginIdentifier = "foreignOrigin"
 
-	// Used as key for storing the path to fetch foreign content
+	// Used as key for storing the path to fetch foreign content.
 	foreignPathIdentifier = "foreignPath"
 
-	// The header that is used to communicate the "Host" from proxy -> ws-proxy in scenarios where ws-proxy is _not_ directly exposed
+	// The header that is used to communicate the "Host" from proxy -> ws-proxy in scenarios where ws-proxy is _not_ directly exposed.
 	forwardedHostnameHeader = "x-wsproxy-host"
 
-	// This pattern matches v4 UUIDs as well as the new generated workspace ids (e.g. pink-panda-ns35kd21)
+	// This pattern matches v4 UUIDs as well as the new generated workspace ids (e.g. pink-panda-ns35kd21).
 	workspaceIDRegex   = "(?P<" + workspaceIDIdentifier + ">[a-f][0-9a-f]{7}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}|[0-9a-z]{2,16}-[0-9a-z]{2,16}-[0-9a-z]{8})"
 	workspacePortRegex = "(?P<" + workspacePortIdentifier + ">[0-9]+)-"
 )
 
 // WorkspaceRouter is a function that configures subrouters (one for theia, one for the exposed ports) on the given router
 // which resolve workspace coordinates (ID, port?) from each request. The contract is to store those in the request's mux.Vars
-// with the keys workspacePortIdentifier and workspaceIDIdentifier
+// with the keys workspacePortIdentifier and workspaceIDIdentifier.
 type WorkspaceRouter func(r *mux.Router, wsInfoProvider WorkspaceInfoProvider) (ideRouter *mux.Router, portRouter *mux.Router, blobserveRouter *mux.Router)
 
-// HostBasedRouter is a WorkspaceRouter that routes simply based on the "Host" header
+// HostBasedRouter is a WorkspaceRouter that routes simply based on the "Host" header.
 func HostBasedRouter(header, wsHostSuffix string, wsHostSuffixRegex string) WorkspaceRouter {
 	return func(r *mux.Router, wsInfoProvider WorkspaceInfoProvider) (*mux.Router, *mux.Router, *mux.Router) {
-
 		allClusterWsHostSuffixRegex := wsHostSuffixRegex
 		if allClusterWsHostSuffixRegex == "" {
 			allClusterWsHostSuffixRegex = wsHostSuffix
@@ -66,7 +65,7 @@ func HostBasedRouter(header, wsHostSuffix string, wsHostSuffixRegex string) Work
 		r.NotFoundHandler = http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
 			hostname := getHostHeader(req)
 			log.Debugf("no match for path %s, host: %s", req.URL.Path, hostname)
-			w.WriteHeader(404)
+			w.WriteHeader(http.StatusNotFound)
 		})
 		return ideRouter, portRouter, blobserveRouter
 	}
@@ -182,6 +181,7 @@ func matchWorkspaceHostHeader(wsHostSuffix string, headerProvider hostHeaderProv
 		if foreignPath != "" {
 			m.Vars[foreignPathIdentifier] = foreignPath
 		}
+
 		return true
 	}
 }
diff --git a/components/ws-proxy/pkg/proxy/workspacerouter_test.go b/components/ws-proxy/pkg/proxy/workspacerouter_test.go
index 2f76b251dcf3c7..2469f862c9ce31 100644
--- a/components/ws-proxy/pkg/proxy/workspacerouter_test.go
+++ b/components/ws-proxy/pkg/proxy/workspacerouter_test.go
@@ -83,7 +83,7 @@ func TestWorkspaceRouter(t *testing.T) {
 			ideRouter, portRouter, blobserveRouter := test.Router(r, &fakeWsInfoProvider{infos: test.Infos})
 			var act Expectation
 			actRecorder := func(w http.ResponseWriter, req *http.Request) {
-				defer w.WriteHeader(200)
+				defer w.WriteHeader(http.StatusOK)
 
 				vars := mux.Vars(req)
 				if vars == nil {
diff --git a/dev/loadgen/go.mod b/dev/loadgen/go.mod
index 6911322c4a28c6..c1394c9053b795 100644
--- a/dev/loadgen/go.mod
+++ b/dev/loadgen/go.mod
@@ -29,6 +29,7 @@ require (
 	golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 // indirect
 	golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 // indirect
 	golang.org/x/text v0.3.6 // indirect
+	golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
 	google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154 // indirect
 	gopkg.in/yaml.v2 v2.4.0 // indirect
 )
diff --git a/installer/go.mod b/installer/go.mod
index 6514fa0062a954..49becd0d82a1a6 100644
--- a/installer/go.mod
+++ b/installer/go.mod
@@ -88,6 +88,7 @@ require (
 	github.com/fatih/structtag v1.2.0 // indirect
 	github.com/felixge/httpsnoop v1.0.1 // indirect
 	github.com/form3tech-oss/jwt-go v3.2.3+incompatible // indirect
+	github.com/fsnotify/fsnotify v1.4.9 // indirect
 	github.com/fvbommel/sortorder v1.0.1 // indirect
 	github.com/gitpod-io/gitpod/content-service v0.0.0-00010101000000-000000000000 // indirect
 	github.com/gitpod-io/gitpod/registry-facade v0.0.0-00010101000000-000000000000 // indirect
@@ -196,6 +197,7 @@ require (
 	golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
 	golang.org/x/tools v0.1.2 // indirect
 	golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
+	gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect
 	google.golang.org/api v0.48.0 // indirect
 	google.golang.org/appengine v1.6.7 // indirect
 	google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08 // indirect
@@ -214,6 +216,7 @@ require (
 	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
+	sigs.k8s.io/controller-runtime v0.10.2 // indirect
 	sigs.k8s.io/kustomize/api v0.8.11 // indirect
 	sigs.k8s.io/kustomize/kyaml v0.11.0 // indirect
 	sigs.k8s.io/structured-merge-diff/v4 v4.1.2 // indirect
diff --git a/installer/go.sum b/installer/go.sum
index f86d3de43ba423..0ed1e0a8339aef 100644
--- a/installer/go.sum
+++ b/installer/go.sum
@@ -153,6 +153,7 @@ github.com/aws/aws-sdk-go v1.34.9/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU
 github.com/aws/aws-sdk-go v1.34.30/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48=
 github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
 github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
+github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
 github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 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=
@@ -452,6 +453,7 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7
 github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
 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-logr/zapr v0.4.0 h1:uc1uML3hRYL9/ZZPdgHS/n8Nzo+eaYL/Efxkkamf7OM=
 github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk=
 github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY=
 github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
@@ -899,8 +901,9 @@ github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+
 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/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg=
-github.com/onsi/ginkgo v1.16.1 h1:foqVmeWDD6yYpK+Yz3fHyNIxFYNxswxqNFjSKe+vI54=
 github.com/onsi/ginkgo v1.16.1/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E=
+github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc=
+github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
 github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
 github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
 github.com/onsi/gomega v1.3.0/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
@@ -910,8 +913,9 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J
 github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
 github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
 github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48=
-github.com/onsi/gomega v1.11.0 h1:+CqWgvj0OZycCaqclBD1pxKHAU+tOkHmQIWvDHq2aug=
 github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg=
+github.com/onsi/gomega v1.15.0 h1:WjP/FQ/sk43MRmnEcT+MlDw2TFvkrXlprrPST/IudjU=
+github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0=
 github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
 github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
 github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
@@ -1212,16 +1216,20 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
 go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
 go.uber.org/atomic v1.8.0 h1:CUhrE4N1rqSE6FM9ecihEjRkLQu8cDfgDyoOs83mEY4=
 go.uber.org/atomic v1.8.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0=
 go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
 go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
 go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
 go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
+go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
 go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
 go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
 go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
 go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
 go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
+go.uber.org/zap v1.19.0 h1:mZQZefskPPCMIBCSEH0v2/iUqqLrYtaeqwD6FUGUnFE=
+go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
 golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
@@ -1337,6 +1345,7 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
 golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
+golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
 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-20210726213435-c6fcb2dbf985 h1:4CSI6oo7cOjJKajidEljs9h+uP0rRZBPPPhcCbj5mw8=
@@ -1469,6 +1478,7 @@ golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBc
 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=
 golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf h1:2ucpDCmfkl8Bd/FsLtiD653Wf96cW37s+iGx93zsu4k=
 golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
@@ -1569,6 +1579,7 @@ 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.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=
 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=
@@ -1819,6 +1830,8 @@ 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=
 sigs.k8s.io/controller-runtime v0.9.0-beta.2/go.mod h1:ufPDuvefw2Y1KnBgHQrLdOjueYlj+XJV2AszbT+WTxs=
+sigs.k8s.io/controller-runtime v0.10.2 h1:jW8qiY+yMnnPx6O9hu63tgcwaKzd1yLYui+mpvClOOc=
+sigs.k8s.io/controller-runtime v0.10.2/go.mod h1:CQp8eyUQZ/Q7PJvnIrB6/hgfTC1kBkGylwsLgOQi1WY=
 sigs.k8s.io/controller-tools v0.6.0-beta.0/go.mod h1:RAYVhbfeCcGzE/Nzeq+FbkUkiJLYnJ4fCnm7/HJWO/Q=
 sigs.k8s.io/kustomize/api v0.8.11 h1:LzQzlq6Z023b+mBtc6v72N2mSHYmN8x7ssgbf/hv0H8=
 sigs.k8s.io/kustomize/api v0.8.11/go.mod h1:a77Ls36JdfCWojpUqR6m60pdGY1AYFix4AH83nJtY1g=
diff --git a/installer/pkg/components/ws-proxy/configmap.go b/installer/pkg/components/ws-proxy/configmap.go
index 841b38d447b8f4..d4b5950ea52210 100644
--- a/installer/pkg/components/ws-proxy/configmap.go
+++ b/installer/pkg/components/ws-proxy/configmap.go
@@ -7,12 +7,12 @@ package wsproxy
 import (
 	"encoding/json"
 	"fmt"
-	"github.com/gitpod-io/gitpod/installer/pkg/components/workspace"
 	"time"
 
+	"github.com/gitpod-io/gitpod/installer/pkg/components/workspace"
+
 	"github.com/gitpod-io/gitpod/common-go/util"
 	"github.com/gitpod-io/gitpod/installer/pkg/common"
-	wsmanager "github.com/gitpod-io/gitpod/installer/pkg/components/ws-manager"
 	"github.com/gitpod-io/gitpod/ws-proxy/pkg/config"
 	"github.com/gitpod-io/gitpod/ws-proxy/pkg/proxy"
 
@@ -25,8 +25,8 @@ func configmap(ctx *common.RenderContext) ([]runtime.Object, error) {
 	// todo(sje): wsManagerProxy seems to be unused
 	wspcfg := config.Config{
 		Ingress: proxy.HostBasedIngressConfig{
-			HttpAddress:  fmt.Sprintf(":%d", HTTPProxyPort),
-			HttpsAddress: fmt.Sprintf(":%d", HTTPSProxyPort),
+			HTTPAddress:  fmt.Sprintf(":%d", HTTPProxyPort),
+			HTTPSAddress: fmt.Sprintf(":%d", HTTPSProxyPort),
 			Header:       HostHeader,
 		},
 		Proxy: proxy.Config{
@@ -54,29 +54,14 @@ func configmap(ctx *common.RenderContext) ([]runtime.Object, error) {
 				WorkspaceHostSuffixRegex: fmt.Sprintf("\\.ws[^\\.]*\\.%s", ctx.Config.Domain),
 			},
 			WorkspacePodConfig: &proxy.WorkspacePodConfig{
-				ServiceTemplate:     fmt.Sprintf("http://ws-{{ .workspaceID }}-theia.%s.svc.cluster.local:{{ .port }}", ctx.Namespace),
-				PortServiceTemplate: fmt.Sprintf("http://ws-{{ .workspaceID }}-ports.%s.svc.cluster.local:{{ .port }}", ctx.Namespace),
-				TheiaPort:           workspace.ContainerPort,
-				SupervisorPort:      workspace.SupervisorPort,
-				SupervisorImage:     common.ImageName(ctx.Config.Repository, workspace.SupervisorImage, ctx.VersionManifest.Components.Workspace.Supervisor.Version),
+				TheiaPort:       workspace.ContainerPort,
+				SupervisorPort:  workspace.SupervisorPort,
+				SupervisorImage: common.ImageName(ctx.Config.Repository, workspace.SupervisorImage, ctx.VersionManifest.Components.Workspace.Supervisor.Version),
 			},
 			BuiltinPages: proxy.BuiltinPagesConfig{
 				Location: "/app/public",
 			},
 		},
-		WorkspaceInfoProviderConfig: proxy.WorkspaceInfoProviderConfig{
-			WsManagerAddr:     fmt.Sprintf("%s:%d", wsmanager.Component, wsmanager.RPCPort),
-			ReconnectInterval: util.Duration(time.Second * 3),
-			TLS: struct {
-				CA   string `json:"ca"`
-				Cert string `json:"crt"`
-				Key  string `json:"key"`
-			}{
-				CA:   "/ws-manager-client-tls-certs/ca.crt",
-				Cert: "/ws-manager-client-tls-certs/tls.crt",
-				Key:  "/ws-manager-client-tls-certs/tls.key",
-			},
-		},
 		PProfAddr:          ":60060",
 		PrometheusAddr:     ":60095",
 		ReadinessProbeAddr: ":60088",
diff --git a/installer/pkg/components/ws-proxy/constants.go b/installer/pkg/components/ws-proxy/constants.go
index 8a64344a463899..009e723e619d44 100644
--- a/installer/pkg/components/ws-proxy/constants.go
+++ b/installer/pkg/components/ws-proxy/constants.go
@@ -4,7 +4,9 @@
 
 package wsproxy
 
-import "github.com/gitpod-io/gitpod/installer/pkg/common"
+import (
+	"github.com/gitpod-io/gitpod/installer/pkg/common"
+)
 
 const (
 	Component          = common.WSProxyComponent
diff --git a/operations/workspace/deployment/go.mod b/operations/workspace/deployment/go.mod
index 371a412926d6ec..76bb00dce3d6b7 100644
--- a/operations/workspace/deployment/go.mod
+++ b/operations/workspace/deployment/go.mod
@@ -8,40 +8,15 @@ require (
 	golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
 	golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1
 	gopkg.in/yaml.v2 v2.4.0
-	k8s.io/client-go v0.0.0-00010101000000-000000000000
 )
 
 require (
-	github.com/davecgh/go-spew v1.1.1 // 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/go-cmp v0.5.6 // indirect
-	github.com/google/gofuzz v1.1.0 // indirect
-	github.com/googleapis/gnostic v0.5.5 // indirect
 	github.com/inconshreveable/mousetrap v1.0.0 // indirect
-	github.com/json-iterator/go v1.1.11 // indirect
-	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
-	github.com/modern-go/reflect2 v1.0.1 // indirect
+	github.com/kr/text v0.2.0 // indirect
 	github.com/sirupsen/logrus v1.8.1 // indirect
 	github.com/spf13/pflag v1.0.5 // indirect
-	golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 // indirect
-	golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602 // 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
-	golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
-	google.golang.org/appengine v1.6.7 // indirect
-	google.golang.org/protobuf v1.27.1 // indirect
 	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
-	gopkg.in/inf.v0 v0.9.1 // indirect
-	gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
-	k8s.io/api v0.22.2 // indirect
-	k8s.io/apimachinery v0.22.2 // indirect
-	k8s.io/klog/v2 v2.9.0 // 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 => ../../../components/common-go // leeway
diff --git a/operations/workspace/deployment/go.sum b/operations/workspace/deployment/go.sum
index dee87e87747db0..28f6cea1534e5c 100644
--- a/operations/workspace/deployment/go.sum
+++ b/operations/workspace/deployment/go.sum
@@ -37,23 +37,12 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl
 cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
 cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
 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/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
-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/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/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
 github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
@@ -71,9 +60,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=
@@ -81,30 +67,18 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y
 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.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-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/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-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/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
-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-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=
@@ -129,11 +103,9 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw
 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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
-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=
@@ -146,10 +118,7 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 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/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=
@@ -165,16 +134,10 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe
 github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/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/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/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=
@@ -196,14 +159,10 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO
 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/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=
 github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
-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=
@@ -212,7 +171,6 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
 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/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
 github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@@ -220,8 +178,6 @@ 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.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-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
 github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
@@ -233,29 +189,12 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu
 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.1/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 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/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/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
 github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
-github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
 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=
@@ -271,17 +210,14 @@ 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/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
 github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
 github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw=
 github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=
 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.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=
-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/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
@@ -316,8 +252,6 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/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=
@@ -355,7 +289,6 @@ golang.org/x/mod v0.4.1/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-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -368,7 +301,6 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR
 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-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=
@@ -379,7 +311,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=
@@ -392,8 +323,6 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
 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=
@@ -405,7 +334,6 @@ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ
 golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602 h1:0Ja1LBD+yisY6RWM/BH7TJVXWsSjs2VwBSmvSX4HdBc=
 golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 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=
@@ -421,7 +349,6 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cO
 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-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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -431,11 +358,9 @@ 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-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-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -449,7 +374,6 @@ 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-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -464,14 +388,10 @@ golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/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-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=
@@ -479,13 +399,9 @@ 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.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.5/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-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=
@@ -570,7 +486,6 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7
 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
 google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
 google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
 google.golang.org/appengine v1.6.7/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=
@@ -603,7 +518,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=
@@ -646,30 +560,18 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
 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/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/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 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.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
-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.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=
@@ -679,24 +581,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 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/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/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=