diff --git a/components/content-service/pkg/initializer/initializer.go b/components/content-service/pkg/initializer/initializer.go index d3ed8f495efe55..770feea372b7e9 100644 --- a/components/content-service/pkg/initializer/initializer.go +++ b/components/content-service/pkg/initializer/initializer.go @@ -468,20 +468,38 @@ func InitializeWorkspace(ctx context.Context, location string, remoteStorage sto } } - // Run the initializer + // Try to download a backup first + initialSize, fsErr := getFsUsage() + if fsErr != nil { + log.WithError(fsErr).Error("could not get disk usage") + } + downloadStart := time.Now() hasBackup, err := remoteStorage.Download(ctx, location, storage.DefaultBackup, cfg.mappings) if err != nil { return src, nil, xerrors.Errorf("cannot restore backup: %w", err) } + downloadDuration := time.Since(downloadStart) span.SetTag("hasBackup", hasBackup) if hasBackup { src = csapi.WorkspaceInitFromBackup - } else { - src, stats, err = cfg.Initializer.Run(ctx, cfg.mappings) - if err != nil { - return src, nil, xerrors.Errorf("cannot initialize workspace: %w", err) + + currentSize, fsErr := getFsUsage() + if fsErr != nil { + log.WithError(fsErr).Error("could not get disk usage") } + stats = []csapi.InitializerMetric{{ + Type: "fromBackup", + Duration: downloadDuration, + Size: currentSize - initialSize, + }} + return + } + + // If there is not backup, run the initializer + src, stats, err = cfg.Initializer.Run(ctx, cfg.mappings) + if err != nil { + return src, nil, xerrors.Errorf("cannot initialize workspace: %w", err) } return diff --git a/components/dashboard/src/Insights.tsx b/components/dashboard/src/Insights.tsx index c9fa6d3e69069e..c2dc65a23252ef 100644 --- a/components/dashboard/src/Insights.tsx +++ b/components/dashboard/src/Insights.tsx @@ -63,7 +63,7 @@ export const Insights = () => { "md:flex-row md:items-center md:space-x-4 md:space-y-0", )} > - +
{ +export const DownloadInsights = ({ to, disabled }: DownloadUsageProps) => { const { data: org } = useCurrentOrg(); const { toast } = useToast(); // When we start the download, we disable the button for a short time diff --git a/components/dashboard/src/insights/download/download-sessions.ts b/components/dashboard/src/insights/download/download-sessions.ts index 9a68c3c022bfdc..0248ab23810bbc 100644 --- a/components/dashboard/src/insights/download/download-sessions.ts +++ b/components/dashboard/src/insights/download/download-sessions.ts @@ -15,7 +15,7 @@ import dayjs from "dayjs"; import { useQuery, useQueryClient } from "@tanstack/react-query"; import { useCallback } from "react"; import { noPersistence } from "../../data/setup"; -import { Timestamp } from "@bufbuild/protobuf"; +import { Duration, Timestamp } from "@bufbuild/protobuf"; const pageSize = 100; const maxPages = 100; // safety limit if something goes wrong with pagination @@ -154,6 +154,16 @@ const displayTime = (timestamp?: Timestamp) => { return timestamp.toDate().toISOString(); }; +const renderDuration = (duration?: Duration): string => { + if (!duration) { + return ""; + } + + let seconds = Number(duration.seconds); + seconds += duration.nanos / 1_000_000_000; + return seconds.toString(10); +}; + export const transformSessionRecord = (session: WorkspaceSession) => { const initializerType = session.workspace?.spec?.initializer?.specs; const prebuildInitializer = initializerType?.find((i) => i.spec.case === "prebuild")?.spec.value as @@ -190,6 +200,20 @@ export const transformSessionRecord = (session: WorkspaceSession) => { timeout: session.workspace?.spec?.timeout?.inactivity?.seconds, editor: session.workspace?.spec?.editor?.name, editorVersion: session.workspace?.spec?.editor?.version, // indicates whether user selected the stable or latest editor release channel + + // initializer metrics + contentInitGitDuration: renderDuration(session.metrics?.initializerMetrics?.git?.duration), + contentInitGitSize: session.metrics?.initializerMetrics?.git?.size, + contentInitFileDownloadDuration: renderDuration(session.metrics?.initializerMetrics?.fileDownload?.duration), + contentInitFileDownloadSize: session.metrics?.initializerMetrics?.fileDownload?.size, + contentInitSnapshotDuration: renderDuration(session.metrics?.initializerMetrics?.snapshot?.duration), + contentInitSnapshotSize: session.metrics?.initializerMetrics?.snapshot?.size, + contentInitBackupDuration: renderDuration(session.metrics?.initializerMetrics?.backup?.duration), + contentInitBackupSize: session.metrics?.initializerMetrics?.backup?.size, + contentInitPrebuildDuration: renderDuration(session.metrics?.initializerMetrics?.prebuild?.duration), + contentInitPrebuildSize: session.metrics?.initializerMetrics?.prebuild?.size, + contentInitCompositeDuration: renderDuration(session.metrics?.initializerMetrics?.composite?.duration), + contentInitCompositeSize: session.metrics?.initializerMetrics?.composite?.size, }; return row; diff --git a/components/gitpod-db/src/typeorm/entity/db-workspace-instance-metrics.ts b/components/gitpod-db/src/typeorm/entity/db-workspace-instance-metrics.ts new file mode 100644 index 00000000000000..0942b4e075f5b7 --- /dev/null +++ b/components/gitpod-db/src/typeorm/entity/db-workspace-instance-metrics.ts @@ -0,0 +1,20 @@ +/** + * Copyright (c) 2025 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. + */ + +import { Entity, Column, PrimaryColumn } from "typeorm"; +import { WorkspaceInstanceMetrics } from "@gitpod/gitpod-protocol"; + +@Entity() +export class DBWorkspaceInstanceMetrics { + @PrimaryColumn() + instanceId: string; + + @Column("json", { nullable: true }) + metrics?: WorkspaceInstanceMetrics; + + @Column() + _lastModified: Date; +} diff --git a/components/gitpod-db/src/typeorm/migration/1739892121734-AddWorkspaceInstanceMetricsTable.ts b/components/gitpod-db/src/typeorm/migration/1739892121734-AddWorkspaceInstanceMetricsTable.ts new file mode 100644 index 00000000000000..768aaaf4141f56 --- /dev/null +++ b/components/gitpod-db/src/typeorm/migration/1739892121734-AddWorkspaceInstanceMetricsTable.ts @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2025 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. + */ + +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class AddWorkspaceInstanceMetricsTable1739892121734 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE TABLE IF NOT EXISTS d_b_workspace_instance_metrics ( + instanceId char(36) NOT NULL, + metrics JSON, + _lastModified timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), + PRIMARY KEY (instanceId), + KEY ind_dbsync (_lastModified) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP TABLE IF EXISTS d_b_workspace_instance_metrics`); + } +} diff --git a/components/gitpod-db/src/typeorm/workspace-db-impl.ts b/components/gitpod-db/src/typeorm/workspace-db-impl.ts index 9e92a8038d433c..a6a67d59bd040b 100644 --- a/components/gitpod-db/src/typeorm/workspace-db-impl.ts +++ b/components/gitpod-db/src/typeorm/workspace-db-impl.ts @@ -19,6 +19,7 @@ import { WorkspaceAndInstance, WorkspaceInfo, WorkspaceInstance, + WorkspaceInstanceMetrics, WorkspaceInstanceUser, WorkspaceSession, WorkspaceType, @@ -62,6 +63,7 @@ import { TypeORM } from "./typeorm"; import { ApplicationError, ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error"; import { DBProject } from "./entity/db-project"; import { PrebuiltWorkspaceWithWorkspace } from "@gitpod/gitpod-protocol/src/protocol"; +import { DBWorkspaceInstanceMetrics } from "./entity/db-workspace-instance-metrics"; type RawTo = (instance: WorkspaceInstance, ws: Workspace) => T; interface OrderBy { @@ -109,6 +111,10 @@ export class TypeORMWorkspaceDBImpl extends TransactionalDBImpl imp ); } + private async getWorkspaceInstanceMetricsRepo(): Promise> { + return (await this.getEntityManager()).getRepository(DBWorkspaceInstanceMetrics); + } + public async connect(maxTries: number = 3, timeout: number = 2000): Promise { let tries = 1; while (tries <= maxTries) { @@ -459,27 +465,39 @@ export class TypeORMWorkspaceDBImpl extends TransactionalDBImpl imp offset: number, ): Promise { const workspaceInstanceRepo = await this.getWorkspaceInstanceRepo(); + // The query basically selects all workspace instances for the given owner, whose startDate is within the period, and which are either: // - not stopped yet, or // - is stopped or stopping. - const sessions = await workspaceInstanceRepo + type JoinResult = DBWorkspaceInstance & { + metrics: DBWorkspaceInstanceMetrics | undefined; + workspace: DBWorkspace; + }; + const sessions = (await workspaceInstanceRepo .createQueryBuilder("wsi") .leftJoinAndMapOne("wsi.workspace", DBWorkspace, "ws", "ws.id = wsi.workspaceId") + .leftJoinAndMapOne("wsi.metrics", DBWorkspaceInstanceMetrics, "wsim", "wsim.instanceId = wsi.id") .where("ws.organizationId = :organizationId", { organizationId }) .andWhere("wsi.creationTime >= :periodStart", { periodStart: periodStart.toISOString() }) .andWhere("wsi.creationTime <= :periodEnd", { periodEnd: periodEnd.toISOString() }) .orderBy("wsi.creationTime", "DESC") .skip(offset) .take(limit) - .getMany(); + .getMany()) as JoinResult[]; - const resultSessions: { instance: WorkspaceInstance; workspace: Workspace }[] = []; + const resultSessions: { + instance: WorkspaceInstance; + workspace: Workspace; + metrics?: WorkspaceInstanceMetrics; + }[] = []; for (const session of sessions) { resultSessions.push({ - workspace: (session as any).workspace, + workspace: session.workspace, instance: session, + metrics: session.metrics?.metrics, }); delete (session as any).workspace; + delete (session as any).metrics; } return resultSessions; } @@ -1143,6 +1161,36 @@ export class TypeORMWorkspaceDBImpl extends TransactionalDBImpl imp const res = await query.getMany(); return res.map((r) => r.info); } + + async storeMetrics(instanceId: string, metrics: WorkspaceInstanceMetrics): Promise { + const repo = await this.getWorkspaceInstanceMetricsRepo(); + const result = await repo.save({ + instanceId, + metrics, + }); + return result.metrics; + } + + async getMetrics(instanceId: string): Promise { + const repo = await this.getWorkspaceInstanceMetricsRepo(); + const dbMetrics = await repo.findOne({ where: { instanceId } }); + return dbMetrics?.metrics; + } + + async updateMetrics( + instanceId: string, + update: WorkspaceInstanceMetrics, + merge: (current: WorkspaceInstanceMetrics, update: WorkspaceInstanceMetrics) => WorkspaceInstanceMetrics, + ): Promise { + return await this.transaction(async (db) => { + const current = await db.getMetrics(instanceId); + if (!current) { + return await db.storeMetrics(instanceId, update); + } + const merged = merge(current, update); + return await db.storeMetrics(instanceId, merged); + }); + } } type InstanceJoinResult = DBWorkspace & { instance: WorkspaceInstance }; diff --git a/components/gitpod-db/src/workspace-db.ts b/components/gitpod-db/src/workspace-db.ts index e42a23186e2cdc..015cb558264835 100644 --- a/components/gitpod-db/src/workspace-db.ts +++ b/components/gitpod-db/src/workspace-db.ts @@ -23,6 +23,7 @@ import { WorkspaceSession, PrebuiltWorkspaceWithWorkspace, PrebuildWithStatus, + WorkspaceInstanceMetrics, } from "@gitpod/gitpod-protocol"; export type MaybeWorkspace = Workspace | undefined; @@ -196,4 +197,12 @@ export interface WorkspaceDB { storePrebuildInfo(prebuildInfo: PrebuildInfo): Promise; findPrebuildInfos(prebuildIds: string[]): Promise; + + storeMetrics(instanceId: string, metrics: WorkspaceInstanceMetrics): Promise; + getMetrics(instanceId: string): Promise; + updateMetrics( + instanceId: string, + update: WorkspaceInstanceMetrics, + merge: (current: WorkspaceInstanceMetrics, update: WorkspaceInstanceMetrics) => WorkspaceInstanceMetrics, + ): Promise; } diff --git a/components/gitpod-protocol/src/protocol.ts b/components/gitpod-protocol/src/protocol.ts index 399f33da2bf11c..8606fe10f76134 100644 --- a/components/gitpod-protocol/src/protocol.ts +++ b/components/gitpod-protocol/src/protocol.ts @@ -4,7 +4,7 @@ * See License.AGPL.txt in the project root for license information. */ -import { WorkspaceInstance, PortVisibility, PortProtocol } from "./workspace-instance"; +import { WorkspaceInstance, PortVisibility, PortProtocol, WorkspaceInstanceMetrics } from "./workspace-instance"; import { RoleOrPermission } from "./permission"; import { Project } from "./teams-projects-protocol"; import { createHash } from "crypto"; @@ -1390,6 +1390,7 @@ export namespace WorkspaceInstancePortsChangedEvent { export interface WorkspaceSession { workspace: Workspace; instance: WorkspaceInstance; + metrics?: WorkspaceInstanceMetrics; } export interface WorkspaceInfo { workspace: Workspace; diff --git a/components/gitpod-protocol/src/workspace-instance.ts b/components/gitpod-protocol/src/workspace-instance.ts index cc0eea7ed08285..2895e4eb482eaa 100644 --- a/components/gitpod-protocol/src/workspace-instance.ts +++ b/components/gitpod-protocol/src/workspace-instance.ts @@ -332,14 +332,43 @@ export interface ImageBuildLogInfo { * Holds metrics about the workspace instance */ export interface WorkspaceInstanceMetrics { - image?: Partial<{ - /** - * the total size of the image in bytes (includes Gitpod-specific layers like IDE) - */ - totalSize: number; - /** - * the size of the workspace image in bytes - */ - workspaceImageSize: number; - }>; + image?: ImageMetrics; + + /** + * Metrics about the workspace initializer + */ + initializerMetrics?: InitializerMetrics; +} + +export interface ImageMetrics { + /** + * the total size of the image in bytes (includes Gitpod-specific layers like IDE) + */ + totalSize?: number; + + /** + * the size of the workspace image in bytes + */ + workspaceImageSize?: number; +} + +export interface InitializerMetrics { + git?: InitializerMetric; + fileDownload?: InitializerMetric; + snapshot?: InitializerMetric; + backup?: InitializerMetric; + prebuild?: InitializerMetric; + composite?: InitializerMetric; +} + +export interface InitializerMetric { + /** + * Duration in milliseconds + */ + duration: number; + + /** + * Size in bytes + */ + size: number; } diff --git a/components/public-api/gitpod/v1/workspace.proto b/components/public-api/gitpod/v1/workspace.proto index 1b8f373ec2e804..1373412b583d81 100644 --- a/components/public-api/gitpod/v1/workspace.proto +++ b/components/public-api/gitpod/v1/workspace.proto @@ -939,6 +939,48 @@ message WorkspaceSession { // total_image_size is the total size of the image in bytes (includes Gitpod-specific layers like IDE) int64 total_image_size = 2; + + // initializer_metrics are all metrics exported from the content initializer on workspace start + InitializerMetrics initializer_metrics = 3; + } + + // Add these new message definitions + message InitializerMetric { + // duration in seconds + google.protobuf.Duration duration = 1; + + // size in bytes + uint64 size = 2; + } + + message InitializerMetrics { + // git contains metrics for the git initializer step + // This is set whenever a `git clone` is issued (mostly on first workspace start) + InitializerMetric git = 1; + + // file_download contains metrics for the file download initializer step + // This is set for injecting "additionalFiles" into the workspace. + InitializerMetric file_download = 2; + + // snapshot contains metrics for the snapshot initializer step + // This used for workspaces started from snapshots. + InitializerMetric snapshot = 3; + + // backup contains metrics for the backup initializer step + // This is set on subsequent workspace starts, when the file system is restored from backup. + InitializerMetric backup = 4; + + // prebuild contains metrics for the prebuild initializer step + // This is set if the workspace is based on a prebuild. + InitializerMetric prebuild = 5; + + // composite contains metrics for the composite initializer step + // This reports the total if multiple steps are run to initialize the workspace content. + // Examples are: + // - "additionalFiles" injected into the workspace + // - "additionalRepositories" configured + // - incremental Prebuilds + InitializerMetric composite = 6; } string id = 1; diff --git a/components/public-api/go/v1/workspace.pb.go b/components/public-api/go/v1/workspace.pb.go index 8da0642afa9f08..cb220e67b90a67 100644 --- a/components/public-api/go/v1/workspace.pb.go +++ b/components/public-api/go/v1/workspace.pb.go @@ -4840,6 +4840,8 @@ type WorkspaceSession_Metrics struct { WorkspaceImageSize int64 `protobuf:"varint,1,opt,name=workspace_image_size,json=workspaceImageSize,proto3" json:"workspace_image_size,omitempty"` // total_image_size is the total size of the image in bytes (includes Gitpod-specific layers like IDE) TotalImageSize int64 `protobuf:"varint,2,opt,name=total_image_size,json=totalImageSize,proto3" json:"total_image_size,omitempty"` + // initializer_metrics are all metrics exported from the content initializer on workspace start + InitializerMetrics *WorkspaceSession_InitializerMetrics `protobuf:"bytes,3,opt,name=initializer_metrics,json=initializerMetrics,proto3" json:"initializer_metrics,omitempty"` } func (x *WorkspaceSession_Metrics) Reset() { @@ -4888,6 +4890,174 @@ func (x *WorkspaceSession_Metrics) GetTotalImageSize() int64 { return 0 } +func (x *WorkspaceSession_Metrics) GetInitializerMetrics() *WorkspaceSession_InitializerMetrics { + if x != nil { + return x.InitializerMetrics + } + return nil +} + +// Add these new message definitions +type WorkspaceSession_InitializerMetric struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // duration in seconds + Duration *durationpb.Duration `protobuf:"bytes,1,opt,name=duration,proto3" json:"duration,omitempty"` + // size in bytes + Size uint64 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"` +} + +func (x *WorkspaceSession_InitializerMetric) Reset() { + *x = WorkspaceSession_InitializerMetric{} + if protoimpl.UnsafeEnabled { + mi := &file_gitpod_v1_workspace_proto_msgTypes[68] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WorkspaceSession_InitializerMetric) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkspaceSession_InitializerMetric) ProtoMessage() {} + +func (x *WorkspaceSession_InitializerMetric) ProtoReflect() protoreflect.Message { + mi := &file_gitpod_v1_workspace_proto_msgTypes[68] + 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 WorkspaceSession_InitializerMetric.ProtoReflect.Descriptor instead. +func (*WorkspaceSession_InitializerMetric) Descriptor() ([]byte, []int) { + return file_gitpod_v1_workspace_proto_rawDescGZIP(), []int{51, 3} +} + +func (x *WorkspaceSession_InitializerMetric) GetDuration() *durationpb.Duration { + if x != nil { + return x.Duration + } + return nil +} + +func (x *WorkspaceSession_InitializerMetric) GetSize() uint64 { + if x != nil { + return x.Size + } + return 0 +} + +type WorkspaceSession_InitializerMetrics struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // git contains metrics for the git initializer step + // This is set whenever a `git clone` is issued (mostly on first workspace start) + Git *WorkspaceSession_InitializerMetric `protobuf:"bytes,1,opt,name=git,proto3" json:"git,omitempty"` + // file_download contains metrics for the file download initializer step + // This is set for injecting "additionalFiles" into the workspace. + FileDownload *WorkspaceSession_InitializerMetric `protobuf:"bytes,2,opt,name=file_download,json=fileDownload,proto3" json:"file_download,omitempty"` + // snapshot contains metrics for the snapshot initializer step + // This used for workspaces started from snapshots. + Snapshot *WorkspaceSession_InitializerMetric `protobuf:"bytes,3,opt,name=snapshot,proto3" json:"snapshot,omitempty"` + // backup contains metrics for the backup initializer step + // This is set on subsequent workspace starts, when the file system is restored from backup. + Backup *WorkspaceSession_InitializerMetric `protobuf:"bytes,4,opt,name=backup,proto3" json:"backup,omitempty"` + // prebuild contains metrics for the prebuild initializer step + // This is set if the workspace is based on a prebuild. + Prebuild *WorkspaceSession_InitializerMetric `protobuf:"bytes,5,opt,name=prebuild,proto3" json:"prebuild,omitempty"` + // composite contains metrics for the composite initializer step + // This reports the total if multiple steps are run to initialize the workspace content. + // Examples are: + // - "additionalFiles" injected into the workspace + // - "additionalRepositories" configured + // - incremental Prebuilds + Composite *WorkspaceSession_InitializerMetric `protobuf:"bytes,6,opt,name=composite,proto3" json:"composite,omitempty"` +} + +func (x *WorkspaceSession_InitializerMetrics) Reset() { + *x = WorkspaceSession_InitializerMetrics{} + if protoimpl.UnsafeEnabled { + mi := &file_gitpod_v1_workspace_proto_msgTypes[69] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WorkspaceSession_InitializerMetrics) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkspaceSession_InitializerMetrics) ProtoMessage() {} + +func (x *WorkspaceSession_InitializerMetrics) ProtoReflect() protoreflect.Message { + mi := &file_gitpod_v1_workspace_proto_msgTypes[69] + 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 WorkspaceSession_InitializerMetrics.ProtoReflect.Descriptor instead. +func (*WorkspaceSession_InitializerMetrics) Descriptor() ([]byte, []int) { + return file_gitpod_v1_workspace_proto_rawDescGZIP(), []int{51, 4} +} + +func (x *WorkspaceSession_InitializerMetrics) GetGit() *WorkspaceSession_InitializerMetric { + if x != nil { + return x.Git + } + return nil +} + +func (x *WorkspaceSession_InitializerMetrics) GetFileDownload() *WorkspaceSession_InitializerMetric { + if x != nil { + return x.FileDownload + } + return nil +} + +func (x *WorkspaceSession_InitializerMetrics) GetSnapshot() *WorkspaceSession_InitializerMetric { + if x != nil { + return x.Snapshot + } + return nil +} + +func (x *WorkspaceSession_InitializerMetrics) GetBackup() *WorkspaceSession_InitializerMetric { + if x != nil { + return x.Backup + } + return nil +} + +func (x *WorkspaceSession_InitializerMetrics) GetPrebuild() *WorkspaceSession_InitializerMetric { + if x != nil { + return x.Prebuild + } + return nil +} + +func (x *WorkspaceSession_InitializerMetrics) GetComposite() *WorkspaceSession_InitializerMetric { + if x != nil { + return x.Composite + } + return nil +} + type WorkspaceSession_WorkspaceContext_Repository struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4906,7 +5076,7 @@ type WorkspaceSession_WorkspaceContext_Repository struct { func (x *WorkspaceSession_WorkspaceContext_Repository) Reset() { *x = WorkspaceSession_WorkspaceContext_Repository{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_v1_workspace_proto_msgTypes[68] + mi := &file_gitpod_v1_workspace_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4919,7 +5089,7 @@ func (x *WorkspaceSession_WorkspaceContext_Repository) String() string { func (*WorkspaceSession_WorkspaceContext_Repository) ProtoMessage() {} func (x *WorkspaceSession_WorkspaceContext_Repository) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_v1_workspace_proto_msgTypes[68] + mi := &file_gitpod_v1_workspace_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5632,7 +5802,7 @@ var file_gitpod_v1_workspace_proto_rawDesc = []byte{ 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xd7, 0x09, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xef, 0x0e, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x32, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, @@ -5703,144 +5873,185 @@ var file_gitpod_v1_workspace_proto_rawDesc = []byte{ 0x45, 0x46, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x52, 0x41, 0x4e, 0x43, 0x48, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x45, 0x46, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x41, 0x47, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x46, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, - 0x45, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x1a, 0x65, 0x0a, 0x07, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, 0x61, - 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x2a, 0x6f, 0x0a, 0x0e, 0x41, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, - 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x44, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, - 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x44, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, - 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x4f, 0x57, 0x4e, 0x45, 0x52, 0x5f, 0x4f, 0x4e, 0x4c, - 0x59, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x44, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, - 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x45, 0x56, 0x45, 0x52, 0x59, 0x4f, 0x4e, 0x45, 0x10, - 0x02, 0x32, 0xd3, 0x0e, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x51, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x14, 0x57, 0x61, 0x74, - 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x26, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, - 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x69, 0x74, 0x70, - 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x57, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, - 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x69, 0x74, - 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x6c, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, - 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, - 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, - 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, + 0x45, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x1a, 0xc6, 0x01, 0x0a, 0x07, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x5f, 0x0a, 0x13, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, + 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, + 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x12, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x1a, 0x5e, 0x0a, 0x11, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x72, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x35, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, + 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, + 0x7a, 0x65, 0x1a, 0xd3, 0x03, 0x0a, 0x12, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x72, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x3f, 0x0a, 0x03, 0x67, 0x69, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, + 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x03, 0x67, 0x69, 0x74, 0x12, 0x52, 0x0a, 0x0d, 0x66, 0x69, + 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x49, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x52, 0x0c, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x49, + 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, + 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, + 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x45, 0x0a, 0x06, 0x62, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x69, 0x74, 0x70, + 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x72, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x12, 0x49, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, + 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x52, 0x08, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x4b, 0x0a, 0x09, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, + 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x09, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x2a, 0x6f, 0x0a, 0x0e, 0x41, 0x64, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x44, + 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x41, + 0x44, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x4f, + 0x57, 0x4e, 0x45, 0x52, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x41, + 0x44, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x45, + 0x56, 0x45, 0x52, 0x59, 0x4f, 0x4e, 0x45, 0x10, 0x02, 0x32, 0xd3, 0x0e, 0x0a, 0x10, 0x57, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x51, + 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1e, + 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, + 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, - 0x31, 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, 0x5a, 0x0a, 0x0f, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x2e, - 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x00, 0x12, 0x6b, 0x0a, 0x14, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x26, 0x2e, 0x67, 0x69, 0x74, 0x70, + 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, + 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x57, + 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, + 0x12, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x27, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x69, 0x74, 0x70, + 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, + 0x6e, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x69, + 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x6e, + 0x64, 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, 0x57, 0x0a, 0x0e, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x20, 0x2e, 0x67, 0x69, + 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 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, 0x5a, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, + 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, + 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, 0x57, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, - 0x64, 0x2e, 0x76, 0x31, 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, 0x5a, 0x0a, 0x0f, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x21, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, - 0x12, 0x26, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, + 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 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, 0x5a, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x69, 0x74, + 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x69, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x55, 0x52, 0x4c, 0x12, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x55, - 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x70, - 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x75, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x2e, 0x67, 0x69, - 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, + 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x27, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x50, + 0x61, 0x72, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x55, 0x52, 0x4c, 0x12, 0x21, + 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x73, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, + 0x72, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x12, 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2b, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x49, + 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, + 0x0a, 0x0d, 0x53, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x61, 0x72, 0x74, 0x42, 0x65, 0x61, 0x74, 0x12, + 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, + 0x48, 0x65, 0x61, 0x72, 0x74, 0x42, 0x65, 0x61, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, + 0x64, 0x48, 0x65, 0x61, 0x72, 0x74, 0x42, 0x65, 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x28, + 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, + 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x84, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x72, 0x65, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x53, 0x65, 0x6e, 0x64, 0x48, 0x65, - 0x61, 0x72, 0x74, 0x42, 0x65, 0x61, 0x74, 0x12, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x61, 0x72, 0x74, 0x42, 0x65, 0x61, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, - 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x61, 0x72, 0x74, 0x42, 0x65, - 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, - 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, - 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x28, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, - 0x77, 0x6e, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x84, 0x01, - 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x45, 0x64, - 0x69, 0x74, 0x6f, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, - 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x72, - 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x30, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, - 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, - 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x69, 0x74, - 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x18, 0x57, 0x61, 0x69, 0x74, - 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x12, 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, - 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2b, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x69, - 0x74, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x66, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x25, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, - 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x51, 0x0a, 0x16, 0x69, 0x6f, 0x2e, 0x67, 0x69, - 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x5a, 0x37, 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, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, + 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, + 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x75, 0x0a, 0x18, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x2a, 0x2e, 0x67, + 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, + 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x25, + 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, + 0x51, 0x0a, 0x16, 0x69, 0x6f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x5a, 0x37, 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, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, + 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5856,7 +6067,7 @@ func file_gitpod_v1_workspace_proto_rawDescGZIP() []byte { } var file_gitpod_v1_workspace_proto_enumTypes = make([]protoimpl.EnumInfo, 9) -var file_gitpod_v1_workspace_proto_msgTypes = make([]protoimpl.MessageInfo, 69) +var file_gitpod_v1_workspace_proto_msgTypes = make([]protoimpl.MessageInfo, 71) var file_gitpod_v1_workspace_proto_goTypes = []interface{}{ (AdmissionLevel)(0), // 0: gitpod.v1.AdmissionLevel (GetWorkspaceDefaultImageResponse_Source)(0), // 1: gitpod.v1.GetWorkspaceDefaultImageResponse.Source @@ -5935,136 +6146,146 @@ var file_gitpod_v1_workspace_proto_goTypes = []interface{}{ (*WorkspaceSession_Owner)(nil), // 74: gitpod.v1.WorkspaceSession.Owner (*WorkspaceSession_WorkspaceContext)(nil), // 75: gitpod.v1.WorkspaceSession.WorkspaceContext (*WorkspaceSession_Metrics)(nil), // 76: gitpod.v1.WorkspaceSession.Metrics - (*WorkspaceSession_WorkspaceContext_Repository)(nil), // 77: gitpod.v1.WorkspaceSession.WorkspaceContext.Repository - (*PaginationRequest)(nil), // 78: gitpod.v1.PaginationRequest - (*PaginationResponse)(nil), // 79: gitpod.v1.PaginationResponse - (*timestamppb.Timestamp)(nil), // 80: google.protobuf.Timestamp - (*EnvironmentVariable)(nil), // 81: gitpod.v1.EnvironmentVariable - (*EditorReference)(nil), // 82: gitpod.v1.EditorReference - (*durationpb.Duration)(nil), // 83: google.protobuf.Duration + (*WorkspaceSession_InitializerMetric)(nil), // 77: gitpod.v1.WorkspaceSession.InitializerMetric + (*WorkspaceSession_InitializerMetrics)(nil), // 78: gitpod.v1.WorkspaceSession.InitializerMetrics + (*WorkspaceSession_WorkspaceContext_Repository)(nil), // 79: gitpod.v1.WorkspaceSession.WorkspaceContext.Repository + (*PaginationRequest)(nil), // 80: gitpod.v1.PaginationRequest + (*PaginationResponse)(nil), // 81: gitpod.v1.PaginationResponse + (*timestamppb.Timestamp)(nil), // 82: google.protobuf.Timestamp + (*EnvironmentVariable)(nil), // 83: gitpod.v1.EnvironmentVariable + (*EditorReference)(nil), // 84: gitpod.v1.EditorReference + (*durationpb.Duration)(nil), // 85: google.protobuf.Duration } var file_gitpod_v1_workspace_proto_depIdxs = []int32{ - 0, // 0: gitpod.v1.UpdateWorkspacePortRequest.admission:type_name -> gitpod.v1.AdmissionLevel - 4, // 1: gitpod.v1.UpdateWorkspacePortRequest.protocol:type_name -> gitpod.v1.WorkspacePort.Protocol - 31, // 2: gitpod.v1.GetWorkspaceResponse.workspace:type_name -> gitpod.v1.Workspace - 34, // 3: gitpod.v1.WatchWorkspaceStatusResponse.status:type_name -> gitpod.v1.WorkspaceStatus - 78, // 4: gitpod.v1.ListWorkspacesRequest.pagination:type_name -> gitpod.v1.PaginationRequest - 79, // 5: gitpod.v1.ListWorkspacesResponse.pagination:type_name -> gitpod.v1.PaginationResponse - 31, // 6: gitpod.v1.ListWorkspacesResponse.workspaces:type_name -> gitpod.v1.Workspace - 78, // 7: gitpod.v1.ListWorkspaceSessionsRequest.pagination:type_name -> gitpod.v1.PaginationRequest - 80, // 8: gitpod.v1.ListWorkspaceSessionsRequest.from:type_name -> google.protobuf.Timestamp - 80, // 9: gitpod.v1.ListWorkspaceSessionsRequest.to:type_name -> google.protobuf.Timestamp - 79, // 10: gitpod.v1.ListWorkspaceSessionsResponse.pagination:type_name -> gitpod.v1.PaginationResponse - 60, // 11: gitpod.v1.ListWorkspaceSessionsResponse.workspace_sessions:type_name -> gitpod.v1.WorkspaceSession - 32, // 12: gitpod.v1.CreateAndStartWorkspaceRequest.metadata:type_name -> gitpod.v1.WorkspaceMetadata - 61, // 13: gitpod.v1.CreateAndStartWorkspaceRequest.context_url:type_name -> gitpod.v1.CreateAndStartWorkspaceRequest.ContextURL - 33, // 14: gitpod.v1.CreateAndStartWorkspaceRequest.spec:type_name -> gitpod.v1.WorkspaceSpec - 31, // 15: gitpod.v1.CreateAndStartWorkspaceResponse.workspace:type_name -> gitpod.v1.Workspace - 31, // 16: gitpod.v1.StartWorkspaceResponse.workspace:type_name -> gitpod.v1.Workspace - 1, // 17: gitpod.v1.GetWorkspaceDefaultImageResponse.source:type_name -> gitpod.v1.GetWorkspaceDefaultImageResponse.Source - 32, // 18: gitpod.v1.Workspace.metadata:type_name -> gitpod.v1.WorkspaceMetadata - 33, // 19: gitpod.v1.Workspace.spec:type_name -> gitpod.v1.WorkspaceSpec - 34, // 20: gitpod.v1.Workspace.status:type_name -> gitpod.v1.WorkspaceStatus - 62, // 21: gitpod.v1.WorkspaceMetadata.annotations:type_name -> gitpod.v1.WorkspaceMetadata.AnnotationsEntry - 38, // 22: gitpod.v1.WorkspaceSpec.initializer:type_name -> gitpod.v1.WorkspaceInitializer - 2, // 23: gitpod.v1.WorkspaceSpec.type:type_name -> gitpod.v1.WorkspaceSpec.WorkspaceType - 35, // 24: gitpod.v1.WorkspaceSpec.ports:type_name -> gitpod.v1.WorkspacePort - 81, // 25: gitpod.v1.WorkspaceSpec.environment_variables:type_name -> gitpod.v1.EnvironmentVariable - 64, // 26: gitpod.v1.WorkspaceSpec.git:type_name -> gitpod.v1.WorkspaceSpec.GitSpec - 63, // 27: gitpod.v1.WorkspaceSpec.timeout:type_name -> gitpod.v1.WorkspaceSpec.Timeout - 0, // 28: gitpod.v1.WorkspaceSpec.admission:type_name -> gitpod.v1.AdmissionLevel - 80, // 29: gitpod.v1.WorkspaceSpec.last_user_activity:type_name -> google.protobuf.Timestamp - 82, // 30: gitpod.v1.WorkspaceSpec.editor:type_name -> gitpod.v1.EditorReference - 37, // 31: gitpod.v1.WorkspaceStatus.phase:type_name -> gitpod.v1.WorkspacePhase - 65, // 32: gitpod.v1.WorkspaceStatus.conditions:type_name -> gitpod.v1.WorkspaceStatus.WorkspaceConditions - 66, // 33: gitpod.v1.WorkspaceStatus.prebuild_result:type_name -> gitpod.v1.WorkspaceStatus.PrebuildResult - 36, // 34: gitpod.v1.WorkspaceStatus.git_status:type_name -> gitpod.v1.WorkspaceGitStatus - 0, // 35: gitpod.v1.WorkspacePort.admission:type_name -> gitpod.v1.AdmissionLevel - 4, // 36: gitpod.v1.WorkspacePort.protocol:type_name -> gitpod.v1.WorkspacePort.Protocol - 5, // 37: gitpod.v1.WorkspacePhase.name:type_name -> gitpod.v1.WorkspacePhase.Phase - 80, // 38: gitpod.v1.WorkspacePhase.last_transition_time:type_name -> google.protobuf.Timestamp - 67, // 39: gitpod.v1.WorkspaceInitializer.specs:type_name -> gitpod.v1.WorkspaceInitializer.Spec - 6, // 40: gitpod.v1.GitInitializer.target_mode:type_name -> gitpod.v1.GitInitializer.CloneTargetMode - 68, // 41: gitpod.v1.GitInitializer.config:type_name -> gitpod.v1.GitInitializer.GitConfig - 70, // 42: gitpod.v1.FileDownloadInitializer.files:type_name -> gitpod.v1.FileDownloadInitializer.FileInfo - 71, // 43: gitpod.v1.UpdateWorkspaceRequest.metadata:type_name -> gitpod.v1.UpdateWorkspaceRequest.UpdateWorkspaceMetadata - 73, // 44: gitpod.v1.UpdateWorkspaceRequest.spec:type_name -> gitpod.v1.UpdateWorkspaceRequest.UpdateWorkspaceSpec - 36, // 45: gitpod.v1.UpdateWorkspaceRequest.git_status:type_name -> gitpod.v1.WorkspaceGitStatus - 31, // 46: gitpod.v1.UpdateWorkspaceResponse.workspace:type_name -> gitpod.v1.Workspace - 78, // 47: gitpod.v1.ListWorkspaceClassesRequest.pagination:type_name -> gitpod.v1.PaginationRequest - 79, // 48: gitpod.v1.ListWorkspaceClassesResponse.pagination:type_name -> gitpod.v1.PaginationResponse - 54, // 49: gitpod.v1.ListWorkspaceClassesResponse.workspace_classes:type_name -> gitpod.v1.WorkspaceClass - 32, // 50: gitpod.v1.ParseContextURLResponse.metadata:type_name -> gitpod.v1.WorkspaceMetadata - 33, // 51: gitpod.v1.ParseContextURLResponse.spec:type_name -> gitpod.v1.WorkspaceSpec - 59, // 52: gitpod.v1.CreateWorkspaceSnapshotResponse.snapshot:type_name -> gitpod.v1.WorkspaceSnapshot - 80, // 53: gitpod.v1.WorkspaceSnapshot.creation_time:type_name -> google.protobuf.Timestamp - 31, // 54: gitpod.v1.WorkspaceSession.workspace:type_name -> gitpod.v1.Workspace - 80, // 55: gitpod.v1.WorkspaceSession.creation_time:type_name -> google.protobuf.Timestamp - 80, // 56: gitpod.v1.WorkspaceSession.deployed_time:type_name -> google.protobuf.Timestamp - 80, // 57: gitpod.v1.WorkspaceSession.started_time:type_name -> google.protobuf.Timestamp - 80, // 58: gitpod.v1.WorkspaceSession.stopping_time:type_name -> google.protobuf.Timestamp - 80, // 59: gitpod.v1.WorkspaceSession.stopped_time:type_name -> google.protobuf.Timestamp - 76, // 60: gitpod.v1.WorkspaceSession.metrics:type_name -> gitpod.v1.WorkspaceSession.Metrics - 74, // 61: gitpod.v1.WorkspaceSession.owner:type_name -> gitpod.v1.WorkspaceSession.Owner - 75, // 62: gitpod.v1.WorkspaceSession.context:type_name -> gitpod.v1.WorkspaceSession.WorkspaceContext - 82, // 63: gitpod.v1.CreateAndStartWorkspaceRequest.ContextURL.editor:type_name -> gitpod.v1.EditorReference - 83, // 64: gitpod.v1.WorkspaceSpec.Timeout.inactivity:type_name -> google.protobuf.Duration - 83, // 65: gitpod.v1.WorkspaceSpec.Timeout.disconnected:type_name -> google.protobuf.Duration - 83, // 66: gitpod.v1.WorkspaceSpec.Timeout.maximum_lifetime:type_name -> google.protobuf.Duration - 3, // 67: gitpod.v1.WorkspaceStatus.WorkspaceConditions.failed_reason:type_name -> gitpod.v1.WorkspaceStatus.WorkspaceConditions.FailedReason - 39, // 68: gitpod.v1.WorkspaceInitializer.Spec.git:type_name -> gitpod.v1.GitInitializer - 40, // 69: gitpod.v1.WorkspaceInitializer.Spec.snapshot:type_name -> gitpod.v1.SnapshotInitializer - 41, // 70: gitpod.v1.WorkspaceInitializer.Spec.prebuild:type_name -> gitpod.v1.PrebuildInitializer - 42, // 71: gitpod.v1.WorkspaceInitializer.Spec.download:type_name -> gitpod.v1.FileDownloadInitializer - 69, // 72: gitpod.v1.GitInitializer.GitConfig.custom_config:type_name -> gitpod.v1.GitInitializer.GitConfig.CustomConfigEntry - 7, // 73: gitpod.v1.GitInitializer.GitConfig.authentication:type_name -> gitpod.v1.GitInitializer.AuthMethod - 83, // 74: gitpod.v1.UpdateWorkspaceRequest.UpdateTimeout.inactivity:type_name -> google.protobuf.Duration - 83, // 75: gitpod.v1.UpdateWorkspaceRequest.UpdateTimeout.disconnected:type_name -> google.protobuf.Duration - 72, // 76: gitpod.v1.UpdateWorkspaceRequest.UpdateWorkspaceSpec.timeout:type_name -> gitpod.v1.UpdateWorkspaceRequest.UpdateTimeout - 0, // 77: gitpod.v1.UpdateWorkspaceRequest.UpdateWorkspaceSpec.admission:type_name -> gitpod.v1.AdmissionLevel - 8, // 78: gitpod.v1.WorkspaceSession.WorkspaceContext.ref_type:type_name -> gitpod.v1.WorkspaceSession.WorkspaceContext.RefType - 77, // 79: gitpod.v1.WorkspaceSession.WorkspaceContext.repository:type_name -> gitpod.v1.WorkspaceSession.WorkspaceContext.Repository - 11, // 80: gitpod.v1.WorkspaceService.GetWorkspace:input_type -> gitpod.v1.GetWorkspaceRequest - 13, // 81: gitpod.v1.WorkspaceService.WatchWorkspaceStatus:input_type -> gitpod.v1.WatchWorkspaceStatusRequest - 15, // 82: gitpod.v1.WorkspaceService.ListWorkspaces:input_type -> gitpod.v1.ListWorkspacesRequest - 17, // 83: gitpod.v1.WorkspaceService.ListWorkspaceSessions:input_type -> gitpod.v1.ListWorkspaceSessionsRequest - 19, // 84: gitpod.v1.WorkspaceService.CreateAndStartWorkspace:input_type -> gitpod.v1.CreateAndStartWorkspaceRequest - 21, // 85: gitpod.v1.WorkspaceService.StartWorkspace:input_type -> gitpod.v1.StartWorkspaceRequest - 44, // 86: gitpod.v1.WorkspaceService.UpdateWorkspace:input_type -> gitpod.v1.UpdateWorkspaceRequest - 46, // 87: gitpod.v1.WorkspaceService.StopWorkspace:input_type -> gitpod.v1.StopWorkspaceRequest - 48, // 88: gitpod.v1.WorkspaceService.DeleteWorkspace:input_type -> gitpod.v1.DeleteWorkspaceRequest - 50, // 89: gitpod.v1.WorkspaceService.ListWorkspaceClasses:input_type -> gitpod.v1.ListWorkspaceClassesRequest - 52, // 90: gitpod.v1.WorkspaceService.ParseContextURL:input_type -> gitpod.v1.ParseContextURLRequest - 23, // 91: gitpod.v1.WorkspaceService.GetWorkspaceDefaultImage:input_type -> gitpod.v1.GetWorkspaceDefaultImageRequest - 25, // 92: gitpod.v1.WorkspaceService.SendHeartBeat:input_type -> gitpod.v1.SendHeartBeatRequest - 27, // 93: gitpod.v1.WorkspaceService.GetWorkspaceOwnerToken:input_type -> gitpod.v1.GetWorkspaceOwnerTokenRequest - 29, // 94: gitpod.v1.WorkspaceService.GetWorkspaceEditorCredentials:input_type -> gitpod.v1.GetWorkspaceEditorCredentialsRequest - 55, // 95: gitpod.v1.WorkspaceService.CreateWorkspaceSnapshot:input_type -> gitpod.v1.CreateWorkspaceSnapshotRequest - 57, // 96: gitpod.v1.WorkspaceService.WaitForWorkspaceSnapshot:input_type -> gitpod.v1.WaitForWorkspaceSnapshotRequest - 9, // 97: gitpod.v1.WorkspaceService.UpdateWorkspacePort:input_type -> gitpod.v1.UpdateWorkspacePortRequest - 12, // 98: gitpod.v1.WorkspaceService.GetWorkspace:output_type -> gitpod.v1.GetWorkspaceResponse - 14, // 99: gitpod.v1.WorkspaceService.WatchWorkspaceStatus:output_type -> gitpod.v1.WatchWorkspaceStatusResponse - 16, // 100: gitpod.v1.WorkspaceService.ListWorkspaces:output_type -> gitpod.v1.ListWorkspacesResponse - 18, // 101: gitpod.v1.WorkspaceService.ListWorkspaceSessions:output_type -> gitpod.v1.ListWorkspaceSessionsResponse - 20, // 102: gitpod.v1.WorkspaceService.CreateAndStartWorkspace:output_type -> gitpod.v1.CreateAndStartWorkspaceResponse - 22, // 103: gitpod.v1.WorkspaceService.StartWorkspace:output_type -> gitpod.v1.StartWorkspaceResponse - 45, // 104: gitpod.v1.WorkspaceService.UpdateWorkspace:output_type -> gitpod.v1.UpdateWorkspaceResponse - 47, // 105: gitpod.v1.WorkspaceService.StopWorkspace:output_type -> gitpod.v1.StopWorkspaceResponse - 49, // 106: gitpod.v1.WorkspaceService.DeleteWorkspace:output_type -> gitpod.v1.DeleteWorkspaceResponse - 51, // 107: gitpod.v1.WorkspaceService.ListWorkspaceClasses:output_type -> gitpod.v1.ListWorkspaceClassesResponse - 53, // 108: gitpod.v1.WorkspaceService.ParseContextURL:output_type -> gitpod.v1.ParseContextURLResponse - 24, // 109: gitpod.v1.WorkspaceService.GetWorkspaceDefaultImage:output_type -> gitpod.v1.GetWorkspaceDefaultImageResponse - 26, // 110: gitpod.v1.WorkspaceService.SendHeartBeat:output_type -> gitpod.v1.SendHeartBeatResponse - 28, // 111: gitpod.v1.WorkspaceService.GetWorkspaceOwnerToken:output_type -> gitpod.v1.GetWorkspaceOwnerTokenResponse - 30, // 112: gitpod.v1.WorkspaceService.GetWorkspaceEditorCredentials:output_type -> gitpod.v1.GetWorkspaceEditorCredentialsResponse - 56, // 113: gitpod.v1.WorkspaceService.CreateWorkspaceSnapshot:output_type -> gitpod.v1.CreateWorkspaceSnapshotResponse - 58, // 114: gitpod.v1.WorkspaceService.WaitForWorkspaceSnapshot:output_type -> gitpod.v1.WaitForWorkspaceSnapshotResponse - 10, // 115: gitpod.v1.WorkspaceService.UpdateWorkspacePort:output_type -> gitpod.v1.UpdateWorkspacePortResponse - 98, // [98:116] is the sub-list for method output_type - 80, // [80:98] is the sub-list for method input_type - 80, // [80:80] is the sub-list for extension type_name - 80, // [80:80] is the sub-list for extension extendee - 0, // [0:80] is the sub-list for field type_name + 0, // 0: gitpod.v1.UpdateWorkspacePortRequest.admission:type_name -> gitpod.v1.AdmissionLevel + 4, // 1: gitpod.v1.UpdateWorkspacePortRequest.protocol:type_name -> gitpod.v1.WorkspacePort.Protocol + 31, // 2: gitpod.v1.GetWorkspaceResponse.workspace:type_name -> gitpod.v1.Workspace + 34, // 3: gitpod.v1.WatchWorkspaceStatusResponse.status:type_name -> gitpod.v1.WorkspaceStatus + 80, // 4: gitpod.v1.ListWorkspacesRequest.pagination:type_name -> gitpod.v1.PaginationRequest + 81, // 5: gitpod.v1.ListWorkspacesResponse.pagination:type_name -> gitpod.v1.PaginationResponse + 31, // 6: gitpod.v1.ListWorkspacesResponse.workspaces:type_name -> gitpod.v1.Workspace + 80, // 7: gitpod.v1.ListWorkspaceSessionsRequest.pagination:type_name -> gitpod.v1.PaginationRequest + 82, // 8: gitpod.v1.ListWorkspaceSessionsRequest.from:type_name -> google.protobuf.Timestamp + 82, // 9: gitpod.v1.ListWorkspaceSessionsRequest.to:type_name -> google.protobuf.Timestamp + 81, // 10: gitpod.v1.ListWorkspaceSessionsResponse.pagination:type_name -> gitpod.v1.PaginationResponse + 60, // 11: gitpod.v1.ListWorkspaceSessionsResponse.workspace_sessions:type_name -> gitpod.v1.WorkspaceSession + 32, // 12: gitpod.v1.CreateAndStartWorkspaceRequest.metadata:type_name -> gitpod.v1.WorkspaceMetadata + 61, // 13: gitpod.v1.CreateAndStartWorkspaceRequest.context_url:type_name -> gitpod.v1.CreateAndStartWorkspaceRequest.ContextURL + 33, // 14: gitpod.v1.CreateAndStartWorkspaceRequest.spec:type_name -> gitpod.v1.WorkspaceSpec + 31, // 15: gitpod.v1.CreateAndStartWorkspaceResponse.workspace:type_name -> gitpod.v1.Workspace + 31, // 16: gitpod.v1.StartWorkspaceResponse.workspace:type_name -> gitpod.v1.Workspace + 1, // 17: gitpod.v1.GetWorkspaceDefaultImageResponse.source:type_name -> gitpod.v1.GetWorkspaceDefaultImageResponse.Source + 32, // 18: gitpod.v1.Workspace.metadata:type_name -> gitpod.v1.WorkspaceMetadata + 33, // 19: gitpod.v1.Workspace.spec:type_name -> gitpod.v1.WorkspaceSpec + 34, // 20: gitpod.v1.Workspace.status:type_name -> gitpod.v1.WorkspaceStatus + 62, // 21: gitpod.v1.WorkspaceMetadata.annotations:type_name -> gitpod.v1.WorkspaceMetadata.AnnotationsEntry + 38, // 22: gitpod.v1.WorkspaceSpec.initializer:type_name -> gitpod.v1.WorkspaceInitializer + 2, // 23: gitpod.v1.WorkspaceSpec.type:type_name -> gitpod.v1.WorkspaceSpec.WorkspaceType + 35, // 24: gitpod.v1.WorkspaceSpec.ports:type_name -> gitpod.v1.WorkspacePort + 83, // 25: gitpod.v1.WorkspaceSpec.environment_variables:type_name -> gitpod.v1.EnvironmentVariable + 64, // 26: gitpod.v1.WorkspaceSpec.git:type_name -> gitpod.v1.WorkspaceSpec.GitSpec + 63, // 27: gitpod.v1.WorkspaceSpec.timeout:type_name -> gitpod.v1.WorkspaceSpec.Timeout + 0, // 28: gitpod.v1.WorkspaceSpec.admission:type_name -> gitpod.v1.AdmissionLevel + 82, // 29: gitpod.v1.WorkspaceSpec.last_user_activity:type_name -> google.protobuf.Timestamp + 84, // 30: gitpod.v1.WorkspaceSpec.editor:type_name -> gitpod.v1.EditorReference + 37, // 31: gitpod.v1.WorkspaceStatus.phase:type_name -> gitpod.v1.WorkspacePhase + 65, // 32: gitpod.v1.WorkspaceStatus.conditions:type_name -> gitpod.v1.WorkspaceStatus.WorkspaceConditions + 66, // 33: gitpod.v1.WorkspaceStatus.prebuild_result:type_name -> gitpod.v1.WorkspaceStatus.PrebuildResult + 36, // 34: gitpod.v1.WorkspaceStatus.git_status:type_name -> gitpod.v1.WorkspaceGitStatus + 0, // 35: gitpod.v1.WorkspacePort.admission:type_name -> gitpod.v1.AdmissionLevel + 4, // 36: gitpod.v1.WorkspacePort.protocol:type_name -> gitpod.v1.WorkspacePort.Protocol + 5, // 37: gitpod.v1.WorkspacePhase.name:type_name -> gitpod.v1.WorkspacePhase.Phase + 82, // 38: gitpod.v1.WorkspacePhase.last_transition_time:type_name -> google.protobuf.Timestamp + 67, // 39: gitpod.v1.WorkspaceInitializer.specs:type_name -> gitpod.v1.WorkspaceInitializer.Spec + 6, // 40: gitpod.v1.GitInitializer.target_mode:type_name -> gitpod.v1.GitInitializer.CloneTargetMode + 68, // 41: gitpod.v1.GitInitializer.config:type_name -> gitpod.v1.GitInitializer.GitConfig + 70, // 42: gitpod.v1.FileDownloadInitializer.files:type_name -> gitpod.v1.FileDownloadInitializer.FileInfo + 71, // 43: gitpod.v1.UpdateWorkspaceRequest.metadata:type_name -> gitpod.v1.UpdateWorkspaceRequest.UpdateWorkspaceMetadata + 73, // 44: gitpod.v1.UpdateWorkspaceRequest.spec:type_name -> gitpod.v1.UpdateWorkspaceRequest.UpdateWorkspaceSpec + 36, // 45: gitpod.v1.UpdateWorkspaceRequest.git_status:type_name -> gitpod.v1.WorkspaceGitStatus + 31, // 46: gitpod.v1.UpdateWorkspaceResponse.workspace:type_name -> gitpod.v1.Workspace + 80, // 47: gitpod.v1.ListWorkspaceClassesRequest.pagination:type_name -> gitpod.v1.PaginationRequest + 81, // 48: gitpod.v1.ListWorkspaceClassesResponse.pagination:type_name -> gitpod.v1.PaginationResponse + 54, // 49: gitpod.v1.ListWorkspaceClassesResponse.workspace_classes:type_name -> gitpod.v1.WorkspaceClass + 32, // 50: gitpod.v1.ParseContextURLResponse.metadata:type_name -> gitpod.v1.WorkspaceMetadata + 33, // 51: gitpod.v1.ParseContextURLResponse.spec:type_name -> gitpod.v1.WorkspaceSpec + 59, // 52: gitpod.v1.CreateWorkspaceSnapshotResponse.snapshot:type_name -> gitpod.v1.WorkspaceSnapshot + 82, // 53: gitpod.v1.WorkspaceSnapshot.creation_time:type_name -> google.protobuf.Timestamp + 31, // 54: gitpod.v1.WorkspaceSession.workspace:type_name -> gitpod.v1.Workspace + 82, // 55: gitpod.v1.WorkspaceSession.creation_time:type_name -> google.protobuf.Timestamp + 82, // 56: gitpod.v1.WorkspaceSession.deployed_time:type_name -> google.protobuf.Timestamp + 82, // 57: gitpod.v1.WorkspaceSession.started_time:type_name -> google.protobuf.Timestamp + 82, // 58: gitpod.v1.WorkspaceSession.stopping_time:type_name -> google.protobuf.Timestamp + 82, // 59: gitpod.v1.WorkspaceSession.stopped_time:type_name -> google.protobuf.Timestamp + 76, // 60: gitpod.v1.WorkspaceSession.metrics:type_name -> gitpod.v1.WorkspaceSession.Metrics + 74, // 61: gitpod.v1.WorkspaceSession.owner:type_name -> gitpod.v1.WorkspaceSession.Owner + 75, // 62: gitpod.v1.WorkspaceSession.context:type_name -> gitpod.v1.WorkspaceSession.WorkspaceContext + 84, // 63: gitpod.v1.CreateAndStartWorkspaceRequest.ContextURL.editor:type_name -> gitpod.v1.EditorReference + 85, // 64: gitpod.v1.WorkspaceSpec.Timeout.inactivity:type_name -> google.protobuf.Duration + 85, // 65: gitpod.v1.WorkspaceSpec.Timeout.disconnected:type_name -> google.protobuf.Duration + 85, // 66: gitpod.v1.WorkspaceSpec.Timeout.maximum_lifetime:type_name -> google.protobuf.Duration + 3, // 67: gitpod.v1.WorkspaceStatus.WorkspaceConditions.failed_reason:type_name -> gitpod.v1.WorkspaceStatus.WorkspaceConditions.FailedReason + 39, // 68: gitpod.v1.WorkspaceInitializer.Spec.git:type_name -> gitpod.v1.GitInitializer + 40, // 69: gitpod.v1.WorkspaceInitializer.Spec.snapshot:type_name -> gitpod.v1.SnapshotInitializer + 41, // 70: gitpod.v1.WorkspaceInitializer.Spec.prebuild:type_name -> gitpod.v1.PrebuildInitializer + 42, // 71: gitpod.v1.WorkspaceInitializer.Spec.download:type_name -> gitpod.v1.FileDownloadInitializer + 69, // 72: gitpod.v1.GitInitializer.GitConfig.custom_config:type_name -> gitpod.v1.GitInitializer.GitConfig.CustomConfigEntry + 7, // 73: gitpod.v1.GitInitializer.GitConfig.authentication:type_name -> gitpod.v1.GitInitializer.AuthMethod + 85, // 74: gitpod.v1.UpdateWorkspaceRequest.UpdateTimeout.inactivity:type_name -> google.protobuf.Duration + 85, // 75: gitpod.v1.UpdateWorkspaceRequest.UpdateTimeout.disconnected:type_name -> google.protobuf.Duration + 72, // 76: gitpod.v1.UpdateWorkspaceRequest.UpdateWorkspaceSpec.timeout:type_name -> gitpod.v1.UpdateWorkspaceRequest.UpdateTimeout + 0, // 77: gitpod.v1.UpdateWorkspaceRequest.UpdateWorkspaceSpec.admission:type_name -> gitpod.v1.AdmissionLevel + 8, // 78: gitpod.v1.WorkspaceSession.WorkspaceContext.ref_type:type_name -> gitpod.v1.WorkspaceSession.WorkspaceContext.RefType + 79, // 79: gitpod.v1.WorkspaceSession.WorkspaceContext.repository:type_name -> gitpod.v1.WorkspaceSession.WorkspaceContext.Repository + 78, // 80: gitpod.v1.WorkspaceSession.Metrics.initializer_metrics:type_name -> gitpod.v1.WorkspaceSession.InitializerMetrics + 85, // 81: gitpod.v1.WorkspaceSession.InitializerMetric.duration:type_name -> google.protobuf.Duration + 77, // 82: gitpod.v1.WorkspaceSession.InitializerMetrics.git:type_name -> gitpod.v1.WorkspaceSession.InitializerMetric + 77, // 83: gitpod.v1.WorkspaceSession.InitializerMetrics.file_download:type_name -> gitpod.v1.WorkspaceSession.InitializerMetric + 77, // 84: gitpod.v1.WorkspaceSession.InitializerMetrics.snapshot:type_name -> gitpod.v1.WorkspaceSession.InitializerMetric + 77, // 85: gitpod.v1.WorkspaceSession.InitializerMetrics.backup:type_name -> gitpod.v1.WorkspaceSession.InitializerMetric + 77, // 86: gitpod.v1.WorkspaceSession.InitializerMetrics.prebuild:type_name -> gitpod.v1.WorkspaceSession.InitializerMetric + 77, // 87: gitpod.v1.WorkspaceSession.InitializerMetrics.composite:type_name -> gitpod.v1.WorkspaceSession.InitializerMetric + 11, // 88: gitpod.v1.WorkspaceService.GetWorkspace:input_type -> gitpod.v1.GetWorkspaceRequest + 13, // 89: gitpod.v1.WorkspaceService.WatchWorkspaceStatus:input_type -> gitpod.v1.WatchWorkspaceStatusRequest + 15, // 90: gitpod.v1.WorkspaceService.ListWorkspaces:input_type -> gitpod.v1.ListWorkspacesRequest + 17, // 91: gitpod.v1.WorkspaceService.ListWorkspaceSessions:input_type -> gitpod.v1.ListWorkspaceSessionsRequest + 19, // 92: gitpod.v1.WorkspaceService.CreateAndStartWorkspace:input_type -> gitpod.v1.CreateAndStartWorkspaceRequest + 21, // 93: gitpod.v1.WorkspaceService.StartWorkspace:input_type -> gitpod.v1.StartWorkspaceRequest + 44, // 94: gitpod.v1.WorkspaceService.UpdateWorkspace:input_type -> gitpod.v1.UpdateWorkspaceRequest + 46, // 95: gitpod.v1.WorkspaceService.StopWorkspace:input_type -> gitpod.v1.StopWorkspaceRequest + 48, // 96: gitpod.v1.WorkspaceService.DeleteWorkspace:input_type -> gitpod.v1.DeleteWorkspaceRequest + 50, // 97: gitpod.v1.WorkspaceService.ListWorkspaceClasses:input_type -> gitpod.v1.ListWorkspaceClassesRequest + 52, // 98: gitpod.v1.WorkspaceService.ParseContextURL:input_type -> gitpod.v1.ParseContextURLRequest + 23, // 99: gitpod.v1.WorkspaceService.GetWorkspaceDefaultImage:input_type -> gitpod.v1.GetWorkspaceDefaultImageRequest + 25, // 100: gitpod.v1.WorkspaceService.SendHeartBeat:input_type -> gitpod.v1.SendHeartBeatRequest + 27, // 101: gitpod.v1.WorkspaceService.GetWorkspaceOwnerToken:input_type -> gitpod.v1.GetWorkspaceOwnerTokenRequest + 29, // 102: gitpod.v1.WorkspaceService.GetWorkspaceEditorCredentials:input_type -> gitpod.v1.GetWorkspaceEditorCredentialsRequest + 55, // 103: gitpod.v1.WorkspaceService.CreateWorkspaceSnapshot:input_type -> gitpod.v1.CreateWorkspaceSnapshotRequest + 57, // 104: gitpod.v1.WorkspaceService.WaitForWorkspaceSnapshot:input_type -> gitpod.v1.WaitForWorkspaceSnapshotRequest + 9, // 105: gitpod.v1.WorkspaceService.UpdateWorkspacePort:input_type -> gitpod.v1.UpdateWorkspacePortRequest + 12, // 106: gitpod.v1.WorkspaceService.GetWorkspace:output_type -> gitpod.v1.GetWorkspaceResponse + 14, // 107: gitpod.v1.WorkspaceService.WatchWorkspaceStatus:output_type -> gitpod.v1.WatchWorkspaceStatusResponse + 16, // 108: gitpod.v1.WorkspaceService.ListWorkspaces:output_type -> gitpod.v1.ListWorkspacesResponse + 18, // 109: gitpod.v1.WorkspaceService.ListWorkspaceSessions:output_type -> gitpod.v1.ListWorkspaceSessionsResponse + 20, // 110: gitpod.v1.WorkspaceService.CreateAndStartWorkspace:output_type -> gitpod.v1.CreateAndStartWorkspaceResponse + 22, // 111: gitpod.v1.WorkspaceService.StartWorkspace:output_type -> gitpod.v1.StartWorkspaceResponse + 45, // 112: gitpod.v1.WorkspaceService.UpdateWorkspace:output_type -> gitpod.v1.UpdateWorkspaceResponse + 47, // 113: gitpod.v1.WorkspaceService.StopWorkspace:output_type -> gitpod.v1.StopWorkspaceResponse + 49, // 114: gitpod.v1.WorkspaceService.DeleteWorkspace:output_type -> gitpod.v1.DeleteWorkspaceResponse + 51, // 115: gitpod.v1.WorkspaceService.ListWorkspaceClasses:output_type -> gitpod.v1.ListWorkspaceClassesResponse + 53, // 116: gitpod.v1.WorkspaceService.ParseContextURL:output_type -> gitpod.v1.ParseContextURLResponse + 24, // 117: gitpod.v1.WorkspaceService.GetWorkspaceDefaultImage:output_type -> gitpod.v1.GetWorkspaceDefaultImageResponse + 26, // 118: gitpod.v1.WorkspaceService.SendHeartBeat:output_type -> gitpod.v1.SendHeartBeatResponse + 28, // 119: gitpod.v1.WorkspaceService.GetWorkspaceOwnerToken:output_type -> gitpod.v1.GetWorkspaceOwnerTokenResponse + 30, // 120: gitpod.v1.WorkspaceService.GetWorkspaceEditorCredentials:output_type -> gitpod.v1.GetWorkspaceEditorCredentialsResponse + 56, // 121: gitpod.v1.WorkspaceService.CreateWorkspaceSnapshot:output_type -> gitpod.v1.CreateWorkspaceSnapshotResponse + 58, // 122: gitpod.v1.WorkspaceService.WaitForWorkspaceSnapshot:output_type -> gitpod.v1.WaitForWorkspaceSnapshotResponse + 10, // 123: gitpod.v1.WorkspaceService.UpdateWorkspacePort:output_type -> gitpod.v1.UpdateWorkspacePortResponse + 106, // [106:124] is the sub-list for method output_type + 88, // [88:106] is the sub-list for method input_type + 88, // [88:88] is the sub-list for extension type_name + 88, // [88:88] is the sub-list for extension extendee + 0, // [0:88] is the sub-list for field type_name } func init() { file_gitpod_v1_workspace_proto_init() } @@ -6869,6 +7090,30 @@ func file_gitpod_v1_workspace_proto_init() { } } file_gitpod_v1_workspace_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkspaceSession_InitializerMetric); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gitpod_v1_workspace_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkspaceSession_InitializerMetrics); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gitpod_v1_workspace_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WorkspaceSession_WorkspaceContext_Repository); i { case 0: return &v.state @@ -6902,7 +7147,7 @@ func file_gitpod_v1_workspace_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_gitpod_v1_workspace_proto_rawDesc, NumEnums: 9, - NumMessages: 69, + NumMessages: 71, NumExtensions: 0, NumServices: 1, }, diff --git a/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/WorkspaceOuterClass.java b/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/WorkspaceOuterClass.java index 4a788baedc3820..2c0575a2374620 100644 --- a/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/WorkspaceOuterClass.java +++ b/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/WorkspaceOuterClass.java @@ -62215,6 +62215,33 @@ public interface MetricsOrBuilder extends * @return The totalImageSize. */ long getTotalImageSize(); + + /** + *
+       * initializer_metrics are all metrics exported from the content initializer on workspace start
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetrics initializer_metrics = 3 [json_name = "initializerMetrics"]; + * @return Whether the initializerMetrics field is set. + */ + boolean hasInitializerMetrics(); + /** + *
+       * initializer_metrics are all metrics exported from the content initializer on workspace start
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetrics initializer_metrics = 3 [json_name = "initializerMetrics"]; + * @return The initializerMetrics. + */ + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics getInitializerMetrics(); + /** + *
+       * initializer_metrics are all metrics exported from the content initializer on workspace start
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetrics initializer_metrics = 3 [json_name = "initializerMetrics"]; + */ + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricsOrBuilder getInitializerMetricsOrBuilder(); } /** * Protobuf type {@code gitpod.v1.WorkspaceSession.Metrics} @@ -62253,6 +62280,7 @@ private Metrics() { io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.Metrics.class, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.Metrics.Builder.class); } + private int bitField0_; public static final int WORKSPACE_IMAGE_SIZE_FIELD_NUMBER = 1; private long workspaceImageSize_ = 0L; /** @@ -62283,6 +62311,44 @@ public long getTotalImageSize() { return totalImageSize_; } + public static final int INITIALIZER_METRICS_FIELD_NUMBER = 3; + private io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics initializerMetrics_; + /** + *
+       * initializer_metrics are all metrics exported from the content initializer on workspace start
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetrics initializer_metrics = 3 [json_name = "initializerMetrics"]; + * @return Whether the initializerMetrics field is set. + */ + @java.lang.Override + public boolean hasInitializerMetrics() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
+       * initializer_metrics are all metrics exported from the content initializer on workspace start
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetrics initializer_metrics = 3 [json_name = "initializerMetrics"]; + * @return The initializerMetrics. + */ + @java.lang.Override + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics getInitializerMetrics() { + return initializerMetrics_ == null ? io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics.getDefaultInstance() : initializerMetrics_; + } + /** + *
+       * initializer_metrics are all metrics exported from the content initializer on workspace start
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetrics initializer_metrics = 3 [json_name = "initializerMetrics"]; + */ + @java.lang.Override + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricsOrBuilder getInitializerMetricsOrBuilder() { + return initializerMetrics_ == null ? io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics.getDefaultInstance() : initializerMetrics_; + } + private byte memoizedIsInitialized = -1; @java.lang.Override public final boolean isInitialized() { @@ -62303,6 +62369,9 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) if (totalImageSize_ != 0L) { output.writeInt64(2, totalImageSize_); } + if (((bitField0_ & 0x00000001) != 0)) { + output.writeMessage(3, getInitializerMetrics()); + } getUnknownFields().writeTo(output); } @@ -62320,6 +62389,10 @@ public int getSerializedSize() { size += com.google.protobuf.CodedOutputStream .computeInt64Size(2, totalImageSize_); } + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, getInitializerMetrics()); + } size += getUnknownFields().getSerializedSize(); memoizedSize = size; return size; @@ -62339,6 +62412,11 @@ public boolean equals(final java.lang.Object obj) { != other.getWorkspaceImageSize()) return false; if (getTotalImageSize() != other.getTotalImageSize()) return false; + if (hasInitializerMetrics() != other.hasInitializerMetrics()) return false; + if (hasInitializerMetrics()) { + if (!getInitializerMetrics() + .equals(other.getInitializerMetrics())) return false; + } if (!getUnknownFields().equals(other.getUnknownFields())) return false; return true; } @@ -62356,6 +62434,10 @@ public int hashCode() { hash = (37 * hash) + TOTAL_IMAGE_SIZE_FIELD_NUMBER; hash = (53 * hash) + com.google.protobuf.Internal.hashLong( getTotalImageSize()); + if (hasInitializerMetrics()) { + hash = (37 * hash) + INITIALIZER_METRICS_FIELD_NUMBER; + hash = (53 * hash) + getInitializerMetrics().hashCode(); + } hash = (29 * hash) + getUnknownFields().hashCode(); memoizedHashCode = hash; return hash; @@ -62475,13 +62557,19 @@ public static final class Builder extends // Construct using io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.Metrics.newBuilder() private Builder() { - + maybeForceBuilderInitialization(); } private Builder( com.google.protobuf.GeneratedMessage.BuilderParent parent) { super(parent); - + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage + .alwaysUseFieldBuilders) { + getInitializerMetricsFieldBuilder(); + } } @java.lang.Override public Builder clear() { @@ -62489,6 +62577,11 @@ public Builder clear() { bitField0_ = 0; workspaceImageSize_ = 0L; totalImageSize_ = 0L; + initializerMetrics_ = null; + if (initializerMetricsBuilder_ != null) { + initializerMetricsBuilder_.dispose(); + initializerMetricsBuilder_ = null; + } return this; } @@ -62525,187 +62618,3173 @@ private void buildPartial0(io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceS if (((from_bitField0_ & 0x00000001) != 0)) { result.workspaceImageSize_ = workspaceImageSize_; } - if (((from_bitField0_ & 0x00000002) != 0)) { - result.totalImageSize_ = totalImageSize_; + if (((from_bitField0_ & 0x00000002) != 0)) { + result.totalImageSize_ = totalImageSize_; + } + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000004) != 0)) { + result.initializerMetrics_ = initializerMetricsBuilder_ == null + ? initializerMetrics_ + : initializerMetricsBuilder_.build(); + to_bitField0_ |= 0x00000001; + } + result.bitField0_ |= to_bitField0_; + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.Metrics) { + return mergeFrom((io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.Metrics)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.Metrics other) { + if (other == io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.Metrics.getDefaultInstance()) return this; + if (other.getWorkspaceImageSize() != 0L) { + setWorkspaceImageSize(other.getWorkspaceImageSize()); + } + if (other.getTotalImageSize() != 0L) { + setTotalImageSize(other.getTotalImageSize()); + } + if (other.hasInitializerMetrics()) { + mergeInitializerMetrics(other.getInitializerMetrics()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + workspaceImageSize_ = input.readInt64(); + bitField0_ |= 0x00000001; + break; + } // case 8 + case 16: { + totalImageSize_ = input.readInt64(); + bitField0_ |= 0x00000002; + break; + } // case 16 + case 26: { + input.readMessage( + getInitializerMetricsFieldBuilder().getBuilder(), + extensionRegistry); + bitField0_ |= 0x00000004; + break; + } // case 26 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + private int bitField0_; + + private long workspaceImageSize_ ; + /** + *
+         * workspace_image_size is the size of the workspace image in bytes
+         * 
+ * + * int64 workspace_image_size = 1 [json_name = "workspaceImageSize"]; + * @return The workspaceImageSize. + */ + @java.lang.Override + public long getWorkspaceImageSize() { + return workspaceImageSize_; + } + /** + *
+         * workspace_image_size is the size of the workspace image in bytes
+         * 
+ * + * int64 workspace_image_size = 1 [json_name = "workspaceImageSize"]; + * @param value The workspaceImageSize to set. + * @return This builder for chaining. + */ + public Builder setWorkspaceImageSize(long value) { + + workspaceImageSize_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + *
+         * workspace_image_size is the size of the workspace image in bytes
+         * 
+ * + * int64 workspace_image_size = 1 [json_name = "workspaceImageSize"]; + * @return This builder for chaining. + */ + public Builder clearWorkspaceImageSize() { + bitField0_ = (bitField0_ & ~0x00000001); + workspaceImageSize_ = 0L; + onChanged(); + return this; + } + + private long totalImageSize_ ; + /** + *
+         * total_image_size is the total size of the image in bytes (includes Gitpod-specific layers like IDE)
+         * 
+ * + * int64 total_image_size = 2 [json_name = "totalImageSize"]; + * @return The totalImageSize. + */ + @java.lang.Override + public long getTotalImageSize() { + return totalImageSize_; + } + /** + *
+         * total_image_size is the total size of the image in bytes (includes Gitpod-specific layers like IDE)
+         * 
+ * + * int64 total_image_size = 2 [json_name = "totalImageSize"]; + * @param value The totalImageSize to set. + * @return This builder for chaining. + */ + public Builder setTotalImageSize(long value) { + + totalImageSize_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + *
+         * total_image_size is the total size of the image in bytes (includes Gitpod-specific layers like IDE)
+         * 
+ * + * int64 total_image_size = 2 [json_name = "totalImageSize"]; + * @return This builder for chaining. + */ + public Builder clearTotalImageSize() { + bitField0_ = (bitField0_ & ~0x00000002); + totalImageSize_ = 0L; + onChanged(); + return this; + } + + private io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics initializerMetrics_; + private com.google.protobuf.SingleFieldBuilder< + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics.Builder, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricsOrBuilder> initializerMetricsBuilder_; + /** + *
+         * initializer_metrics are all metrics exported from the content initializer on workspace start
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetrics initializer_metrics = 3 [json_name = "initializerMetrics"]; + * @return Whether the initializerMetrics field is set. + */ + public boolean hasInitializerMetrics() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
+         * initializer_metrics are all metrics exported from the content initializer on workspace start
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetrics initializer_metrics = 3 [json_name = "initializerMetrics"]; + * @return The initializerMetrics. + */ + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics getInitializerMetrics() { + if (initializerMetricsBuilder_ == null) { + return initializerMetrics_ == null ? io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics.getDefaultInstance() : initializerMetrics_; + } else { + return initializerMetricsBuilder_.getMessage(); + } + } + /** + *
+         * initializer_metrics are all metrics exported from the content initializer on workspace start
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetrics initializer_metrics = 3 [json_name = "initializerMetrics"]; + */ + public Builder setInitializerMetrics(io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics value) { + if (initializerMetricsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + initializerMetrics_ = value; + } else { + initializerMetricsBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + /** + *
+         * initializer_metrics are all metrics exported from the content initializer on workspace start
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetrics initializer_metrics = 3 [json_name = "initializerMetrics"]; + */ + public Builder setInitializerMetrics( + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics.Builder builderForValue) { + if (initializerMetricsBuilder_ == null) { + initializerMetrics_ = builderForValue.build(); + } else { + initializerMetricsBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + /** + *
+         * initializer_metrics are all metrics exported from the content initializer on workspace start
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetrics initializer_metrics = 3 [json_name = "initializerMetrics"]; + */ + public Builder mergeInitializerMetrics(io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics value) { + if (initializerMetricsBuilder_ == null) { + if (((bitField0_ & 0x00000004) != 0) && + initializerMetrics_ != null && + initializerMetrics_ != io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics.getDefaultInstance()) { + getInitializerMetricsBuilder().mergeFrom(value); + } else { + initializerMetrics_ = value; + } + } else { + initializerMetricsBuilder_.mergeFrom(value); + } + if (initializerMetrics_ != null) { + bitField0_ |= 0x00000004; + onChanged(); + } + return this; + } + /** + *
+         * initializer_metrics are all metrics exported from the content initializer on workspace start
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetrics initializer_metrics = 3 [json_name = "initializerMetrics"]; + */ + public Builder clearInitializerMetrics() { + bitField0_ = (bitField0_ & ~0x00000004); + initializerMetrics_ = null; + if (initializerMetricsBuilder_ != null) { + initializerMetricsBuilder_.dispose(); + initializerMetricsBuilder_ = null; + } + onChanged(); + return this; + } + /** + *
+         * initializer_metrics are all metrics exported from the content initializer on workspace start
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetrics initializer_metrics = 3 [json_name = "initializerMetrics"]; + */ + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics.Builder getInitializerMetricsBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getInitializerMetricsFieldBuilder().getBuilder(); + } + /** + *
+         * initializer_metrics are all metrics exported from the content initializer on workspace start
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetrics initializer_metrics = 3 [json_name = "initializerMetrics"]; + */ + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricsOrBuilder getInitializerMetricsOrBuilder() { + if (initializerMetricsBuilder_ != null) { + return initializerMetricsBuilder_.getMessageOrBuilder(); + } else { + return initializerMetrics_ == null ? + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics.getDefaultInstance() : initializerMetrics_; + } + } + /** + *
+         * initializer_metrics are all metrics exported from the content initializer on workspace start
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetrics initializer_metrics = 3 [json_name = "initializerMetrics"]; + */ + private com.google.protobuf.SingleFieldBuilder< + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics.Builder, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricsOrBuilder> + getInitializerMetricsFieldBuilder() { + if (initializerMetricsBuilder_ == null) { + initializerMetricsBuilder_ = new com.google.protobuf.SingleFieldBuilder< + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics.Builder, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricsOrBuilder>( + getInitializerMetrics(), + getParentForChildren(), + isClean()); + initializerMetrics_ = null; + } + return initializerMetricsBuilder_; + } + + // @@protoc_insertion_point(builder_scope:gitpod.v1.WorkspaceSession.Metrics) + } + + // @@protoc_insertion_point(class_scope:gitpod.v1.WorkspaceSession.Metrics) + private static final io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.Metrics DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.Metrics(); + } + + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.Metrics getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Metrics parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.Metrics getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface InitializerMetricOrBuilder extends + // @@protoc_insertion_point(interface_extends:gitpod.v1.WorkspaceSession.InitializerMetric) + com.google.protobuf.MessageOrBuilder { + + /** + *
+       * duration in seconds
+       * 
+ * + * .google.protobuf.Duration duration = 1 [json_name = "duration"]; + * @return Whether the duration field is set. + */ + boolean hasDuration(); + /** + *
+       * duration in seconds
+       * 
+ * + * .google.protobuf.Duration duration = 1 [json_name = "duration"]; + * @return The duration. + */ + com.google.protobuf.Duration getDuration(); + /** + *
+       * duration in seconds
+       * 
+ * + * .google.protobuf.Duration duration = 1 [json_name = "duration"]; + */ + com.google.protobuf.DurationOrBuilder getDurationOrBuilder(); + + /** + *
+       * size in bytes
+       * 
+ * + * uint64 size = 2 [json_name = "size"]; + * @return The size. + */ + long getSize(); + } + /** + *
+     * Add these new message definitions
+     * 
+ * + * Protobuf type {@code gitpod.v1.WorkspaceSession.InitializerMetric} + */ + public static final class InitializerMetric extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:gitpod.v1.WorkspaceSession.InitializerMetric) + InitializerMetricOrBuilder { + private static final long serialVersionUID = 0L; + static { + com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion( + com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC, + /* major= */ 4, + /* minor= */ 27, + /* patch= */ 2, + /* suffix= */ "", + InitializerMetric.class.getName()); + } + // Use InitializerMetric.newBuilder() to construct. + private InitializerMetric(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + } + private InitializerMetric() { + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.gitpod.publicapi.v1.WorkspaceOuterClass.internal_static_gitpod_v1_WorkspaceSession_InitializerMetric_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.gitpod.publicapi.v1.WorkspaceOuterClass.internal_static_gitpod_v1_WorkspaceSession_InitializerMetric_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.class, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder.class); + } + + private int bitField0_; + public static final int DURATION_FIELD_NUMBER = 1; + private com.google.protobuf.Duration duration_; + /** + *
+       * duration in seconds
+       * 
+ * + * .google.protobuf.Duration duration = 1 [json_name = "duration"]; + * @return Whether the duration field is set. + */ + @java.lang.Override + public boolean hasDuration() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
+       * duration in seconds
+       * 
+ * + * .google.protobuf.Duration duration = 1 [json_name = "duration"]; + * @return The duration. + */ + @java.lang.Override + public com.google.protobuf.Duration getDuration() { + return duration_ == null ? com.google.protobuf.Duration.getDefaultInstance() : duration_; + } + /** + *
+       * duration in seconds
+       * 
+ * + * .google.protobuf.Duration duration = 1 [json_name = "duration"]; + */ + @java.lang.Override + public com.google.protobuf.DurationOrBuilder getDurationOrBuilder() { + return duration_ == null ? com.google.protobuf.Duration.getDefaultInstance() : duration_; + } + + public static final int SIZE_FIELD_NUMBER = 2; + private long size_ = 0L; + /** + *
+       * size in bytes
+       * 
+ * + * uint64 size = 2 [json_name = "size"]; + * @return The size. + */ + @java.lang.Override + public long getSize() { + return size_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeMessage(1, getDuration()); + } + if (size_ != 0L) { + output.writeUInt64(2, size_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, getDuration()); + } + if (size_ != 0L) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(2, size_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric)) { + return super.equals(obj); + } + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric other = (io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric) obj; + + if (hasDuration() != other.hasDuration()) return false; + if (hasDuration()) { + if (!getDuration() + .equals(other.getDuration())) return false; + } + if (getSize() + != other.getSize()) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasDuration()) { + hash = (37 * hash) + DURATION_FIELD_NUMBER; + hash = (53 * hash) + getDuration().hashCode(); + } + hash = (37 * hash) + SIZE_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getSize()); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input); + } + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseDelimitedWithIOException(PARSER, input); + } + + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input); + } + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
+       * Add these new message definitions
+       * 
+ * + * Protobuf type {@code gitpod.v1.WorkspaceSession.InitializerMetric} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:gitpod.v1.WorkspaceSession.InitializerMetric) + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.gitpod.publicapi.v1.WorkspaceOuterClass.internal_static_gitpod_v1_WorkspaceSession_InitializerMetric_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.gitpod.publicapi.v1.WorkspaceOuterClass.internal_static_gitpod_v1_WorkspaceSession_InitializerMetric_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.class, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder.class); + } + + // Construct using io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage + .alwaysUseFieldBuilders) { + getDurationFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + duration_ = null; + if (durationBuilder_ != null) { + durationBuilder_.dispose(); + durationBuilder_ = null; + } + size_ = 0L; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.gitpod.publicapi.v1.WorkspaceOuterClass.internal_static_gitpod_v1_WorkspaceSession_InitializerMetric_descriptor; + } + + @java.lang.Override + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric getDefaultInstanceForType() { + return io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance(); + } + + @java.lang.Override + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric build() { + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric buildPartial() { + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric result = new io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric(this); + if (bitField0_ != 0) { buildPartial0(result); } + onBuilt(); + return result; + } + + private void buildPartial0(io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric result) { + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.duration_ = durationBuilder_ == null + ? duration_ + : durationBuilder_.build(); + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.size_ = size_; + } + result.bitField0_ |= to_bitField0_; + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric) { + return mergeFrom((io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric other) { + if (other == io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance()) return this; + if (other.hasDuration()) { + mergeDuration(other.getDuration()); + } + if (other.getSize() != 0L) { + setSize(other.getSize()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + input.readMessage( + getDurationFieldBuilder().getBuilder(), + extensionRegistry); + bitField0_ |= 0x00000001; + break; + } // case 10 + case 16: { + size_ = input.readUInt64(); + bitField0_ |= 0x00000002; + break; + } // case 16 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + private int bitField0_; + + private com.google.protobuf.Duration duration_; + private com.google.protobuf.SingleFieldBuilder< + com.google.protobuf.Duration, com.google.protobuf.Duration.Builder, com.google.protobuf.DurationOrBuilder> durationBuilder_; + /** + *
+         * duration in seconds
+         * 
+ * + * .google.protobuf.Duration duration = 1 [json_name = "duration"]; + * @return Whether the duration field is set. + */ + public boolean hasDuration() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
+         * duration in seconds
+         * 
+ * + * .google.protobuf.Duration duration = 1 [json_name = "duration"]; + * @return The duration. + */ + public com.google.protobuf.Duration getDuration() { + if (durationBuilder_ == null) { + return duration_ == null ? com.google.protobuf.Duration.getDefaultInstance() : duration_; + } else { + return durationBuilder_.getMessage(); + } + } + /** + *
+         * duration in seconds
+         * 
+ * + * .google.protobuf.Duration duration = 1 [json_name = "duration"]; + */ + public Builder setDuration(com.google.protobuf.Duration value) { + if (durationBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + duration_ = value; + } else { + durationBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + *
+         * duration in seconds
+         * 
+ * + * .google.protobuf.Duration duration = 1 [json_name = "duration"]; + */ + public Builder setDuration( + com.google.protobuf.Duration.Builder builderForValue) { + if (durationBuilder_ == null) { + duration_ = builderForValue.build(); + } else { + durationBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + *
+         * duration in seconds
+         * 
+ * + * .google.protobuf.Duration duration = 1 [json_name = "duration"]; + */ + public Builder mergeDuration(com.google.protobuf.Duration value) { + if (durationBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0) && + duration_ != null && + duration_ != com.google.protobuf.Duration.getDefaultInstance()) { + getDurationBuilder().mergeFrom(value); + } else { + duration_ = value; + } + } else { + durationBuilder_.mergeFrom(value); + } + if (duration_ != null) { + bitField0_ |= 0x00000001; + onChanged(); + } + return this; + } + /** + *
+         * duration in seconds
+         * 
+ * + * .google.protobuf.Duration duration = 1 [json_name = "duration"]; + */ + public Builder clearDuration() { + bitField0_ = (bitField0_ & ~0x00000001); + duration_ = null; + if (durationBuilder_ != null) { + durationBuilder_.dispose(); + durationBuilder_ = null; + } + onChanged(); + return this; + } + /** + *
+         * duration in seconds
+         * 
+ * + * .google.protobuf.Duration duration = 1 [json_name = "duration"]; + */ + public com.google.protobuf.Duration.Builder getDurationBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getDurationFieldBuilder().getBuilder(); + } + /** + *
+         * duration in seconds
+         * 
+ * + * .google.protobuf.Duration duration = 1 [json_name = "duration"]; + */ + public com.google.protobuf.DurationOrBuilder getDurationOrBuilder() { + if (durationBuilder_ != null) { + return durationBuilder_.getMessageOrBuilder(); + } else { + return duration_ == null ? + com.google.protobuf.Duration.getDefaultInstance() : duration_; + } + } + /** + *
+         * duration in seconds
+         * 
+ * + * .google.protobuf.Duration duration = 1 [json_name = "duration"]; + */ + private com.google.protobuf.SingleFieldBuilder< + com.google.protobuf.Duration, com.google.protobuf.Duration.Builder, com.google.protobuf.DurationOrBuilder> + getDurationFieldBuilder() { + if (durationBuilder_ == null) { + durationBuilder_ = new com.google.protobuf.SingleFieldBuilder< + com.google.protobuf.Duration, com.google.protobuf.Duration.Builder, com.google.protobuf.DurationOrBuilder>( + getDuration(), + getParentForChildren(), + isClean()); + duration_ = null; + } + return durationBuilder_; + } + + private long size_ ; + /** + *
+         * size in bytes
+         * 
+ * + * uint64 size = 2 [json_name = "size"]; + * @return The size. + */ + @java.lang.Override + public long getSize() { + return size_; + } + /** + *
+         * size in bytes
+         * 
+ * + * uint64 size = 2 [json_name = "size"]; + * @param value The size to set. + * @return This builder for chaining. + */ + public Builder setSize(long value) { + + size_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + *
+         * size in bytes
+         * 
+ * + * uint64 size = 2 [json_name = "size"]; + * @return This builder for chaining. + */ + public Builder clearSize() { + bitField0_ = (bitField0_ & ~0x00000002); + size_ = 0L; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:gitpod.v1.WorkspaceSession.InitializerMetric) + } + + // @@protoc_insertion_point(class_scope:gitpod.v1.WorkspaceSession.InitializerMetric) + private static final io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric(); + } + + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public InitializerMetric parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface InitializerMetricsOrBuilder extends + // @@protoc_insertion_point(interface_extends:gitpod.v1.WorkspaceSession.InitializerMetrics) + com.google.protobuf.MessageOrBuilder { + + /** + *
+       * git contains metrics for the git initializer step
+       * This is set whenever a `git clone` is issued (mostly on first workspace start)
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric git = 1 [json_name = "git"]; + * @return Whether the git field is set. + */ + boolean hasGit(); + /** + *
+       * git contains metrics for the git initializer step
+       * This is set whenever a `git clone` is issued (mostly on first workspace start)
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric git = 1 [json_name = "git"]; + * @return The git. + */ + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric getGit(); + /** + *
+       * git contains metrics for the git initializer step
+       * This is set whenever a `git clone` is issued (mostly on first workspace start)
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric git = 1 [json_name = "git"]; + */ + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder getGitOrBuilder(); + + /** + *
+       * file_download contains metrics for the file download initializer step
+       * This is set for injecting "additionalFiles" into the workspace.
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric file_download = 2 [json_name = "fileDownload"]; + * @return Whether the fileDownload field is set. + */ + boolean hasFileDownload(); + /** + *
+       * file_download contains metrics for the file download initializer step
+       * This is set for injecting "additionalFiles" into the workspace.
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric file_download = 2 [json_name = "fileDownload"]; + * @return The fileDownload. + */ + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric getFileDownload(); + /** + *
+       * file_download contains metrics for the file download initializer step
+       * This is set for injecting "additionalFiles" into the workspace.
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric file_download = 2 [json_name = "fileDownload"]; + */ + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder getFileDownloadOrBuilder(); + + /** + *
+       * snapshot contains metrics for the snapshot initializer step
+       * This used for workspaces started from snapshots.
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric snapshot = 3 [json_name = "snapshot"]; + * @return Whether the snapshot field is set. + */ + boolean hasSnapshot(); + /** + *
+       * snapshot contains metrics for the snapshot initializer step
+       * This used for workspaces started from snapshots.
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric snapshot = 3 [json_name = "snapshot"]; + * @return The snapshot. + */ + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric getSnapshot(); + /** + *
+       * snapshot contains metrics for the snapshot initializer step
+       * This used for workspaces started from snapshots.
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric snapshot = 3 [json_name = "snapshot"]; + */ + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder getSnapshotOrBuilder(); + + /** + *
+       * backup contains metrics for the backup initializer step
+       * This is set on subsequent workspace starts, when the file system is restored from backup.
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric backup = 4 [json_name = "backup"]; + * @return Whether the backup field is set. + */ + boolean hasBackup(); + /** + *
+       * backup contains metrics for the backup initializer step
+       * This is set on subsequent workspace starts, when the file system is restored from backup.
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric backup = 4 [json_name = "backup"]; + * @return The backup. + */ + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric getBackup(); + /** + *
+       * backup contains metrics for the backup initializer step
+       * This is set on subsequent workspace starts, when the file system is restored from backup.
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric backup = 4 [json_name = "backup"]; + */ + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder getBackupOrBuilder(); + + /** + *
+       * prebuild contains metrics for the prebuild initializer step
+       * This is set if the workspace is based on a prebuild.
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric prebuild = 5 [json_name = "prebuild"]; + * @return Whether the prebuild field is set. + */ + boolean hasPrebuild(); + /** + *
+       * prebuild contains metrics for the prebuild initializer step
+       * This is set if the workspace is based on a prebuild.
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric prebuild = 5 [json_name = "prebuild"]; + * @return The prebuild. + */ + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric getPrebuild(); + /** + *
+       * prebuild contains metrics for the prebuild initializer step
+       * This is set if the workspace is based on a prebuild.
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric prebuild = 5 [json_name = "prebuild"]; + */ + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder getPrebuildOrBuilder(); + + /** + *
+       * composite contains metrics for the composite initializer step
+       * This reports the total if multiple steps are run to initialize the workspace content.
+       * Examples are:
+       * - "additionalFiles" injected into the workspace
+       * - "additionalRepositories" configured
+       * - incremental Prebuilds
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric composite = 6 [json_name = "composite"]; + * @return Whether the composite field is set. + */ + boolean hasComposite(); + /** + *
+       * composite contains metrics for the composite initializer step
+       * This reports the total if multiple steps are run to initialize the workspace content.
+       * Examples are:
+       * - "additionalFiles" injected into the workspace
+       * - "additionalRepositories" configured
+       * - incremental Prebuilds
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric composite = 6 [json_name = "composite"]; + * @return The composite. + */ + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric getComposite(); + /** + *
+       * composite contains metrics for the composite initializer step
+       * This reports the total if multiple steps are run to initialize the workspace content.
+       * Examples are:
+       * - "additionalFiles" injected into the workspace
+       * - "additionalRepositories" configured
+       * - incremental Prebuilds
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric composite = 6 [json_name = "composite"]; + */ + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder getCompositeOrBuilder(); + } + /** + * Protobuf type {@code gitpod.v1.WorkspaceSession.InitializerMetrics} + */ + public static final class InitializerMetrics extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:gitpod.v1.WorkspaceSession.InitializerMetrics) + InitializerMetricsOrBuilder { + private static final long serialVersionUID = 0L; + static { + com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion( + com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC, + /* major= */ 4, + /* minor= */ 27, + /* patch= */ 2, + /* suffix= */ "", + InitializerMetrics.class.getName()); + } + // Use InitializerMetrics.newBuilder() to construct. + private InitializerMetrics(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + } + private InitializerMetrics() { + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.gitpod.publicapi.v1.WorkspaceOuterClass.internal_static_gitpod_v1_WorkspaceSession_InitializerMetrics_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.gitpod.publicapi.v1.WorkspaceOuterClass.internal_static_gitpod_v1_WorkspaceSession_InitializerMetrics_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics.class, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics.Builder.class); + } + + private int bitField0_; + public static final int GIT_FIELD_NUMBER = 1; + private io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric git_; + /** + *
+       * git contains metrics for the git initializer step
+       * This is set whenever a `git clone` is issued (mostly on first workspace start)
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric git = 1 [json_name = "git"]; + * @return Whether the git field is set. + */ + @java.lang.Override + public boolean hasGit() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
+       * git contains metrics for the git initializer step
+       * This is set whenever a `git clone` is issued (mostly on first workspace start)
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric git = 1 [json_name = "git"]; + * @return The git. + */ + @java.lang.Override + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric getGit() { + return git_ == null ? io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance() : git_; + } + /** + *
+       * git contains metrics for the git initializer step
+       * This is set whenever a `git clone` is issued (mostly on first workspace start)
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric git = 1 [json_name = "git"]; + */ + @java.lang.Override + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder getGitOrBuilder() { + return git_ == null ? io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance() : git_; + } + + public static final int FILE_DOWNLOAD_FIELD_NUMBER = 2; + private io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric fileDownload_; + /** + *
+       * file_download contains metrics for the file download initializer step
+       * This is set for injecting "additionalFiles" into the workspace.
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric file_download = 2 [json_name = "fileDownload"]; + * @return Whether the fileDownload field is set. + */ + @java.lang.Override + public boolean hasFileDownload() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
+       * file_download contains metrics for the file download initializer step
+       * This is set for injecting "additionalFiles" into the workspace.
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric file_download = 2 [json_name = "fileDownload"]; + * @return The fileDownload. + */ + @java.lang.Override + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric getFileDownload() { + return fileDownload_ == null ? io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance() : fileDownload_; + } + /** + *
+       * file_download contains metrics for the file download initializer step
+       * This is set for injecting "additionalFiles" into the workspace.
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric file_download = 2 [json_name = "fileDownload"]; + */ + @java.lang.Override + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder getFileDownloadOrBuilder() { + return fileDownload_ == null ? io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance() : fileDownload_; + } + + public static final int SNAPSHOT_FIELD_NUMBER = 3; + private io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric snapshot_; + /** + *
+       * snapshot contains metrics for the snapshot initializer step
+       * This used for workspaces started from snapshots.
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric snapshot = 3 [json_name = "snapshot"]; + * @return Whether the snapshot field is set. + */ + @java.lang.Override + public boolean hasSnapshot() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
+       * snapshot contains metrics for the snapshot initializer step
+       * This used for workspaces started from snapshots.
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric snapshot = 3 [json_name = "snapshot"]; + * @return The snapshot. + */ + @java.lang.Override + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric getSnapshot() { + return snapshot_ == null ? io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance() : snapshot_; + } + /** + *
+       * snapshot contains metrics for the snapshot initializer step
+       * This used for workspaces started from snapshots.
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric snapshot = 3 [json_name = "snapshot"]; + */ + @java.lang.Override + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder getSnapshotOrBuilder() { + return snapshot_ == null ? io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance() : snapshot_; + } + + public static final int BACKUP_FIELD_NUMBER = 4; + private io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric backup_; + /** + *
+       * backup contains metrics for the backup initializer step
+       * This is set on subsequent workspace starts, when the file system is restored from backup.
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric backup = 4 [json_name = "backup"]; + * @return Whether the backup field is set. + */ + @java.lang.Override + public boolean hasBackup() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + *
+       * backup contains metrics for the backup initializer step
+       * This is set on subsequent workspace starts, when the file system is restored from backup.
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric backup = 4 [json_name = "backup"]; + * @return The backup. + */ + @java.lang.Override + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric getBackup() { + return backup_ == null ? io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance() : backup_; + } + /** + *
+       * backup contains metrics for the backup initializer step
+       * This is set on subsequent workspace starts, when the file system is restored from backup.
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric backup = 4 [json_name = "backup"]; + */ + @java.lang.Override + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder getBackupOrBuilder() { + return backup_ == null ? io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance() : backup_; + } + + public static final int PREBUILD_FIELD_NUMBER = 5; + private io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric prebuild_; + /** + *
+       * prebuild contains metrics for the prebuild initializer step
+       * This is set if the workspace is based on a prebuild.
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric prebuild = 5 [json_name = "prebuild"]; + * @return Whether the prebuild field is set. + */ + @java.lang.Override + public boolean hasPrebuild() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + *
+       * prebuild contains metrics for the prebuild initializer step
+       * This is set if the workspace is based on a prebuild.
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric prebuild = 5 [json_name = "prebuild"]; + * @return The prebuild. + */ + @java.lang.Override + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric getPrebuild() { + return prebuild_ == null ? io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance() : prebuild_; + } + /** + *
+       * prebuild contains metrics for the prebuild initializer step
+       * This is set if the workspace is based on a prebuild.
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric prebuild = 5 [json_name = "prebuild"]; + */ + @java.lang.Override + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder getPrebuildOrBuilder() { + return prebuild_ == null ? io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance() : prebuild_; + } + + public static final int COMPOSITE_FIELD_NUMBER = 6; + private io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric composite_; + /** + *
+       * composite contains metrics for the composite initializer step
+       * This reports the total if multiple steps are run to initialize the workspace content.
+       * Examples are:
+       * - "additionalFiles" injected into the workspace
+       * - "additionalRepositories" configured
+       * - incremental Prebuilds
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric composite = 6 [json_name = "composite"]; + * @return Whether the composite field is set. + */ + @java.lang.Override + public boolean hasComposite() { + return ((bitField0_ & 0x00000020) != 0); + } + /** + *
+       * composite contains metrics for the composite initializer step
+       * This reports the total if multiple steps are run to initialize the workspace content.
+       * Examples are:
+       * - "additionalFiles" injected into the workspace
+       * - "additionalRepositories" configured
+       * - incremental Prebuilds
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric composite = 6 [json_name = "composite"]; + * @return The composite. + */ + @java.lang.Override + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric getComposite() { + return composite_ == null ? io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance() : composite_; + } + /** + *
+       * composite contains metrics for the composite initializer step
+       * This reports the total if multiple steps are run to initialize the workspace content.
+       * Examples are:
+       * - "additionalFiles" injected into the workspace
+       * - "additionalRepositories" configured
+       * - incremental Prebuilds
+       * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric composite = 6 [json_name = "composite"]; + */ + @java.lang.Override + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder getCompositeOrBuilder() { + return composite_ == null ? io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance() : composite_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeMessage(1, getGit()); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeMessage(2, getFileDownload()); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeMessage(3, getSnapshot()); + } + if (((bitField0_ & 0x00000008) != 0)) { + output.writeMessage(4, getBackup()); + } + if (((bitField0_ & 0x00000010) != 0)) { + output.writeMessage(5, getPrebuild()); + } + if (((bitField0_ & 0x00000020) != 0)) { + output.writeMessage(6, getComposite()); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, getGit()); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, getFileDownload()); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, getSnapshot()); + } + if (((bitField0_ & 0x00000008) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, getBackup()); + } + if (((bitField0_ & 0x00000010) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(5, getPrebuild()); + } + if (((bitField0_ & 0x00000020) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(6, getComposite()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics)) { + return super.equals(obj); + } + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics other = (io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics) obj; + + if (hasGit() != other.hasGit()) return false; + if (hasGit()) { + if (!getGit() + .equals(other.getGit())) return false; + } + if (hasFileDownload() != other.hasFileDownload()) return false; + if (hasFileDownload()) { + if (!getFileDownload() + .equals(other.getFileDownload())) return false; + } + if (hasSnapshot() != other.hasSnapshot()) return false; + if (hasSnapshot()) { + if (!getSnapshot() + .equals(other.getSnapshot())) return false; + } + if (hasBackup() != other.hasBackup()) return false; + if (hasBackup()) { + if (!getBackup() + .equals(other.getBackup())) return false; + } + if (hasPrebuild() != other.hasPrebuild()) return false; + if (hasPrebuild()) { + if (!getPrebuild() + .equals(other.getPrebuild())) return false; + } + if (hasComposite() != other.hasComposite()) return false; + if (hasComposite()) { + if (!getComposite() + .equals(other.getComposite())) return false; + } + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasGit()) { + hash = (37 * hash) + GIT_FIELD_NUMBER; + hash = (53 * hash) + getGit().hashCode(); + } + if (hasFileDownload()) { + hash = (37 * hash) + FILE_DOWNLOAD_FIELD_NUMBER; + hash = (53 * hash) + getFileDownload().hashCode(); + } + if (hasSnapshot()) { + hash = (37 * hash) + SNAPSHOT_FIELD_NUMBER; + hash = (53 * hash) + getSnapshot().hashCode(); + } + if (hasBackup()) { + hash = (37 * hash) + BACKUP_FIELD_NUMBER; + hash = (53 * hash) + getBackup().hashCode(); + } + if (hasPrebuild()) { + hash = (37 * hash) + PREBUILD_FIELD_NUMBER; + hash = (53 * hash) + getPrebuild().hashCode(); + } + if (hasComposite()) { + hash = (37 * hash) + COMPOSITE_FIELD_NUMBER; + hash = (53 * hash) + getComposite().hashCode(); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input); + } + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseDelimitedWithIOException(PARSER, input); + } + + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input); + } + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code gitpod.v1.WorkspaceSession.InitializerMetrics} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:gitpod.v1.WorkspaceSession.InitializerMetrics) + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricsOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.gitpod.publicapi.v1.WorkspaceOuterClass.internal_static_gitpod_v1_WorkspaceSession_InitializerMetrics_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.gitpod.publicapi.v1.WorkspaceOuterClass.internal_static_gitpod_v1_WorkspaceSession_InitializerMetrics_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics.class, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics.Builder.class); + } + + // Construct using io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage + .alwaysUseFieldBuilders) { + getGitFieldBuilder(); + getFileDownloadFieldBuilder(); + getSnapshotFieldBuilder(); + getBackupFieldBuilder(); + getPrebuildFieldBuilder(); + getCompositeFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + git_ = null; + if (gitBuilder_ != null) { + gitBuilder_.dispose(); + gitBuilder_ = null; + } + fileDownload_ = null; + if (fileDownloadBuilder_ != null) { + fileDownloadBuilder_.dispose(); + fileDownloadBuilder_ = null; + } + snapshot_ = null; + if (snapshotBuilder_ != null) { + snapshotBuilder_.dispose(); + snapshotBuilder_ = null; + } + backup_ = null; + if (backupBuilder_ != null) { + backupBuilder_.dispose(); + backupBuilder_ = null; + } + prebuild_ = null; + if (prebuildBuilder_ != null) { + prebuildBuilder_.dispose(); + prebuildBuilder_ = null; + } + composite_ = null; + if (compositeBuilder_ != null) { + compositeBuilder_.dispose(); + compositeBuilder_ = null; + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.gitpod.publicapi.v1.WorkspaceOuterClass.internal_static_gitpod_v1_WorkspaceSession_InitializerMetrics_descriptor; + } + + @java.lang.Override + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics getDefaultInstanceForType() { + return io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics.getDefaultInstance(); + } + + @java.lang.Override + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics build() { + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics buildPartial() { + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics result = new io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics(this); + if (bitField0_ != 0) { buildPartial0(result); } + onBuilt(); + return result; + } + + private void buildPartial0(io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics result) { + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.git_ = gitBuilder_ == null + ? git_ + : gitBuilder_.build(); + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.fileDownload_ = fileDownloadBuilder_ == null + ? fileDownload_ + : fileDownloadBuilder_.build(); + to_bitField0_ |= 0x00000002; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.snapshot_ = snapshotBuilder_ == null + ? snapshot_ + : snapshotBuilder_.build(); + to_bitField0_ |= 0x00000004; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + result.backup_ = backupBuilder_ == null + ? backup_ + : backupBuilder_.build(); + to_bitField0_ |= 0x00000008; + } + if (((from_bitField0_ & 0x00000010) != 0)) { + result.prebuild_ = prebuildBuilder_ == null + ? prebuild_ + : prebuildBuilder_.build(); + to_bitField0_ |= 0x00000010; + } + if (((from_bitField0_ & 0x00000020) != 0)) { + result.composite_ = compositeBuilder_ == null + ? composite_ + : compositeBuilder_.build(); + to_bitField0_ |= 0x00000020; + } + result.bitField0_ |= to_bitField0_; + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics) { + return mergeFrom((io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics other) { + if (other == io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics.getDefaultInstance()) return this; + if (other.hasGit()) { + mergeGit(other.getGit()); + } + if (other.hasFileDownload()) { + mergeFileDownload(other.getFileDownload()); + } + if (other.hasSnapshot()) { + mergeSnapshot(other.getSnapshot()); + } + if (other.hasBackup()) { + mergeBackup(other.getBackup()); + } + if (other.hasPrebuild()) { + mergePrebuild(other.getPrebuild()); + } + if (other.hasComposite()) { + mergeComposite(other.getComposite()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + input.readMessage( + getGitFieldBuilder().getBuilder(), + extensionRegistry); + bitField0_ |= 0x00000001; + break; + } // case 10 + case 18: { + input.readMessage( + getFileDownloadFieldBuilder().getBuilder(), + extensionRegistry); + bitField0_ |= 0x00000002; + break; + } // case 18 + case 26: { + input.readMessage( + getSnapshotFieldBuilder().getBuilder(), + extensionRegistry); + bitField0_ |= 0x00000004; + break; + } // case 26 + case 34: { + input.readMessage( + getBackupFieldBuilder().getBuilder(), + extensionRegistry); + bitField0_ |= 0x00000008; + break; + } // case 34 + case 42: { + input.readMessage( + getPrebuildFieldBuilder().getBuilder(), + extensionRegistry); + bitField0_ |= 0x00000010; + break; + } // case 42 + case 50: { + input.readMessage( + getCompositeFieldBuilder().getBuilder(), + extensionRegistry); + bitField0_ |= 0x00000020; + break; + } // case 50 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + private int bitField0_; + + private io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric git_; + private com.google.protobuf.SingleFieldBuilder< + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder> gitBuilder_; + /** + *
+         * git contains metrics for the git initializer step
+         * This is set whenever a `git clone` is issued (mostly on first workspace start)
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric git = 1 [json_name = "git"]; + * @return Whether the git field is set. + */ + public boolean hasGit() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
+         * git contains metrics for the git initializer step
+         * This is set whenever a `git clone` is issued (mostly on first workspace start)
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric git = 1 [json_name = "git"]; + * @return The git. + */ + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric getGit() { + if (gitBuilder_ == null) { + return git_ == null ? io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance() : git_; + } else { + return gitBuilder_.getMessage(); + } + } + /** + *
+         * git contains metrics for the git initializer step
+         * This is set whenever a `git clone` is issued (mostly on first workspace start)
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric git = 1 [json_name = "git"]; + */ + public Builder setGit(io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric value) { + if (gitBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + git_ = value; + } else { + gitBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + *
+         * git contains metrics for the git initializer step
+         * This is set whenever a `git clone` is issued (mostly on first workspace start)
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric git = 1 [json_name = "git"]; + */ + public Builder setGit( + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder builderForValue) { + if (gitBuilder_ == null) { + git_ = builderForValue.build(); + } else { + gitBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + *
+         * git contains metrics for the git initializer step
+         * This is set whenever a `git clone` is issued (mostly on first workspace start)
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric git = 1 [json_name = "git"]; + */ + public Builder mergeGit(io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric value) { + if (gitBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0) && + git_ != null && + git_ != io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance()) { + getGitBuilder().mergeFrom(value); + } else { + git_ = value; + } + } else { + gitBuilder_.mergeFrom(value); + } + if (git_ != null) { + bitField0_ |= 0x00000001; + onChanged(); + } + return this; + } + /** + *
+         * git contains metrics for the git initializer step
+         * This is set whenever a `git clone` is issued (mostly on first workspace start)
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric git = 1 [json_name = "git"]; + */ + public Builder clearGit() { + bitField0_ = (bitField0_ & ~0x00000001); + git_ = null; + if (gitBuilder_ != null) { + gitBuilder_.dispose(); + gitBuilder_ = null; + } + onChanged(); + return this; + } + /** + *
+         * git contains metrics for the git initializer step
+         * This is set whenever a `git clone` is issued (mostly on first workspace start)
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric git = 1 [json_name = "git"]; + */ + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder getGitBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getGitFieldBuilder().getBuilder(); + } + /** + *
+         * git contains metrics for the git initializer step
+         * This is set whenever a `git clone` is issued (mostly on first workspace start)
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric git = 1 [json_name = "git"]; + */ + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder getGitOrBuilder() { + if (gitBuilder_ != null) { + return gitBuilder_.getMessageOrBuilder(); + } else { + return git_ == null ? + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance() : git_; + } + } + /** + *
+         * git contains metrics for the git initializer step
+         * This is set whenever a `git clone` is issued (mostly on first workspace start)
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric git = 1 [json_name = "git"]; + */ + private com.google.protobuf.SingleFieldBuilder< + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder> + getGitFieldBuilder() { + if (gitBuilder_ == null) { + gitBuilder_ = new com.google.protobuf.SingleFieldBuilder< + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder>( + getGit(), + getParentForChildren(), + isClean()); + git_ = null; + } + return gitBuilder_; + } + + private io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric fileDownload_; + private com.google.protobuf.SingleFieldBuilder< + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder> fileDownloadBuilder_; + /** + *
+         * file_download contains metrics for the file download initializer step
+         * This is set for injecting "additionalFiles" into the workspace.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric file_download = 2 [json_name = "fileDownload"]; + * @return Whether the fileDownload field is set. + */ + public boolean hasFileDownload() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
+         * file_download contains metrics for the file download initializer step
+         * This is set for injecting "additionalFiles" into the workspace.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric file_download = 2 [json_name = "fileDownload"]; + * @return The fileDownload. + */ + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric getFileDownload() { + if (fileDownloadBuilder_ == null) { + return fileDownload_ == null ? io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance() : fileDownload_; + } else { + return fileDownloadBuilder_.getMessage(); + } + } + /** + *
+         * file_download contains metrics for the file download initializer step
+         * This is set for injecting "additionalFiles" into the workspace.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric file_download = 2 [json_name = "fileDownload"]; + */ + public Builder setFileDownload(io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric value) { + if (fileDownloadBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + fileDownload_ = value; + } else { + fileDownloadBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + *
+         * file_download contains metrics for the file download initializer step
+         * This is set for injecting "additionalFiles" into the workspace.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric file_download = 2 [json_name = "fileDownload"]; + */ + public Builder setFileDownload( + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder builderForValue) { + if (fileDownloadBuilder_ == null) { + fileDownload_ = builderForValue.build(); + } else { + fileDownloadBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + *
+         * file_download contains metrics for the file download initializer step
+         * This is set for injecting "additionalFiles" into the workspace.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric file_download = 2 [json_name = "fileDownload"]; + */ + public Builder mergeFileDownload(io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric value) { + if (fileDownloadBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0) && + fileDownload_ != null && + fileDownload_ != io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance()) { + getFileDownloadBuilder().mergeFrom(value); + } else { + fileDownload_ = value; + } + } else { + fileDownloadBuilder_.mergeFrom(value); + } + if (fileDownload_ != null) { + bitField0_ |= 0x00000002; + onChanged(); + } + return this; + } + /** + *
+         * file_download contains metrics for the file download initializer step
+         * This is set for injecting "additionalFiles" into the workspace.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric file_download = 2 [json_name = "fileDownload"]; + */ + public Builder clearFileDownload() { + bitField0_ = (bitField0_ & ~0x00000002); + fileDownload_ = null; + if (fileDownloadBuilder_ != null) { + fileDownloadBuilder_.dispose(); + fileDownloadBuilder_ = null; + } + onChanged(); + return this; + } + /** + *
+         * file_download contains metrics for the file download initializer step
+         * This is set for injecting "additionalFiles" into the workspace.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric file_download = 2 [json_name = "fileDownload"]; + */ + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder getFileDownloadBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getFileDownloadFieldBuilder().getBuilder(); + } + /** + *
+         * file_download contains metrics for the file download initializer step
+         * This is set for injecting "additionalFiles" into the workspace.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric file_download = 2 [json_name = "fileDownload"]; + */ + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder getFileDownloadOrBuilder() { + if (fileDownloadBuilder_ != null) { + return fileDownloadBuilder_.getMessageOrBuilder(); + } else { + return fileDownload_ == null ? + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance() : fileDownload_; + } + } + /** + *
+         * file_download contains metrics for the file download initializer step
+         * This is set for injecting "additionalFiles" into the workspace.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric file_download = 2 [json_name = "fileDownload"]; + */ + private com.google.protobuf.SingleFieldBuilder< + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder> + getFileDownloadFieldBuilder() { + if (fileDownloadBuilder_ == null) { + fileDownloadBuilder_ = new com.google.protobuf.SingleFieldBuilder< + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder>( + getFileDownload(), + getParentForChildren(), + isClean()); + fileDownload_ = null; + } + return fileDownloadBuilder_; + } + + private io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric snapshot_; + private com.google.protobuf.SingleFieldBuilder< + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder> snapshotBuilder_; + /** + *
+         * snapshot contains metrics for the snapshot initializer step
+         * This used for workspaces started from snapshots.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric snapshot = 3 [json_name = "snapshot"]; + * @return Whether the snapshot field is set. + */ + public boolean hasSnapshot() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
+         * snapshot contains metrics for the snapshot initializer step
+         * This used for workspaces started from snapshots.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric snapshot = 3 [json_name = "snapshot"]; + * @return The snapshot. + */ + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric getSnapshot() { + if (snapshotBuilder_ == null) { + return snapshot_ == null ? io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance() : snapshot_; + } else { + return snapshotBuilder_.getMessage(); + } + } + /** + *
+         * snapshot contains metrics for the snapshot initializer step
+         * This used for workspaces started from snapshots.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric snapshot = 3 [json_name = "snapshot"]; + */ + public Builder setSnapshot(io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric value) { + if (snapshotBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + snapshot_ = value; + } else { + snapshotBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + /** + *
+         * snapshot contains metrics for the snapshot initializer step
+         * This used for workspaces started from snapshots.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric snapshot = 3 [json_name = "snapshot"]; + */ + public Builder setSnapshot( + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder builderForValue) { + if (snapshotBuilder_ == null) { + snapshot_ = builderForValue.build(); + } else { + snapshotBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + /** + *
+         * snapshot contains metrics for the snapshot initializer step
+         * This used for workspaces started from snapshots.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric snapshot = 3 [json_name = "snapshot"]; + */ + public Builder mergeSnapshot(io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric value) { + if (snapshotBuilder_ == null) { + if (((bitField0_ & 0x00000004) != 0) && + snapshot_ != null && + snapshot_ != io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance()) { + getSnapshotBuilder().mergeFrom(value); + } else { + snapshot_ = value; + } + } else { + snapshotBuilder_.mergeFrom(value); + } + if (snapshot_ != null) { + bitField0_ |= 0x00000004; + onChanged(); + } + return this; + } + /** + *
+         * snapshot contains metrics for the snapshot initializer step
+         * This used for workspaces started from snapshots.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric snapshot = 3 [json_name = "snapshot"]; + */ + public Builder clearSnapshot() { + bitField0_ = (bitField0_ & ~0x00000004); + snapshot_ = null; + if (snapshotBuilder_ != null) { + snapshotBuilder_.dispose(); + snapshotBuilder_ = null; + } + onChanged(); + return this; + } + /** + *
+         * snapshot contains metrics for the snapshot initializer step
+         * This used for workspaces started from snapshots.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric snapshot = 3 [json_name = "snapshot"]; + */ + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder getSnapshotBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getSnapshotFieldBuilder().getBuilder(); + } + /** + *
+         * snapshot contains metrics for the snapshot initializer step
+         * This used for workspaces started from snapshots.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric snapshot = 3 [json_name = "snapshot"]; + */ + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder getSnapshotOrBuilder() { + if (snapshotBuilder_ != null) { + return snapshotBuilder_.getMessageOrBuilder(); + } else { + return snapshot_ == null ? + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance() : snapshot_; + } + } + /** + *
+         * snapshot contains metrics for the snapshot initializer step
+         * This used for workspaces started from snapshots.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric snapshot = 3 [json_name = "snapshot"]; + */ + private com.google.protobuf.SingleFieldBuilder< + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder> + getSnapshotFieldBuilder() { + if (snapshotBuilder_ == null) { + snapshotBuilder_ = new com.google.protobuf.SingleFieldBuilder< + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder>( + getSnapshot(), + getParentForChildren(), + isClean()); + snapshot_ = null; + } + return snapshotBuilder_; + } + + private io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric backup_; + private com.google.protobuf.SingleFieldBuilder< + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder> backupBuilder_; + /** + *
+         * backup contains metrics for the backup initializer step
+         * This is set on subsequent workspace starts, when the file system is restored from backup.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric backup = 4 [json_name = "backup"]; + * @return Whether the backup field is set. + */ + public boolean hasBackup() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + *
+         * backup contains metrics for the backup initializer step
+         * This is set on subsequent workspace starts, when the file system is restored from backup.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric backup = 4 [json_name = "backup"]; + * @return The backup. + */ + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric getBackup() { + if (backupBuilder_ == null) { + return backup_ == null ? io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance() : backup_; + } else { + return backupBuilder_.getMessage(); + } + } + /** + *
+         * backup contains metrics for the backup initializer step
+         * This is set on subsequent workspace starts, when the file system is restored from backup.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric backup = 4 [json_name = "backup"]; + */ + public Builder setBackup(io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric value) { + if (backupBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + backup_ = value; + } else { + backupBuilder_.setMessage(value); + } + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + /** + *
+         * backup contains metrics for the backup initializer step
+         * This is set on subsequent workspace starts, when the file system is restored from backup.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric backup = 4 [json_name = "backup"]; + */ + public Builder setBackup( + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder builderForValue) { + if (backupBuilder_ == null) { + backup_ = builderForValue.build(); + } else { + backupBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + /** + *
+         * backup contains metrics for the backup initializer step
+         * This is set on subsequent workspace starts, when the file system is restored from backup.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric backup = 4 [json_name = "backup"]; + */ + public Builder mergeBackup(io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric value) { + if (backupBuilder_ == null) { + if (((bitField0_ & 0x00000008) != 0) && + backup_ != null && + backup_ != io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance()) { + getBackupBuilder().mergeFrom(value); + } else { + backup_ = value; + } + } else { + backupBuilder_.mergeFrom(value); + } + if (backup_ != null) { + bitField0_ |= 0x00000008; + onChanged(); + } + return this; + } + /** + *
+         * backup contains metrics for the backup initializer step
+         * This is set on subsequent workspace starts, when the file system is restored from backup.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric backup = 4 [json_name = "backup"]; + */ + public Builder clearBackup() { + bitField0_ = (bitField0_ & ~0x00000008); + backup_ = null; + if (backupBuilder_ != null) { + backupBuilder_.dispose(); + backupBuilder_ = null; + } + onChanged(); + return this; + } + /** + *
+         * backup contains metrics for the backup initializer step
+         * This is set on subsequent workspace starts, when the file system is restored from backup.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric backup = 4 [json_name = "backup"]; + */ + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder getBackupBuilder() { + bitField0_ |= 0x00000008; + onChanged(); + return getBackupFieldBuilder().getBuilder(); + } + /** + *
+         * backup contains metrics for the backup initializer step
+         * This is set on subsequent workspace starts, when the file system is restored from backup.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric backup = 4 [json_name = "backup"]; + */ + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder getBackupOrBuilder() { + if (backupBuilder_ != null) { + return backupBuilder_.getMessageOrBuilder(); + } else { + return backup_ == null ? + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance() : backup_; + } + } + /** + *
+         * backup contains metrics for the backup initializer step
+         * This is set on subsequent workspace starts, when the file system is restored from backup.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric backup = 4 [json_name = "backup"]; + */ + private com.google.protobuf.SingleFieldBuilder< + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder> + getBackupFieldBuilder() { + if (backupBuilder_ == null) { + backupBuilder_ = new com.google.protobuf.SingleFieldBuilder< + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder>( + getBackup(), + getParentForChildren(), + isClean()); + backup_ = null; + } + return backupBuilder_; + } + + private io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric prebuild_; + private com.google.protobuf.SingleFieldBuilder< + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder> prebuildBuilder_; + /** + *
+         * prebuild contains metrics for the prebuild initializer step
+         * This is set if the workspace is based on a prebuild.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric prebuild = 5 [json_name = "prebuild"]; + * @return Whether the prebuild field is set. + */ + public boolean hasPrebuild() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + *
+         * prebuild contains metrics for the prebuild initializer step
+         * This is set if the workspace is based on a prebuild.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric prebuild = 5 [json_name = "prebuild"]; + * @return The prebuild. + */ + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric getPrebuild() { + if (prebuildBuilder_ == null) { + return prebuild_ == null ? io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance() : prebuild_; + } else { + return prebuildBuilder_.getMessage(); + } + } + /** + *
+         * prebuild contains metrics for the prebuild initializer step
+         * This is set if the workspace is based on a prebuild.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric prebuild = 5 [json_name = "prebuild"]; + */ + public Builder setPrebuild(io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric value) { + if (prebuildBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + prebuild_ = value; + } else { + prebuildBuilder_.setMessage(value); } + bitField0_ |= 0x00000010; + onChanged(); + return this; } - - @java.lang.Override - public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.Metrics) { - return mergeFrom((io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.Metrics)other); + /** + *
+         * prebuild contains metrics for the prebuild initializer step
+         * This is set if the workspace is based on a prebuild.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric prebuild = 5 [json_name = "prebuild"]; + */ + public Builder setPrebuild( + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder builderForValue) { + if (prebuildBuilder_ == null) { + prebuild_ = builderForValue.build(); } else { - super.mergeFrom(other); - return this; + prebuildBuilder_.setMessage(builderForValue.build()); } + bitField0_ |= 0x00000010; + onChanged(); + return this; } - - public Builder mergeFrom(io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.Metrics other) { - if (other == io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.Metrics.getDefaultInstance()) return this; - if (other.getWorkspaceImageSize() != 0L) { - setWorkspaceImageSize(other.getWorkspaceImageSize()); + /** + *
+         * prebuild contains metrics for the prebuild initializer step
+         * This is set if the workspace is based on a prebuild.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric prebuild = 5 [json_name = "prebuild"]; + */ + public Builder mergePrebuild(io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric value) { + if (prebuildBuilder_ == null) { + if (((bitField0_ & 0x00000010) != 0) && + prebuild_ != null && + prebuild_ != io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance()) { + getPrebuildBuilder().mergeFrom(value); + } else { + prebuild_ = value; + } + } else { + prebuildBuilder_.mergeFrom(value); } - if (other.getTotalImageSize() != 0L) { - setTotalImageSize(other.getTotalImageSize()); + if (prebuild_ != null) { + bitField0_ |= 0x00000010; + onChanged(); + } + return this; + } + /** + *
+         * prebuild contains metrics for the prebuild initializer step
+         * This is set if the workspace is based on a prebuild.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric prebuild = 5 [json_name = "prebuild"]; + */ + public Builder clearPrebuild() { + bitField0_ = (bitField0_ & ~0x00000010); + prebuild_ = null; + if (prebuildBuilder_ != null) { + prebuildBuilder_.dispose(); + prebuildBuilder_ = null; } - this.mergeUnknownFields(other.getUnknownFields()); onChanged(); return this; } - - @java.lang.Override - public final boolean isInitialized() { - return true; + /** + *
+         * prebuild contains metrics for the prebuild initializer step
+         * This is set if the workspace is based on a prebuild.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric prebuild = 5 [json_name = "prebuild"]; + */ + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder getPrebuildBuilder() { + bitField0_ |= 0x00000010; + onChanged(); + return getPrebuildFieldBuilder().getBuilder(); } - - @java.lang.Override - public Builder mergeFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); + /** + *
+         * prebuild contains metrics for the prebuild initializer step
+         * This is set if the workspace is based on a prebuild.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric prebuild = 5 [json_name = "prebuild"]; + */ + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder getPrebuildOrBuilder() { + if (prebuildBuilder_ != null) { + return prebuildBuilder_.getMessageOrBuilder(); + } else { + return prebuild_ == null ? + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance() : prebuild_; } - try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch (tag) { - case 0: - done = true; - break; - case 8: { - workspaceImageSize_ = input.readInt64(); - bitField0_ |= 0x00000001; - break; - } // case 8 - case 16: { - totalImageSize_ = input.readInt64(); - bitField0_ |= 0x00000002; - break; - } // case 16 - default: { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - done = true; // was an endgroup tag - } - break; - } // default: - } // switch (tag) - } // while (!done) - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.unwrapIOException(); - } finally { - onChanged(); - } // finally - return this; } - private int bitField0_; + /** + *
+         * prebuild contains metrics for the prebuild initializer step
+         * This is set if the workspace is based on a prebuild.
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric prebuild = 5 [json_name = "prebuild"]; + */ + private com.google.protobuf.SingleFieldBuilder< + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder> + getPrebuildFieldBuilder() { + if (prebuildBuilder_ == null) { + prebuildBuilder_ = new com.google.protobuf.SingleFieldBuilder< + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder>( + getPrebuild(), + getParentForChildren(), + isClean()); + prebuild_ = null; + } + return prebuildBuilder_; + } - private long workspaceImageSize_ ; + private io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric composite_; + private com.google.protobuf.SingleFieldBuilder< + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder> compositeBuilder_; /** *
-         * workspace_image_size is the size of the workspace image in bytes
+         * composite contains metrics for the composite initializer step
+         * This reports the total if multiple steps are run to initialize the workspace content.
+         * Examples are:
+         * - "additionalFiles" injected into the workspace
+         * - "additionalRepositories" configured
+         * - incremental Prebuilds
          * 
* - * int64 workspace_image_size = 1 [json_name = "workspaceImageSize"]; - * @return The workspaceImageSize. + * .gitpod.v1.WorkspaceSession.InitializerMetric composite = 6 [json_name = "composite"]; + * @return Whether the composite field is set. */ - @java.lang.Override - public long getWorkspaceImageSize() { - return workspaceImageSize_; + public boolean hasComposite() { + return ((bitField0_ & 0x00000020) != 0); } /** *
-         * workspace_image_size is the size of the workspace image in bytes
+         * composite contains metrics for the composite initializer step
+         * This reports the total if multiple steps are run to initialize the workspace content.
+         * Examples are:
+         * - "additionalFiles" injected into the workspace
+         * - "additionalRepositories" configured
+         * - incremental Prebuilds
          * 
* - * int64 workspace_image_size = 1 [json_name = "workspaceImageSize"]; - * @param value The workspaceImageSize to set. - * @return This builder for chaining. + * .gitpod.v1.WorkspaceSession.InitializerMetric composite = 6 [json_name = "composite"]; + * @return The composite. */ - public Builder setWorkspaceImageSize(long value) { - - workspaceImageSize_ = value; - bitField0_ |= 0x00000001; + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric getComposite() { + if (compositeBuilder_ == null) { + return composite_ == null ? io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance() : composite_; + } else { + return compositeBuilder_.getMessage(); + } + } + /** + *
+         * composite contains metrics for the composite initializer step
+         * This reports the total if multiple steps are run to initialize the workspace content.
+         * Examples are:
+         * - "additionalFiles" injected into the workspace
+         * - "additionalRepositories" configured
+         * - incremental Prebuilds
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric composite = 6 [json_name = "composite"]; + */ + public Builder setComposite(io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric value) { + if (compositeBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + composite_ = value; + } else { + compositeBuilder_.setMessage(value); + } + bitField0_ |= 0x00000020; onChanged(); return this; } /** *
-         * workspace_image_size is the size of the workspace image in bytes
+         * composite contains metrics for the composite initializer step
+         * This reports the total if multiple steps are run to initialize the workspace content.
+         * Examples are:
+         * - "additionalFiles" injected into the workspace
+         * - "additionalRepositories" configured
+         * - incremental Prebuilds
          * 
* - * int64 workspace_image_size = 1 [json_name = "workspaceImageSize"]; - * @return This builder for chaining. + * .gitpod.v1.WorkspaceSession.InitializerMetric composite = 6 [json_name = "composite"]; */ - public Builder clearWorkspaceImageSize() { - bitField0_ = (bitField0_ & ~0x00000001); - workspaceImageSize_ = 0L; + public Builder setComposite( + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder builderForValue) { + if (compositeBuilder_ == null) { + composite_ = builderForValue.build(); + } else { + compositeBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000020; onChanged(); return this; } - - private long totalImageSize_ ; /** *
-         * total_image_size is the total size of the image in bytes (includes Gitpod-specific layers like IDE)
+         * composite contains metrics for the composite initializer step
+         * This reports the total if multiple steps are run to initialize the workspace content.
+         * Examples are:
+         * - "additionalFiles" injected into the workspace
+         * - "additionalRepositories" configured
+         * - incremental Prebuilds
          * 
* - * int64 total_image_size = 2 [json_name = "totalImageSize"]; - * @return The totalImageSize. + * .gitpod.v1.WorkspaceSession.InitializerMetric composite = 6 [json_name = "composite"]; */ - @java.lang.Override - public long getTotalImageSize() { - return totalImageSize_; + public Builder mergeComposite(io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric value) { + if (compositeBuilder_ == null) { + if (((bitField0_ & 0x00000020) != 0) && + composite_ != null && + composite_ != io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance()) { + getCompositeBuilder().mergeFrom(value); + } else { + composite_ = value; + } + } else { + compositeBuilder_.mergeFrom(value); + } + if (composite_ != null) { + bitField0_ |= 0x00000020; + onChanged(); + } + return this; } /** *
-         * total_image_size is the total size of the image in bytes (includes Gitpod-specific layers like IDE)
+         * composite contains metrics for the composite initializer step
+         * This reports the total if multiple steps are run to initialize the workspace content.
+         * Examples are:
+         * - "additionalFiles" injected into the workspace
+         * - "additionalRepositories" configured
+         * - incremental Prebuilds
          * 
* - * int64 total_image_size = 2 [json_name = "totalImageSize"]; - * @param value The totalImageSize to set. - * @return This builder for chaining. + * .gitpod.v1.WorkspaceSession.InitializerMetric composite = 6 [json_name = "composite"]; */ - public Builder setTotalImageSize(long value) { - - totalImageSize_ = value; - bitField0_ |= 0x00000002; + public Builder clearComposite() { + bitField0_ = (bitField0_ & ~0x00000020); + composite_ = null; + if (compositeBuilder_ != null) { + compositeBuilder_.dispose(); + compositeBuilder_ = null; + } onChanged(); return this; } /** *
-         * total_image_size is the total size of the image in bytes (includes Gitpod-specific layers like IDE)
+         * composite contains metrics for the composite initializer step
+         * This reports the total if multiple steps are run to initialize the workspace content.
+         * Examples are:
+         * - "additionalFiles" injected into the workspace
+         * - "additionalRepositories" configured
+         * - incremental Prebuilds
          * 
* - * int64 total_image_size = 2 [json_name = "totalImageSize"]; - * @return This builder for chaining. + * .gitpod.v1.WorkspaceSession.InitializerMetric composite = 6 [json_name = "composite"]; */ - public Builder clearTotalImageSize() { - bitField0_ = (bitField0_ & ~0x00000002); - totalImageSize_ = 0L; + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder getCompositeBuilder() { + bitField0_ |= 0x00000020; onChanged(); - return this; + return getCompositeFieldBuilder().getBuilder(); + } + /** + *
+         * composite contains metrics for the composite initializer step
+         * This reports the total if multiple steps are run to initialize the workspace content.
+         * Examples are:
+         * - "additionalFiles" injected into the workspace
+         * - "additionalRepositories" configured
+         * - incremental Prebuilds
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric composite = 6 [json_name = "composite"]; + */ + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder getCompositeOrBuilder() { + if (compositeBuilder_ != null) { + return compositeBuilder_.getMessageOrBuilder(); + } else { + return composite_ == null ? + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.getDefaultInstance() : composite_; + } + } + /** + *
+         * composite contains metrics for the composite initializer step
+         * This reports the total if multiple steps are run to initialize the workspace content.
+         * Examples are:
+         * - "additionalFiles" injected into the workspace
+         * - "additionalRepositories" configured
+         * - incremental Prebuilds
+         * 
+ * + * .gitpod.v1.WorkspaceSession.InitializerMetric composite = 6 [json_name = "composite"]; + */ + private com.google.protobuf.SingleFieldBuilder< + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder> + getCompositeFieldBuilder() { + if (compositeBuilder_ == null) { + compositeBuilder_ = new com.google.protobuf.SingleFieldBuilder< + io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetric.Builder, io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetricOrBuilder>( + getComposite(), + getParentForChildren(), + isClean()); + composite_ = null; + } + return compositeBuilder_; } - // @@protoc_insertion_point(builder_scope:gitpod.v1.WorkspaceSession.Metrics) + // @@protoc_insertion_point(builder_scope:gitpod.v1.WorkspaceSession.InitializerMetrics) } - // @@protoc_insertion_point(class_scope:gitpod.v1.WorkspaceSession.Metrics) - private static final io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.Metrics DEFAULT_INSTANCE; + // @@protoc_insertion_point(class_scope:gitpod.v1.WorkspaceSession.InitializerMetrics) + private static final io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics DEFAULT_INSTANCE; static { - DEFAULT_INSTANCE = new io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.Metrics(); + DEFAULT_INSTANCE = new io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics(); } - public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.Metrics getDefaultInstance() { + public static io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics getDefaultInstance() { return DEFAULT_INSTANCE; } - private static final com.google.protobuf.Parser - PARSER = new com.google.protobuf.AbstractParser() { + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { @java.lang.Override - public Metrics parsePartialFrom( + public InitializerMetrics parsePartialFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { @@ -62724,17 +65803,17 @@ public Metrics parsePartialFrom( } }; - public static com.google.protobuf.Parser parser() { + public static com.google.protobuf.Parser parser() { return PARSER; } @java.lang.Override - public com.google.protobuf.Parser getParserForType() { + public com.google.protobuf.Parser getParserForType() { return PARSER; } @java.lang.Override - public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.Metrics getDefaultInstanceForType() { + public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession.InitializerMetrics getDefaultInstanceForType() { return DEFAULT_INSTANCE; } @@ -65214,6 +68293,16 @@ public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession getDefaultIns private static final com.google.protobuf.GeneratedMessage.FieldAccessorTable internal_static_gitpod_v1_WorkspaceSession_Metrics_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_WorkspaceSession_InitializerMetric_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_WorkspaceSession_InitializerMetric_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_WorkspaceSession_InitializerMetrics_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_WorkspaceSession_InitializerMetrics_fieldAccessorTable; public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { @@ -65489,7 +68578,7 @@ public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession getDefaultIns "onse\"\207\001\n\021WorkspaceSnapshot\022\016\n\002id\030\001 \001(\tR\002" + "id\022!\n\014workspace_id\030\002 \001(\tR\013workspaceId\022?\n" + "\rcreation_time\030\003 \001(\0132\032.google.protobuf.T" + - "imestampR\014creationTime\"\327\t\n\020WorkspaceSess" + + "imestampR\014creationTime\"\357\016\n\020WorkspaceSess" + "ion\022\016\n\002id\030\001 \001(\tR\002id\0222\n\tworkspace\030\002 \001(\0132\024" + ".gitpod.v1.WorkspaceR\tworkspace\022?\n\rcreat" + "ion_time\030\003 \001(\0132\032.google.protobuf.Timesta" + @@ -65518,61 +68607,78 @@ public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession getDefaultIns "er\022\022\n\004name\030\004 \001(\tR\004name\"a\n\007RefType\022\030\n\024REF" + "_TYPE_UNSPECIFIED\020\000\022\023\n\017REF_TYPE_BRANCH\020\001" + "\022\020\n\014REF_TYPE_TAG\020\002\022\025\n\021REF_TYPE_REVISION\020" + - "\003\032e\n\007Metrics\0220\n\024workspace_image_size\030\001 \001" + - "(\003R\022workspaceImageSize\022(\n\020total_image_si" + - "ze\030\002 \001(\003R\016totalImageSize*o\n\016AdmissionLev" + - "el\022\037\n\033ADMISSION_LEVEL_UNSPECIFIED\020\000\022\036\n\032A" + - "DMISSION_LEVEL_OWNER_ONLY\020\001\022\034\n\030ADMISSION" + - "_LEVEL_EVERYONE\020\0022\323\016\n\020WorkspaceService\022Q" + - "\n\014GetWorkspace\022\036.gitpod.v1.GetWorkspaceR" + - "equest\032\037.gitpod.v1.GetWorkspaceResponse\"" + - "\000\022k\n\024WatchWorkspaceStatus\022&.gitpod.v1.Wa" + - "tchWorkspaceStatusRequest\032\'.gitpod.v1.Wa" + - "tchWorkspaceStatusResponse\"\0000\001\022W\n\016ListWo" + - "rkspaces\022 .gitpod.v1.ListWorkspacesReque" + - "st\032!.gitpod.v1.ListWorkspacesResponse\"\000\022" + - "l\n\025ListWorkspaceSessions\022\'.gitpod.v1.Lis" + - "tWorkspaceSessionsRequest\032(.gitpod.v1.Li" + - "stWorkspaceSessionsResponse\"\000\022r\n\027CreateA" + - "ndStartWorkspace\022).gitpod.v1.CreateAndSt" + - "artWorkspaceRequest\032*.gitpod.v1.CreateAn" + - "dStartWorkspaceResponse\"\000\022W\n\016StartWorksp" + - "ace\022 .gitpod.v1.StartWorkspaceRequest\032!." + - "gitpod.v1.StartWorkspaceResponse\"\000\022Z\n\017Up" + - "dateWorkspace\022!.gitpod.v1.UpdateWorkspac" + - "eRequest\032\".gitpod.v1.UpdateWorkspaceResp" + - "onse\"\000\022T\n\rStopWorkspace\022\037.gitpod.v1.Stop" + - "WorkspaceRequest\032 .gitpod.v1.StopWorkspa" + - "ceResponse\"\000\022Z\n\017DeleteWorkspace\022!.gitpod" + - ".v1.DeleteWorkspaceRequest\032\".gitpod.v1.D" + - "eleteWorkspaceResponse\"\000\022i\n\024ListWorkspac" + - "eClasses\022&.gitpod.v1.ListWorkspaceClasse" + - "sRequest\032\'.gitpod.v1.ListWorkspaceClasse" + - "sResponse\"\000\022Z\n\017ParseContextURL\022!.gitpod." + - "v1.ParseContextURLRequest\032\".gitpod.v1.Pa" + - "rseContextURLResponse\"\000\022u\n\030GetWorkspaceD" + - "efaultImage\022*.gitpod.v1.GetWorkspaceDefa" + - "ultImageRequest\032+.gitpod.v1.GetWorkspace" + - "DefaultImageResponse\"\000\022T\n\rSendHeartBeat\022" + - "\037.gitpod.v1.SendHeartBeatRequest\032 .gitpo" + - "d.v1.SendHeartBeatResponse\"\000\022o\n\026GetWorks" + - "paceOwnerToken\022(.gitpod.v1.GetWorkspaceO" + - "wnerTokenRequest\032).gitpod.v1.GetWorkspac" + - "eOwnerTokenResponse\"\000\022\204\001\n\035GetWorkspaceEd" + - "itorCredentials\022/.gitpod.v1.GetWorkspace" + - "EditorCredentialsRequest\0320.gitpod.v1.Get" + - "WorkspaceEditorCredentialsResponse\"\000\022r\n\027" + - "CreateWorkspaceSnapshot\022).gitpod.v1.Crea" + - "teWorkspaceSnapshotRequest\032*.gitpod.v1.C" + - "reateWorkspaceSnapshotResponse\"\000\022u\n\030Wait" + - "ForWorkspaceSnapshot\022*.gitpod.v1.WaitFor" + - "WorkspaceSnapshotRequest\032+.gitpod.v1.Wai" + - "tForWorkspaceSnapshotResponse\"\000\022f\n\023Updat" + - "eWorkspacePort\022%.gitpod.v1.UpdateWorkspa" + - "cePortRequest\032&.gitpod.v1.UpdateWorkspac" + - "ePortResponse\"\000BQ\n\026io.gitpod.publicapi.v" + - "1Z7github.com/gitpod-io/gitpod/component" + - "s/public-api/go/v1b\006proto3" + "\003\032\306\001\n\007Metrics\0220\n\024workspace_image_size\030\001 " + + "\001(\003R\022workspaceImageSize\022(\n\020total_image_s" + + "ize\030\002 \001(\003R\016totalImageSize\022_\n\023initializer" + + "_metrics\030\003 \001(\0132..gitpod.v1.WorkspaceSess" + + "ion.InitializerMetricsR\022initializerMetri" + + "cs\032^\n\021InitializerMetric\0225\n\010duration\030\001 \001(" + + "\0132\031.google.protobuf.DurationR\010duration\022\022" + + "\n\004size\030\002 \001(\004R\004size\032\323\003\n\022InitializerMetric" + + "s\022?\n\003git\030\001 \001(\0132-.gitpod.v1.WorkspaceSess" + + "ion.InitializerMetricR\003git\022R\n\rfile_downl" + + "oad\030\002 \001(\0132-.gitpod.v1.WorkspaceSession.I" + + "nitializerMetricR\014fileDownload\022I\n\010snapsh" + + "ot\030\003 \001(\0132-.gitpod.v1.WorkspaceSession.In" + + "itializerMetricR\010snapshot\022E\n\006backup\030\004 \001(" + + "\0132-.gitpod.v1.WorkspaceSession.Initializ" + + "erMetricR\006backup\022I\n\010prebuild\030\005 \001(\0132-.git" + + "pod.v1.WorkspaceSession.InitializerMetri" + + "cR\010prebuild\022K\n\tcomposite\030\006 \001(\0132-.gitpod." + + "v1.WorkspaceSession.InitializerMetricR\tc" + + "omposite*o\n\016AdmissionLevel\022\037\n\033ADMISSION_" + + "LEVEL_UNSPECIFIED\020\000\022\036\n\032ADMISSION_LEVEL_O" + + "WNER_ONLY\020\001\022\034\n\030ADMISSION_LEVEL_EVERYONE\020" + + "\0022\323\016\n\020WorkspaceService\022Q\n\014GetWorkspace\022\036" + + ".gitpod.v1.GetWorkspaceRequest\032\037.gitpod." + + "v1.GetWorkspaceResponse\"\000\022k\n\024WatchWorksp" + + "aceStatus\022&.gitpod.v1.WatchWorkspaceStat" + + "usRequest\032\'.gitpod.v1.WatchWorkspaceStat" + + "usResponse\"\0000\001\022W\n\016ListWorkspaces\022 .gitpo" + + "d.v1.ListWorkspacesRequest\032!.gitpod.v1.L" + + "istWorkspacesResponse\"\000\022l\n\025ListWorkspace" + + "Sessions\022\'.gitpod.v1.ListWorkspaceSessio" + + "nsRequest\032(.gitpod.v1.ListWorkspaceSessi" + + "onsResponse\"\000\022r\n\027CreateAndStartWorkspace" + + "\022).gitpod.v1.CreateAndStartWorkspaceRequ" + + "est\032*.gitpod.v1.CreateAndStartWorkspaceR" + + "esponse\"\000\022W\n\016StartWorkspace\022 .gitpod.v1." + + "StartWorkspaceRequest\032!.gitpod.v1.StartW" + + "orkspaceResponse\"\000\022Z\n\017UpdateWorkspace\022!." + + "gitpod.v1.UpdateWorkspaceRequest\032\".gitpo" + + "d.v1.UpdateWorkspaceResponse\"\000\022T\n\rStopWo" + + "rkspace\022\037.gitpod.v1.StopWorkspaceRequest" + + "\032 .gitpod.v1.StopWorkspaceResponse\"\000\022Z\n\017" + + "DeleteWorkspace\022!.gitpod.v1.DeleteWorksp" + + "aceRequest\032\".gitpod.v1.DeleteWorkspaceRe" + + "sponse\"\000\022i\n\024ListWorkspaceClasses\022&.gitpo" + + "d.v1.ListWorkspaceClassesRequest\032\'.gitpo" + + "d.v1.ListWorkspaceClassesResponse\"\000\022Z\n\017P" + + "arseContextURL\022!.gitpod.v1.ParseContextU" + + "RLRequest\032\".gitpod.v1.ParseContextURLRes" + + "ponse\"\000\022u\n\030GetWorkspaceDefaultImage\022*.gi" + + "tpod.v1.GetWorkspaceDefaultImageRequest\032" + + "+.gitpod.v1.GetWorkspaceDefaultImageResp" + + "onse\"\000\022T\n\rSendHeartBeat\022\037.gitpod.v1.Send" + + "HeartBeatRequest\032 .gitpod.v1.SendHeartBe" + + "atResponse\"\000\022o\n\026GetWorkspaceOwnerToken\022(" + + ".gitpod.v1.GetWorkspaceOwnerTokenRequest" + + "\032).gitpod.v1.GetWorkspaceOwnerTokenRespo" + + "nse\"\000\022\204\001\n\035GetWorkspaceEditorCredentials\022" + + "/.gitpod.v1.GetWorkspaceEditorCredential" + + "sRequest\0320.gitpod.v1.GetWorkspaceEditorC" + + "redentialsResponse\"\000\022r\n\027CreateWorkspaceS" + + "napshot\022).gitpod.v1.CreateWorkspaceSnaps" + + "hotRequest\032*.gitpod.v1.CreateWorkspaceSn" + + "apshotResponse\"\000\022u\n\030WaitForWorkspaceSnap" + + "shot\022*.gitpod.v1.WaitForWorkspaceSnapsho" + + "tRequest\032+.gitpod.v1.WaitForWorkspaceSna" + + "pshotResponse\"\000\022f\n\023UpdateWorkspacePort\022%" + + ".gitpod.v1.UpdateWorkspacePortRequest\032&." + + "gitpod.v1.UpdateWorkspacePortResponse\"\000B" + + "Q\n\026io.gitpod.publicapi.v1Z7github.com/gi" + + "tpod-io/gitpod/components/public-api/go/" + + "v1b\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor .internalBuildGeneratedFileFrom(descriptorData, @@ -65996,7 +69102,19 @@ public io.gitpod.publicapi.v1.WorkspaceOuterClass.WorkspaceSession getDefaultIns internal_static_gitpod_v1_WorkspaceSession_Metrics_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_gitpod_v1_WorkspaceSession_Metrics_descriptor, - new java.lang.String[] { "WorkspaceImageSize", "TotalImageSize", }); + new java.lang.String[] { "WorkspaceImageSize", "TotalImageSize", "InitializerMetrics", }); + internal_static_gitpod_v1_WorkspaceSession_InitializerMetric_descriptor = + internal_static_gitpod_v1_WorkspaceSession_descriptor.getNestedTypes().get(3); + internal_static_gitpod_v1_WorkspaceSession_InitializerMetric_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_gitpod_v1_WorkspaceSession_InitializerMetric_descriptor, + new java.lang.String[] { "Duration", "Size", }); + internal_static_gitpod_v1_WorkspaceSession_InitializerMetrics_descriptor = + internal_static_gitpod_v1_WorkspaceSession_descriptor.getNestedTypes().get(4); + internal_static_gitpod_v1_WorkspaceSession_InitializerMetrics_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_gitpod_v1_WorkspaceSession_InitializerMetrics_descriptor, + new java.lang.String[] { "Git", "FileDownload", "Snapshot", "Backup", "Prebuild", "Composite", }); descriptor.resolveAllFeaturesImmutable(); io.gitpod.publicapi.v1.Editor.getDescriptor(); io.gitpod.publicapi.v1.Envvar.getDescriptor(); diff --git a/components/public-api/typescript-common/src/public-api-converter.spec.ts b/components/public-api/typescript-common/src/public-api-converter.spec.ts index 226e84c736778e..0dae99513a44ae 100644 --- a/components/public-api/typescript-common/src/public-api-converter.spec.ts +++ b/components/public-api/typescript-common/src/public-api-converter.spec.ts @@ -258,6 +258,69 @@ describe("PublicAPIConverter", () => { }); }); + describe("toDurationFromMillis", () => { + it("should convert 0 milliseconds to 0 seconds and 0 nanos", () => { + const result = converter.toDurationFromMillis(0); + expect(result.seconds).to.equal(BigInt(0)); + expect(result.nanos).to.equal(0); + }); + + it("should convert 999 milliseconds to 0 seconds and 999000000 nanos", () => { + const result = converter.toDurationFromMillis(999); + expect(result.seconds).to.equal(BigInt(0)); + expect(result.nanos).to.equal(999000000); + }); + + it("should convert 1000 milliseconds to 1 second and 0 nanos", () => { + const result = converter.toDurationFromMillis(1000); + expect(result.seconds).to.equal(BigInt(1)); + expect(result.nanos).to.equal(0); + }); + + it("should convert 1500 milliseconds to 1 second and 500000000 nanos", () => { + const result = converter.toDurationFromMillis(1500); + expect(result.seconds).to.equal(BigInt(1)); + expect(result.nanos).to.equal(500000000); + }); + + it("should convert 123456789 milliseconds to 123456 seconds and 789000000 nanos", () => { + const result = converter.toDurationFromMillis(123456789); + expect(result.seconds).to.equal(BigInt(123456)); + expect(result.nanos).to.equal(789000000); + }); + + it("should convert 987654321 milliseconds to 987654 seconds and 321000000 nanos", () => { + const result = converter.toDurationFromMillis(987654321); + expect(result.seconds).to.equal(BigInt(987654)); + expect(result.nanos).to.equal(321000000); + }); + + it("should convert 1001 milliseconds to 1 second and 1000000 nanos", () => { + const result = converter.toDurationFromMillis(1001); + expect(result.seconds).to.equal(BigInt(1)); + expect(result.nanos).to.equal(1000000); + }); + + it("should convert 2001 milliseconds to 2 seconds and 1000000 nanos", () => { + const result = converter.toDurationFromMillis(2001); + expect(result.seconds).to.equal(BigInt(2)); + expect(result.nanos).to.equal(1000000); + }); + + it("should convert 2011.506776 milliseconds to 2 seconds and 11506776 nanos", () => { + const result = converter.toDurationFromMillis(2011.506776); + expect(result.seconds).to.equal(BigInt(2)); + expect(result.nanos).to.equal(11506776); + }); + + it("should convert 2011.50677699 milliseconds to 2 seconds and 11506776 nanos", () => { + const result = converter.toDurationFromMillis(2011.50677699); + expect(result.seconds).to.equal(BigInt(2)); + expect(result.nanos).to.equal(11506776); + }); + }); + + describe("toDurationString", () => { it("should convert with empty string", () => { expect(converter.toDurationString(new Duration())).to.equal(""); diff --git a/components/public-api/typescript-common/src/public-api-converter.ts b/components/public-api/typescript-common/src/public-api-converter.ts index 26c6700f813aba..21a054a50af630 100644 --- a/components/public-api/typescript-common/src/public-api-converter.ts +++ b/components/public-api/typescript-common/src/public-api-converter.ts @@ -67,11 +67,16 @@ import { SupportedWorkspaceClass } from "@gitpod/gitpod-protocol/lib/workspace-c import { isWorkspaceRegion } from "@gitpod/gitpod-protocol/lib/workspace-cluster"; import { ConfigurationIdeConfig, + ImageMetrics, + InitializerMetric, + InitializerMetrics, PortProtocol, WorkspaceInstance, WorkspaceInstanceConditions, + WorkspaceInstanceMetrics, WorkspaceInstancePhase, WorkspaceInstancePort, + WorkspaceInstanceStatus, } from "@gitpod/gitpod-protocol/lib/workspace-instance"; import { AuthProvider, @@ -182,6 +187,8 @@ import { WorkspaceSession_WorkspaceContext, WorkspaceSession_WorkspaceContext_Repository, WorkspaceSession_WorkspaceContext_RefType, + WorkspaceSession_InitializerMetrics, + WorkspaceSession_InitializerMetric, } from "@gitpod/public-api/lib/gitpod/v1/workspace_pb"; import { BigIntToJson } from "@gitpod/gitpod-protocol/lib/util/stringify"; import { getPrebuildLogPath } from "./prebuild-utils"; @@ -221,13 +228,7 @@ export class PublicAPIConverter { result.stoppedTime = Timestamp.fromDate(new Date(arg.instance.stoppedTime)); } - const { metrics } = arg.instance.status; - result.metrics = new WorkspaceSession_Metrics({ - totalImageSize: metrics?.image?.totalSize ? BigInt(metrics.image.totalSize) : undefined, - workspaceImageSize: metrics?.image?.workspaceImageSize - ? BigInt(metrics.image.workspaceImageSize) - : undefined, - }); + result.metrics = this.toWorkspaceSessionMetrics(arg.instance.status, arg.metrics); result.id = arg.instance.id; result.owner = owner; @@ -236,6 +237,56 @@ export class PublicAPIConverter { return result; } + toWorkspaceSessionMetrics(status: WorkspaceInstanceStatus, metrics: WorkspaceInstanceMetrics | undefined): WorkspaceSession_Metrics { + // TODO(gpl): Drop the `status` parameter and use `metrics` only once we rolled out the "metrics" table for long enough. + const image: ImageMetrics | undefined = status.metrics?.image || metrics?.image; + + const data: PartialMessage = { }; + if (image?.totalSize) { + data.totalImageSize = BigInt(image.totalSize); + } + if (image?.workspaceImageSize) { + data.workspaceImageSize = BigInt(image.workspaceImageSize); + } + + if (metrics?.initializerMetrics) { + data.initializerMetrics = this.toInitializerMetrics(metrics.initializerMetrics); + } + + return new WorkspaceSession_Metrics(data); + } + + toInitializerMetrics(metrics: InitializerMetrics): WorkspaceSession_InitializerMetrics { + const result = new WorkspaceSession_InitializerMetrics(); + if (metrics.git) { + result.git = this.toInitializerMetric(metrics.git); + } + if (metrics.fileDownload) { + result.fileDownload = this.toInitializerMetric(metrics.fileDownload); + } + if (metrics.snapshot) { + result.snapshot = this.toInitializerMetric(metrics.snapshot); + } + if (metrics.backup) { + result.backup = this.toInitializerMetric(metrics.backup); + } + if (metrics.prebuild) { + result.prebuild = this.toInitializerMetric(metrics.prebuild); + } + if (metrics.composite) { + result.composite = this.toInitializerMetric(metrics.composite); + } + + return result; + } + + toInitializerMetric(metric: InitializerMetric): WorkspaceSession_InitializerMetric { + const result = new WorkspaceSession_InitializerMetric(); + result.duration = this.toDurationFromMillis(metric.duration); + result.size = BigInt(metric.size); + return result; + } + toWorkspace(arg: WorkspaceInfo | WorkspaceInstance, current?: Workspace): Workspace { const workspace = current ?? new Workspace(); @@ -1751,8 +1802,20 @@ export class PublicAPIConverter { */ toDuration(from: string): Duration { const millis = parseGoDurationToMs(from); - const seconds = BigInt(Math.floor(millis / 1000)); - const nanos = (millis % 1000) * 1000000; + return this.toDurationFromMillis(millis); + } + + /** + * Converts a duration number in milliseconds to a Duration + * @param millis + * @returns a Duration where `seconds` and `nanos` combined result in the given `millis` + */ + toDurationFromMillis(millis: number): Duration { + // we convert to BigInt directly, to avoid working with lossy Number + const nanosB = BigInt(Math.floor(millis * 1000000)); + const seconds = nanosB / BigInt(1000000000); + const nanosRestB = nanosB % BigInt(1000000000); + const nanos = Number(nanosRestB); return new Duration({ seconds, nanos, diff --git a/components/public-api/typescript/src/gitpod/v1/workspace_pb.ts b/components/public-api/typescript/src/gitpod/v1/workspace_pb.ts index d5f7bd48587c64..689c98e2b049ca 100644 --- a/components/public-api/typescript/src/gitpod/v1/workspace_pb.ts +++ b/components/public-api/typescript/src/gitpod/v1/workspace_pb.ts @@ -3989,6 +3989,13 @@ export class WorkspaceSession_Metrics extends Message */ totalImageSize = protoInt64.zero; + /** + * initializer_metrics are all metrics exported from the content initializer on workspace start + * + * @generated from field: gitpod.v1.WorkspaceSession.InitializerMetrics initializer_metrics = 3; + */ + initializerMetrics?: WorkspaceSession_InitializerMetrics; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -3999,6 +4006,7 @@ export class WorkspaceSession_Metrics extends Message static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "workspace_image_size", kind: "scalar", T: 3 /* ScalarType.INT64 */ }, { no: 2, name: "total_image_size", kind: "scalar", T: 3 /* ScalarType.INT64 */ }, + { no: 3, name: "initializer_metrics", kind: "message", T: WorkspaceSession_InitializerMetrics }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): WorkspaceSession_Metrics { @@ -4017,3 +4025,141 @@ export class WorkspaceSession_Metrics extends Message return proto3.util.equals(WorkspaceSession_Metrics, a, b); } } + +/** + * Add these new message definitions + * + * @generated from message gitpod.v1.WorkspaceSession.InitializerMetric + */ +export class WorkspaceSession_InitializerMetric extends Message { + /** + * duration in seconds + * + * @generated from field: google.protobuf.Duration duration = 1; + */ + duration?: Duration; + + /** + * size in bytes + * + * @generated from field: uint64 size = 2; + */ + size = protoInt64.zero; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "gitpod.v1.WorkspaceSession.InitializerMetric"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "duration", kind: "message", T: Duration }, + { no: 2, name: "size", kind: "scalar", T: 4 /* ScalarType.UINT64 */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): WorkspaceSession_InitializerMetric { + return new WorkspaceSession_InitializerMetric().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): WorkspaceSession_InitializerMetric { + return new WorkspaceSession_InitializerMetric().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): WorkspaceSession_InitializerMetric { + return new WorkspaceSession_InitializerMetric().fromJsonString(jsonString, options); + } + + static equals(a: WorkspaceSession_InitializerMetric | PlainMessage | undefined, b: WorkspaceSession_InitializerMetric | PlainMessage | undefined): boolean { + return proto3.util.equals(WorkspaceSession_InitializerMetric, a, b); + } +} + +/** + * @generated from message gitpod.v1.WorkspaceSession.InitializerMetrics + */ +export class WorkspaceSession_InitializerMetrics extends Message { + /** + * git contains metrics for the git initializer step + * This is set whenever a `git clone` is issued (mostly on first workspace start) + * + * @generated from field: gitpod.v1.WorkspaceSession.InitializerMetric git = 1; + */ + git?: WorkspaceSession_InitializerMetric; + + /** + * file_download contains metrics for the file download initializer step + * This is set for injecting "additionalFiles" into the workspace. + * + * @generated from field: gitpod.v1.WorkspaceSession.InitializerMetric file_download = 2; + */ + fileDownload?: WorkspaceSession_InitializerMetric; + + /** + * snapshot contains metrics for the snapshot initializer step + * This used for workspaces started from snapshots. + * + * @generated from field: gitpod.v1.WorkspaceSession.InitializerMetric snapshot = 3; + */ + snapshot?: WorkspaceSession_InitializerMetric; + + /** + * backup contains metrics for the backup initializer step + * This is set on subsequent workspace starts, when the file system is restored from backup. + * + * @generated from field: gitpod.v1.WorkspaceSession.InitializerMetric backup = 4; + */ + backup?: WorkspaceSession_InitializerMetric; + + /** + * prebuild contains metrics for the prebuild initializer step + * This is set if the workspace is based on a prebuild. + * + * @generated from field: gitpod.v1.WorkspaceSession.InitializerMetric prebuild = 5; + */ + prebuild?: WorkspaceSession_InitializerMetric; + + /** + * composite contains metrics for the composite initializer step + * This reports the total if multiple steps are run to initialize the workspace content. + * Examples are: + * - "additionalFiles" injected into the workspace + * - "additionalRepositories" configured + * - incremental Prebuilds + * + * @generated from field: gitpod.v1.WorkspaceSession.InitializerMetric composite = 6; + */ + composite?: WorkspaceSession_InitializerMetric; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "gitpod.v1.WorkspaceSession.InitializerMetrics"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "git", kind: "message", T: WorkspaceSession_InitializerMetric }, + { no: 2, name: "file_download", kind: "message", T: WorkspaceSession_InitializerMetric }, + { no: 3, name: "snapshot", kind: "message", T: WorkspaceSession_InitializerMetric }, + { no: 4, name: "backup", kind: "message", T: WorkspaceSession_InitializerMetric }, + { no: 5, name: "prebuild", kind: "message", T: WorkspaceSession_InitializerMetric }, + { no: 6, name: "composite", kind: "message", T: WorkspaceSession_InitializerMetric }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): WorkspaceSession_InitializerMetrics { + return new WorkspaceSession_InitializerMetrics().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): WorkspaceSession_InitializerMetrics { + return new WorkspaceSession_InitializerMetrics().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): WorkspaceSession_InitializerMetrics { + return new WorkspaceSession_InitializerMetrics().fromJsonString(jsonString, options); + } + + static equals(a: WorkspaceSession_InitializerMetrics | PlainMessage | undefined, b: WorkspaceSession_InitializerMetrics | PlainMessage | undefined): boolean { + return proto3.util.equals(WorkspaceSession_InitializerMetrics, a, b); + } +} diff --git a/components/ws-daemon/cmd/content-initializer.go b/components/ws-daemon/cmd/content-initializer.go index 556f26d20b3f11..af2ac5a69f9af3 100644 --- a/components/ws-daemon/cmd/content-initializer.go +++ b/components/ws-daemon/cmd/content-initializer.go @@ -5,6 +5,8 @@ package cmd import ( + "os" + "github.com/spf13/cobra" "github.com/gitpod-io/gitpod/ws-daemon/pkg/content" @@ -16,7 +18,15 @@ var contentInitializerCmd = &cobra.Command{ Short: "fork'ed by ws-daemon to initialize content", Args: cobra.ExactArgs(0), RunE: func(cmd *cobra.Command, args []string) error { - return content.RunInitializerChild() + + statsFd := os.NewFile(content.RUN_INITIALIZER_CHILD_STATS_FD, "stats") + + err := content.RunInitializerChild(statsFd) + if err != nil { + return err + } + + return nil }, } diff --git a/components/ws-daemon/cmd/content-initializer/main.go b/components/ws-daemon/cmd/content-initializer/main.go index 7f892564e25f08..bf0648e6996c71 100644 --- a/components/ws-daemon/cmd/content-initializer/main.go +++ b/components/ws-daemon/cmd/content-initializer/main.go @@ -21,9 +21,11 @@ func main() { log.Init("content-initializer", "", true, false) tracing.Init("content-initializer") - err := content.RunInitializerChild() + statsFd := os.NewFile(content.RUN_INITIALIZER_CHILD_STATS_FD, "stats") + + err := content.RunInitializerChild(statsFd) if err != nil { - errfd := os.NewFile(uintptr(3), "errout") + errfd := os.NewFile(content.RUN_INITIALIZER_CHILD_ERROUT_FD, "errout") _, _ = fmt.Fprintf(errfd, err.Error()) os.Exit(content.FAIL_CONTENT_INITIALIZER_EXIT_CODE) diff --git a/components/ws-daemon/cmd/debug-run-initializer.go b/components/ws-daemon/cmd/debug-run-initializer.go index 86df4c24112835..09e12cf9faf6a2 100644 --- a/components/ws-daemon/cmd/debug-run-initializer.go +++ b/components/ws-daemon/cmd/debug-run-initializer.go @@ -22,7 +22,7 @@ var debugRunInitializer = &cobra.Command{ RunE: func(cmd *cobra.Command, args []string) error { dst := args[0] log.WithField("dst", dst).Info("running content initializer") - return content.RunInitializer(context.Background(), dst, &api.WorkspaceInitializer{ + _, err := content.RunInitializer(context.Background(), dst, &api.WorkspaceInitializer{ Spec: &api.WorkspaceInitializer_Git{ Git: &api.GitInitializer{ RemoteUri: "https://github.com/gitpod-io/gitpod.git", @@ -35,6 +35,7 @@ var debugRunInitializer = &cobra.Command{ }, }, }, make(map[string]storage.DownloadInfo), content.RunInitializerOpts{}) + return err }, } diff --git a/components/ws-daemon/debug.Dockerfile b/components/ws-daemon/debug.Dockerfile index 49ff1c205af648..cb005ba682057f 100644 --- a/components/ws-daemon/debug.Dockerfile +++ b/components/ws-daemon/debug.Dockerfile @@ -9,7 +9,7 @@ RUN go get -u github.com/go-delve/delve/cmd/dlv FROM cgr.dev/chainguard/wolfi-base:latest@sha256:a7db49b55bd97c12cd686272325bbac236830111db336e084b89f5c816ab0537 as dl WORKDIR /dl RUN apk add --no-cache curl file \ - && curl -OsSL https://github.com/opencontainers/runc/releases/download/v1.1.12/runc.amd64 \ + && curl -OsSL https://github.com/opencontainers/runc/releases/download/v1.1.14/runc.amd64 \ && chmod +x runc.amd64 \ && if ! file runc.amd64 | grep -iq "ELF 64-bit LSB pie executable"; then echo "runc.amd64 is not a binary file"; exit 1;fi diff --git a/components/ws-daemon/pkg/content/initializer.go b/components/ws-daemon/pkg/content/initializer.go index cee0ea8fc931ca..12a946af10f35c 100644 --- a/components/ws-daemon/pkg/content/initializer.go +++ b/components/ws-daemon/pkg/content/initializer.go @@ -9,10 +9,11 @@ import ( "context" "encoding/json" "errors" - "io/ioutil" + "io" "os" "os/exec" "path/filepath" + "strconv" "strings" "syscall" "time" @@ -122,21 +123,22 @@ func CollectRemoteContent(ctx context.Context, rs storage.DirectAccess, ps stora } // RunInitializer runs a content initializer in a user, PID and mount namespace to isolate it from ws-daemon -func RunInitializer(ctx context.Context, destination string, initializer *csapi.WorkspaceInitializer, remoteContent map[string]storage.DownloadInfo, opts RunInitializerOpts) (err error) { +func RunInitializer(ctx context.Context, destination string, initializer *csapi.WorkspaceInitializer, remoteContent map[string]storage.DownloadInfo, opts RunInitializerOpts) (*csapi.InitializerMetrics, error) { //nolint:ineffassign,staticcheck span, ctx := opentracing.StartSpanFromContext(ctx, "RunInitializer") + var err error defer tracing.FinishSpan(span, &err) // it's possible the destination folder doesn't exist yet, because the kubelet hasn't created it yet. // If we fail to create the folder, it either already exists, or we'll fail when we try and mount it. err = os.MkdirAll(destination, 0755) if err != nil && !os.IsExist(err) { - return xerrors.Errorf("cannot mkdir destination: %w", err) + return nil, xerrors.Errorf("cannot mkdir destination: %w", err) } init, err := proto.Marshal(initializer) if err != nil { - return err + return nil, err } if opts.GID == 0 { @@ -148,13 +150,13 @@ func RunInitializer(ctx context.Context, destination string, initializer *csapi. tmpdir, err := os.MkdirTemp("", "content-init") if err != nil { - return err + return nil, err } defer os.RemoveAll(tmpdir) err = os.MkdirAll(filepath.Join(tmpdir, "rootfs"), 0755) if err != nil { - return err + return nil, err } msg := msgInitContent{ @@ -169,11 +171,11 @@ func RunInitializer(ctx context.Context, destination string, initializer *csapi. } fc, err := json.MarshalIndent(msg, "", " ") if err != nil { - return err + return nil, err } err = os.WriteFile(filepath.Join(tmpdir, "rootfs", "content.json"), fc, 0644) if err != nil { - return err + return nil, err } spec := specconv.Example() @@ -226,11 +228,11 @@ func RunInitializer(ctx context.Context, destination string, initializer *csapi. fc, err = json.MarshalIndent(spec, "", " ") if err != nil { - return err + return nil, err } err = os.WriteFile(filepath.Join(tmpdir, "config.json"), fc, 0644) if err != nil { - return err + return nil, err } args := []string{"--root", "state"} @@ -243,26 +245,29 @@ func RunInitializer(ctx context.Context, destination string, initializer *csapi. if opts.OWI.InstanceID == "" { id, err := uuid.NewRandom() if err != nil { - return err + return nil, err } name = "init-rnd-" + id.String() } else { name = "init-ws-" + opts.OWI.InstanceID } - args = append(args, "--log-format", "json", "run") - args = append(args, "--preserve-fds", "1") - args = append(args, name) - + // pass a pipe "file" to the content init process as fd 3 to capture the error output errIn, errOut, err := os.Pipe() if err != nil { - return err + return nil, err } - errch := make(chan []byte, 1) - go func() { - errmsg, _ := ioutil.ReadAll(errIn) - errch <- errmsg - }() + + // pass a pipe "file" to the content init process as fd 4 to capture the metrics output + statsIn, statsOut, err := os.Pipe() + if err != nil { + return nil, err + } + + args = append(args, "--log-format", "json", "run") + extraFiles := []*os.File{errOut, statsOut} + args = append(args, "--preserve-fds", strconv.Itoa(len(extraFiles))) + args = append(args, name) var cmdOut bytes.Buffer cmd := exec.Command("runc", args...) @@ -270,34 +275,87 @@ func RunInitializer(ctx context.Context, destination string, initializer *csapi. cmd.Stdout = &cmdOut cmd.Stderr = os.Stderr cmd.Stdin = os.Stdin - cmd.ExtraFiles = []*os.File{errOut} + cmd.ExtraFiles = extraFiles err = cmd.Run() log.FromBuffer(&cmdOut, log.WithFields(opts.OWI.Fields())) - errOut.Close() - var errmsg []byte - select { - case errmsg = <-errch: - case <-time.After(1 * time.Second): - errmsg = []byte("failed to read content initializer response") - } + // read contents of the extra files + errOut.Close() + statsOut.Close() + errmsg, statsBytes := waitForAndReadExtraFiles(errIn, statsIn) if err != nil { if exiterr, ok := err.(*exec.ExitError); ok { // The program has exited with an exit code != 0. If it's FAIL_CONTENT_INITIALIZER_EXIT_CODE, it was deliberate. if status, ok := exiterr.Sys().(syscall.WaitStatus); ok && status.ExitStatus() == FAIL_CONTENT_INITIALIZER_EXIT_CODE { log.WithError(err).WithFields(opts.OWI.Fields()).WithField("errmsgsize", len(errmsg)).WithField("exitCode", status.ExitStatus()).WithField("args", args).Error("content init failed") - return xerrors.Errorf(string(errmsg)) + return nil, xerrors.Errorf(string(errmsg)) } } - return err + return nil, err } - return nil + stats := parseStats(statsBytes) + return stats, nil } +// waitForAndReadExtraFiles tries to read the content of the extra files passed to the content initializer, and waits up to 1s to do so +func waitForAndReadExtraFiles(errIn *os.File, statsIn *os.File) (errmsg []byte, statsBytes []byte) { + // read err + errch := make(chan []byte, 1) + go func() { + errmsg, _ := io.ReadAll(errIn) + errch <- errmsg + }() + + // read stats + statsCh := make(chan []byte, 1) + go func() { + statsBytes, readErr := io.ReadAll(statsIn) + if readErr != nil { + log.WithError(readErr).Warn("cannot read stats") + } + log.WithField("statsBytes", log.TrustedValueWrap{Value: string(statsBytes)}).Debug("read stats") + statsCh <- statsBytes + }() + + readFiles := 0 + for { + select { + case errmsg = <-errch: + readFiles += 1 + case statsBytes = <-statsCh: + readFiles += 1 + case <-time.After(1 * time.Second): + if errmsg == nil { + errmsg = []byte("failed to read content initializer response") + } + return + } + if readFiles == 2 { + return + } + } +} + +func parseStats(statsBytes []byte) *csapi.InitializerMetrics { + var stats csapi.InitializerMetrics + err := json.Unmarshal(statsBytes, &stats) + if err != nil { + log.WithError(err).WithField("bytes", log.TrustedValueWrap{Value: statsBytes}).Warn("cannot unmarshal stats") + return nil + } + return &stats +} + +// RUN_INITIALIZER_CHILD_ERROUT_FD is the fileDescriptor of the "errout" file descriptor passed to the content initializer +const RUN_INITIALIZER_CHILD_ERROUT_FD = 3 + +// RUN_INITIALIZER_CHILD_STATS_FD is the fileDescriptor of the "stats" file descriptor passed to the content initializer +const RUN_INITIALIZER_CHILD_STATS_FD = 4 + // RunInitializerChild is the function that's expected to run when we call `/proc/self/exe content-initializer` -func RunInitializerChild() (err error) { +func RunInitializerChild(statsFd *os.File) (err error) { fc, err := os.ReadFile("/content.json") if err != nil { return err @@ -357,9 +415,32 @@ func RunInitializerChild() (err error) { return err } + // Serialize metrics, so we can pass them back to the caller + if statsFd != nil { + defer statsFd.Close() + writeInitializerStats(statsFd, &stats) + } else { + log.Warn("no stats file descriptor provided") + } + return nil } +func writeInitializerStats(statsFd *os.File, stats *csapi.InitializerMetrics) { + serializedStats, err := json.Marshal(stats) + if err != nil { + log.WithError(err).Warn("cannot serialize initializer stats") + return + } + + log.WithField("stats", log.TrustedValueWrap{Value: string(serializedStats)}).Debug("writing initializer stats to fd") + _, writeErr := statsFd.Write(serializedStats) + if writeErr != nil { + log.WithError(writeErr).Warn("error writing initializer stats to fd") + return + } +} + var _ storage.DirectAccess = &remoteContentStorage{} type remoteContentStorage struct { diff --git a/components/ws-daemon/pkg/controller/mock.go b/components/ws-daemon/pkg/controller/mock.go index 4156704848106b..852533079c9996 100644 --- a/components/ws-daemon/pkg/controller/mock.go +++ b/components/ws-daemon/pkg/controller/mock.go @@ -1,4 +1,4 @@ -// Copyright (c) 2024 Gitpod GmbH. All rights reserved. +// Copyright (c) 2025 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. @@ -70,12 +70,13 @@ func (mr *MockWorkspaceOperationsMockRecorder) DeleteWorkspace(arg0, arg1 interf } // InitWorkspace mocks base method. -func (m *MockWorkspaceOperations) InitWorkspace(arg0 context.Context, arg1 InitOptions) (string, error) { +func (m *MockWorkspaceOperations) InitWorkspace(arg0 context.Context, arg1 InitOptions) (*api.InitializerMetrics, string, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "InitWorkspace", arg0, arg1) - ret0, _ := ret[0].(string) - ret1, _ := ret[1].(error) - return ret0, ret1 + ret0, _ := ret[0].(*api.InitializerMetrics) + ret1, _ := ret[1].(string) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 } // InitWorkspace indicates an expected call of InitWorkspace. diff --git a/components/ws-daemon/pkg/controller/workspace_controller.go b/components/ws-daemon/pkg/controller/workspace_controller.go index 12e8fece0239e6..eb0fc194a5fccb 100644 --- a/components/ws-daemon/pkg/controller/workspace_controller.go +++ b/components/ws-daemon/pkg/controller/workspace_controller.go @@ -179,7 +179,7 @@ func (wsc *WorkspaceController) handleWorkspaceInit(ctx context.Context, ws *wor } initStart := time.Now() - failure, initErr := wsc.operations.InitWorkspace(ctx, InitOptions{ + stats, failure, initErr := wsc.operations.InitWorkspace(ctx, InitOptions{ Meta: WorkspaceMeta{ Owner: ws.Spec.Ownership.Owner, WorkspaceID: ws.Spec.Ownership.WorkspaceID, @@ -190,11 +190,13 @@ func (wsc *WorkspaceController) handleWorkspaceInit(ctx context.Context, ws *wor StorageQuota: ws.Spec.StorageQuota, }) + initMetrics := initializerMetricsFromInitializerStats(stats) err = retry.RetryOnConflict(retryParams, func() error { if err := wsc.Get(ctx, req.NamespacedName, ws); err != nil { return err } + // persist init failure/success if failure != "" { log.Error(initErr, "could not initialize workspace", "name", ws.Name) ws.Status.SetCondition(workspacev1.NewWorkspaceConditionContentReady(metav1.ConditionFalse, workspacev1.ReasonInitializationFailure, failure)) @@ -202,6 +204,11 @@ func (wsc *WorkspaceController) handleWorkspaceInit(ctx context.Context, ws *wor ws.Status.SetCondition(workspacev1.NewWorkspaceConditionContentReady(metav1.ConditionTrue, workspacev1.ReasonInitializationSuccess, "")) } + // persist initializer metrics + if initMetrics != nil { + ws.Status.InitializerMetrics = initMetrics + } + return wsc.Status().Update(ctx, ws) }) @@ -218,6 +225,50 @@ func (wsc *WorkspaceController) handleWorkspaceInit(ctx context.Context, ws *wor return ctrl.Result{}, nil } +func initializerMetricsFromInitializerStats(stats *csapi.InitializerMetrics) *workspacev1.InitializerMetrics { + if stats == nil { + return nil + } + + result := workspacev1.InitializerMetrics{} + for _, metric := range *stats { + switch metric.Type { + case "git": + result.Git = &workspacev1.InitializerStepMetric{ + Duration: &metav1.Duration{Duration: metric.Duration}, + Size: metric.Size, + } + case "fileDownload": + result.FileDownload = &workspacev1.InitializerStepMetric{ + Duration: &metav1.Duration{Duration: metric.Duration}, + Size: metric.Size, + } + case "snapshot": + result.Snapshot = &workspacev1.InitializerStepMetric{ + Duration: &metav1.Duration{Duration: metric.Duration}, + Size: metric.Size, + } + case "fromBackup": + result.Backup = &workspacev1.InitializerStepMetric{ + Duration: &metav1.Duration{Duration: metric.Duration}, + Size: metric.Size, + } + case "composite": + result.Composite = &workspacev1.InitializerStepMetric{ + Duration: &metav1.Duration{Duration: metric.Duration}, + Size: metric.Size, + } + case "prebuild": + result.Prebuild = &workspacev1.InitializerStepMetric{ + Duration: &metav1.Duration{Duration: metric.Duration}, + Size: metric.Size, + } + } + } + + return &result +} + func (wsc *WorkspaceController) handleWorkspaceRunning(ctx context.Context, ws *workspacev1.Workspace, req ctrl.Request) (result ctrl.Result, err error) { span, ctx := opentracing.StartSpanFromContext(ctx, "handleWorkspaceRunning") defer tracing.FinishSpan(span, &err) diff --git a/components/ws-daemon/pkg/controller/workspace_controller_test.go b/components/ws-daemon/pkg/controller/workspace_controller_test.go index 56c4afe67f5cd3..884a1b13bf216d 100644 --- a/components/ws-daemon/pkg/controller/workspace_controller_test.go +++ b/components/ws-daemon/pkg/controller/workspace_controller_test.go @@ -39,7 +39,7 @@ var _ = Describe("WorkspaceController", func() { defer mockCtrl.Finish() ops := NewMockWorkspaceOperations(mockCtrl) - ops.EXPECT().InitWorkspace(gomock.Any(), gomock.Any()).Return("", nil).Times(1) + ops.EXPECT().InitWorkspace(gomock.Any(), gomock.Any()).Return(&csapi.InitializerMetrics{}, "", nil).Times(1) workspaceCtrl.operations = ops _ = createSecret(fmt.Sprintf("%s-tokens", name), secretsNamespace) diff --git a/components/ws-daemon/pkg/controller/workspace_operations.go b/components/ws-daemon/pkg/controller/workspace_operations.go index 802ab7a19cb011..6c0d37a536093a 100644 --- a/components/ws-daemon/pkg/controller/workspace_operations.go +++ b/components/ws-daemon/pkg/controller/workspace_operations.go @@ -65,7 +65,7 @@ func registerConcurrentBackupMetrics(reg prometheus.Registerer, suffix string) ( //go:generate sh -c "go install github.com/golang/mock/mockgen@v1.6.0 && mockgen -destination=mock.go -package=controller . WorkspaceOperations" type WorkspaceOperations interface { // InitWorkspace initializes the workspace content - InitWorkspace(ctx context.Context, options InitOptions) (string, error) + InitWorkspace(ctx context.Context, options InitOptions) (*csapi.InitializerMetrics, string, error) // BackupWorkspace backups the content of the workspace BackupWorkspace(ctx context.Context, opts BackupOptions) (*csapi.GitStatus, error) // DeleteWorkspace deletes the content of the workspace from disk @@ -130,26 +130,26 @@ func NewWorkspaceOperations(config content.Config, provider *WorkspaceProvider, }, nil } -func (wso *DefaultWorkspaceOperations) InitWorkspace(ctx context.Context, options InitOptions) (string, error) { +func (wso *DefaultWorkspaceOperations) InitWorkspace(ctx context.Context, options InitOptions) (*csapi.InitializerMetrics, string, error) { ws, err := wso.provider.NewWorkspace(ctx, options.Meta.InstanceID, filepath.Join(wso.provider.Location, options.Meta.InstanceID), wso.creator(options.Meta.Owner, options.Meta.WorkspaceID, options.Meta.InstanceID, options.Initializer, false, options.StorageQuota)) if err != nil { - return "bug: cannot add workspace to store", xerrors.Errorf("cannot add workspace to store: %w", err) + return nil, "bug: cannot add workspace to store", xerrors.Errorf("cannot add workspace to store: %w", err) } rs, ok := ws.NonPersistentAttrs[session.AttrRemoteStorage].(storage.DirectAccess) if rs == nil || !ok { - return "bug: workspace has no remote storage", xerrors.Errorf("workspace has no remote storage") + return nil, "bug: workspace has no remote storage", xerrors.Errorf("workspace has no remote storage") } ps, err := storage.NewPresignedAccess(&wso.config.Storage) if err != nil { - return "bug: no presigned storage available", xerrors.Errorf("no presigned storage available: %w", err) + return nil, "bug: no presigned storage available", xerrors.Errorf("no presigned storage available: %w", err) } remoteContent, err := content.CollectRemoteContent(ctx, rs, ps, options.Meta.Owner, options.Initializer) if err != nil { - return "remote content error", xerrors.Errorf("remote content error: %w", err) + return nil, "remote content error", xerrors.Errorf("remote content error: %w", err) } // Initialize workspace. @@ -180,20 +180,20 @@ func (wso *DefaultWorkspaceOperations) InitWorkspace(ctx context.Context, option glog.WithFields(ws.OWI()).Warnf("cannot ensure clean slate for workspace %s (this might break content init): %v", ws.InstanceID, err) } - err = content.RunInitializer(ctx, ws.Location, options.Initializer, remoteContent, opts) + stats, err := content.RunInitializer(ctx, ws.Location, options.Initializer, remoteContent, opts) if err != nil { glog.WithFields(ws.OWI()).Infof("error running initializer %v", err) - return err.Error(), err + return nil, err.Error(), err } err = ws.Persist() if err != nil { - return "cannot persist workspace", err + return nil, "cannot persist workspace", err } glog.WithFields(ws.OWI()).Debug("content init done") - return "", nil + return stats, "", nil } func (wso *DefaultWorkspaceOperations) creator(owner, workspaceID, instanceID string, init *csapi.WorkspaceInitializer, storageDisabled bool, storageQuota int) WorkspaceFactory { diff --git a/components/ws-manager-api/core.proto b/components/ws-manager-api/core.proto index e298640cdd4ea6..82259a578cc35e 100644 --- a/components/ws-manager-api/core.proto +++ b/components/ws-manager-api/core.proto @@ -6,6 +6,7 @@ option go_package = "github.com/gitpod-io/gitpod/ws-manager/api"; import "content-service-api/initializer.proto"; import "google/protobuf/timestamp.proto"; +import "google/protobuf/duration.proto"; service WorkspaceManager { // getWorkspaces produces a list of running workspaces and their status @@ -321,6 +322,9 @@ message WorkspaceStatus { // auth provides authentication information about the workspace. This info is primarily used by ws-proxy. WorkspaceAuthentication auth = 9; + + // metrics contains metrics about the workspace + InitializerMetrics initializer_metrics = 11; } // IDEImage configures the IDE images a workspace will use @@ -757,3 +761,33 @@ message WorkspaceClass { // The cost of running a workspace of this class per minute expressed in credits float credits_per_minute = 4; } + +// Add these new message definitions +message InitializerMetric { + // duration in nanoseconds (standard protobuf duration) + google.protobuf.Duration duration = 1; + + // size in bytes + uint64 size = 2; +} + +message InitializerMetrics { + // git contains metrics for the git initializer step + InitializerMetric git = 1; + + // file_download contains metrics for the file download initializer step + InitializerMetric file_download = 2; + + // snapshot contains metrics for the snapshot initializer step + // This used for workspaces started from snapshots. + InitializerMetric snapshot = 3; + + // backup contains metrics for the backup initializer step + InitializerMetric backup = 4; + + // prebuild contains metrics for the prebuild initializer step + InitializerMetric prebuild = 5; + + // composite contains metrics for the composite initializer step + InitializerMetric composite = 6; +} diff --git a/components/ws-manager-api/go/core.pb.go b/components/ws-manager-api/go/core.pb.go index 3a2916d4b1847b..de13e2b5521792 100644 --- a/components/ws-manager-api/go/core.pb.go +++ b/components/ws-manager-api/go/core.pb.go @@ -1,4 +1,4 @@ -// Copyright (c) 2024 Gitpod GmbH. All rights reserved. +// Copyright (c) 2025 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. @@ -14,6 +14,7 @@ import ( api "github.com/gitpod-io/gitpod/content-service/api" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" @@ -2004,6 +2005,8 @@ type WorkspaceStatus struct { Runtime *WorkspaceRuntimeInfo `protobuf:"bytes,8,opt,name=runtime,proto3" json:"runtime,omitempty"` // auth provides authentication information about the workspace. This info is primarily used by ws-proxy. Auth *WorkspaceAuthentication `protobuf:"bytes,9,opt,name=auth,proto3" json:"auth,omitempty"` + // metrics contains metrics about the workspace + InitializerMetrics *InitializerMetrics `protobuf:"bytes,11,opt,name=initializer_metrics,json=initializerMetrics,proto3" json:"initializer_metrics,omitempty"` } func (x *WorkspaceStatus) Reset() { @@ -2108,6 +2111,13 @@ func (x *WorkspaceStatus) GetAuth() *WorkspaceAuthentication { return nil } +func (x *WorkspaceStatus) GetInitializerMetrics() *InitializerMetrics { + if x != nil { + return x.InitializerMetrics + } + return nil +} + // IDEImage configures the IDE images a workspace will use type IDEImage struct { state protoimpl.MessageState @@ -3394,6 +3404,158 @@ func (x *WorkspaceClass) GetCreditsPerMinute() float32 { return 0 } +// Add these new message definitions +type InitializerMetric struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Duration in nanoseconds (standard protobuf duration) + Duration *durationpb.Duration `protobuf:"bytes,1,opt,name=duration,proto3" json:"duration,omitempty"` + // Size in bytes + Size uint64 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"` +} + +func (x *InitializerMetric) Reset() { + *x = InitializerMetric{} + if protoimpl.UnsafeEnabled { + mi := &file_core_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InitializerMetric) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InitializerMetric) ProtoMessage() {} + +func (x *InitializerMetric) ProtoReflect() protoreflect.Message { + mi := &file_core_proto_msgTypes[44] + 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 InitializerMetric.ProtoReflect.Descriptor instead. +func (*InitializerMetric) Descriptor() ([]byte, []int) { + return file_core_proto_rawDescGZIP(), []int{44} +} + +func (x *InitializerMetric) GetDuration() *durationpb.Duration { + if x != nil { + return x.Duration + } + return nil +} + +func (x *InitializerMetric) GetSize() uint64 { + if x != nil { + return x.Size + } + return 0 +} + +type InitializerMetrics struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Git contains metrics for the git initializer step + Git *InitializerMetric `protobuf:"bytes,1,opt,name=git,proto3" json:"git,omitempty"` + // FileDownload contains metrics for the file download initializer step + FileDownload *InitializerMetric `protobuf:"bytes,2,opt,name=file_download,json=fileDownload,proto3" json:"file_download,omitempty"` + // Snapshot contains metrics for the snapshot initializer step + // This used for workspaces started from snapshots. + Snapshot *InitializerMetric `protobuf:"bytes,3,opt,name=snapshot,proto3" json:"snapshot,omitempty"` + // Backup contains metrics for the backup initializer step + Backup *InitializerMetric `protobuf:"bytes,4,opt,name=backup,proto3" json:"backup,omitempty"` + // Prebuild contains metrics for the prebuild initializer step + Prebuild *InitializerMetric `protobuf:"bytes,5,opt,name=prebuild,proto3" json:"prebuild,omitempty"` + // Composite contains metrics for the composite initializer step + Composite *InitializerMetric `protobuf:"bytes,6,opt,name=composite,proto3" json:"composite,omitempty"` +} + +func (x *InitializerMetrics) Reset() { + *x = InitializerMetrics{} + if protoimpl.UnsafeEnabled { + mi := &file_core_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InitializerMetrics) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InitializerMetrics) ProtoMessage() {} + +func (x *InitializerMetrics) ProtoReflect() protoreflect.Message { + mi := &file_core_proto_msgTypes[45] + 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 InitializerMetrics.ProtoReflect.Descriptor instead. +func (*InitializerMetrics) Descriptor() ([]byte, []int) { + return file_core_proto_rawDescGZIP(), []int{45} +} + +func (x *InitializerMetrics) GetGit() *InitializerMetric { + if x != nil { + return x.Git + } + return nil +} + +func (x *InitializerMetrics) GetFileDownload() *InitializerMetric { + if x != nil { + return x.FileDownload + } + return nil +} + +func (x *InitializerMetrics) GetSnapshot() *InitializerMetric { + if x != nil { + return x.Snapshot + } + return nil +} + +func (x *InitializerMetrics) GetBackup() *InitializerMetric { + if x != nil { + return x.Backup + } + return nil +} + +func (x *InitializerMetrics) GetPrebuild() *InitializerMetric { + if x != nil { + return x.Prebuild + } + return nil +} + +func (x *InitializerMetrics) GetComposite() *InitializerMetric { + if x != nil { + return x.Composite + } + return nil +} + type WorkspaceMetadata_ImageInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3408,7 +3570,7 @@ type WorkspaceMetadata_ImageInfo struct { func (x *WorkspaceMetadata_ImageInfo) Reset() { *x = WorkspaceMetadata_ImageInfo{} if protoimpl.UnsafeEnabled { - mi := &file_core_proto_msgTypes[46] + mi := &file_core_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3421,7 +3583,7 @@ func (x *WorkspaceMetadata_ImageInfo) String() string { func (*WorkspaceMetadata_ImageInfo) ProtoMessage() {} func (x *WorkspaceMetadata_ImageInfo) ProtoReflect() protoreflect.Message { - mi := &file_core_proto_msgTypes[46] + mi := &file_core_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3462,7 +3624,7 @@ type WorkspaceMetadata_Metrics struct { func (x *WorkspaceMetadata_Metrics) Reset() { *x = WorkspaceMetadata_Metrics{} if protoimpl.UnsafeEnabled { - mi := &file_core_proto_msgTypes[47] + mi := &file_core_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3475,7 +3637,7 @@ func (x *WorkspaceMetadata_Metrics) String() string { func (*WorkspaceMetadata_Metrics) ProtoMessage() {} func (x *WorkspaceMetadata_Metrics) ProtoReflect() protoreflect.Message { - mi := &file_core_proto_msgTypes[47] + mi := &file_core_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3510,7 +3672,7 @@ type EnvironmentVariable_SecretKeyRef struct { func (x *EnvironmentVariable_SecretKeyRef) Reset() { *x = EnvironmentVariable_SecretKeyRef{} if protoimpl.UnsafeEnabled { - mi := &file_core_proto_msgTypes[49] + mi := &file_core_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3523,7 +3685,7 @@ func (x *EnvironmentVariable_SecretKeyRef) String() string { func (*EnvironmentVariable_SecretKeyRef) ProtoMessage() {} func (x *EnvironmentVariable_SecretKeyRef) ProtoReflect() protoreflect.Message { - mi := &file_core_proto_msgTypes[49] + mi := &file_core_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3561,7 +3723,9 @@ var file_core_proto_rawDesc = []byte{ 0x76, 0x69, 0x63, 0x65, 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc9, 0x01, 0x0a, 0x0e, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc9, 0x01, 0x0a, 0x0e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 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, @@ -3700,7 +3864,7 @@ var file_core_proto_rawDesc = []byte{ 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x53, - 0x48, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc5, 0x03, 0x0a, + 0x48, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x91, 0x04, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, @@ -3729,359 +3893,392 @@ var file_core_proto_rawDesc = []byte{ 0x12, 0x32, 0x0a, 0x04, 0x61, 0x75, 0x74, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, - 0x61, 0x75, 0x74, 0x68, 0x22, 0x56, 0x0a, 0x08, 0x49, 0x44, 0x45, 0x49, 0x6d, 0x61, 0x67, 0x65, - 0x12, 0x17, 0x0a, 0x07, 0x77, 0x65, 0x62, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x77, 0x65, 0x62, 0x52, 0x65, 0x66, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x75, 0x70, - 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x52, 0x65, 0x66, - 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x22, 0xfb, 0x02, 0x0a, - 0x0d, 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, 0x1a, 0x0a, 0x08, 0x68, 0x65, 0x61, 0x64, 0x6c, - 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x68, 0x65, 0x61, 0x64, 0x6c, - 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x34, 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x64, - 0x5f, 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, 0x0c, 0x65, - 0x78, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x28, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x77, 0x73, 0x6d, 0x61, - 0x6e, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x69, 0x6d, 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, 0x12, 0x14, 0x0a, - 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x69, 0x64, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x5f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x69, - 0x64, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x12, 0x25, 0x0a, - 0x0e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x54, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x9e, 0x01, 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, 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, 0x12, 0x2f, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x50, - 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x7c, 0x0a, 0x12, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x30, 0x0a, 0x14, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x14, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0xd0, 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, 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, 0x12, 0x42, 0x0a, 0x0f, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x37, 0x0a, - 0x07, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x0d, 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, 0x07, 0x61, - 0x62, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x22, 0xb6, 0x04, 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, 0x12, 0x17, 0x0a, 0x04, 0x74, 0x65, 0x61, - 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x88, - 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x88, 0x01, - 0x01, 0x12, 0x3a, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x20, 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, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x1a, 0x5c, 0x0a, - 0x09, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x1a, 0x43, 0x0a, 0x07, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x38, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 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, - 0x49, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, - 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, - 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 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, - 0xfb, 0x05, 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, - 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, + 0x61, 0x75, 0x74, 0x68, 0x12, 0x4a, 0x0a, 0x13, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x12, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x22, 0x56, 0x0a, 0x08, 0x49, 0x44, 0x45, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x17, 0x0a, 0x07, + 0x77, 0x65, 0x62, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x77, + 0x65, 0x62, 0x52, 0x65, 0x66, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, + 0x73, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, + 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x52, 0x65, 0x66, 0x4a, 0x04, 0x08, 0x02, + 0x10, 0x03, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x22, 0xfb, 0x02, 0x0a, 0x0d, 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, 0x1a, 0x0a, 0x08, 0x68, 0x65, 0x61, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x68, 0x65, 0x61, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x12, + 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, + 0x6c, 0x12, 0x34, 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x5f, 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, 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, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x73, - 0x68, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0f, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x73, 0x68, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, - 0x79, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x73, 0x79, 0x73, 0x5f, 0x65, 0x6e, 0x76, 0x76, 0x61, 0x72, - 0x73, 0x18, 0x10, 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, 0x0a, 0x73, 0x79, 0x73, 0x45, 0x6e, 0x76, 0x76, 0x61, 0x72, 0x73, 0x12, + 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0c, 0x65, 0x78, 0x70, 0x6f, 0x73, + 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x28, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x74, 0x69, 0x6d, 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, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x69, 0x64, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x61, 0x79, - 0x65, 0x72, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x69, 0x64, 0x65, 0x49, 0x6d, + 0x65, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x69, 0x64, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6c, 0x6f, - 0x73, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, + 0x73, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x12, 0x29, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x6c, 0x69, 0x66, 0x65, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x69, - 0x6d, 0x75, 0x6d, 0x4c, 0x69, 0x66, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, - 0x03, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x4a, 0x04, 0x08, 0x0e, 0x10, 0x0f, 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, 0xc3, 0x01, 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, 0x12, 0x3f, 0x0a, 0x06, - 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 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, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, - 0x65, 0x79, 0x52, 0x65, 0x66, 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x1a, 0x41, 0x0a, - 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x66, 0x12, 0x1f, 0x0a, - 0x0b, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 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, 0x22, 0x23, 0x0a, 0x0d, 0x53, 0x53, 0x48, 0x50, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x22, 0x18, 0x0a, 0x16, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x99, 0x01, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x42, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, - 0x6c, 0x61, 0x73, 0x73, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, - 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x72, 0x65, 0x64, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x70, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x72, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, - 0x73, 0x73, 0x22, 0x93, 0x01, 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, - 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x72, - 0x65, 0x64, 0x69, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x73, 0x50, - 0x65, 0x72, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x2a, 0x3f, 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, 0x12, 0x09, - 0x0a, 0x05, 0x41, 0x42, 0x4f, 0x52, 0x54, 0x10, 0x02, 0x2a, 0x38, 0x0a, 0x0b, 0x54, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x57, 0x4f, 0x52, 0x4b, - 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x00, 0x12, - 0x12, 0x0a, 0x0e, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, - 0x54, 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, 0x3f, 0x0a, 0x0c, 0x50, 0x6f, - 0x72, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x4f, - 0x52, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x48, 0x54, 0x54, 0x50, - 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, - 0x43, 0x4f, 0x4c, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x01, 0x2a, 0x38, 0x0a, 0x16, 0x57, + 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x9e, 0x01, 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, 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, + 0x12, 0x2f, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x7c, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x30, 0x0a, + 0x14, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x34, 0x0a, 0x16, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x14, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, + 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0xd0, 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, 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, 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, 0x98, 0x01, 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, 0x21, - 0x0a, 0x1d, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, - 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x49, 0x4e, 0x47, 0x10, - 0x0a, 0x12, 0x11, 0x0a, 0x0d, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x50, - 0x53, 0x49, 0x10, 0x0b, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x53, 0x48, 0x5f, 0x43, 0x41, 0x10, 0x0c, - 0x22, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0x04, 0x08, 0x02, 0x10, 0x02, 0x22, 0x04, 0x08, 0x03, - 0x10, 0x03, 0x22, 0x04, 0x08, 0x04, 0x10, 0x04, 0x22, 0x04, 0x08, 0x05, 0x10, 0x05, 0x22, 0x04, - 0x08, 0x06, 0x10, 0x06, 0x22, 0x04, 0x08, 0x07, 0x10, 0x07, 0x22, 0x04, 0x08, 0x08, 0x10, 0x08, - 0x22, 0x04, 0x08, 0x09, 0x10, 0x09, 0x2a, 0x46, 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, 0x0e, 0x0a, 0x0a, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x42, 0x55, 0x49, 0x4c, 0x44, - 0x10, 0x04, 0x22, 0x04, 0x08, 0x02, 0x10, 0x02, 0x22, 0x04, 0x08, 0x03, 0x10, 0x03, 0x32, 0xe7, - 0x08, 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, + 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, 0x12, 0x42, 0x0a, 0x0f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x37, 0x0a, 0x07, 0x61, 0x62, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x18, 0x0d, 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, 0x07, 0x61, 0x62, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x22, 0xb6, 0x04, 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, 0x12, 0x17, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x1d, + 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x01, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, + 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, + 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, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x1a, 0x5c, 0x0a, 0x09, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x1a, 0x43, 0x0a, 0x07, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x12, 0x38, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 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, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 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, 0x42, 0x07, 0x0a, 0x05, + 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 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, 0xfb, 0x05, 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, 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, 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, + 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x73, 0x68, 0x5f, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0d, 0x73, 0x73, 0x68, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x3b, + 0x0a, 0x0b, 0x73, 0x79, 0x73, 0x5f, 0x65, 0x6e, 0x76, 0x76, 0x61, 0x72, 0x73, 0x18, 0x10, 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, + 0x0a, 0x73, 0x79, 0x73, 0x45, 0x6e, 0x76, 0x76, 0x61, 0x72, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x69, + 0x64, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x18, + 0x11, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x69, 0x64, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4c, + 0x61, 0x79, 0x65, 0x72, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, + 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x29, 0x0a, 0x10, + 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x6c, 0x69, 0x66, 0x65, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x4c, + 0x69, 0x66, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, + 0x07, 0x10, 0x08, 0x4a, 0x04, 0x08, 0x0e, 0x10, 0x0f, 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, 0xc3, 0x01, 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, 0x12, 0x3f, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 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, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, + 0x66, 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x1a, 0x41, 0x0a, 0x0c, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x66, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 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, 0x22, 0x23, 0x0a, 0x0d, 0x53, 0x53, 0x48, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x4b, 0x65, 0x79, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x99, 0x01, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, + 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x77, 0x73, 0x6d, 0x61, + 0x6e, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, + 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, + 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, + 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x22, 0x93, + 0x01, 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, + 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x10, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x73, 0x50, 0x65, 0x72, 0x4d, 0x69, + 0x6e, 0x75, 0x74, 0x65, 0x22, 0x5e, 0x0a, 0x11, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x35, 0x0a, 0x08, 0x64, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, + 0x73, 0x69, 0x7a, 0x65, 0x22, 0xd5, 0x02, 0x0a, 0x12, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2a, 0x0a, 0x03, 0x67, + 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, + 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x52, 0x03, 0x67, 0x69, 0x74, 0x12, 0x3d, 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x65, 0x5f, + 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x72, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x0c, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x6f, + 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x34, 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, + 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x30, 0x0a, 0x06, + 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x77, + 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x34, + 0x0a, 0x08, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x08, 0x70, 0x72, 0x65, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, + 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x2a, 0x3f, 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, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x42, 0x4f, 0x52, 0x54, 0x10, 0x02, 0x2a, 0x38, 0x0a, + 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x15, 0x0a, 0x11, + 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, + 0x54, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x5f, 0x54, 0x49, + 0x4d, 0x45, 0x4f, 0x55, 0x54, 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, 0x3f, + 0x0a, 0x0c, 0x50, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x16, + 0x0a, 0x12, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, + 0x48, 0x54, 0x54, 0x50, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x50, + 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x53, 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, + 0x98, 0x01, 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, 0x21, 0x0a, 0x1d, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, + 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, + 0x49, 0x4e, 0x47, 0x10, 0x0a, 0x12, 0x11, 0x0a, 0x0d, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, + 0x43, 0x45, 0x5f, 0x50, 0x53, 0x49, 0x10, 0x0b, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x53, 0x48, 0x5f, + 0x43, 0x41, 0x10, 0x0c, 0x22, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0x04, 0x08, 0x02, 0x10, 0x02, + 0x22, 0x04, 0x08, 0x03, 0x10, 0x03, 0x22, 0x04, 0x08, 0x04, 0x10, 0x04, 0x22, 0x04, 0x08, 0x05, + 0x10, 0x05, 0x22, 0x04, 0x08, 0x06, 0x10, 0x06, 0x22, 0x04, 0x08, 0x07, 0x10, 0x07, 0x22, 0x04, + 0x08, 0x08, 0x10, 0x08, 0x22, 0x04, 0x08, 0x09, 0x10, 0x09, 0x2a, 0x46, 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, 0x0e, 0x0a, 0x0a, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x42, + 0x55, 0x49, 0x4c, 0x44, 0x10, 0x04, 0x22, 0x04, 0x08, 0x02, 0x10, 0x02, 0x22, 0x04, 0x08, 0x03, + 0x10, 0x03, 0x32, 0xe7, 0x08, 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, 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, 0x12, 0x61, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x22, - 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x44, 0x65, 0x6c, 0x65, 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, 0x12, 0x61, 0x0a, 0x14, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x12, 0x22, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0c, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x2e, 0x77, 0x73, 0x6d, 0x61, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, + 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x2e, + 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x53, 0x48, 0x4b, + 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0f, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x77, 0x73, 0x6d, 0x61, 0x6e, 0x2e, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 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, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0f, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x77, 0x73, + 0x6d, 0x61, 0x6e, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x77, 0x73, 0x6d, + 0x61, 0x6e, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 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 ( @@ -4097,7 +4294,7 @@ func file_core_proto_rawDescGZIP() []byte { } var file_core_proto_enumTypes = make([]protoimpl.EnumInfo, 9) -var file_core_proto_msgTypes = make([]protoimpl.MessageInfo, 50) +var file_core_proto_msgTypes = make([]protoimpl.MessageInfo, 52) var file_core_proto_goTypes = []interface{}{ (StopWorkspacePolicy)(0), // 0: wsman.StopWorkspacePolicy (TimeoutType)(0), // 1: wsman.TimeoutType @@ -4152,18 +4349,21 @@ var file_core_proto_goTypes = []interface{}{ (*DescribeClusterRequest)(nil), // 50: wsman.DescribeClusterRequest (*DescribeClusterResponse)(nil), // 51: wsman.DescribeClusterResponse (*WorkspaceClass)(nil), // 52: wsman.WorkspaceClass - nil, // 53: wsman.MetadataFilter.AnnotationsEntry - nil, // 54: wsman.SubscribeResponse.HeaderEntry - (*WorkspaceMetadata_ImageInfo)(nil), // 55: wsman.WorkspaceMetadata.ImageInfo - (*WorkspaceMetadata_Metrics)(nil), // 56: wsman.WorkspaceMetadata.Metrics - nil, // 57: wsman.WorkspaceMetadata.AnnotationsEntry - (*EnvironmentVariable_SecretKeyRef)(nil), // 58: wsman.EnvironmentVariable.SecretKeyRef - (*api.GitStatus)(nil), // 59: contentservice.GitStatus - (*timestamppb.Timestamp)(nil), // 60: google.protobuf.Timestamp - (*api.WorkspaceInitializer)(nil), // 61: contentservice.WorkspaceInitializer + (*InitializerMetric)(nil), // 53: wsman.InitializerMetric + (*InitializerMetrics)(nil), // 54: wsman.InitializerMetrics + nil, // 55: wsman.MetadataFilter.AnnotationsEntry + nil, // 56: wsman.SubscribeResponse.HeaderEntry + (*WorkspaceMetadata_ImageInfo)(nil), // 57: wsman.WorkspaceMetadata.ImageInfo + (*WorkspaceMetadata_Metrics)(nil), // 58: wsman.WorkspaceMetadata.Metrics + nil, // 59: wsman.WorkspaceMetadata.AnnotationsEntry + (*EnvironmentVariable_SecretKeyRef)(nil), // 60: wsman.EnvironmentVariable.SecretKeyRef + (*api.GitStatus)(nil), // 61: contentservice.GitStatus + (*timestamppb.Timestamp)(nil), // 62: google.protobuf.Timestamp + (*api.WorkspaceInitializer)(nil), // 63: contentservice.WorkspaceInitializer + (*durationpb.Duration)(nil), // 64: google.protobuf.Duration } var file_core_proto_depIdxs = []int32{ - 53, // 0: wsman.MetadataFilter.annotations:type_name -> wsman.MetadataFilter.AnnotationsEntry + 55, // 0: wsman.MetadataFilter.annotations:type_name -> wsman.MetadataFilter.AnnotationsEntry 9, // 1: wsman.GetWorkspacesRequest.must_match:type_name -> wsman.MetadataFilter 36, // 2: wsman.GetWorkspacesResponse.status:type_name -> wsman.WorkspaceStatus 42, // 3: wsman.StartWorkspaceRequest.metadata:type_name -> wsman.WorkspaceMetadata @@ -4173,7 +4373,7 @@ var file_core_proto_depIdxs = []int32{ 36, // 7: wsman.DescribeWorkspaceResponse.status:type_name -> wsman.WorkspaceStatus 9, // 8: wsman.SubscribeRequest.must_match:type_name -> wsman.MetadataFilter 36, // 9: wsman.SubscribeResponse.status:type_name -> wsman.WorkspaceStatus - 54, // 10: wsman.SubscribeResponse.header:type_name -> wsman.SubscribeResponse.HeaderEntry + 56, // 10: wsman.SubscribeResponse.header:type_name -> wsman.SubscribeResponse.HeaderEntry 1, // 11: wsman.SetTimeoutRequest.type:type_name -> wsman.TimeoutType 39, // 12: wsman.ControlPortRequest.spec:type_name -> wsman.PortSpec 2, // 13: wsman.ControlAdmissionRequest.level:type_name -> wsman.AdmissionLevel @@ -4182,71 +4382,79 @@ var file_core_proto_depIdxs = []int32{ 38, // 16: wsman.WorkspaceStatus.spec:type_name -> wsman.WorkspaceSpec 6, // 17: wsman.WorkspaceStatus.phase:type_name -> wsman.WorkspacePhase 41, // 18: wsman.WorkspaceStatus.conditions:type_name -> wsman.WorkspaceConditions - 59, // 19: wsman.WorkspaceStatus.repo:type_name -> contentservice.GitStatus + 61, // 19: wsman.WorkspaceStatus.repo:type_name -> contentservice.GitStatus 43, // 20: wsman.WorkspaceStatus.runtime:type_name -> wsman.WorkspaceRuntimeInfo 44, // 21: wsman.WorkspaceStatus.auth:type_name -> wsman.WorkspaceAuthentication - 39, // 22: wsman.WorkspaceSpec.exposed_ports:type_name -> wsman.PortSpec - 8, // 23: wsman.WorkspaceSpec.type:type_name -> wsman.WorkspaceType - 37, // 24: wsman.WorkspaceSpec.ide_image:type_name -> wsman.IDEImage - 3, // 25: wsman.PortSpec.visibility:type_name -> wsman.PortVisibility - 4, // 26: wsman.PortSpec.protocol:type_name -> wsman.PortProtocol - 5, // 27: wsman.WorkspaceConditions.pulling_images:type_name -> wsman.WorkspaceConditionBool - 5, // 28: wsman.WorkspaceConditions.final_backup_complete:type_name -> wsman.WorkspaceConditionBool - 5, // 29: wsman.WorkspaceConditions.deployed:type_name -> wsman.WorkspaceConditionBool - 5, // 30: wsman.WorkspaceConditions.network_not_ready:type_name -> wsman.WorkspaceConditionBool - 60, // 31: wsman.WorkspaceConditions.first_user_activity:type_name -> google.protobuf.Timestamp - 5, // 32: wsman.WorkspaceConditions.stopped_by_request:type_name -> wsman.WorkspaceConditionBool - 40, // 33: wsman.WorkspaceConditions.volume_snapshot:type_name -> wsman.VolumeSnapshotInfo - 5, // 34: wsman.WorkspaceConditions.aborted:type_name -> wsman.WorkspaceConditionBool - 60, // 35: wsman.WorkspaceMetadata.started_at:type_name -> google.protobuf.Timestamp - 57, // 36: wsman.WorkspaceMetadata.annotations:type_name -> wsman.WorkspaceMetadata.AnnotationsEntry - 56, // 37: wsman.WorkspaceMetadata.metrics:type_name -> wsman.WorkspaceMetadata.Metrics - 2, // 38: wsman.WorkspaceAuthentication.admission:type_name -> wsman.AdmissionLevel - 7, // 39: wsman.StartWorkspaceSpec.feature_flags:type_name -> wsman.WorkspaceFeatureFlag - 61, // 40: wsman.StartWorkspaceSpec.initializer:type_name -> contentservice.WorkspaceInitializer - 39, // 41: wsman.StartWorkspaceSpec.ports:type_name -> wsman.PortSpec - 47, // 42: wsman.StartWorkspaceSpec.envvars:type_name -> wsman.EnvironmentVariable - 46, // 43: wsman.StartWorkspaceSpec.git:type_name -> wsman.GitSpec - 2, // 44: wsman.StartWorkspaceSpec.admission:type_name -> wsman.AdmissionLevel - 37, // 45: wsman.StartWorkspaceSpec.ide_image:type_name -> wsman.IDEImage - 47, // 46: wsman.StartWorkspaceSpec.sys_envvars:type_name -> wsman.EnvironmentVariable - 58, // 47: wsman.EnvironmentVariable.secret:type_name -> wsman.EnvironmentVariable.SecretKeyRef - 39, // 48: wsman.ExposedPorts.ports:type_name -> wsman.PortSpec - 52, // 49: wsman.DescribeClusterResponse.workspace_classes:type_name -> wsman.WorkspaceClass - 55, // 50: wsman.WorkspaceMetadata.Metrics.image:type_name -> wsman.WorkspaceMetadata.ImageInfo - 10, // 51: wsman.WorkspaceManager.GetWorkspaces:input_type -> wsman.GetWorkspacesRequest - 12, // 52: wsman.WorkspaceManager.StartWorkspace:input_type -> wsman.StartWorkspaceRequest - 14, // 53: wsman.WorkspaceManager.StopWorkspace:input_type -> wsman.StopWorkspaceRequest - 16, // 54: wsman.WorkspaceManager.DescribeWorkspace:input_type -> wsman.DescribeWorkspaceRequest - 32, // 55: wsman.WorkspaceManager.BackupWorkspace:input_type -> wsman.BackupWorkspaceRequest - 18, // 56: wsman.WorkspaceManager.Subscribe:input_type -> wsman.SubscribeRequest - 20, // 57: wsman.WorkspaceManager.MarkActive:input_type -> wsman.MarkActiveRequest - 22, // 58: wsman.WorkspaceManager.SetTimeout:input_type -> wsman.SetTimeoutRequest - 24, // 59: wsman.WorkspaceManager.ControlPort:input_type -> wsman.ControlPortRequest - 26, // 60: wsman.WorkspaceManager.TakeSnapshot:input_type -> wsman.TakeSnapshotRequest - 28, // 61: wsman.WorkspaceManager.ControlAdmission:input_type -> wsman.ControlAdmissionRequest - 30, // 62: wsman.WorkspaceManager.DeleteVolumeSnapshot:input_type -> wsman.DeleteVolumeSnapshotRequest - 34, // 63: wsman.WorkspaceManager.UpdateSSHKey:input_type -> wsman.UpdateSSHKeyRequest - 50, // 64: wsman.WorkspaceManager.DescribeCluster:input_type -> wsman.DescribeClusterRequest - 11, // 65: wsman.WorkspaceManager.GetWorkspaces:output_type -> wsman.GetWorkspacesResponse - 13, // 66: wsman.WorkspaceManager.StartWorkspace:output_type -> wsman.StartWorkspaceResponse - 15, // 67: wsman.WorkspaceManager.StopWorkspace:output_type -> wsman.StopWorkspaceResponse - 17, // 68: wsman.WorkspaceManager.DescribeWorkspace:output_type -> wsman.DescribeWorkspaceResponse - 33, // 69: wsman.WorkspaceManager.BackupWorkspace:output_type -> wsman.BackupWorkspaceResponse - 19, // 70: wsman.WorkspaceManager.Subscribe:output_type -> wsman.SubscribeResponse - 21, // 71: wsman.WorkspaceManager.MarkActive:output_type -> wsman.MarkActiveResponse - 23, // 72: wsman.WorkspaceManager.SetTimeout:output_type -> wsman.SetTimeoutResponse - 25, // 73: wsman.WorkspaceManager.ControlPort:output_type -> wsman.ControlPortResponse - 27, // 74: wsman.WorkspaceManager.TakeSnapshot:output_type -> wsman.TakeSnapshotResponse - 29, // 75: wsman.WorkspaceManager.ControlAdmission:output_type -> wsman.ControlAdmissionResponse - 31, // 76: wsman.WorkspaceManager.DeleteVolumeSnapshot:output_type -> wsman.DeleteVolumeSnapshotResponse - 35, // 77: wsman.WorkspaceManager.UpdateSSHKey:output_type -> wsman.UpdateSSHKeyResponse - 51, // 78: wsman.WorkspaceManager.DescribeCluster:output_type -> wsman.DescribeClusterResponse - 65, // [65:79] is the sub-list for method output_type - 51, // [51:65] is the sub-list for method input_type - 51, // [51:51] is the sub-list for extension type_name - 51, // [51:51] is the sub-list for extension extendee - 0, // [0:51] is the sub-list for field type_name + 54, // 22: wsman.WorkspaceStatus.initializer_metrics:type_name -> wsman.InitializerMetrics + 39, // 23: wsman.WorkspaceSpec.exposed_ports:type_name -> wsman.PortSpec + 8, // 24: wsman.WorkspaceSpec.type:type_name -> wsman.WorkspaceType + 37, // 25: wsman.WorkspaceSpec.ide_image:type_name -> wsman.IDEImage + 3, // 26: wsman.PortSpec.visibility:type_name -> wsman.PortVisibility + 4, // 27: wsman.PortSpec.protocol:type_name -> wsman.PortProtocol + 5, // 28: wsman.WorkspaceConditions.pulling_images:type_name -> wsman.WorkspaceConditionBool + 5, // 29: wsman.WorkspaceConditions.final_backup_complete:type_name -> wsman.WorkspaceConditionBool + 5, // 30: wsman.WorkspaceConditions.deployed:type_name -> wsman.WorkspaceConditionBool + 5, // 31: wsman.WorkspaceConditions.network_not_ready:type_name -> wsman.WorkspaceConditionBool + 62, // 32: wsman.WorkspaceConditions.first_user_activity:type_name -> google.protobuf.Timestamp + 5, // 33: wsman.WorkspaceConditions.stopped_by_request:type_name -> wsman.WorkspaceConditionBool + 40, // 34: wsman.WorkspaceConditions.volume_snapshot:type_name -> wsman.VolumeSnapshotInfo + 5, // 35: wsman.WorkspaceConditions.aborted:type_name -> wsman.WorkspaceConditionBool + 62, // 36: wsman.WorkspaceMetadata.started_at:type_name -> google.protobuf.Timestamp + 59, // 37: wsman.WorkspaceMetadata.annotations:type_name -> wsman.WorkspaceMetadata.AnnotationsEntry + 58, // 38: wsman.WorkspaceMetadata.metrics:type_name -> wsman.WorkspaceMetadata.Metrics + 2, // 39: wsman.WorkspaceAuthentication.admission:type_name -> wsman.AdmissionLevel + 7, // 40: wsman.StartWorkspaceSpec.feature_flags:type_name -> wsman.WorkspaceFeatureFlag + 63, // 41: wsman.StartWorkspaceSpec.initializer:type_name -> contentservice.WorkspaceInitializer + 39, // 42: wsman.StartWorkspaceSpec.ports:type_name -> wsman.PortSpec + 47, // 43: wsman.StartWorkspaceSpec.envvars:type_name -> wsman.EnvironmentVariable + 46, // 44: wsman.StartWorkspaceSpec.git:type_name -> wsman.GitSpec + 2, // 45: wsman.StartWorkspaceSpec.admission:type_name -> wsman.AdmissionLevel + 37, // 46: wsman.StartWorkspaceSpec.ide_image:type_name -> wsman.IDEImage + 47, // 47: wsman.StartWorkspaceSpec.sys_envvars:type_name -> wsman.EnvironmentVariable + 60, // 48: wsman.EnvironmentVariable.secret:type_name -> wsman.EnvironmentVariable.SecretKeyRef + 39, // 49: wsman.ExposedPorts.ports:type_name -> wsman.PortSpec + 52, // 50: wsman.DescribeClusterResponse.workspace_classes:type_name -> wsman.WorkspaceClass + 64, // 51: wsman.InitializerMetric.duration:type_name -> google.protobuf.Duration + 53, // 52: wsman.InitializerMetrics.git:type_name -> wsman.InitializerMetric + 53, // 53: wsman.InitializerMetrics.file_download:type_name -> wsman.InitializerMetric + 53, // 54: wsman.InitializerMetrics.snapshot:type_name -> wsman.InitializerMetric + 53, // 55: wsman.InitializerMetrics.backup:type_name -> wsman.InitializerMetric + 53, // 56: wsman.InitializerMetrics.prebuild:type_name -> wsman.InitializerMetric + 53, // 57: wsman.InitializerMetrics.composite:type_name -> wsman.InitializerMetric + 57, // 58: wsman.WorkspaceMetadata.Metrics.image:type_name -> wsman.WorkspaceMetadata.ImageInfo + 10, // 59: wsman.WorkspaceManager.GetWorkspaces:input_type -> wsman.GetWorkspacesRequest + 12, // 60: wsman.WorkspaceManager.StartWorkspace:input_type -> wsman.StartWorkspaceRequest + 14, // 61: wsman.WorkspaceManager.StopWorkspace:input_type -> wsman.StopWorkspaceRequest + 16, // 62: wsman.WorkspaceManager.DescribeWorkspace:input_type -> wsman.DescribeWorkspaceRequest + 32, // 63: wsman.WorkspaceManager.BackupWorkspace:input_type -> wsman.BackupWorkspaceRequest + 18, // 64: wsman.WorkspaceManager.Subscribe:input_type -> wsman.SubscribeRequest + 20, // 65: wsman.WorkspaceManager.MarkActive:input_type -> wsman.MarkActiveRequest + 22, // 66: wsman.WorkspaceManager.SetTimeout:input_type -> wsman.SetTimeoutRequest + 24, // 67: wsman.WorkspaceManager.ControlPort:input_type -> wsman.ControlPortRequest + 26, // 68: wsman.WorkspaceManager.TakeSnapshot:input_type -> wsman.TakeSnapshotRequest + 28, // 69: wsman.WorkspaceManager.ControlAdmission:input_type -> wsman.ControlAdmissionRequest + 30, // 70: wsman.WorkspaceManager.DeleteVolumeSnapshot:input_type -> wsman.DeleteVolumeSnapshotRequest + 34, // 71: wsman.WorkspaceManager.UpdateSSHKey:input_type -> wsman.UpdateSSHKeyRequest + 50, // 72: wsman.WorkspaceManager.DescribeCluster:input_type -> wsman.DescribeClusterRequest + 11, // 73: wsman.WorkspaceManager.GetWorkspaces:output_type -> wsman.GetWorkspacesResponse + 13, // 74: wsman.WorkspaceManager.StartWorkspace:output_type -> wsman.StartWorkspaceResponse + 15, // 75: wsman.WorkspaceManager.StopWorkspace:output_type -> wsman.StopWorkspaceResponse + 17, // 76: wsman.WorkspaceManager.DescribeWorkspace:output_type -> wsman.DescribeWorkspaceResponse + 33, // 77: wsman.WorkspaceManager.BackupWorkspace:output_type -> wsman.BackupWorkspaceResponse + 19, // 78: wsman.WorkspaceManager.Subscribe:output_type -> wsman.SubscribeResponse + 21, // 79: wsman.WorkspaceManager.MarkActive:output_type -> wsman.MarkActiveResponse + 23, // 80: wsman.WorkspaceManager.SetTimeout:output_type -> wsman.SetTimeoutResponse + 25, // 81: wsman.WorkspaceManager.ControlPort:output_type -> wsman.ControlPortResponse + 27, // 82: wsman.WorkspaceManager.TakeSnapshot:output_type -> wsman.TakeSnapshotResponse + 29, // 83: wsman.WorkspaceManager.ControlAdmission:output_type -> wsman.ControlAdmissionResponse + 31, // 84: wsman.WorkspaceManager.DeleteVolumeSnapshot:output_type -> wsman.DeleteVolumeSnapshotResponse + 35, // 85: wsman.WorkspaceManager.UpdateSSHKey:output_type -> wsman.UpdateSSHKeyResponse + 51, // 86: wsman.WorkspaceManager.DescribeCluster:output_type -> wsman.DescribeClusterResponse + 73, // [73:87] is the sub-list for method output_type + 59, // [59:73] is the sub-list for method input_type + 59, // [59:59] is the sub-list for extension type_name + 59, // [59:59] is the sub-list for extension extendee + 0, // [0:59] is the sub-list for field type_name } func init() { file_core_proto_init() } @@ -4783,7 +4991,31 @@ func file_core_proto_init() { return nil } } - file_core_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_core_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InitializerMetric); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_core_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InitializerMetrics); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_core_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WorkspaceMetadata_ImageInfo); i { case 0: return &v.state @@ -4795,7 +5027,7 @@ func file_core_proto_init() { return nil } } - file_core_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_core_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WorkspaceMetadata_Metrics); i { case 0: return &v.state @@ -4807,7 +5039,7 @@ func file_core_proto_init() { return nil } } - file_core_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_core_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EnvironmentVariable_SecretKeyRef); i { case 0: return &v.state @@ -4827,7 +5059,7 @@ func file_core_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_core_proto_rawDesc, NumEnums: 9, - NumMessages: 50, + NumMessages: 52, NumExtensions: 0, NumServices: 1, }, diff --git a/components/ws-manager-api/go/core_grpc.pb.go b/components/ws-manager-api/go/core_grpc.pb.go index 71b70e751ec0b4..c05715d91bd22f 100644 --- a/components/ws-manager-api/go/core_grpc.pb.go +++ b/components/ws-manager-api/go/core_grpc.pb.go @@ -1,4 +1,4 @@ -// Copyright (c) 2024 Gitpod GmbH. All rights reserved. +// Copyright (c) 2025 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. diff --git a/components/ws-manager-api/go/crd/v1/workspace_types.go b/components/ws-manager-api/go/crd/v1/workspace_types.go index e95a52b528b118..04df5860f65be0 100644 --- a/components/ws-manager-api/go/crd/v1/workspace_types.go +++ b/components/ws-manager-api/go/crd/v1/workspace_types.go @@ -179,6 +179,41 @@ type WorkspaceImageInfo struct { WorkspaceImageRef string `json:"workspaceImageRef,omitempty"` } +type InitializerMetrics struct { + // Git contains metrics for the git initializer step + // +kubebuilder:validation:Optional + Git *InitializerStepMetric `json:"git"` + + // FileDownload contains metrics for the file download initializer step + // +kubebuilder:validation:Optional + FileDownload *InitializerStepMetric `json:"fileDownload"` + + // Snapshot contains metrics for the snapshot initializer step + // This used for workspaces started from snapshots. + // +kubebuilder:validation:Optional + Snapshot *InitializerStepMetric `json:"snapshot"` + + // Backup contains metrics for the backup initializer step + // +kubebuilder:validation:Optional + Backup *InitializerStepMetric `json:"backup"` + + // Prebuild contains metrics for the prebuild initializer step + // +kubebuilder:validation:Optional + Prebuild *InitializerStepMetric `json:"prebuild"` + + // Composite contains metrics for the composite initializer step + // +kubebuilder:validation:Optional + Composite *InitializerStepMetric `json:"composite"` +} + +type InitializerStepMetric struct { + // +kubebuilder:validation:Optional + Duration *metav1.Duration `json:"duration"` + + // +kubebuilder:validation:Optional + Size uint64 `json:"size"` +} + // WorkspaceStatus defines the observed state of Workspace type WorkspaceStatus struct { PodStarts int `json:"podStarts"` @@ -215,6 +250,9 @@ type WorkspaceStatus struct { // +kubebuilder:validation:Optional ImageInfo *WorkspaceImageInfo `json:"imageInfo,omitempty"` + + // +kubebuilder:validation:Optional + InitializerMetrics *InitializerMetrics `json:"initializerMetrics,omitempty"` } func (s *WorkspaceStatus) SetCondition(cond metav1.Condition) { diff --git a/components/ws-manager-api/go/mock/mock.go b/components/ws-manager-api/go/mock/mock.go index 14e3d4557420db..91aa706e54c99f 100644 --- a/components/ws-manager-api/go/mock/mock.go +++ b/components/ws-manager-api/go/mock/mock.go @@ -1,4 +1,4 @@ -// Copyright (c) 2024 Gitpod GmbH. All rights reserved. +// Copyright (c) 2025 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. diff --git a/components/ws-manager-api/typescript/src/core_grpc_pb.d.ts b/components/ws-manager-api/typescript/src/core_grpc_pb.d.ts index 432b9d74bf2d4b..93ca987ff4e0bb 100644 --- a/components/ws-manager-api/typescript/src/core_grpc_pb.d.ts +++ b/components/ws-manager-api/typescript/src/core_grpc_pb.d.ts @@ -1,5 +1,5 @@ /** - * Copyright (c) 2024 Gitpod GmbH. All rights reserved. + * Copyright (c) 2025 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. */ @@ -14,6 +14,7 @@ import * as grpc from "@grpc/grpc-js"; import * as core_pb from "./core_pb"; import * as content_service_api_initializer_pb from "@gitpod/content-service/lib"; import * as google_protobuf_timestamp_pb from "google-protobuf/google/protobuf/timestamp_pb"; +import * as google_protobuf_duration_pb from "google-protobuf/google/protobuf/duration_pb"; interface IWorkspaceManagerService extends grpc.ServiceDefinition { getWorkspaces: IWorkspaceManagerService_IGetWorkspaces; diff --git a/components/ws-manager-api/typescript/src/core_grpc_pb.js b/components/ws-manager-api/typescript/src/core_grpc_pb.js index 3cc739bad1e6b2..77ae76af6aaf8d 100644 --- a/components/ws-manager-api/typescript/src/core_grpc_pb.js +++ b/components/ws-manager-api/typescript/src/core_grpc_pb.js @@ -1,5 +1,5 @@ /** - * Copyright (c) 2024 Gitpod GmbH. All rights reserved. + * Copyright (c) 2025 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. */ @@ -11,6 +11,7 @@ var grpc = require('@grpc/grpc-js'); var core_pb = require('./core_pb.js'); var content$service$api_initializer_pb = require('@gitpod/content-service/lib'); var google_protobuf_timestamp_pb = require('google-protobuf/google/protobuf/timestamp_pb.js'); +var google_protobuf_duration_pb = require('google-protobuf/google/protobuf/duration_pb.js'); function serialize_wsman_BackupWorkspaceRequest(arg) { if (!(arg instanceof core_pb.BackupWorkspaceRequest)) { 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 e9448e73e347ae..d6411e9126bec4 100644 --- a/components/ws-manager-api/typescript/src/core_pb.d.ts +++ b/components/ws-manager-api/typescript/src/core_pb.d.ts @@ -1,5 +1,5 @@ /** - * Copyright (c) 2024 Gitpod GmbH. All rights reserved. + * Copyright (c) 2025 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. */ @@ -13,6 +13,7 @@ import * as jspb from "google-protobuf"; import * as content_service_api_initializer_pb from "@gitpod/content-service/lib"; import * as google_protobuf_timestamp_pb from "google-protobuf/google/protobuf/timestamp_pb"; +import * as google_protobuf_duration_pb from "google-protobuf/google/protobuf/duration_pb"; export class MetadataFilter extends jspb.Message { getOwner(): string; @@ -671,6 +672,11 @@ export class WorkspaceStatus extends jspb.Message { getAuth(): WorkspaceAuthentication | undefined; setAuth(value?: WorkspaceAuthentication): WorkspaceStatus; + hasInitializerMetrics(): boolean; + clearInitializerMetrics(): void; + getInitializerMetrics(): InitializerMetrics | undefined; + setInitializerMetrics(value?: InitializerMetrics): WorkspaceStatus; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): WorkspaceStatus.AsObject; static toObject(includeInstance: boolean, msg: WorkspaceStatus): WorkspaceStatus.AsObject; @@ -693,6 +699,7 @@ export namespace WorkspaceStatus { repo?: content_service_api_initializer_pb.GitStatus.AsObject, runtime?: WorkspaceRuntimeInfo.AsObject, auth?: WorkspaceAuthentication.AsObject, + initializerMetrics?: InitializerMetrics.AsObject, } } @@ -1311,6 +1318,85 @@ export namespace WorkspaceClass { } } +export class InitializerMetric extends jspb.Message { + + hasDuration(): boolean; + clearDuration(): void; + getDuration(): google_protobuf_duration_pb.Duration | undefined; + setDuration(value?: google_protobuf_duration_pb.Duration): InitializerMetric; + getSize(): number; + setSize(value: number): InitializerMetric; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): InitializerMetric.AsObject; + static toObject(includeInstance: boolean, msg: InitializerMetric): InitializerMetric.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: InitializerMetric, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): InitializerMetric; + static deserializeBinaryFromReader(message: InitializerMetric, reader: jspb.BinaryReader): InitializerMetric; +} + +export namespace InitializerMetric { + export type AsObject = { + duration?: google_protobuf_duration_pb.Duration.AsObject, + size: number, + } +} + +export class InitializerMetrics extends jspb.Message { + + hasGit(): boolean; + clearGit(): void; + getGit(): InitializerMetric | undefined; + setGit(value?: InitializerMetric): InitializerMetrics; + + hasFileDownload(): boolean; + clearFileDownload(): void; + getFileDownload(): InitializerMetric | undefined; + setFileDownload(value?: InitializerMetric): InitializerMetrics; + + hasSnapshot(): boolean; + clearSnapshot(): void; + getSnapshot(): InitializerMetric | undefined; + setSnapshot(value?: InitializerMetric): InitializerMetrics; + + hasBackup(): boolean; + clearBackup(): void; + getBackup(): InitializerMetric | undefined; + setBackup(value?: InitializerMetric): InitializerMetrics; + + hasPrebuild(): boolean; + clearPrebuild(): void; + getPrebuild(): InitializerMetric | undefined; + setPrebuild(value?: InitializerMetric): InitializerMetrics; + + hasComposite(): boolean; + clearComposite(): void; + getComposite(): InitializerMetric | undefined; + setComposite(value?: InitializerMetric): InitializerMetrics; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): InitializerMetrics.AsObject; + static toObject(includeInstance: boolean, msg: InitializerMetrics): InitializerMetrics.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: InitializerMetrics, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): InitializerMetrics; + static deserializeBinaryFromReader(message: InitializerMetrics, reader: jspb.BinaryReader): InitializerMetrics; +} + +export namespace InitializerMetrics { + export type AsObject = { + git?: InitializerMetric.AsObject, + fileDownload?: InitializerMetric.AsObject, + snapshot?: InitializerMetric.AsObject, + backup?: InitializerMetric.AsObject, + prebuild?: InitializerMetric.AsObject, + composite?: InitializerMetric.AsObject, + } +} + 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 c913b9ca67d4ab..a623d1630e2a41 100644 --- a/components/ws-manager-api/typescript/src/core_pb.js +++ b/components/ws-manager-api/typescript/src/core_pb.js @@ -1,5 +1,5 @@ /** - * Copyright (c) 2024 Gitpod GmbH. All rights reserved. + * Copyright (c) 2025 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. */ @@ -25,6 +25,8 @@ var content$service$api_initializer_pb = require('@gitpod/content-service/lib'); goog.object.extend(proto, content$service$api_initializer_pb); var google_protobuf_timestamp_pb = require('google-protobuf/google/protobuf/timestamp_pb.js'); goog.object.extend(proto, google_protobuf_timestamp_pb); +var google_protobuf_duration_pb = require('google-protobuf/google/protobuf/duration_pb.js'); +goog.object.extend(proto, google_protobuf_duration_pb); goog.exportSymbol('proto.wsman.AdmissionLevel', null, global); goog.exportSymbol('proto.wsman.BackupWorkspaceRequest', null, global); goog.exportSymbol('proto.wsman.BackupWorkspaceResponse', null, global); @@ -45,6 +47,8 @@ goog.exportSymbol('proto.wsman.GetWorkspacesRequest', null, global); goog.exportSymbol('proto.wsman.GetWorkspacesResponse', null, global); goog.exportSymbol('proto.wsman.GitSpec', null, global); goog.exportSymbol('proto.wsman.IDEImage', null, global); +goog.exportSymbol('proto.wsman.InitializerMetric', null, global); +goog.exportSymbol('proto.wsman.InitializerMetrics', null, global); goog.exportSymbol('proto.wsman.MarkActiveRequest', null, global); goog.exportSymbol('proto.wsman.MarkActiveResponse', null, global); goog.exportSymbol('proto.wsman.MetadataFilter', null, global); @@ -1068,6 +1072,48 @@ if (goog.DEBUG && !COMPILED) { */ proto.wsman.WorkspaceClass.displayName = 'proto.wsman.WorkspaceClass'; } +/** + * 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.InitializerMetric = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.wsman.InitializerMetric, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.wsman.InitializerMetric.displayName = 'proto.wsman.InitializerMetric'; +} +/** + * 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.InitializerMetrics = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.wsman.InitializerMetrics, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.wsman.InitializerMetrics.displayName = 'proto.wsman.InitializerMetrics'; +} @@ -5314,7 +5360,8 @@ proto.wsman.WorkspaceStatus.toObject = function(includeInstance, msg) { message: jspb.Message.getFieldWithDefault(msg, 6, ""), repo: (f = msg.getRepo()) && content$service$api_initializer_pb.GitStatus.toObject(includeInstance, f), runtime: (f = msg.getRuntime()) && proto.wsman.WorkspaceRuntimeInfo.toObject(includeInstance, f), - auth: (f = msg.getAuth()) && proto.wsman.WorkspaceAuthentication.toObject(includeInstance, f) + auth: (f = msg.getAuth()) && proto.wsman.WorkspaceAuthentication.toObject(includeInstance, f), + initializerMetrics: (f = msg.getInitializerMetrics()) && proto.wsman.InitializerMetrics.toObject(includeInstance, f) }; if (includeInstance) { @@ -5397,6 +5444,11 @@ proto.wsman.WorkspaceStatus.deserializeBinaryFromReader = function(msg, reader) reader.readMessage(value,proto.wsman.WorkspaceAuthentication.deserializeBinaryFromReader); msg.setAuth(value); break; + case 11: + var value = new proto.wsman.InitializerMetrics; + reader.readMessage(value,proto.wsman.InitializerMetrics.deserializeBinaryFromReader); + msg.setInitializerMetrics(value); + break; default: reader.skipField(); break; @@ -5502,6 +5554,14 @@ proto.wsman.WorkspaceStatus.serializeBinaryToWriter = function(message, writer) proto.wsman.WorkspaceAuthentication.serializeBinaryToWriter ); } + f = message.getInitializerMetrics(); + if (f != null) { + writer.writeMessage( + 11, + f, + proto.wsman.InitializerMetrics.serializeBinaryToWriter + ); + } }; @@ -5799,6 +5859,43 @@ proto.wsman.WorkspaceStatus.prototype.hasAuth = function() { }; +/** + * optional InitializerMetrics initializer_metrics = 11; + * @return {?proto.wsman.InitializerMetrics} + */ +proto.wsman.WorkspaceStatus.prototype.getInitializerMetrics = function() { + return /** @type{?proto.wsman.InitializerMetrics} */ ( + jspb.Message.getWrapperField(this, proto.wsman.InitializerMetrics, 11)); +}; + + +/** + * @param {?proto.wsman.InitializerMetrics|undefined} value + * @return {!proto.wsman.WorkspaceStatus} returns this +*/ +proto.wsman.WorkspaceStatus.prototype.setInitializerMetrics = function(value) { + return jspb.Message.setWrapperField(this, 11, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.wsman.WorkspaceStatus} returns this + */ +proto.wsman.WorkspaceStatus.prototype.clearInitializerMetrics = function() { + return this.setInitializerMetrics(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.wsman.WorkspaceStatus.prototype.hasInitializerMetrics = function() { + return jspb.Message.getField(this, 11) != null; +}; + + @@ -10499,6 +10596,593 @@ proto.wsman.WorkspaceClass.prototype.setCreditsPerMinute = function(value) { }; + + + +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.InitializerMetric.prototype.toObject = function(opt_includeInstance) { + return proto.wsman.InitializerMetric.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.InitializerMetric} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.wsman.InitializerMetric.toObject = function(includeInstance, msg) { + var f, obj = { + duration: (f = msg.getDuration()) && google_protobuf_duration_pb.Duration.toObject(includeInstance, f), + size: jspb.Message.getFieldWithDefault(msg, 2, 0) + }; + + 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.InitializerMetric} + */ +proto.wsman.InitializerMetric.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.wsman.InitializerMetric; + return proto.wsman.InitializerMetric.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.wsman.InitializerMetric} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.wsman.InitializerMetric} + */ +proto.wsman.InitializerMetric.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new google_protobuf_duration_pb.Duration; + reader.readMessage(value,google_protobuf_duration_pb.Duration.deserializeBinaryFromReader); + msg.setDuration(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint64()); + msg.setSize(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.wsman.InitializerMetric.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.wsman.InitializerMetric.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.InitializerMetric} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.wsman.InitializerMetric.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getDuration(); + if (f != null) { + writer.writeMessage( + 1, + f, + google_protobuf_duration_pb.Duration.serializeBinaryToWriter + ); + } + f = message.getSize(); + if (f !== 0) { + writer.writeUint64( + 2, + f + ); + } +}; + + +/** + * optional google.protobuf.Duration duration = 1; + * @return {?proto.google.protobuf.Duration} + */ +proto.wsman.InitializerMetric.prototype.getDuration = function() { + return /** @type{?proto.google.protobuf.Duration} */ ( + jspb.Message.getWrapperField(this, google_protobuf_duration_pb.Duration, 1)); +}; + + +/** + * @param {?proto.google.protobuf.Duration|undefined} value + * @return {!proto.wsman.InitializerMetric} returns this +*/ +proto.wsman.InitializerMetric.prototype.setDuration = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.wsman.InitializerMetric} returns this + */ +proto.wsman.InitializerMetric.prototype.clearDuration = function() { + return this.setDuration(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.wsman.InitializerMetric.prototype.hasDuration = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional uint64 size = 2; + * @return {number} + */ +proto.wsman.InitializerMetric.prototype.getSize = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.wsman.InitializerMetric} returns this + */ +proto.wsman.InitializerMetric.prototype.setSize = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + + + + +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.InitializerMetrics.prototype.toObject = function(opt_includeInstance) { + return proto.wsman.InitializerMetrics.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.InitializerMetrics} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.wsman.InitializerMetrics.toObject = function(includeInstance, msg) { + var f, obj = { + git: (f = msg.getGit()) && proto.wsman.InitializerMetric.toObject(includeInstance, f), + fileDownload: (f = msg.getFileDownload()) && proto.wsman.InitializerMetric.toObject(includeInstance, f), + snapshot: (f = msg.getSnapshot()) && proto.wsman.InitializerMetric.toObject(includeInstance, f), + backup: (f = msg.getBackup()) && proto.wsman.InitializerMetric.toObject(includeInstance, f), + prebuild: (f = msg.getPrebuild()) && proto.wsman.InitializerMetric.toObject(includeInstance, f), + composite: (f = msg.getComposite()) && proto.wsman.InitializerMetric.toObject(includeInstance, f) + }; + + 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.InitializerMetrics} + */ +proto.wsman.InitializerMetrics.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.wsman.InitializerMetrics; + return proto.wsman.InitializerMetrics.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.wsman.InitializerMetrics} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.wsman.InitializerMetrics} + */ +proto.wsman.InitializerMetrics.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.wsman.InitializerMetric; + reader.readMessage(value,proto.wsman.InitializerMetric.deserializeBinaryFromReader); + msg.setGit(value); + break; + case 2: + var value = new proto.wsman.InitializerMetric; + reader.readMessage(value,proto.wsman.InitializerMetric.deserializeBinaryFromReader); + msg.setFileDownload(value); + break; + case 3: + var value = new proto.wsman.InitializerMetric; + reader.readMessage(value,proto.wsman.InitializerMetric.deserializeBinaryFromReader); + msg.setSnapshot(value); + break; + case 4: + var value = new proto.wsman.InitializerMetric; + reader.readMessage(value,proto.wsman.InitializerMetric.deserializeBinaryFromReader); + msg.setBackup(value); + break; + case 5: + var value = new proto.wsman.InitializerMetric; + reader.readMessage(value,proto.wsman.InitializerMetric.deserializeBinaryFromReader); + msg.setPrebuild(value); + break; + case 6: + var value = new proto.wsman.InitializerMetric; + reader.readMessage(value,proto.wsman.InitializerMetric.deserializeBinaryFromReader); + msg.setComposite(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.wsman.InitializerMetrics.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.wsman.InitializerMetrics.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.InitializerMetrics} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.wsman.InitializerMetrics.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getGit(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.wsman.InitializerMetric.serializeBinaryToWriter + ); + } + f = message.getFileDownload(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.wsman.InitializerMetric.serializeBinaryToWriter + ); + } + f = message.getSnapshot(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.wsman.InitializerMetric.serializeBinaryToWriter + ); + } + f = message.getBackup(); + if (f != null) { + writer.writeMessage( + 4, + f, + proto.wsman.InitializerMetric.serializeBinaryToWriter + ); + } + f = message.getPrebuild(); + if (f != null) { + writer.writeMessage( + 5, + f, + proto.wsman.InitializerMetric.serializeBinaryToWriter + ); + } + f = message.getComposite(); + if (f != null) { + writer.writeMessage( + 6, + f, + proto.wsman.InitializerMetric.serializeBinaryToWriter + ); + } +}; + + +/** + * optional InitializerMetric git = 1; + * @return {?proto.wsman.InitializerMetric} + */ +proto.wsman.InitializerMetrics.prototype.getGit = function() { + return /** @type{?proto.wsman.InitializerMetric} */ ( + jspb.Message.getWrapperField(this, proto.wsman.InitializerMetric, 1)); +}; + + +/** + * @param {?proto.wsman.InitializerMetric|undefined} value + * @return {!proto.wsman.InitializerMetrics} returns this +*/ +proto.wsman.InitializerMetrics.prototype.setGit = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.wsman.InitializerMetrics} returns this + */ +proto.wsman.InitializerMetrics.prototype.clearGit = function() { + return this.setGit(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.wsman.InitializerMetrics.prototype.hasGit = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional InitializerMetric file_download = 2; + * @return {?proto.wsman.InitializerMetric} + */ +proto.wsman.InitializerMetrics.prototype.getFileDownload = function() { + return /** @type{?proto.wsman.InitializerMetric} */ ( + jspb.Message.getWrapperField(this, proto.wsman.InitializerMetric, 2)); +}; + + +/** + * @param {?proto.wsman.InitializerMetric|undefined} value + * @return {!proto.wsman.InitializerMetrics} returns this +*/ +proto.wsman.InitializerMetrics.prototype.setFileDownload = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.wsman.InitializerMetrics} returns this + */ +proto.wsman.InitializerMetrics.prototype.clearFileDownload = function() { + return this.setFileDownload(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.wsman.InitializerMetrics.prototype.hasFileDownload = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional InitializerMetric snapshot = 3; + * @return {?proto.wsman.InitializerMetric} + */ +proto.wsman.InitializerMetrics.prototype.getSnapshot = function() { + return /** @type{?proto.wsman.InitializerMetric} */ ( + jspb.Message.getWrapperField(this, proto.wsman.InitializerMetric, 3)); +}; + + +/** + * @param {?proto.wsman.InitializerMetric|undefined} value + * @return {!proto.wsman.InitializerMetrics} returns this +*/ +proto.wsman.InitializerMetrics.prototype.setSnapshot = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.wsman.InitializerMetrics} returns this + */ +proto.wsman.InitializerMetrics.prototype.clearSnapshot = function() { + return this.setSnapshot(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.wsman.InitializerMetrics.prototype.hasSnapshot = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional InitializerMetric backup = 4; + * @return {?proto.wsman.InitializerMetric} + */ +proto.wsman.InitializerMetrics.prototype.getBackup = function() { + return /** @type{?proto.wsman.InitializerMetric} */ ( + jspb.Message.getWrapperField(this, proto.wsman.InitializerMetric, 4)); +}; + + +/** + * @param {?proto.wsman.InitializerMetric|undefined} value + * @return {!proto.wsman.InitializerMetrics} returns this +*/ +proto.wsman.InitializerMetrics.prototype.setBackup = function(value) { + return jspb.Message.setWrapperField(this, 4, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.wsman.InitializerMetrics} returns this + */ +proto.wsman.InitializerMetrics.prototype.clearBackup = function() { + return this.setBackup(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.wsman.InitializerMetrics.prototype.hasBackup = function() { + return jspb.Message.getField(this, 4) != null; +}; + + +/** + * optional InitializerMetric prebuild = 5; + * @return {?proto.wsman.InitializerMetric} + */ +proto.wsman.InitializerMetrics.prototype.getPrebuild = function() { + return /** @type{?proto.wsman.InitializerMetric} */ ( + jspb.Message.getWrapperField(this, proto.wsman.InitializerMetric, 5)); +}; + + +/** + * @param {?proto.wsman.InitializerMetric|undefined} value + * @return {!proto.wsman.InitializerMetrics} returns this +*/ +proto.wsman.InitializerMetrics.prototype.setPrebuild = function(value) { + return jspb.Message.setWrapperField(this, 5, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.wsman.InitializerMetrics} returns this + */ +proto.wsman.InitializerMetrics.prototype.clearPrebuild = function() { + return this.setPrebuild(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.wsman.InitializerMetrics.prototype.hasPrebuild = function() { + return jspb.Message.getField(this, 5) != null; +}; + + +/** + * optional InitializerMetric composite = 6; + * @return {?proto.wsman.InitializerMetric} + */ +proto.wsman.InitializerMetrics.prototype.getComposite = function() { + return /** @type{?proto.wsman.InitializerMetric} */ ( + jspb.Message.getWrapperField(this, proto.wsman.InitializerMetric, 6)); +}; + + +/** + * @param {?proto.wsman.InitializerMetric|undefined} value + * @return {!proto.wsman.InitializerMetrics} returns this +*/ +proto.wsman.InitializerMetrics.prototype.setComposite = function(value) { + return jspb.Message.setWrapperField(this, 6, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.wsman.InitializerMetrics} returns this + */ +proto.wsman.InitializerMetrics.prototype.clearComposite = function() { + return this.setComposite(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.wsman.InitializerMetrics.prototype.hasComposite = function() { + return jspb.Message.getField(this, 6) != null; +}; + + /** * @enum {number} */ diff --git a/components/ws-manager-bridge/src/bridge.ts b/components/ws-manager-bridge/src/bridge.ts index 4c6fb1a4ea5fa9..bbac974b96c398 100644 --- a/components/ws-manager-bridge/src/bridge.ts +++ b/components/ws-manager-bridge/src/bridge.ts @@ -22,6 +22,8 @@ import { PortProtocol as WsManPortProtocol, DescribeClusterRequest, WorkspaceType, + InitializerMetrics, + InitializerMetric, } from "@gitpod/ws-manager/lib"; import { scrubber, TrustedValue } from "@gitpod/gitpod-protocol/lib/util/scrubbing"; import { WorkspaceDB } from "@gitpod/gitpod-db/lib/workspace-db"; @@ -38,6 +40,7 @@ import { performance } from "perf_hooks"; import { WorkspaceInstanceController } from "./workspace-instance-controller"; import { PrebuildUpdater } from "./prebuild-updater"; import { RedisPublisher } from "@gitpod/gitpod-db/lib"; +import { merge } from "ts-deepmerge"; export const WorkspaceManagerBridgeFactory = Symbol("WorkspaceManagerBridgeFactory"); @@ -332,11 +335,13 @@ export class WorkspaceManagerBridge implements Disposable { instance.status.podName = instance.status.podName || status.runtime?.podName; instance.status.nodeIp = instance.status.nodeIp || status.runtime?.nodeIp; instance.status.ownerToken = status.auth!.ownerToken; + // TODO(gpl): fade this our in favor of only using DBWorkspaceInstanceMetrics instance.status.metrics = { image: { totalSize: instance.status.metrics?.image?.totalSize || status.metadata.metrics?.image?.totalSize, workspaceImageSize: - instance.status.metrics?.image?.totalSize || status.metadata.metrics?.image?.workspaceImageSize, + instance.status.metrics?.image?.workspaceImageSize || + status.metadata.metrics?.image?.workspaceImageSize, }, }; @@ -411,6 +416,14 @@ export class WorkspaceManagerBridge implements Disposable { // now notify all prebuild listeners about updates - and update DB if needed await this.prebuildUpdater.updatePrebuiltWorkspace({ span }, userId, status); + // store metrics + const instanceMetrics = mapInstanceMetrics(status); + if (instanceMetrics) { + await this.workspaceDB + .trace(ctx) + .updateMetrics(instance.id, instanceMetrics, mergeWorkspaceInstanceMetrics); + } + // cleanup // important: call this after the DB update if (!!lifecycleHandler) { @@ -501,3 +514,64 @@ function toWorkspaceType(type: WorkspaceType): protocol.WorkspaceType { } throw new Error("invalid WorkspaceType: " + type); } + +function mergeWorkspaceInstanceMetrics( + current: protocol.WorkspaceInstanceMetrics, + update: protocol.WorkspaceInstanceMetrics, +): protocol.WorkspaceInstanceMetrics { + const merged = merge.withOptions({ mergeArrays: false, allowUndefinedOverrides: false }, current, update); + return merged; +} + +function mapInstanceMetrics(status: WorkspaceStatus.AsObject): protocol.WorkspaceInstanceMetrics | undefined { + let result: protocol.WorkspaceInstanceMetrics | undefined = undefined; + + if (status.metadata?.metrics?.image) { + result = result || {}; + result.image = { + totalSize: status.metadata.metrics.image.totalSize, + workspaceImageSize: status.metadata.metrics.image.workspaceImageSize, + }; + } + if (status.initializerMetrics) { + result = result || {}; + result.initializerMetrics = mapInitializerMetrics(status.initializerMetrics); + } + + return result; +} + +function mapInitializerMetrics(metrics: InitializerMetrics.AsObject): protocol.InitializerMetrics { + const result: protocol.InitializerMetrics = {}; + if (metrics.git) { + result.git = mapInitializerMetric(metrics.git); + } + if (metrics.fileDownload) { + result.fileDownload = mapInitializerMetric(metrics.fileDownload); + } + if (metrics.snapshot) { + result.snapshot = mapInitializerMetric(metrics.snapshot); + } + if (metrics.backup) { + result.backup = mapInitializerMetric(metrics.backup); + } + if (metrics.prebuild) { + result.prebuild = mapInitializerMetric(metrics.prebuild); + } + if (metrics.composite) { + result.composite = mapInitializerMetric(metrics.composite); + } + + return result; +} + +function mapInitializerMetric(metric: InitializerMetric.AsObject | undefined): protocol.InitializerMetric | undefined { + if (!metric || !metric.duration) { + return undefined; + } + + return { + duration: metric.duration.seconds * 1000 + metric.duration.nanos / 1000000, + size: metric.size, + }; +} diff --git a/components/ws-manager-mk2/config/crd/bases/workspace.gitpod.io_snapshots.yaml b/components/ws-manager-mk2/config/crd/bases/workspace.gitpod.io_snapshots.yaml index 9153f1bfd33813..3503cc347ae962 100644 --- a/components/ws-manager-mk2/config/crd/bases/workspace.gitpod.io_snapshots.yaml +++ b/components/ws-manager-mk2/config/crd/bases/workspace.gitpod.io_snapshots.yaml @@ -1,4 +1,4 @@ -# Copyright (c) 2023 Gitpod GmbH. All rights reserved. +# Copyright (c) 2025 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. diff --git a/components/ws-manager-mk2/config/crd/bases/workspace.gitpod.io_workspaces.yaml b/components/ws-manager-mk2/config/crd/bases/workspace.gitpod.io_workspaces.yaml index 765c0b1700dd93..39ac0ef270b36b 100644 --- a/components/ws-manager-mk2/config/crd/bases/workspace.gitpod.io_workspaces.yaml +++ b/components/ws-manager-mk2/config/crd/bases/workspace.gitpod.io_workspaces.yaml @@ -1,4 +1,4 @@ -# Copyright (c) 2023 Gitpod GmbH. All rights reserved. +# Copyright (c) 2025 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. @@ -202,8 +202,12 @@ spec: description: The key to select. type: string name: + default: "" description: |- Name of the referent. + This field is effectively required, but due to backwards compatibility is + allowed to be empty. Instances of this type with an empty value here are + almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names type: string optional: @@ -263,8 +267,12 @@ spec: be a valid secret key. type: string name: + default: "" description: |- Name of the referent. + This field is effectively required, but due to backwards compatibility is + allowed to be empty. Instances of this type with an empty value here are + almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names type: string optional: @@ -329,8 +337,12 @@ spec: description: The key to select. type: string name: + default: "" description: |- Name of the referent. + This field is effectively required, but due to backwards compatibility is + allowed to be empty. Instances of this type with an empty value here are + almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names type: string optional: @@ -390,8 +402,12 @@ spec: be a valid secret key. type: string name: + default: "" description: |- Name of the referent. + This field is effectively required, but due to backwards compatibility is + allowed to be empty. Instances of this type with an empty value here are + almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names type: string optional: @@ -531,6 +547,69 @@ spec: required: - totalSize type: object + initializerMetrics: + properties: + backup: + description: Backup contains metrics for the backup initializer + step + properties: + duration: + type: string + size: + format: int64 + type: integer + type: object + composite: + description: Composite contains metrics for the composite initializer + step + properties: + duration: + type: string + size: + format: int64 + type: integer + type: object + fileDownload: + description: FileDownload contains metrics for the file download + initializer step + properties: + duration: + type: string + size: + format: int64 + type: integer + type: object + git: + description: Git contains metrics for the git initializer step + properties: + duration: + type: string + size: + format: int64 + type: integer + type: object + prebuild: + description: Prebuild contains metrics for the prebuild initializer + step + properties: + duration: + type: string + size: + format: int64 + type: integer + type: object + snapshot: + description: |- + Snapshot contains metrics for the snapshot initializer step + This used for workspaces started from snapshots. + properties: + duration: + type: string + size: + format: int64 + type: integer + type: object + type: object lastActivity: format: date-time type: string diff --git a/components/ws-manager-mk2/config/webhook/manifests.yaml b/components/ws-manager-mk2/config/webhook/manifests.yaml index 7da836094b1d47..72a2e24b282869 100644 --- a/components/ws-manager-mk2/config/webhook/manifests.yaml +++ b/components/ws-manager-mk2/config/webhook/manifests.yaml @@ -1,4 +1,4 @@ -# Copyright (c) 2023 Gitpod GmbH. All rights reserved. +# Copyright (c) 2025 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. diff --git a/components/ws-manager-mk2/service/manager.go b/components/ws-manager-mk2/service/manager.go index ab5fe7113617c5..3e2431017ab577 100644 --- a/components/ws-manager-mk2/service/manager.go +++ b/components/ws-manager-mk2/service/manager.go @@ -23,6 +23,7 @@ import ( "google.golang.org/grpc/peer" "google.golang.org/grpc/status" "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/durationpb" "google.golang.org/protobuf/types/known/timestamppb" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" @@ -1115,6 +1116,11 @@ func (wsm *WorkspaceManagerServer) extractWorkspaceStatus(ws *workspacev1.Worksp } } + var initializerMetrics *wsmanapi.InitializerMetrics + if ws.Status.InitializerMetrics != nil { + initializerMetrics = mapInitializerMetrics(ws.Status.InitializerMetrics) + } + res := &wsmanapi.WorkspaceStatus{ Id: ws.Name, StatusVersion: version, @@ -1157,12 +1163,73 @@ func (wsm *WorkspaceManagerServer) extractWorkspaceStatus(ws *workspacev1.Worksp Admission: admissionLevel, OwnerToken: ws.Status.OwnerToken, }, - Repo: convertGitStatus(ws.Status.GitStatus), + Repo: convertGitStatus(ws.Status.GitStatus), + InitializerMetrics: initializerMetrics, } return res } +func mapInitializerMetrics(in *workspacev1.InitializerMetrics) *wsmanapi.InitializerMetrics { + result := &wsmanapi.InitializerMetrics{} + // Convert Git metrics + if in.Git != nil { + result.Git = &wsmanapi.InitializerMetric{ + Duration: durationToProto(in.Git.Duration), + Size: uint64(in.Git.Size), + } + } + + // Convert FileDownload metrics + if in.FileDownload != nil { + result.FileDownload = &wsmanapi.InitializerMetric{ + Duration: durationToProto(in.FileDownload.Duration), + Size: uint64(in.FileDownload.Size), + } + } + + // Convert Snapshot metrics + if in.Snapshot != nil { + result.Snapshot = &wsmanapi.InitializerMetric{ + Duration: durationToProto(in.Snapshot.Duration), + Size: uint64(in.Snapshot.Size), + } + } + + // Convert Backup metrics + if in.Backup != nil { + result.Backup = &wsmanapi.InitializerMetric{ + Duration: durationToProto(in.Backup.Duration), + Size: uint64(in.Backup.Size), + } + } + + // Convert Prebuild metrics + if in.Prebuild != nil { + result.Prebuild = &wsmanapi.InitializerMetric{ + Duration: durationToProto(in.Prebuild.Duration), + Size: uint64(in.Prebuild.Size), + } + } + + // Convert Composite metrics + if in.Composite != nil { + result.Composite = &wsmanapi.InitializerMetric{ + Duration: durationToProto(in.Composite.Duration), + Size: uint64(in.Composite.Size), + } + } + + return result +} + +func durationToProto(d *metav1.Duration) *durationpb.Duration { + if d == nil { + return nil + } + return durationpb.New(d.Duration) +} + func getConditionMessageIfTrue(conds []metav1.Condition, tpe string) string { for _, c := range conds { if c.Type == tpe && c.Status == metav1.ConditionTrue {