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 {