From d6ef67cee32c4c30dd1b0b0ce9cdda2c889045b6 Mon Sep 17 00:00:00 2001 From: Yash Bhardwaj Date: Mon, 10 Jun 2024 17:35:58 +0530 Subject: [PATCH] feat: get change-log api (#234) * feat: get changelog API * fix: lint * fix: undo migration change * fix: refactor to create a new changelog service * fix: update proton --- Makefile | 2 +- core/job/handler/v1beta1/job.go | 46 +- core/job/handler/v1beta1/job_adapter.go | 15 + core/job/handler/v1beta1/job_test.go | 204 ++- core/job/service/changelog_service.go | 35 + core/job/service/job_service.go | 35 +- core/job/service/job_service_test.go | 8 + core/job/spec.go | 11 + internal/store/postgres/job/adapter.go | 33 +- internal/store/postgres/job/job_repository.go | 28 +- .../000063_create_changelog_table.up.sql | 2 +- .../optimus/core/v1beta1/job_spec.pb.go | 1602 ++++++++++------- .../optimus/core/v1beta1/job_spec.pb.gw.go | 119 ++ .../core/v1beta1/job_spec.swagger.json | 76 + .../optimus/core/v1beta1/job_spec_grpc.pb.go | 38 + server/optimus.go | 4 +- 16 files changed, 1537 insertions(+), 721 deletions(-) create mode 100644 core/job/service/changelog_service.go diff --git a/Makefile b/Makefile index d432693411..983fece946 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ NAME = "github.com/goto/optimus" LAST_COMMIT := $(shell git rev-parse --short HEAD) LAST_TAG := "$(shell git rev-list --tags --max-count=1)" OPMS_VERSION := "$(shell git describe --tags ${LAST_TAG})-next" -PROTON_COMMIT := "f9c7065042b7465da89125d5a16f0ed930bc9588" +PROTON_COMMIT := "1090b06ae7c9a95bb3086b55d068b949e50b2aa0" .PHONY: build test test-ci generate-proto unit-test-ci integration-test vet coverage clean install lint diff --git a/core/job/handler/v1beta1/job.go b/core/job/handler/v1beta1/job.go index 8320b5baf3..3899bb5250 100644 --- a/core/job/handler/v1beta1/job.go +++ b/core/job/handler/v1beta1/job.go @@ -28,16 +28,18 @@ const ( ) type JobHandler struct { - l log.Logger - jobService JobService + l log.Logger + jobService JobService + changeLogService ChangeLogService pb.UnimplementedJobSpecificationServiceServer } -func NewJobHandler(jobService JobService, logger log.Logger) *JobHandler { +func NewJobHandler(jobService JobService, changeLogService ChangeLogService, logger log.Logger) *JobHandler { return &JobHandler{ - jobService: jobService, - l: logger, + jobService: jobService, + changeLogService: changeLogService, + l: logger, } } @@ -60,6 +62,10 @@ type JobService interface { GetDownstream(ctx context.Context, job *job.Job, localJob bool) ([]*job.Downstream, error) } +type ChangeLogService interface { + GetChangelog(ctx context.Context, projectName tenant.ProjectName, jobName job.Name) ([]*job.ChangeLog, error) +} + func (jh *JobHandler) AddJobSpecifications(ctx context.Context, jobSpecRequest *pb.AddJobSpecificationsRequest) (*pb.AddJobSpecificationsResponse, error) { jobTenant, err := tenant.NewTenant(jobSpecRequest.ProjectName, jobSpecRequest.NamespaceName) if err != nil { @@ -218,7 +224,7 @@ func (jh *JobHandler) GetJobSpecification(ctx context.Context, req *pb.GetJobSpe } jobName, err := job.NameFrom(req.GetJobName()) if err != nil { - jh.l.Error("error adapating job name [%s]: %s", req.GetJobName(), err) + jh.l.Error("error adapting job name [%s]: %s", req.GetJobName(), err) return nil, err } @@ -235,6 +241,34 @@ func (jh *JobHandler) GetJobSpecification(ctx context.Context, req *pb.GetJobSpe }, nil } +func (jh *JobHandler) GetJobChangelog(ctx context.Context, req *pb.GetJobChangelogRequest) (*pb.GetJobChangelogResponse, error) { + projectName, err := tenant.ProjectNameFrom(req.GetProjectName()) + if err != nil { + jh.l.Error("invalid project information request project [%s]: %s", req.GetProjectName(), err) + return nil, err + } + jobName, err := job.NameFrom(req.GetJobName()) + if err != nil { + jh.l.Error("error adapting job name [%s]: %s", req.GetJobName(), err) + return nil, err + } + + changeLog, err := jh.changeLogService.GetChangelog(ctx, projectName, jobName) + if err != nil && !errors.IsErrorType(err, errors.ErrNotFound) { + errorMsg := "failed to get job specification" + jh.l.Error(fmt.Sprintf("%s: %s", err.Error(), errorMsg)) + return nil, errors.GRPCErr(err, errorMsg) + } + history := make([]*pb.JobChangelog, len(changeLog)) + for i, clog := range changeLog { + history[i] = toJobChangeLogProto(clog) + } + + return &pb.GetJobChangelogResponse{ + History: history, + }, nil +} + func (jh *JobHandler) GetJobSpecifications(ctx context.Context, req *pb.GetJobSpecificationsRequest) (*pb.GetJobSpecificationsResponse, error) { jobSpecs, merr := jh.jobService.GetByFilter(ctx, filter.WithString(filter.ResourceDestination, req.GetResourceDestination()), diff --git a/core/job/handler/v1beta1/job_adapter.go b/core/job/handler/v1beta1/job_adapter.go index 24969068f5..fdeb97e484 100644 --- a/core/job/handler/v1beta1/job_adapter.go +++ b/core/job/handler/v1beta1/job_adapter.go @@ -541,6 +541,21 @@ func toUpstreamProtos(upstreams []*job.Upstream, upstreamSpec *job.UpstreamSpec, } } +func toJobChangeLogProto(changeLog *job.ChangeLog) *pb.JobChangelog { + pbChange := &pb.JobChangelog{ + EventType: changeLog.Type, + Timestamp: changeLog.Time.String(), + } + pbChange.Change = make([]*pb.JobChange, len(changeLog.Change)) + for i, change := range changeLog.Change { + pbChange.Change[i] = &pb.JobChange{ + AttributeName: change.Property, + Diff: change.Diff, + } + } + return pbChange +} + func toHTTPUpstreamProtos(httpUpstreamSpecs []*job.SpecHTTPUpstream) []*pb.HttpDependency { var httpUpstreamProtos []*pb.HttpDependency for _, httpUpstream := range httpUpstreamSpecs { diff --git a/core/job/handler/v1beta1/job_test.go b/core/job/handler/v1beta1/job_test.go index 21a6cc60db..335ce12359 100644 --- a/core/job/handler/v1beta1/job_test.go +++ b/core/job/handler/v1beta1/job_test.go @@ -90,8 +90,9 @@ func TestNewJobHandler(t *testing.T) { t.Run("AddJobSpecifications", func(t *testing.T) { t.Run("adds job", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) jobSpecProto := &pb.JobSpecification{ Version: int32(jobVersion), @@ -122,8 +123,9 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("adds complete job", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) jobSpecProto := &pb.JobSpecification{ Version: int32(jobVersion), @@ -157,8 +159,9 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("returns error when unable to create tenant", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) request := pb.AddJobSpecificationsRequest{ NamespaceName: namespace.Name().String(), @@ -171,8 +174,9 @@ func TestNewJobHandler(t *testing.T) { t.Run("skips job if unable to parse from proto", func(t *testing.T) { t.Run("due to empty owner", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) jobSpecProtos := []*pb.JobSpecification{ { @@ -213,8 +217,9 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("due to invalid start date", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) jobSpecProtos := []*pb.JobSpecification{ { @@ -256,8 +261,9 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("due to invalid end date", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) jobSpecProtos := []*pb.JobSpecification{ { @@ -299,8 +305,9 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("due to invalid alert configuration", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) behaviorWithInvalidAlertConf := &pb.JobSpecification_Behavior{ Retry: &pb.JobSpecification_Behavior_Retry{ExponentialBackoff: false}, @@ -351,8 +358,9 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("returns error when all jobs failed to be added", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) jobSpecProtos := []*pb.JobSpecification{ { @@ -379,8 +387,9 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("returns response with job errors log when some jobs failed to be added", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) jobSpecProtos := []*pb.JobSpecification{ { @@ -423,8 +432,9 @@ func TestNewJobHandler(t *testing.T) { t.Run("UpdateJobSpecifications", func(t *testing.T) { t.Run("update jobs", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) jobSpecProto := &pb.JobSpecification{ Version: int32(jobVersion), @@ -455,8 +465,9 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("update complete jobs", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) jobSpecProto := &pb.JobSpecification{ Version: int32(jobVersion), @@ -490,8 +501,9 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("returns error when unable to create tenant", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) request := pb.UpdateJobSpecificationsRequest{ NamespaceName: namespace.Name().String(), @@ -503,8 +515,9 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("skips job if unable to parse from proto", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) jobSpecProtos := []*pb.JobSpecification{ { @@ -545,8 +558,9 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("returns error when all jobs failed to be updated", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) jobSpecProtos := []*pb.JobSpecification{ { @@ -575,8 +589,9 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("returns response with job errors log when some jobs failed to be updated", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) jobSpecProtos := []*pb.JobSpecification{ { @@ -622,6 +637,7 @@ func TestNewJobHandler(t *testing.T) { t.Run("fail if invalid params", func(t *testing.T) { t.Run("invalid source namespace", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) defer jobService.AssertExpectations(t) jobAName, _ := job.NameFrom("job-A") request := &pb.ChangeJobNamespaceRequest{ @@ -630,12 +646,13 @@ func TestNewJobHandler(t *testing.T) { JobName: jobAName.String(), NewNamespaceName: newNamespaceName, } - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) _, err := jobHandler.ChangeJobNamespace(ctx, request) assert.ErrorContains(t, err, "failed to adapt source tenant when changing job namespace") }) t.Run("invalid new namespace", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) defer jobService.AssertExpectations(t) jobAName, _ := job.NameFrom("job-A") @@ -645,12 +662,13 @@ func TestNewJobHandler(t *testing.T) { JobName: jobAName.String(), NewNamespaceName: "", } - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) _, err := jobHandler.ChangeJobNamespace(ctx, request) assert.ErrorContains(t, err, "failed to adapt new tenant when changing job namespace") }) t.Run("invalid job name", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) defer jobService.AssertExpectations(t) request := &pb.ChangeJobNamespaceRequest{ @@ -659,7 +677,7 @@ func TestNewJobHandler(t *testing.T) { JobName: "", NewNamespaceName: newNamespaceName, } - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) _, err := jobHandler.ChangeJobNamespace(ctx, request) assert.ErrorContains(t, err, "failed to adapt job name when changing job specification") }) @@ -667,6 +685,7 @@ func TestNewJobHandler(t *testing.T) { t.Run("Change job namespace successfully", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) jobAName, _ := job.NameFrom("job-A") request := &pb.ChangeJobNamespaceRequest{ @@ -678,12 +697,13 @@ func TestNewJobHandler(t *testing.T) { newTenant, _ := tenant.NewTenant(project.Name().String(), newNamespaceName) jobService.On("ChangeNamespace", ctx, sampleTenant, newTenant, jobAName).Return(nil) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) _, err := jobHandler.ChangeJobNamespace(ctx, request) assert.NoError(t, err) }) t.Run("fail to Change job namespace", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) jobAName, _ := job.NameFrom("job-A") request := &pb.ChangeJobNamespaceRequest{ @@ -695,7 +715,7 @@ func TestNewJobHandler(t *testing.T) { newTenant, _ := tenant.NewTenant(project.Name().String(), newNamespaceName) jobService.On("ChangeNamespace", ctx, sampleTenant, newTenant, jobAName).Return(errors.New("error in changing namespace")) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) _, err := jobHandler.ChangeJobNamespace(ctx, request) assert.ErrorContains(t, err, "error in changing namespace: failed to change job namespace") }) @@ -712,7 +732,7 @@ func TestNewJobHandler(t *testing.T) { JobNames: []string{jobAName.String()}, } - jobHandler := v1beta1.NewJobHandler(nil, log) + jobHandler := v1beta1.NewJobHandler(nil, nil, log) _, err := jobHandler.UpdateJobsState(ctx, request) assert.ErrorContains(t, err, "namespace name is empty") }) @@ -725,7 +745,7 @@ func TestNewJobHandler(t *testing.T) { JobNames: []string{""}, } - jobHandler := v1beta1.NewJobHandler(nil, log) + jobHandler := v1beta1.NewJobHandler(nil, nil, log) _, err := jobHandler.UpdateJobsState(ctx, request) assert.ErrorContains(t, err, "name is empty") }) @@ -737,7 +757,7 @@ func TestNewJobHandler(t *testing.T) { Remark: updateRemark, JobNames: []string{jobAName.String()}, } - jobHandler := v1beta1.NewJobHandler(nil, log) + jobHandler := v1beta1.NewJobHandler(nil, nil, log) _, err := jobHandler.UpdateJobsState(ctx, request) assert.ErrorContains(t, err, "invalid state") }) @@ -750,7 +770,7 @@ func TestNewJobHandler(t *testing.T) { Remark: "", } - jobHandler := v1beta1.NewJobHandler(nil, log) + jobHandler := v1beta1.NewJobHandler(nil, nil, log) _, err := jobHandler.UpdateJobsState(ctx, request) assert.ErrorContains(t, err, "can not update job state without a valid remark") }) @@ -758,6 +778,7 @@ func TestNewJobHandler(t *testing.T) { t.Run("DeleteJobSpecification", func(t *testing.T) { t.Run("deletes job successfully", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) jobAName, _ := job.NameFrom("job-A") request := &pb.DeleteJobSpecificationRequest{ @@ -770,13 +791,14 @@ func TestNewJobHandler(t *testing.T) { jobService.On("Delete", ctx, sampleTenant, jobAName, false, false).Return(nil, nil) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) resp, err := jobHandler.DeleteJobSpecification(ctx, request) assert.NoError(t, err) assert.NotContains(t, resp.Message, "these downstream will be affected") }) t.Run("force deletes job with downstream successfully", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) jobAName, _ := job.NameFrom("job-A") request := &pb.DeleteJobSpecificationRequest{ @@ -790,13 +812,14 @@ func TestNewJobHandler(t *testing.T) { downstreamNames := []job.FullName{"job-B"} jobService.On("Delete", ctx, sampleTenant, jobAName, false, true).Return(downstreamNames, nil) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) resp, err := jobHandler.DeleteJobSpecification(ctx, request) assert.NoError(t, err) assert.Contains(t, resp.Message, "these downstream will be affected") }) t.Run("returns error if unable to construct tenant", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) jobAName, _ := job.NameFrom("job-A") request := &pb.DeleteJobSpecificationRequest{ @@ -806,13 +829,14 @@ func TestNewJobHandler(t *testing.T) { Force: true, } - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) resp, err := jobHandler.DeleteJobSpecification(ctx, request) assert.Error(t, err) assert.Nil(t, resp) }) t.Run("returns error if job name is not found", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) request := &pb.DeleteJobSpecificationRequest{ ProjectName: project.Name().String(), @@ -821,13 +845,14 @@ func TestNewJobHandler(t *testing.T) { Force: true, } - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) resp, err := jobHandler.DeleteJobSpecification(ctx, request) assert.Error(t, err) assert.Nil(t, resp) }) t.Run("returns error if unable to delete job", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) jobAName, _ := job.NameFrom("job-A") request := &pb.DeleteJobSpecificationRequest{ @@ -840,7 +865,7 @@ func TestNewJobHandler(t *testing.T) { jobService.On("Delete", ctx, sampleTenant, jobAName, false, true).Return(nil, errors.New("internal error")) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) resp, err := jobHandler.DeleteJobSpecification(ctx, request) assert.Error(t, err) assert.Nil(t, resp) @@ -851,7 +876,7 @@ func TestNewJobHandler(t *testing.T) { req := &pb.GetWindowRequest{ ScheduledAt: nil, } - jobHandler := v1beta1.NewJobHandler(nil, log) + jobHandler := v1beta1.NewJobHandler(nil, nil, log) resp, err := jobHandler.GetWindow(ctx, req) assert.Error(t, err) @@ -862,7 +887,7 @@ func TestNewJobHandler(t *testing.T) { Version: 3, ScheduledAt: timestamppb.New(time.Date(2022, 11, 18, 13, 0, 0, 0, time.UTC)), } - jobHandler := v1beta1.NewJobHandler(nil, log) + jobHandler := v1beta1.NewJobHandler(nil, nil, log) resp, err := jobHandler.GetWindow(ctx, req) assert.Error(t, err) @@ -874,7 +899,7 @@ func TestNewJobHandler(t *testing.T) { ScheduledAt: timestamppb.New(time.Date(2022, 11, 18, 13, 0, 0, 0, time.UTC)), Size: "1", } - jobHandler := v1beta1.NewJobHandler(nil, log) + jobHandler := v1beta1.NewJobHandler(nil, nil, log) resp, err := jobHandler.GetWindow(ctx, req) assert.Error(t, err) @@ -888,7 +913,7 @@ func TestNewJobHandler(t *testing.T) { Offset: "0", TruncateTo: "d", } - jobHandler := v1beta1.NewJobHandler(nil, log) + jobHandler := v1beta1.NewJobHandler(nil, nil, log) resp, err := jobHandler.GetWindow(ctx, req) assert.NoError(t, err) @@ -901,7 +926,7 @@ func TestNewJobHandler(t *testing.T) { Offset: "0", TruncateTo: "d", } - jobHandler := v1beta1.NewJobHandler(nil, log) + jobHandler := v1beta1.NewJobHandler(nil, nil, log) resp, err := jobHandler.GetWindow(ctx, req) assert.NoError(t, err) @@ -912,8 +937,9 @@ func TestNewJobHandler(t *testing.T) { var jobNamesWithInvalidSpec []job.Name t.Run("replaces all job specifications of a tenant", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) jobProtos := []*pb.JobSpecification{ { @@ -978,8 +1004,9 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("replaces all job specifications given multiple tenant", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) jobProtos := []*pb.JobSpecification{ { @@ -1024,8 +1051,9 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("skips a job if the proto is invalid", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) jobProtos := []*pb.JobSpecification{ { @@ -1066,8 +1094,9 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("skips operation for a namespace if the tenant is invalid", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) jobProtos := []*pb.JobSpecification{ { @@ -1117,8 +1146,9 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("marks operation for this namespace to failed if unable to successfully do replace all", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) jobProtos := []*pb.JobSpecification{ { @@ -1168,8 +1198,9 @@ func TestNewJobHandler(t *testing.T) { t.Run("RefreshJobs", func(t *testing.T) { t.Run("do refresh for the requested jobs", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) request := &pb.RefreshJobsRequest{ ProjectName: project.Name().String(), @@ -1188,8 +1219,9 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("returns error if project name is invalid", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) request := &pb.RefreshJobsRequest{ NamespaceNames: []string{namespace.Name().String()}, @@ -1205,8 +1237,9 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("returns error if unable to successfully run refresh", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) request := &pb.RefreshJobsRequest{ ProjectName: project.Name().String(), @@ -1227,17 +1260,19 @@ func TestNewJobHandler(t *testing.T) { t.Run("GetJobSpecification", func(t *testing.T) { t.Run("return error when tenant creation failed", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) defer jobService.AssertExpectations(t) request := pb.GetJobSpecificationRequest{} - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) resp, err := jobHandler.GetJobSpecification(ctx, &request) assert.Error(t, err) assert.Nil(t, resp) }) t.Run("return error when job name is empty", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) defer jobService.AssertExpectations(t) request := pb.GetJobSpecificationRequest{ @@ -1245,13 +1280,14 @@ func TestNewJobHandler(t *testing.T) { NamespaceName: sampleTenant.NamespaceName().String(), } - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) resp, err := jobHandler.GetJobSpecification(ctx, &request) assert.Error(t, err) assert.Nil(t, resp) }) t.Run("return error when service get failed", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) defer jobService.AssertExpectations(t) request := pb.GetJobSpecificationRequest{ @@ -1261,13 +1297,14 @@ func TestNewJobHandler(t *testing.T) { } jobService.On("Get", ctx, sampleTenant, job.Name("job-A")).Return(nil, errors.New("error encountered")) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) resp, err := jobHandler.GetJobSpecification(ctx, &request) assert.Error(t, err) assert.Nil(t, resp) }) t.Run("return success", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) defer jobService.AssertExpectations(t) specA, _ := job.NewSpecBuilder(jobVersion, "job-A", sampleOwner, jobSchedule, jobWindow, jobTask).Build() @@ -1280,7 +1317,7 @@ func TestNewJobHandler(t *testing.T) { } jobService.On("Get", ctx, sampleTenant, jobA.Spec().Name()).Return(jobA, nil) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) resp, err := jobHandler.GetJobSpecification(ctx, &request) assert.NoError(t, err) assert.NotNil(t, resp) @@ -1292,12 +1329,13 @@ func TestNewJobHandler(t *testing.T) { } t.Run("return error when service get by filter is failed", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) defer jobService.AssertExpectations(t) request := pb.GetJobSpecificationsRequest{} jobService.On("GetByFilter", ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("error encountered")) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) resp, err := jobHandler.GetJobSpecifications(ctx, &request) assert.Error(t, err) assert.NotNil(t, resp) @@ -1305,6 +1343,7 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("return success", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) defer jobService.AssertExpectations(t) request := pb.GetJobSpecificationsRequest{} @@ -1315,7 +1354,7 @@ func TestNewJobHandler(t *testing.T) { jobB := job.NewJob(sampleTenant, specB, resourceURNB, []resource.URN{resourceURNC}, false) jobService.On("GetByFilter", ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]*job.Job{jobA, jobB}, nil) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) resp, err := jobHandler.GetJobSpecifications(ctx, &request) assert.NoError(t, err) assert.NotNil(t, resp) @@ -1326,6 +1365,7 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("return success without asset", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) defer jobService.AssertExpectations(t) request := pb.GetJobSpecificationsRequest{ @@ -1338,7 +1378,7 @@ func TestNewJobHandler(t *testing.T) { jobB := job.NewJob(sampleTenant, specB, resourceURNB, []resource.URN{resourceURNC}, false) jobService.On("GetByFilter", ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]*job.Job{jobA, jobB}, nil) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) resp, err := jobHandler.GetJobSpecifications(ctx, &request) assert.NoError(t, err) assert.NotNil(t, resp) @@ -1354,12 +1394,13 @@ func TestNewJobHandler(t *testing.T) { } t.Run("return error when service get by filter failed", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) defer jobService.AssertExpectations(t) request := pb.ListJobSpecificationRequest{} jobService.On("GetByFilter", ctx, mock.Anything, mock.Anything).Return(nil, errors.New("error encountered")) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) resp, err := jobHandler.ListJobSpecification(ctx, &request) assert.Error(t, err) assert.NotNil(t, resp) @@ -1367,6 +1408,7 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("return success", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) defer jobService.AssertExpectations(t) request := pb.ListJobSpecificationRequest{ @@ -1380,7 +1422,7 @@ func TestNewJobHandler(t *testing.T) { jobB := job.NewJob(sampleTenant, specB, resourceURNB, []resource.URN{resourceURNC}, false) jobService.On("GetByFilter", ctx, mock.Anything, mock.Anything).Return([]*job.Job{jobA, jobB}, nil) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) resp, err := jobHandler.ListJobSpecification(ctx, &request) assert.NoError(t, err) assert.NotNil(t, resp) @@ -1391,6 +1433,7 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("return success without asset", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) defer jobService.AssertExpectations(t) request := pb.ListJobSpecificationRequest{ @@ -1405,7 +1448,7 @@ func TestNewJobHandler(t *testing.T) { jobB := job.NewJob(sampleTenant, specB, resourceURNB, []resource.URN{resourceURNC}, false) jobService.On("GetByFilter", ctx, mock.Anything, mock.Anything).Return([]*job.Job{jobA, jobB}, nil) - jobHandler := v1beta1.NewJobHandler(jobService, log) + jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) resp, err := jobHandler.ListJobSpecification(ctx, &request) assert.NoError(t, err) assert.NotNil(t, resp) @@ -1424,6 +1467,7 @@ func TestNewJobHandler(t *testing.T) { } t.Run("should return basic info, upstream, downstream of an existing job", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) httpUpstream, _ := job.NewSpecHTTPUpstreamBuilder("sample-upstream", "sample-url").Build() upstreamSpec, _ := job.NewSpecUpstreamBuilder().WithSpecHTTPUpstream([]*job.SpecHTTPUpstream{httpUpstream}).Build() @@ -1522,13 +1566,14 @@ func TestNewJobHandler(t *testing.T) { }, } - handler := v1beta1.NewJobHandler(jobService, log) + handler := v1beta1.NewJobHandler(jobService, changeLogService, log) result, err := handler.JobInspect(ctx, req) assert.NoError(t, err) assert.Equal(t, resp, result) }) t.Run("should return basic info, upstream, downstream of a user given job spec", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) httpUpstream, _ := job.NewSpecHTTPUpstreamBuilder("sample-upstream", "sample-url").Build() upstreamSpec, _ := job.NewSpecUpstreamBuilder(). @@ -1658,39 +1703,42 @@ func TestNewJobHandler(t *testing.T) { }, } - handler := v1beta1.NewJobHandler(jobService, log) + handler := v1beta1.NewJobHandler(jobService, changeLogService, log) result, err := handler.JobInspect(ctx, req) assert.NoError(t, err) assert.Equal(t, resp, result) }) t.Run("should return error if tenant is invalid", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) req := &pb.JobInspectRequest{ ProjectName: project.Name().String(), JobName: "job-A", } - handler := v1beta1.NewJobHandler(jobService, log) + handler := v1beta1.NewJobHandler(jobService, changeLogService, log) result, err := handler.JobInspect(ctx, req) assert.Error(t, err) assert.Nil(t, result) }) t.Run("should return error if job name and spec are not provided", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) req := &pb.JobInspectRequest{ ProjectName: project.Name().String(), NamespaceName: namespace.Name().String(), } - handler := v1beta1.NewJobHandler(jobService, log) + handler := v1beta1.NewJobHandler(jobService, changeLogService, log) result, err := handler.JobInspect(ctx, req) assert.Error(t, err) assert.Nil(t, result) }) t.Run("should return error if job spec proto is invalid", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) jobSpecProto := &pb.JobSpecification{ Name: "job-A", @@ -1701,13 +1749,14 @@ func TestNewJobHandler(t *testing.T) { Spec: jobSpecProto, } - handler := v1beta1.NewJobHandler(jobService, log) + handler := v1beta1.NewJobHandler(jobService, changeLogService, log) result, err := handler.JobInspect(ctx, req) assert.Error(t, err) assert.Nil(t, result) }) t.Run("should return downstream and upstream error log messages if exist", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) specA, _ := job.NewSpecBuilder(jobVersion, "job-A", sampleOwner, jobSchedule, jobWindow, jobTask).Build() jobA := job.NewJob(sampleTenant, specA, resourceURNA, nil, false) @@ -1795,13 +1844,14 @@ func TestNewJobHandler(t *testing.T) { }, } - handler := v1beta1.NewJobHandler(jobService, log) + handler := v1beta1.NewJobHandler(jobService, changeLogService, log) result, err := handler.JobInspect(ctx, req) assert.NoError(t, err) assert.Equal(t, resp, result) }) t.Run("should return error if job basic info is not found", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) httpUpstream, _ := job.NewSpecHTTPUpstreamBuilder("sample-upstream", "sample-url").Build() upstreamSpec, _ := job.NewSpecUpstreamBuilder().WithSpecHTTPUpstream([]*job.SpecHTTPUpstream{httpUpstream}).Build() @@ -1818,7 +1868,7 @@ func TestNewJobHandler(t *testing.T) { JobName: specA.Name().String(), } - handler := v1beta1.NewJobHandler(jobService, log) + handler := v1beta1.NewJobHandler(jobService, changeLogService, log) result, err := handler.JobInspect(ctx, req) assert.Nil(t, result) assert.ErrorContains(t, err, "not found") @@ -1827,11 +1877,12 @@ func TestNewJobHandler(t *testing.T) { t.Run("GetJobTask", func(t *testing.T) { t.Run("return error when create tenant failed", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) defer jobService.AssertExpectations(t) req := &pb.GetJobTaskRequest{} - handler := v1beta1.NewJobHandler(jobService, log) + handler := v1beta1.NewJobHandler(jobService, changeLogService, log) resp, err := handler.GetJobTask(ctx, req) assert.Error(t, err) assert.Nil(t, resp) @@ -1839,6 +1890,7 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("return error when job name is empty", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) defer jobService.AssertExpectations(t) req := &pb.GetJobTaskRequest{ @@ -1846,7 +1898,7 @@ func TestNewJobHandler(t *testing.T) { NamespaceName: sampleTenant.NamespaceName().String(), } - handler := v1beta1.NewJobHandler(jobService, log) + handler := v1beta1.NewJobHandler(jobService, changeLogService, log) resp, err := handler.GetJobTask(ctx, req) assert.Error(t, err) assert.Nil(t, resp) @@ -1854,6 +1906,7 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("return error when service get job eror", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) defer jobService.AssertExpectations(t) req := &pb.GetJobTaskRequest{ @@ -1863,13 +1916,14 @@ func TestNewJobHandler(t *testing.T) { } jobService.On("Get", ctx, sampleTenant, job.Name("job-A")).Return(nil, errors.New("error encountered")) - handler := v1beta1.NewJobHandler(jobService, log) + handler := v1beta1.NewJobHandler(jobService, changeLogService, log) resp, err := handler.GetJobTask(ctx, req) assert.Error(t, err) assert.Nil(t, resp) }) t.Run("return error when service get task info error", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) defer jobService.AssertExpectations(t) specA, _ := job.NewSpecBuilder(jobVersion, "job-A", sampleOwner, jobSchedule, jobWindow, jobTask).Build() @@ -1883,13 +1937,14 @@ func TestNewJobHandler(t *testing.T) { jobService.On("Get", ctx, sampleTenant, jobA.Spec().Name()).Return(jobA, nil) jobService.On("GetTaskInfo", ctx, jobA.Spec().Task()).Return(nil, errors.New("error encountered")) - handler := v1beta1.NewJobHandler(jobService, log) + handler := v1beta1.NewJobHandler(jobService, changeLogService, log) resp, err := handler.GetJobTask(ctx, req) assert.Error(t, err) assert.Nil(t, resp) }) t.Run("return success", func(t *testing.T) { jobService := new(JobService) + changeLogService := new(ChangeLogService) defer jobService.AssertExpectations(t) specA, _ := job.NewSpecBuilder(jobVersion, "job-A", sampleOwner, jobSchedule, jobWindow, jobTask).Build() @@ -1908,7 +1963,7 @@ func TestNewJobHandler(t *testing.T) { } jobService.On("Get", ctx, sampleTenant, jobA.Spec().Name()).Return(jobA, nil) jobService.On("GetTaskInfo", ctx, jobA.Spec().Task()).Return(taskInfo, nil) - handler := v1beta1.NewJobHandler(jobService, log) + handler := v1beta1.NewJobHandler(jobService, changeLogService, log) resp, err := handler.GetJobTask(ctx, req) assert.NoError(t, err) assert.NotNil(t, resp) @@ -1917,6 +1972,19 @@ func TestNewJobHandler(t *testing.T) { }) } +// ChangeLogService is an autogenerated mock type for the JobService type +type ChangeLogService struct { + mock.Mock +} + +func (_m *ChangeLogService) GetChangelog(ctx context.Context, projectName tenant.ProjectName, jobName job.Name) ([]*job.ChangeLog, error) { + args := _m.Called(ctx, projectName, jobName) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).([]*job.ChangeLog), args.Error(1) +} + // JobService is an autogenerated mock type for the JobService type type JobService struct { mock.Mock @@ -2076,6 +2144,14 @@ func (_m *JobService) GetJobBasicInfo(ctx context.Context, jobTenant tenant.Tena return r0, r1 } +func (_m *JobService) GetChangelog(ctx context.Context, projectName tenant.ProjectName, jobName job.Name) ([]*job.ChangeLog, error) { + args := _m.Called(ctx, projectName, jobName) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).([]*job.ChangeLog), args.Error(1) +} + // GetTaskInfo provides a mock function with given fields: ctx, task func (_m *JobService) GetTaskInfo(ctx context.Context, task job.Task) (*plugin.Info, error) { ret := _m.Called(ctx, task) diff --git a/core/job/service/changelog_service.go b/core/job/service/changelog_service.go new file mode 100644 index 0000000000..b301bdfbd0 --- /dev/null +++ b/core/job/service/changelog_service.go @@ -0,0 +1,35 @@ +package service + +import ( + "context" + + "github.com/goto/optimus/core/job" + "github.com/goto/optimus/core/tenant" +) + +type ChangeLogService struct { + jobRepo JobRepository +} + +func (cl *ChangeLogService) GetChangelog(ctx context.Context, projectName tenant.ProjectName, jobName job.Name) ([]*job.ChangeLog, error) { + changelog, err := cl.jobRepo.GetChangelog(ctx, projectName, jobName) + if err != nil { + getChangelogFailures.WithLabelValues( + projectName.String(), + jobName.String(), + err.Error(), + ).Inc() + } + getChangelogFeatureAdoption.WithLabelValues( + projectName.String(), + jobName.String(), + ).Inc() + + return changelog, err +} + +func NewChangeLogService(jobRepo JobRepository) *ChangeLogService { + return &ChangeLogService{ + jobRepo: jobRepo, + } +} diff --git a/core/job/service/job_service.go b/core/job/service/job_service.go index 8bb854e5af..2633f7382d 100644 --- a/core/job/service/job_service.go +++ b/core/job/service/job_service.go @@ -9,6 +9,8 @@ import ( "github.com/goto/salt/log" "github.com/kushsharma/parallel" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "github.com/goto/optimus/core/event" "github.com/goto/optimus/core/event/moderator" @@ -36,6 +38,20 @@ const ( projectConfigPrefix = "GLOBAL__" ) +var ( + + // right now this is done to capture the feature adoption + getChangelogFeatureAdoption = promauto.NewCounterVec(prometheus.CounterOpts{ + Name: "get_changelog_total", + Help: "number of requests received for viewing changelog", + }, []string{"project", "job"}) + + getChangelogFailures = promauto.NewCounterVec(prometheus.CounterOpts{ + Name: "get_changelog_errors", + Help: "errors occurred in get changelog", + }, []string{"project", "job", "error"}) +) + type JobService struct { jobRepo JobRepository upstreamRepo UpstreamRepository @@ -100,13 +116,13 @@ type JobDeploymentService interface { } type JobRepository interface { - // TODO: remove `savedJobs` since the method's main purpose is to add, not to get Add(context.Context, []*job.Job) (addedJobs []*job.Job, err error) Update(context.Context, []*job.Job) (updatedJobs []*job.Job, err error) Delete(ctx context.Context, projectName tenant.ProjectName, jobName job.Name, cleanHistory bool) error SetDirty(ctx context.Context, jobsTenant tenant.Tenant, jobNames []job.Name, isDirty bool) error ChangeJobNamespace(ctx context.Context, jobName job.Name, tenant, newTenant tenant.Tenant) error + GetChangelog(ctx context.Context, projectName tenant.ProjectName, jobName job.Name) ([]*job.ChangeLog, error) GetByJobName(ctx context.Context, projectName tenant.ProjectName, jobName job.Name) (*job.Job, error) GetAllByResourceDestination(ctx context.Context, resourceDestination resource.URN) ([]*job.Job, error) GetAllByTenant(ctx context.Context, jobTenant tenant.Tenant) ([]*job.Job, error) @@ -330,6 +346,23 @@ func (j *JobService) ChangeNamespace(ctx context.Context, jobTenant, jobNewTenan return nil } +func (j *JobService) GetChangelog(ctx context.Context, projectName tenant.ProjectName, jobName job.Name) ([]*job.ChangeLog, error) { + changelog, err := j.jobRepo.GetChangelog(ctx, projectName, jobName) + if err != nil { + getChangelogFailures.WithLabelValues( + projectName.String(), + jobName.String(), + err.Error(), + ).Inc() + } + getChangelogFeatureAdoption.WithLabelValues( + projectName.String(), + jobName.String(), + ).Inc() + + return changelog, err +} + func (j *JobService) Get(ctx context.Context, jobTenant tenant.Tenant, jobName job.Name) (*job.Job, error) { jobs, err := j.GetByFilter(ctx, filter.WithString(filter.ProjectName, jobTenant.ProjectName().String()), diff --git a/core/job/service/job_service_test.go b/core/job/service/job_service_test.go index c5c4f70466..725ce3d86a 100644 --- a/core/job/service/job_service_test.go +++ b/core/job/service/job_service_test.go @@ -4293,6 +4293,14 @@ func (_m *JobRepository) Add(_a0 context.Context, _a1 []*job.Job) ([]*job.Job, e return r0, r1 } +func (_m *JobRepository) GetChangelog(ctx context.Context, projectName tenant.ProjectName, jobName job.Name) ([]*job.ChangeLog, error) { + args := _m.Called(ctx, projectName, jobName) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).([]*job.ChangeLog), args.Error(1) +} + // Delete provides a mock function with given fields: ctx, projectName, jobName, cleanHistory func (_m *JobRepository) Delete(ctx context.Context, projectName tenant.ProjectName, jobName job.Name, cleanHistory bool) error { ret := _m.Called(ctx, projectName, jobName, cleanHistory) diff --git a/core/job/spec.go b/core/job/spec.go index baef01d2b8..8064b3b3b3 100644 --- a/core/job/spec.go +++ b/core/job/spec.go @@ -587,6 +587,17 @@ type SpecHTTPUpstream struct { params map[string]string } +type Change struct { + Property string + Diff string +} + +type ChangeLog struct { + Change []Change + Type string + Time time.Time +} + func (s SpecHTTPUpstream) Name() string { return s.name } diff --git a/internal/store/postgres/job/adapter.go b/internal/store/postgres/job/adapter.go index 99b6f13202..28ae2f9046 100644 --- a/internal/store/postgres/job/adapter.go +++ b/internal/store/postgres/job/adapter.go @@ -60,7 +60,12 @@ type Change struct { Property string `json:"attribute_name"` Diff string `json:"diff"` } -type ChangeLog []Change + +type ChangeLog struct { + Change []Change + Type string + Time time.Time +} type Schedule struct { StartDate time.Time @@ -376,6 +381,20 @@ func toStorageMetadata(metadataSpec *job.Metadata) ([]byte, error) { return json.Marshal(metadata) } +func fromStorageChangelog(changeLog *ChangeLog) *job.ChangeLog { + jobChangeLog := job.ChangeLog{ + Type: changeLog.Type, + Time: changeLog.Time, + } + + jobChangeLog.Change = make([]job.Change, len(changeLog.Change)) + for i, change := range changeLog.Change { + jobChangeLog.Change[i].Property = change.Property + jobChangeLog.Change[i].Diff = change.Diff + } + return &jobChangeLog +} + func fromStorageSpec(jobSpec *Spec) (*job.Spec, error) { version := jobSpec.Version @@ -658,6 +677,18 @@ func fromStorageWebhook(raw []byte) ([]*job.WebhookSpec, error) { return webhookSpecs, nil } +func FromChangelogRow(row pgx.Row) (*ChangeLog, error) { + var cl ChangeLog + err := row.Scan(&cl.Change, &cl.Type, &cl.Time) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return nil, errors.NotFound(job.EntityJobChangeLog, "changelog not found") + } + return nil, errors.Wrap(job.EntityJob, "error in reading row for changelog", err) + } + return &cl, nil +} + func FromRow(row pgx.Row) (*Spec, error) { var js Spec diff --git a/internal/store/postgres/job/job_repository.go b/internal/store/postgres/job/job_repository.go index 13d94f6d7c..49d11c028e 100644 --- a/internal/store/postgres/job/job_repository.go +++ b/internal/store/postgres/job/job_repository.go @@ -257,7 +257,7 @@ func (j JobRepository) preCheckUpdate(ctx context.Context, jobEntity *job.Job) e return nil } -func getJobDiff(storageSpecOld *Spec, newJobEntity *job.Job) (ChangeLog, error) { +func getJobDiff(storageSpecOld *Spec, newJobEntity *job.Job) ([]Change, error) { toIgnore := map[string]struct{}{ "ID": {}, "CreatedAt": {}, @@ -286,7 +286,7 @@ func getJobDiff(storageSpecOld *Spec, newJobEntity *job.Job) (ChangeLog, error) return changelog, nil } -func (j JobRepository) insertChangelog(ctx context.Context, jobName job.Name, projectName tenant.ProjectName, changeLog ChangeLog) error { +func (j JobRepository) insertChangelog(ctx context.Context, jobName job.Name, projectName tenant.ProjectName, changeLog []Change) error { changeLogBytes, err := json.Marshal(changeLog) if err != nil { return err @@ -305,6 +305,30 @@ func (j JobRepository) insertChangelog(ctx context.Context, jobName job.Name, pr return err } +func (j JobRepository) GetChangelog(ctx context.Context, projectName tenant.ProjectName, jobName job.Name) ([]*job.ChangeLog, error) { + me := errors.NewMultiError("get change log errors") + + getChangeLogQuery := `select changes, change_type, created_at from changeLog where project_name = $1 and name = $2;` + + rows, err := j.db.Query(ctx, getChangeLogQuery, projectName, jobName) + if err != nil { + return nil, errors.Wrap(job.EntityJob, "error while changeLog for job: "+projectName.String()+"/"+jobName.String(), err) + } + defer rows.Close() + + var changeLog []*job.ChangeLog + for rows.Next() { + log, err := FromChangelogRow(rows) + if err != nil { + me.Append(err) + continue + } + changeLog = append(changeLog, fromStorageChangelog(log)) + } + + return changeLog, me.ToErr() +} + func (j JobRepository) computeAndPersistChangeLog(ctx context.Context, existingJob *Spec, incomingJobEntity *job.Job) error { changeLog, err := getJobDiff(existingJob, incomingJobEntity) if err != nil { diff --git a/internal/store/postgres/migrations/000063_create_changelog_table.up.sql b/internal/store/postgres/migrations/000063_create_changelog_table.up.sql index e65e7c9052..52089ee610 100644 --- a/internal/store/postgres/migrations/000063_create_changelog_table.up.sql +++ b/internal/store/postgres/migrations/000063_create_changelog_table.up.sql @@ -21,4 +21,4 @@ CREATE TABLE IF NOT EXISTS changelog ( created_at TIMESTAMP WITH TIME ZONE NOT NULL ); -CREATE INDEX IF NOT EXISTS changelog_project_name_name_idx ON changelog USING btree (project_name, name); +CREATE INDEX IF NOT EXISTS changelog_project_name_name_idx ON changelog USING btree (project_name, name); \ No newline at end of file diff --git a/protos/gotocompany/optimus/core/v1beta1/job_spec.pb.go b/protos/gotocompany/optimus/core/v1beta1/job_spec.pb.go index bef27fba8e..b495eb6587 100644 --- a/protos/gotocompany/optimus/core/v1beta1/job_spec.pb.go +++ b/protos/gotocompany/optimus/core/v1beta1/job_spec.pb.go @@ -2702,6 +2702,226 @@ func (x *DeployJobFailure) GetMessage() string { return "" } +type GetJobChangelogRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + JobName string `protobuf:"bytes,2,opt,name=job_name,json=jobName,proto3" json:"job_name,omitempty"` +} + +func (x *GetJobChangelogRequest) Reset() { + *x = GetJobChangelogRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetJobChangelogRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetJobChangelogRequest) ProtoMessage() {} + +func (x *GetJobChangelogRequest) ProtoReflect() protoreflect.Message { + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[40] + 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 GetJobChangelogRequest.ProtoReflect.Descriptor instead. +func (*GetJobChangelogRequest) Descriptor() ([]byte, []int) { + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{40} +} + +func (x *GetJobChangelogRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *GetJobChangelogRequest) GetJobName() string { + if x != nil { + return x.JobName + } + return "" +} + +type JobChange struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AttributeName string `protobuf:"bytes,1,opt,name=attribute_name,json=attributeName,proto3" json:"attribute_name,omitempty"` + Diff string `protobuf:"bytes,2,opt,name=diff,proto3" json:"diff,omitempty"` +} + +func (x *JobChange) Reset() { + *x = JobChange{} + if protoimpl.UnsafeEnabled { + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *JobChange) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobChange) ProtoMessage() {} + +func (x *JobChange) ProtoReflect() protoreflect.Message { + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[41] + 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 JobChange.ProtoReflect.Descriptor instead. +func (*JobChange) Descriptor() ([]byte, []int) { + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{41} +} + +func (x *JobChange) GetAttributeName() string { + if x != nil { + return x.AttributeName + } + return "" +} + +func (x *JobChange) GetDiff() string { + if x != nil { + return x.Diff + } + return "" +} + +type JobChangelog struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EventType string `protobuf:"bytes,1,opt,name=event_type,json=eventType,proto3" json:"event_type,omitempty"` + Timestamp string `protobuf:"bytes,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Change []*JobChange `protobuf:"bytes,3,rep,name=change,proto3" json:"change,omitempty"` +} + +func (x *JobChangelog) Reset() { + *x = JobChangelog{} + if protoimpl.UnsafeEnabled { + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *JobChangelog) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobChangelog) ProtoMessage() {} + +func (x *JobChangelog) ProtoReflect() protoreflect.Message { + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[42] + 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 JobChangelog.ProtoReflect.Descriptor instead. +func (*JobChangelog) Descriptor() ([]byte, []int) { + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{42} +} + +func (x *JobChangelog) GetEventType() string { + if x != nil { + return x.EventType + } + return "" +} + +func (x *JobChangelog) GetTimestamp() string { + if x != nil { + return x.Timestamp + } + return "" +} + +func (x *JobChangelog) GetChange() []*JobChange { + if x != nil { + return x.Change + } + return nil +} + +type GetJobChangelogResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + History []*JobChangelog `protobuf:"bytes,1,rep,name=history,proto3" json:"history,omitempty"` +} + +func (x *GetJobChangelogResponse) Reset() { + *x = GetJobChangelogResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetJobChangelogResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetJobChangelogResponse) ProtoMessage() {} + +func (x *GetJobChangelogResponse) ProtoReflect() protoreflect.Message { + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[43] + 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 GetJobChangelogResponse.ProtoReflect.Descriptor instead. +func (*GetJobChangelogResponse) Descriptor() ([]byte, []int) { + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{43} +} + +func (x *GetJobChangelogResponse) GetHistory() []*JobChangelog { + if x != nil { + return x.History + } + return nil +} + type GetJobSpecificationsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2717,7 +2937,7 @@ type GetJobSpecificationsRequest struct { func (x *GetJobSpecificationsRequest) Reset() { *x = GetJobSpecificationsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[40] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2730,7 +2950,7 @@ func (x *GetJobSpecificationsRequest) String() string { func (*GetJobSpecificationsRequest) ProtoMessage() {} func (x *GetJobSpecificationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[40] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2743,7 +2963,7 @@ func (x *GetJobSpecificationsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetJobSpecificationsRequest.ProtoReflect.Descriptor instead. func (*GetJobSpecificationsRequest) Descriptor() ([]byte, []int) { - return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{40} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{44} } func (x *GetJobSpecificationsRequest) GetProjectName() string { @@ -2794,7 +3014,7 @@ type GetJobSpecificationsResponse struct { func (x *GetJobSpecificationsResponse) Reset() { *x = GetJobSpecificationsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[41] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2807,7 +3027,7 @@ func (x *GetJobSpecificationsResponse) String() string { func (*GetJobSpecificationsResponse) ProtoMessage() {} func (x *GetJobSpecificationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[41] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2820,7 +3040,7 @@ func (x *GetJobSpecificationsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetJobSpecificationsResponse.ProtoReflect.Descriptor instead. func (*GetJobSpecificationsResponse) Descriptor() ([]byte, []int) { - return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{41} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{45} } // Deprecated: Do not use. @@ -2851,7 +3071,7 @@ type JobSpecificationResponse struct { func (x *JobSpecificationResponse) Reset() { *x = JobSpecificationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[42] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2864,7 +3084,7 @@ func (x *JobSpecificationResponse) String() string { func (*JobSpecificationResponse) ProtoMessage() {} func (x *JobSpecificationResponse) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[42] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2877,7 +3097,7 @@ func (x *JobSpecificationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use JobSpecificationResponse.ProtoReflect.Descriptor instead. func (*JobSpecificationResponse) Descriptor() ([]byte, []int) { - return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{42} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{46} } func (x *JobSpecificationResponse) GetProjectName() string { @@ -2914,7 +3134,7 @@ type ReplaceAllJobSpecificationsRequest struct { func (x *ReplaceAllJobSpecificationsRequest) Reset() { *x = ReplaceAllJobSpecificationsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[43] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2927,7 +3147,7 @@ func (x *ReplaceAllJobSpecificationsRequest) String() string { func (*ReplaceAllJobSpecificationsRequest) ProtoMessage() {} func (x *ReplaceAllJobSpecificationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[43] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2940,7 +3160,7 @@ func (x *ReplaceAllJobSpecificationsRequest) ProtoReflect() protoreflect.Message // Deprecated: Use ReplaceAllJobSpecificationsRequest.ProtoReflect.Descriptor instead. func (*ReplaceAllJobSpecificationsRequest) Descriptor() ([]byte, []int) { - return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{43} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{47} } func (x *ReplaceAllJobSpecificationsRequest) GetProjectName() string { @@ -2975,7 +3195,7 @@ type ReplaceAllJobSpecificationsResponse struct { func (x *ReplaceAllJobSpecificationsResponse) Reset() { *x = ReplaceAllJobSpecificationsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[44] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2988,7 +3208,7 @@ func (x *ReplaceAllJobSpecificationsResponse) String() string { func (*ReplaceAllJobSpecificationsResponse) ProtoMessage() {} func (x *ReplaceAllJobSpecificationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[44] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3001,7 +3221,7 @@ func (x *ReplaceAllJobSpecificationsResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use ReplaceAllJobSpecificationsResponse.ProtoReflect.Descriptor instead. func (*ReplaceAllJobSpecificationsResponse) Descriptor() ([]byte, []int) { - return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{44} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{48} } func (x *ReplaceAllJobSpecificationsResponse) GetLogStatus() *Log { @@ -3024,7 +3244,7 @@ type GetJobTaskRequest struct { func (x *GetJobTaskRequest) Reset() { *x = GetJobTaskRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[45] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3037,7 +3257,7 @@ func (x *GetJobTaskRequest) String() string { func (*GetJobTaskRequest) ProtoMessage() {} func (x *GetJobTaskRequest) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[45] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3050,7 +3270,7 @@ func (x *GetJobTaskRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetJobTaskRequest.ProtoReflect.Descriptor instead. func (*GetJobTaskRequest) Descriptor() ([]byte, []int) { - return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{45} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{49} } func (x *GetJobTaskRequest) GetProjectName() string { @@ -3085,7 +3305,7 @@ type GetJobTaskResponse struct { func (x *GetJobTaskResponse) Reset() { *x = GetJobTaskResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[46] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3098,7 +3318,7 @@ func (x *GetJobTaskResponse) String() string { func (*GetJobTaskResponse) ProtoMessage() {} func (x *GetJobTaskResponse) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[46] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3111,7 +3331,7 @@ func (x *GetJobTaskResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetJobTaskResponse.ProtoReflect.Descriptor instead. func (*GetJobTaskResponse) Descriptor() ([]byte, []int) { - return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{46} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{50} } func (x *GetJobTaskResponse) GetTask() *JobTask { @@ -3138,7 +3358,7 @@ type JobTask struct { func (x *JobTask) Reset() { *x = JobTask{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[47] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3151,7 +3371,7 @@ func (x *JobTask) String() string { func (*JobTask) ProtoMessage() {} func (x *JobTask) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[47] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3164,7 +3384,7 @@ func (x *JobTask) ProtoReflect() protoreflect.Message { // Deprecated: Use JobTask.ProtoReflect.Descriptor instead. func (*JobTask) Descriptor() ([]byte, []int) { - return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{47} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{51} } func (x *JobTask) GetName() string { @@ -3218,7 +3438,7 @@ type GetWindowRequest struct { func (x *GetWindowRequest) Reset() { *x = GetWindowRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[48] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3231,7 +3451,7 @@ func (x *GetWindowRequest) String() string { func (*GetWindowRequest) ProtoMessage() {} func (x *GetWindowRequest) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[48] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3244,7 +3464,7 @@ func (x *GetWindowRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWindowRequest.ProtoReflect.Descriptor instead. func (*GetWindowRequest) Descriptor() ([]byte, []int) { - return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{48} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{52} } func (x *GetWindowRequest) GetScheduledAt() *timestamppb.Timestamp { @@ -3295,7 +3515,7 @@ type GetWindowResponse struct { func (x *GetWindowResponse) Reset() { *x = GetWindowResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[49] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3308,7 +3528,7 @@ func (x *GetWindowResponse) String() string { func (*GetWindowResponse) ProtoMessage() {} func (x *GetWindowResponse) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[49] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3321,7 +3541,7 @@ func (x *GetWindowResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWindowResponse.ProtoReflect.Descriptor instead. func (*GetWindowResponse) Descriptor() ([]byte, []int) { - return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{49} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{53} } func (x *GetWindowResponse) GetStart() *timestamppb.Timestamp { @@ -3353,7 +3573,7 @@ type UpdateJobsStateRequest struct { func (x *UpdateJobsStateRequest) Reset() { *x = UpdateJobsStateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[50] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3366,7 +3586,7 @@ func (x *UpdateJobsStateRequest) String() string { func (*UpdateJobsStateRequest) ProtoMessage() {} func (x *UpdateJobsStateRequest) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[50] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3379,7 +3599,7 @@ func (x *UpdateJobsStateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateJobsStateRequest.ProtoReflect.Descriptor instead. func (*UpdateJobsStateRequest) Descriptor() ([]byte, []int) { - return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{50} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{54} } func (x *UpdateJobsStateRequest) GetProjectName() string { @@ -3426,7 +3646,7 @@ type UpdateJobsStateResponse struct { func (x *UpdateJobsStateResponse) Reset() { *x = UpdateJobsStateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[51] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3439,7 +3659,7 @@ func (x *UpdateJobsStateResponse) String() string { func (*UpdateJobsStateResponse) ProtoMessage() {} func (x *UpdateJobsStateResponse) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[51] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3452,7 +3672,7 @@ func (x *UpdateJobsStateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateJobsStateResponse.ProtoReflect.Descriptor instead. func (*UpdateJobsStateResponse) Descriptor() ([]byte, []int) { - return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{51} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{55} } type SyncJobsStateRequest struct { @@ -3468,7 +3688,7 @@ type SyncJobsStateRequest struct { func (x *SyncJobsStateRequest) Reset() { *x = SyncJobsStateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[52] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3481,7 +3701,7 @@ func (x *SyncJobsStateRequest) String() string { func (*SyncJobsStateRequest) ProtoMessage() {} func (x *SyncJobsStateRequest) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[52] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3494,7 +3714,7 @@ func (x *SyncJobsStateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SyncJobsStateRequest.ProtoReflect.Descriptor instead. func (*SyncJobsStateRequest) Descriptor() ([]byte, []int) { - return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{52} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{56} } func (x *SyncJobsStateRequest) GetProjectName() string { @@ -3527,7 +3747,7 @@ type SyncJobsStateResponse struct { func (x *SyncJobsStateResponse) Reset() { *x = SyncJobsStateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[53] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3540,7 +3760,7 @@ func (x *SyncJobsStateResponse) String() string { func (*SyncJobsStateResponse) ProtoMessage() {} func (x *SyncJobsStateResponse) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[53] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3553,7 +3773,7 @@ func (x *SyncJobsStateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SyncJobsStateResponse.ProtoReflect.Descriptor instead. func (*SyncJobsStateResponse) Descriptor() ([]byte, []int) { - return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{53} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{57} } type JobInspectResponse_BasicInfoSection struct { @@ -3570,7 +3790,7 @@ type JobInspectResponse_BasicInfoSection struct { func (x *JobInspectResponse_BasicInfoSection) Reset() { *x = JobInspectResponse_BasicInfoSection{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[54] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3583,7 +3803,7 @@ func (x *JobInspectResponse_BasicInfoSection) String() string { func (*JobInspectResponse_BasicInfoSection) ProtoMessage() {} func (x *JobInspectResponse_BasicInfoSection) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[54] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3643,7 +3863,7 @@ type JobInspectResponse_JobDependency struct { func (x *JobInspectResponse_JobDependency) Reset() { *x = JobInspectResponse_JobDependency{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[55] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3656,7 +3876,7 @@ func (x *JobInspectResponse_JobDependency) String() string { func (*JobInspectResponse_JobDependency) ProtoMessage() {} func (x *JobInspectResponse_JobDependency) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[55] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3729,7 +3949,7 @@ type JobInspectResponse_UpstreamSection struct { func (x *JobInspectResponse_UpstreamSection) Reset() { *x = JobInspectResponse_UpstreamSection{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[56] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3742,7 +3962,7 @@ func (x *JobInspectResponse_UpstreamSection) String() string { func (*JobInspectResponse_UpstreamSection) ProtoMessage() {} func (x *JobInspectResponse_UpstreamSection) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[56] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3805,7 +4025,7 @@ type JobInspectResponse_DownstreamSection struct { func (x *JobInspectResponse_DownstreamSection) Reset() { *x = JobInspectResponse_DownstreamSection{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[57] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3818,7 +4038,7 @@ func (x *JobInspectResponse_DownstreamSection) String() string { func (*JobInspectResponse_DownstreamSection) ProtoMessage() {} func (x *JobInspectResponse_DownstreamSection) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[57] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3861,7 +4081,7 @@ type JobInspectResponse_UpstreamSection_UnknownDependencies struct { func (x *JobInspectResponse_UpstreamSection_UnknownDependencies) Reset() { *x = JobInspectResponse_UpstreamSection_UnknownDependencies{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[58] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3874,7 +4094,7 @@ func (x *JobInspectResponse_UpstreamSection_UnknownDependencies) String() string func (*JobInspectResponse_UpstreamSection_UnknownDependencies) ProtoMessage() {} func (x *JobInspectResponse_UpstreamSection_UnknownDependencies) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[58] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3923,7 +4143,7 @@ type ValidateRequest_FromServer struct { func (x *ValidateRequest_FromServer) Reset() { *x = ValidateRequest_FromServer{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[59] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3936,7 +4156,7 @@ func (x *ValidateRequest_FromServer) String() string { func (*ValidateRequest_FromServer) ProtoMessage() {} func (x *ValidateRequest_FromServer) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[59] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3977,7 +4197,7 @@ type ValidateRequest_FromOutside struct { func (x *ValidateRequest_FromOutside) Reset() { *x = ValidateRequest_FromOutside{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[60] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3990,7 +4210,7 @@ func (x *ValidateRequest_FromOutside) String() string { func (*ValidateRequest_FromOutside) ProtoMessage() {} func (x *ValidateRequest_FromOutside) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[60] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4026,7 +4246,7 @@ type ValidateResponse_Result struct { func (x *ValidateResponse_Result) Reset() { *x = ValidateResponse_Result{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[61] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4039,7 +4259,7 @@ func (x *ValidateResponse_Result) String() string { func (*ValidateResponse_Result) ProtoMessage() {} func (x *ValidateResponse_Result) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[61] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4087,7 +4307,7 @@ type ValidateResponse_ResultList struct { func (x *ValidateResponse_ResultList) Reset() { *x = ValidateResponse_ResultList{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[62] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4100,7 +4320,7 @@ func (x *ValidateResponse_ResultList) String() string { func (*ValidateResponse_ResultList) ProtoMessage() {} func (x *ValidateResponse_ResultList) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[62] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4140,7 +4360,7 @@ type JobSpecification_Window struct { func (x *JobSpecification_Window) Reset() { *x = JobSpecification_Window{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[64] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4153,7 +4373,7 @@ func (x *JobSpecification_Window) String() string { func (*JobSpecification_Window) ProtoMessage() {} func (x *JobSpecification_Window) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[64] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4225,7 +4445,7 @@ type JobSpecification_Behavior struct { func (x *JobSpecification_Behavior) Reset() { *x = JobSpecification_Behavior{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[67] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4238,7 +4458,7 @@ func (x *JobSpecification_Behavior) String() string { func (*JobSpecification_Behavior) ProtoMessage() {} func (x *JobSpecification_Behavior) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[67] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4289,7 +4509,7 @@ type JobSpecification_Behavior_Retry struct { func (x *JobSpecification_Behavior_Retry) Reset() { *x = JobSpecification_Behavior_Retry{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[68] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4302,7 +4522,7 @@ func (x *JobSpecification_Behavior_Retry) String() string { func (*JobSpecification_Behavior_Retry) ProtoMessage() {} func (x *JobSpecification_Behavior_Retry) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[68] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4353,7 +4573,7 @@ type JobSpecification_Behavior_Notifiers struct { func (x *JobSpecification_Behavior_Notifiers) Reset() { *x = JobSpecification_Behavior_Notifiers{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[69] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4366,7 +4586,7 @@ func (x *JobSpecification_Behavior_Notifiers) String() string { func (*JobSpecification_Behavior_Notifiers) ProtoMessage() {} func (x *JobSpecification_Behavior_Notifiers) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[69] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4415,7 +4635,7 @@ type JobSpecification_Behavior_Webhook struct { func (x *JobSpecification_Behavior_Webhook) Reset() { *x = JobSpecification_Behavior_Webhook{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[70] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4428,7 +4648,7 @@ func (x *JobSpecification_Behavior_Webhook) String() string { func (*JobSpecification_Behavior_Webhook) ProtoMessage() {} func (x *JobSpecification_Behavior_Webhook) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[70] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4470,7 +4690,7 @@ type JobSpecification_Behavior_Webhook_WebhookEndpoint struct { func (x *JobSpecification_Behavior_Webhook_WebhookEndpoint) Reset() { *x = JobSpecification_Behavior_Webhook_WebhookEndpoint{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[72] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4483,7 +4703,7 @@ func (x *JobSpecification_Behavior_Webhook_WebhookEndpoint) String() string { func (*JobSpecification_Behavior_Webhook_WebhookEndpoint) ProtoMessage() {} func (x *JobSpecification_Behavior_Webhook_WebhookEndpoint) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[72] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4525,7 +4745,7 @@ type JobTask_Destination struct { func (x *JobTask_Destination) Reset() { *x = JobTask_Destination{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[77] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4538,7 +4758,7 @@ func (x *JobTask_Destination) String() string { func (*JobTask_Destination) ProtoMessage() {} func (x *JobTask_Destination) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[77] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4551,7 +4771,7 @@ func (x *JobTask_Destination) ProtoReflect() protoreflect.Message { // Deprecated: Use JobTask_Destination.ProtoReflect.Descriptor instead. func (*JobTask_Destination) Descriptor() ([]byte, []int) { - return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{47, 0} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{51, 0} } func (x *JobTask_Destination) GetDestination() string { @@ -4579,7 +4799,7 @@ type JobTask_Dependency struct { func (x *JobTask_Dependency) Reset() { *x = JobTask_Dependency{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[78] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4592,7 +4812,7 @@ func (x *JobTask_Dependency) String() string { func (*JobTask_Dependency) ProtoMessage() {} func (x *JobTask_Dependency) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[78] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4605,7 +4825,7 @@ func (x *JobTask_Dependency) ProtoReflect() protoreflect.Message { // Deprecated: Use JobTask_Dependency.ProtoReflect.Descriptor instead. func (*JobTask_Dependency) Descriptor() ([]byte, []int) { - return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{47, 1} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{51, 1} } func (x *JobTask_Dependency) GetDependency() string { @@ -4627,7 +4847,7 @@ type SyncJobsStateRequest_JobStatePair struct { func (x *SyncJobsStateRequest_JobStatePair) Reset() { *x = SyncJobsStateRequest_JobStatePair{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[79] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4640,7 +4860,7 @@ func (x *SyncJobsStateRequest_JobStatePair) String() string { func (*SyncJobsStateRequest_JobStatePair) ProtoMessage() {} func (x *SyncJobsStateRequest_JobStatePair) ProtoReflect() protoreflect.Message { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[79] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4653,7 +4873,7 @@ func (x *SyncJobsStateRequest_JobStatePair) ProtoReflect() protoreflect.Message // Deprecated: Use SyncJobsStateRequest_JobStatePair.ProtoReflect.Descriptor instead. func (*SyncJobsStateRequest_JobStatePair) Descriptor() ([]byte, []int) { - return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{52, 0} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{56, 0} } func (x *SyncJobsStateRequest_JobStatePair) GetJobName() string { @@ -5353,424 +5573,462 @@ var file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDesc = []byte{ 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, - 0xda, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x31, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x13, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x6a, 0x6f, 0x62, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x67, 0x6e, 0x6f, 0x72, - 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, 0xe6, 0x01, 0x0a, - 0x1c, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, - 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, - 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4a, - 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, - 0x02, 0x18, 0x01, 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x12, 0x7a, 0x0a, 0x1b, 0x6a, 0x6f, 0x62, - 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, + 0x56, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x6c, + 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, + 0x6a, 0x6f, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x6a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x46, 0x0a, 0x09, 0x4a, 0x6f, 0x62, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, + 0x69, 0x66, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x69, 0x66, 0x66, 0x22, + 0x90, 0x01, 0x0a, 0x0c, 0x4a, 0x6f, 0x62, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x6c, 0x6f, 0x67, + 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x43, 0x0a, + 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, + 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, + 0x2e, 0x4a, 0x6f, 0x62, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x22, 0x63, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x6c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, + 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x19, 0x6a, 0x6f, 0x62, 0x53, - 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0xaa, 0x01, 0x0a, 0x18, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, + 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x6c, 0x6f, 0x67, 0x52, 0x07, + 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x22, 0xda, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4a, + 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x31, 0x0a, 0x14, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, + 0x08, 0x6a, 0x6f, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x6a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x23, 0x0a, 0x0d, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x73, 0x22, 0xe6, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, + 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, + 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x6a, 0x6f, 0x62, + 0x73, 0x12, 0x7a, 0x0a, 0x1b, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, + 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x03, - 0x6a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, - 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x6a, - 0x6f, 0x62, 0x22, 0xb6, 0x01, 0x0a, 0x22, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x41, 0x6c, - 0x6c, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x73, 0x65, 0x52, 0x19, 0x6a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0xaa, 0x01, + 0x0a, 0x18, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, + 0x0e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x22, 0x6b, 0x0a, 0x23, 0x52, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x22, 0xb6, 0x01, 0x0a, 0x22, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x41, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x44, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, - 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x09, 0x6c, - 0x6f, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x78, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4a, - 0x6f, 0x62, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, - 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6a, 0x6f, 0x62, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6a, 0x6f, 0x62, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0x53, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, - 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x61, 0x73, - 0x6b, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0xfb, 0x02, 0x0a, 0x07, 0x4a, 0x6f, 0x62, 0x54, - 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, - 0x57, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, - 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x61, 0x73, 0x6b, 0x2e, - 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x58, 0x0a, 0x0c, 0x64, 0x65, 0x70, 0x65, - 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, - 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, - 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, - 0x65, 0x6e, 0x63, 0x79, 0x52, 0x0c, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, - 0x65, 0x73, 0x1a, 0x43, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x1a, 0x2c, 0x0a, 0x0a, 0x44, 0x65, 0x70, 0x65, 0x6e, - 0x64, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, - 0x6e, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x65, 0x6e, - 0x64, 0x65, 0x6e, 0x63, 0x79, 0x22, 0xbc, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x57, 0x69, 0x6e, - 0x64, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x0c, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x01, 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, 0x0b, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, - 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, - 0x65, 0x5f, 0x74, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x72, 0x75, 0x6e, - 0x63, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x3a, 0x02, 0x18, 0x01, 0x22, 0x77, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x57, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x18, 0x01, 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, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, - 0x6e, 0x64, 0x18, 0x02, 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, 0x03, 0x65, 0x6e, 0x64, 0x3a, 0x02, 0x18, 0x01, 0x22, 0xd9, 0x01, - 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x40, 0x0a, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x74, 0x6f, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x04, 0x6a, + 0x6f, 0x62, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x09, - 0x6a, 0x6f, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x08, 0x6a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb1, 0x02, 0x0a, 0x14, 0x53, 0x79, 0x6e, 0x63, 0x4a, 0x6f, 0x62, - 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, - 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x62, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x67, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, - 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, - 0x79, 0x6e, 0x63, 0x4a, 0x6f, 0x62, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x65, 0x50, 0x61, 0x69, 0x72, - 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x1a, 0x6b, 0x0a, 0x0c, 0x4a, - 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x65, 0x50, 0x61, 0x69, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6a, - 0x6f, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6a, - 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, - 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x53, 0x79, 0x6e, 0x63, - 0x4a, 0x6f, 0x62, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2a, 0x54, 0x0a, 0x08, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x19, 0x0a, - 0x15, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x4a, 0x4f, 0x42, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x01, 0x12, - 0x16, 0x0a, 0x12, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x49, 0x53, - 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x32, 0xa6, 0x1f, 0x0a, 0x17, 0x4a, 0x6f, 0x62, 0x53, - 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0xa1, 0x01, 0x0a, 0x16, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4a, 0x6f, - 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, + 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x6a, + 0x6f, 0x62, 0x73, 0x22, 0x6b, 0x0a, 0x23, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x41, 0x6c, + 0x6c, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x0a, 0x6c, 0x6f, + 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x40, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, - 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0xca, 0x01, 0x0a, 0x0a, 0x4a, 0x6f, 0x62, 0x49, - 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x12, 0x33, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, - 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x49, 0x6e, 0x73, - 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x67, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, - 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4a, - 0x6f, 0x62, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4b, 0x3a, 0x01, 0x2a, 0x22, 0x46, 0x2f, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x2f, 0x69, 0x6e, 0x73, - 0x70, 0x65, 0x63, 0x74, 0x12, 0xe6, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, - 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x3f, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, - 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x40, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, - 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, - 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x49, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x43, 0x3a, 0x01, 0x2a, 0x22, 0x3e, 0x2f, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, - 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x12, 0xe1, 0x01, - 0x0a, 0x14, 0x41, 0x64, 0x64, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3d, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, + 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x22, 0x78, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x19, 0x0a, 0x08, 0x6a, 0x6f, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x53, 0x0a, 0x12, 0x47, 0x65, + 0x74, 0x4a, 0x6f, 0x62, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3d, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, + 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, + 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, + 0xfb, 0x02, 0x0a, 0x07, 0x4a, 0x6f, 0x62, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x57, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, + 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x4a, 0x6f, 0x62, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x58, 0x0a, 0x0c, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4a, 0x6f, 0x62, - 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, - 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4a, 0x6f, 0x62, 0x53, - 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x3a, 0x01, 0x2a, - 0x22, 0x3f, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x7d, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6a, 0x6f, 0x62, - 0x73, 0x12, 0xea, 0x01, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x53, - 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x40, 0x2e, + 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x61, 0x73, + 0x6b, 0x2e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x0c, 0x64, 0x65, + 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x1a, 0x43, 0x0a, 0x0b, 0x44, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x1a, + 0x2c, 0x0a, 0x0a, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x1e, 0x0a, + 0x0a, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x22, 0xbc, 0x01, + 0x0a, 0x10, 0x47, 0x65, 0x74, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x01, 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, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1f, 0x0a, + 0x0b, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x6f, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x12, 0x18, + 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x77, 0x0a, 0x11, + 0x47, 0x65, 0x74, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 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, 0x05, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 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, 0x03, 0x65, 0x6e, + 0x64, 0x3a, 0x02, 0x18, 0x01, 0x22, 0xd9, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x4a, 0x6f, 0x62, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, + 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x61, + 0x72, 0x6b, 0x12, 0x40, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, + 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6a, 0x6f, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x22, 0x19, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb1, 0x02, 0x0a, + 0x14, 0x53, 0x79, 0x6e, 0x63, 0x4a, 0x6f, 0x62, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x62, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, + 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x4a, 0x6f, 0x62, 0x73, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x50, 0x61, 0x69, 0x72, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x73, 0x1a, 0x6b, 0x0a, 0x0c, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x65, 0x50, + 0x61, 0x69, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6a, 0x6f, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x40, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x41, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, - 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x4a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x3a, 0x01, 0x2a, 0x1a, 0x3f, 0x2f, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, - 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x73, 0x12, 0xe5, - 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, + 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x22, 0x17, 0x0a, 0x15, 0x53, 0x79, 0x6e, 0x63, 0x4a, 0x6f, 0x62, 0x73, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x54, 0x0a, 0x08, 0x4a, 0x6f, 0x62, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x15, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x15, 0x0a, 0x11, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x4e, + 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4a, 0x4f, 0x42, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x32, + 0xf1, 0x20, 0x0a, 0x17, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xa1, 0x01, 0x0a, 0x16, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, - 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, - 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x70, - 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4b, 0x12, 0x49, 0x2f, 0x76, 0x31, - 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x2f, 0x7b, 0x6a, 0x6f, 0x62, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xac, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4a, 0x6f, - 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x3d, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, - 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, + 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x40, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, + 0xca, 0x01, 0x0a, 0x0a, 0x4a, 0x6f, 0x62, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x12, 0x33, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2f, 0x6a, 0x6f, 0x62, 0x73, 0x12, 0xee, 0x01, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x3f, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, - 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, - 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x40, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, - 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, - 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x53, 0x70, - 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4b, 0x2a, 0x49, 0x2f, 0x76, 0x31, - 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x2f, 0x7b, 0x6a, 0x6f, 0x62, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xd0, 0x01, 0x0a, 0x12, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x4a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x3b, 0x2e, + 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, + 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x4b, 0x3a, 0x01, 0x2a, 0x22, 0x46, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, + 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, + 0x2f, 0x6a, 0x6f, 0x62, 0x2f, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x12, 0xe6, 0x01, 0x0a, + 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x40, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x49, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x43, 0x3a, 0x01, 0x2a, 0x22, 0x3e, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x12, 0xe1, 0x01, 0x0a, 0x14, 0x41, 0x64, 0x64, 0x4a, 0x6f, 0x62, + 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3d, + 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, + 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, + 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x67, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x4a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, - 0x3a, 0x01, 0x2a, 0x22, 0x34, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2d, 0x6a, 0x6f, 0x62, 0x2d, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0xdd, 0x01, 0x0a, 0x14, 0x4c, 0x69, - 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x3d, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, - 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, - 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, - 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x3e, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, - 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, - 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x12, 0x3e, 0x2f, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x12, 0xce, 0x01, 0x0a, 0x15, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, - 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x53, - 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x3f, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, - 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x53, - 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x22, - 0x29, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, - 0x2f, 0x6a, 0x6f, 0x62, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x12, 0xa2, 0x01, 0x0a, 0x16, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3f, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, + 0x2e, 0x41, 0x64, 0x64, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4a, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x3a, 0x01, 0x2a, 0x22, 0x3f, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, + 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x73, 0x12, 0xea, 0x01, 0x0a, 0x17, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x40, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x4a, 0x6f, - 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x40, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, - 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x4a, + 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x30, 0x01, 0x12, - 0xc5, 0x01, 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x31, 0x2e, 0x67, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x41, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4a, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x44, 0x3a, 0x01, 0x2a, 0x1a, 0x3f, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x73, 0x12, 0xe5, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4a, 0x6f, + 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, + 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, + 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x32, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, - 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x52, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4c, 0x3a, 0x01, 0x2a, 0x22, 0x47, + 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x4b, 0x12, 0x49, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x7b, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, + 0x6a, 0x6f, 0x62, 0x2f, 0x7b, 0x6a, 0x6f, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xac, + 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3d, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, + 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, + 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, + 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, + 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6a, 0x6f, 0x62, 0x73, 0x12, 0xc8, 0x01, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x6c, 0x6f, + 0x67, 0x12, 0x38, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, + 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x6c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x67, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, + 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x6c, 0x6f, 0x67, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x12, 0x38, + 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, + 0x6a, 0x6f, 0x62, 0x2f, 0x7b, 0x6a, 0x6f, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x6c, 0x6f, 0x67, 0x12, 0xee, 0x01, 0x0a, 0x16, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, + 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, + 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x40, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, + 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, + 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4b, 0x2a, 0x49, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x2f, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x7e, 0x0a, 0x0b, 0x52, 0x65, 0x66, 0x72, 0x65, - 0x73, 0x68, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x34, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, - 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x67, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, - 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, - 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x94, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4a, 0x6f, 0x62, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x3c, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, - 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4a, 0x6f, 0x62, 0x73, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, + 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x2f, 0x7b, + 0x6a, 0x6f, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xd0, 0x01, 0x0a, 0x12, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x4a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x3b, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4a, 0x6f, 0x62, 0x73, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xb0, - 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x41, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, - 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x44, - 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, - 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x41, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x53, - 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x45, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, - 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x41, - 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, - 0x01, 0x12, 0xcf, 0x01, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x54, 0x61, 0x73, 0x6b, - 0x12, 0x33, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, - 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, - 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x54, - 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x56, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x50, 0x12, 0x4e, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x7b, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, - 0x6a, 0x6f, 0x62, 0x2f, 0x7b, 0x6a, 0x6f, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x74, - 0x61, 0x73, 0x6b, 0x12, 0x90, 0x01, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x57, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x12, 0x32, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, - 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, - 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, + 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x39, 0x3a, 0x01, 0x2a, 0x22, 0x34, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, + 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2d, 0x6a, + 0x6f, 0x62, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0xdd, 0x01, 0x0a, + 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x88, 0x02, 0x01, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, - 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0xde, 0x01, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x38, 0x2e, 0x67, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, + 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, + 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, - 0x62, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x56, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x50, 0x3a, 0x01, 0x2a, 0x32, 0x4b, 0x2f, 0x76, 0x31, 0x62, - 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x6a, 0x6f, - 0x62, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0xd6, 0x01, 0x0a, 0x0d, 0x53, 0x79, 0x6e, 0x63, - 0x4a, 0x6f, 0x62, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x36, 0x2e, 0x67, 0x6f, 0x74, 0x6f, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x53, + 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x12, 0x3e, 0x2f, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x12, 0xce, 0x01, 0x0a, + 0x15, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, + 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x4a, + 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3f, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, + 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x4a, + 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x2b, 0x22, 0x29, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x12, 0xa2, 0x01, + 0x0a, 0x16, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3f, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x40, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x79, 0x6e, - 0x63, 0x4a, 0x6f, 0x62, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x37, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, + 0x30, 0x01, 0x12, 0xc5, 0x01, 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, + 0x31, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, + 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, + 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4c, 0x3a, 0x01, + 0x2a, 0x22, 0x47, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x7d, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x7b, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6a, 0x6f, + 0x62, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x7e, 0x0a, 0x0b, 0x52, 0x65, + 0x66, 0x72, 0x65, 0x73, 0x68, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x34, 0x2e, 0x67, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x35, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, + 0x61, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x94, 0x01, 0x0a, 0x13, 0x47, + 0x65, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4a, 0x6f, 0x62, 0x73, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x3c, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, + 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4a, + 0x6f, 0x62, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x3d, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4a, 0x6f, 0x62, + 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0xb0, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x41, 0x6c, 0x6c, + 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x44, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, - 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x4a, 0x6f, 0x62, 0x73, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x4e, 0x3a, 0x01, 0x2a, 0x32, 0x49, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x7d, 0x2f, 0x73, 0x79, 0x6e, 0x63, 0x2d, 0x6a, 0x6f, 0x62, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x42, 0xaa, 0x01, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, - 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6e, 0x2e, 0x6f, 0x70, 0x74, 0x69, - 0x6d, 0x75, 0x73, 0x42, 0x1e, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x50, 0x01, 0x5a, 0x1e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x67, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6e, 0x2f, 0x6f, 0x70, - 0x74, 0x69, 0x6d, 0x75, 0x73, 0x92, 0x41, 0x45, 0x12, 0x05, 0x32, 0x03, 0x30, 0x2e, 0x31, 0x1a, - 0x0e, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x3a, 0x39, 0x31, 0x30, 0x30, 0x22, - 0x04, 0x2f, 0x61, 0x70, 0x69, 0x2a, 0x01, 0x01, 0x72, 0x23, 0x0a, 0x21, 0x4f, 0x70, 0x74, 0x69, - 0x6d, 0x75, 0x73, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x41, 0x6c, 0x6c, 0x4a, + 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x45, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x41, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x28, 0x01, 0x30, 0x01, 0x12, 0xcf, 0x01, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x33, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, + 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x54, 0x61, 0x73, + 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, + 0x6f, 0x62, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x56, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x50, 0x12, 0x4e, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, + 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x2f, 0x7b, 0x6a, 0x6f, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x7d, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x12, 0x90, 0x01, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x57, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x32, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, + 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x88, + 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, + 0x61, 0x31, 0x2f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0xde, 0x01, 0x0a, 0x0f, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x38, 0x2e, + 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x56, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x50, 0x3a, 0x01, 0x2a, 0x32, 0x4b, 0x2f, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, + 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x2d, 0x6a, 0x6f, 0x62, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0xd6, 0x01, 0x0a, 0x0d, 0x53, + 0x79, 0x6e, 0x63, 0x4a, 0x6f, 0x62, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x36, 0x2e, 0x67, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, + 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x53, 0x79, 0x6e, 0x63, 0x4a, 0x6f, 0x62, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, + 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x4a, 0x6f, 0x62, 0x73, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x4e, 0x3a, 0x01, 0x2a, 0x32, 0x49, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, + 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x73, 0x79, 0x6e, 0x63, 0x2d, 0x6a, 0x6f, 0x62, 0x2d, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x42, 0xaa, 0x01, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6e, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x42, 0x1e, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x50, 0x01, 0x5a, 0x1e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6e, + 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x92, 0x41, 0x45, 0x12, 0x05, 0x32, 0x03, 0x30, + 0x2e, 0x31, 0x1a, 0x0e, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x3a, 0x39, 0x31, + 0x30, 0x30, 0x22, 0x04, 0x2f, 0x61, 0x70, 0x69, 0x2a, 0x01, 0x01, 0x72, 0x23, 0x0a, 0x21, 0x4f, + 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x53, 0x70, 0x65, 0x63, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5786,7 +6044,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP() []byte { } var file_gotocompany_optimus_core_v1beta1_job_spec_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes = make([]protoimpl.MessageInfo, 80) +var file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes = make([]protoimpl.MessageInfo, 84) var file_gotocompany_optimus_core_v1beta1_job_spec_proto_goTypes = []interface{}{ (JobState)(0), // 0: gotocompany.optimus.core.v1beta1.JobState (JobEvent_Type)(0), // 1: gotocompany.optimus.core.v1beta1.JobEvent.Type @@ -5830,173 +6088,181 @@ var file_gotocompany_optimus_core_v1beta1_job_spec_proto_goTypes = []interface{} (*GetDeployJobsStatusRequest)(nil), // 39: gotocompany.optimus.core.v1beta1.GetDeployJobsStatusRequest (*GetDeployJobsStatusResponse)(nil), // 40: gotocompany.optimus.core.v1beta1.GetDeployJobsStatusResponse (*DeployJobFailure)(nil), // 41: gotocompany.optimus.core.v1beta1.DeployJobFailure - (*GetJobSpecificationsRequest)(nil), // 42: gotocompany.optimus.core.v1beta1.GetJobSpecificationsRequest - (*GetJobSpecificationsResponse)(nil), // 43: gotocompany.optimus.core.v1beta1.GetJobSpecificationsResponse - (*JobSpecificationResponse)(nil), // 44: gotocompany.optimus.core.v1beta1.JobSpecificationResponse - (*ReplaceAllJobSpecificationsRequest)(nil), // 45: gotocompany.optimus.core.v1beta1.ReplaceAllJobSpecificationsRequest - (*ReplaceAllJobSpecificationsResponse)(nil), // 46: gotocompany.optimus.core.v1beta1.ReplaceAllJobSpecificationsResponse - (*GetJobTaskRequest)(nil), // 47: gotocompany.optimus.core.v1beta1.GetJobTaskRequest - (*GetJobTaskResponse)(nil), // 48: gotocompany.optimus.core.v1beta1.GetJobTaskResponse - (*JobTask)(nil), // 49: gotocompany.optimus.core.v1beta1.JobTask - (*GetWindowRequest)(nil), // 50: gotocompany.optimus.core.v1beta1.GetWindowRequest - (*GetWindowResponse)(nil), // 51: gotocompany.optimus.core.v1beta1.GetWindowResponse - (*UpdateJobsStateRequest)(nil), // 52: gotocompany.optimus.core.v1beta1.UpdateJobsStateRequest - (*UpdateJobsStateResponse)(nil), // 53: gotocompany.optimus.core.v1beta1.UpdateJobsStateResponse - (*SyncJobsStateRequest)(nil), // 54: gotocompany.optimus.core.v1beta1.SyncJobsStateRequest - (*SyncJobsStateResponse)(nil), // 55: gotocompany.optimus.core.v1beta1.SyncJobsStateResponse - (*JobInspectResponse_BasicInfoSection)(nil), // 56: gotocompany.optimus.core.v1beta1.JobInspectResponse.BasicInfoSection - (*JobInspectResponse_JobDependency)(nil), // 57: gotocompany.optimus.core.v1beta1.JobInspectResponse.JobDependency - (*JobInspectResponse_UpstreamSection)(nil), // 58: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection - (*JobInspectResponse_DownstreamSection)(nil), // 59: gotocompany.optimus.core.v1beta1.JobInspectResponse.DownstreamSection - (*JobInspectResponse_UpstreamSection_UnknownDependencies)(nil), // 60: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.UnknownDependencies - (*ValidateRequest_FromServer)(nil), // 61: gotocompany.optimus.core.v1beta1.ValidateRequest.FromServer - (*ValidateRequest_FromOutside)(nil), // 62: gotocompany.optimus.core.v1beta1.ValidateRequest.FromOutside - (*ValidateResponse_Result)(nil), // 63: gotocompany.optimus.core.v1beta1.ValidateResponse.Result - (*ValidateResponse_ResultList)(nil), // 64: gotocompany.optimus.core.v1beta1.ValidateResponse.ResultList - nil, // 65: gotocompany.optimus.core.v1beta1.ValidateResponse.ResultsByJobNameEntry - (*JobSpecification_Window)(nil), // 66: gotocompany.optimus.core.v1beta1.JobSpecification.Window - nil, // 67: gotocompany.optimus.core.v1beta1.JobSpecification.AssetsEntry - nil, // 68: gotocompany.optimus.core.v1beta1.JobSpecification.LabelsEntry - (*JobSpecification_Behavior)(nil), // 69: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior - (*JobSpecification_Behavior_Retry)(nil), // 70: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Retry - (*JobSpecification_Behavior_Notifiers)(nil), // 71: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Notifiers - (*JobSpecification_Behavior_Webhook)(nil), // 72: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook - nil, // 73: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Notifiers.ConfigEntry - (*JobSpecification_Behavior_Webhook_WebhookEndpoint)(nil), // 74: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.WebhookEndpoint - nil, // 75: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.WebhookEndpoint.HeadersEntry - nil, // 76: gotocompany.optimus.core.v1beta1.HttpDependency.HeadersEntry - nil, // 77: gotocompany.optimus.core.v1beta1.HttpDependency.ParamsEntry - nil, // 78: gotocompany.optimus.core.v1beta1.GetDeployJobsStatusResponse.UnknownDependenciesEntry - (*JobTask_Destination)(nil), // 79: gotocompany.optimus.core.v1beta1.JobTask.Destination - (*JobTask_Dependency)(nil), // 80: gotocompany.optimus.core.v1beta1.JobTask.Dependency - (*SyncJobsStateRequest_JobStatePair)(nil), // 81: gotocompany.optimus.core.v1beta1.SyncJobsStateRequest.JobStatePair - (*Log)(nil), // 82: gotocompany.optimus.core.v1beta1.Log - (*timestamppb.Timestamp)(nil), // 83: google.protobuf.Timestamp - (*structpb.Struct)(nil), // 84: google.protobuf.Struct - (*durationpb.Duration)(nil), // 85: google.protobuf.Duration + (*GetJobChangelogRequest)(nil), // 42: gotocompany.optimus.core.v1beta1.GetJobChangelogRequest + (*JobChange)(nil), // 43: gotocompany.optimus.core.v1beta1.JobChange + (*JobChangelog)(nil), // 44: gotocompany.optimus.core.v1beta1.JobChangelog + (*GetJobChangelogResponse)(nil), // 45: gotocompany.optimus.core.v1beta1.GetJobChangelogResponse + (*GetJobSpecificationsRequest)(nil), // 46: gotocompany.optimus.core.v1beta1.GetJobSpecificationsRequest + (*GetJobSpecificationsResponse)(nil), // 47: gotocompany.optimus.core.v1beta1.GetJobSpecificationsResponse + (*JobSpecificationResponse)(nil), // 48: gotocompany.optimus.core.v1beta1.JobSpecificationResponse + (*ReplaceAllJobSpecificationsRequest)(nil), // 49: gotocompany.optimus.core.v1beta1.ReplaceAllJobSpecificationsRequest + (*ReplaceAllJobSpecificationsResponse)(nil), // 50: gotocompany.optimus.core.v1beta1.ReplaceAllJobSpecificationsResponse + (*GetJobTaskRequest)(nil), // 51: gotocompany.optimus.core.v1beta1.GetJobTaskRequest + (*GetJobTaskResponse)(nil), // 52: gotocompany.optimus.core.v1beta1.GetJobTaskResponse + (*JobTask)(nil), // 53: gotocompany.optimus.core.v1beta1.JobTask + (*GetWindowRequest)(nil), // 54: gotocompany.optimus.core.v1beta1.GetWindowRequest + (*GetWindowResponse)(nil), // 55: gotocompany.optimus.core.v1beta1.GetWindowResponse + (*UpdateJobsStateRequest)(nil), // 56: gotocompany.optimus.core.v1beta1.UpdateJobsStateRequest + (*UpdateJobsStateResponse)(nil), // 57: gotocompany.optimus.core.v1beta1.UpdateJobsStateResponse + (*SyncJobsStateRequest)(nil), // 58: gotocompany.optimus.core.v1beta1.SyncJobsStateRequest + (*SyncJobsStateResponse)(nil), // 59: gotocompany.optimus.core.v1beta1.SyncJobsStateResponse + (*JobInspectResponse_BasicInfoSection)(nil), // 60: gotocompany.optimus.core.v1beta1.JobInspectResponse.BasicInfoSection + (*JobInspectResponse_JobDependency)(nil), // 61: gotocompany.optimus.core.v1beta1.JobInspectResponse.JobDependency + (*JobInspectResponse_UpstreamSection)(nil), // 62: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection + (*JobInspectResponse_DownstreamSection)(nil), // 63: gotocompany.optimus.core.v1beta1.JobInspectResponse.DownstreamSection + (*JobInspectResponse_UpstreamSection_UnknownDependencies)(nil), // 64: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.UnknownDependencies + (*ValidateRequest_FromServer)(nil), // 65: gotocompany.optimus.core.v1beta1.ValidateRequest.FromServer + (*ValidateRequest_FromOutside)(nil), // 66: gotocompany.optimus.core.v1beta1.ValidateRequest.FromOutside + (*ValidateResponse_Result)(nil), // 67: gotocompany.optimus.core.v1beta1.ValidateResponse.Result + (*ValidateResponse_ResultList)(nil), // 68: gotocompany.optimus.core.v1beta1.ValidateResponse.ResultList + nil, // 69: gotocompany.optimus.core.v1beta1.ValidateResponse.ResultsByJobNameEntry + (*JobSpecification_Window)(nil), // 70: gotocompany.optimus.core.v1beta1.JobSpecification.Window + nil, // 71: gotocompany.optimus.core.v1beta1.JobSpecification.AssetsEntry + nil, // 72: gotocompany.optimus.core.v1beta1.JobSpecification.LabelsEntry + (*JobSpecification_Behavior)(nil), // 73: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior + (*JobSpecification_Behavior_Retry)(nil), // 74: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Retry + (*JobSpecification_Behavior_Notifiers)(nil), // 75: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Notifiers + (*JobSpecification_Behavior_Webhook)(nil), // 76: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook + nil, // 77: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Notifiers.ConfigEntry + (*JobSpecification_Behavior_Webhook_WebhookEndpoint)(nil), // 78: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.WebhookEndpoint + nil, // 79: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.WebhookEndpoint.HeadersEntry + nil, // 80: gotocompany.optimus.core.v1beta1.HttpDependency.HeadersEntry + nil, // 81: gotocompany.optimus.core.v1beta1.HttpDependency.ParamsEntry + nil, // 82: gotocompany.optimus.core.v1beta1.GetDeployJobsStatusResponse.UnknownDependenciesEntry + (*JobTask_Destination)(nil), // 83: gotocompany.optimus.core.v1beta1.JobTask.Destination + (*JobTask_Dependency)(nil), // 84: gotocompany.optimus.core.v1beta1.JobTask.Dependency + (*SyncJobsStateRequest_JobStatePair)(nil), // 85: gotocompany.optimus.core.v1beta1.SyncJobsStateRequest.JobStatePair + (*Log)(nil), // 86: gotocompany.optimus.core.v1beta1.Log + (*timestamppb.Timestamp)(nil), // 87: google.protobuf.Timestamp + (*structpb.Struct)(nil), // 88: google.protobuf.Struct + (*durationpb.Duration)(nil), // 89: google.protobuf.Duration } var file_gotocompany_optimus_core_v1beta1_job_spec_proto_depIdxs = []int32{ 27, // 0: gotocompany.optimus.core.v1beta1.DeployJobSpecificationRequest.jobs:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification - 82, // 1: gotocompany.optimus.core.v1beta1.DeployJobSpecificationResponse.log_status:type_name -> gotocompany.optimus.core.v1beta1.Log + 86, // 1: gotocompany.optimus.core.v1beta1.DeployJobSpecificationResponse.log_status:type_name -> gotocompany.optimus.core.v1beta1.Log 27, // 2: gotocompany.optimus.core.v1beta1.AddJobSpecificationsRequest.specs:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification 27, // 3: gotocompany.optimus.core.v1beta1.UpdateJobSpecificationsRequest.specs:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification 27, // 4: gotocompany.optimus.core.v1beta1.JobInspectRequest.spec:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification - 83, // 5: gotocompany.optimus.core.v1beta1.JobInspectRequest.scheduled_at:type_name -> google.protobuf.Timestamp - 83, // 6: gotocompany.optimus.core.v1beta1.JobRun.scheduled_at:type_name -> google.protobuf.Timestamp - 56, // 7: gotocompany.optimus.core.v1beta1.JobInspectResponse.basic_info:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.BasicInfoSection - 58, // 8: gotocompany.optimus.core.v1beta1.JobInspectResponse.upstreams:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection - 59, // 9: gotocompany.optimus.core.v1beta1.JobInspectResponse.downstreams:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.DownstreamSection + 87, // 5: gotocompany.optimus.core.v1beta1.JobInspectRequest.scheduled_at:type_name -> google.protobuf.Timestamp + 87, // 6: gotocompany.optimus.core.v1beta1.JobRun.scheduled_at:type_name -> google.protobuf.Timestamp + 60, // 7: gotocompany.optimus.core.v1beta1.JobInspectResponse.basic_info:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.BasicInfoSection + 62, // 8: gotocompany.optimus.core.v1beta1.JobInspectResponse.upstreams:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection + 63, // 9: gotocompany.optimus.core.v1beta1.JobInspectResponse.downstreams:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.DownstreamSection 27, // 10: gotocompany.optimus.core.v1beta1.CreateJobSpecificationRequest.spec:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification 27, // 11: gotocompany.optimus.core.v1beta1.GetJobSpecificationResponse.spec:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification 27, // 12: gotocompany.optimus.core.v1beta1.ListJobSpecificationResponse.jobs:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification 27, // 13: gotocompany.optimus.core.v1beta1.CheckJobSpecificationRequest.job:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification 27, // 14: gotocompany.optimus.core.v1beta1.CheckJobSpecificationsRequest.jobs:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification - 82, // 15: gotocompany.optimus.core.v1beta1.CheckJobSpecificationsResponse.log_status:type_name -> gotocompany.optimus.core.v1beta1.Log - 61, // 16: gotocompany.optimus.core.v1beta1.ValidateRequest.from_server:type_name -> gotocompany.optimus.core.v1beta1.ValidateRequest.FromServer - 62, // 17: gotocompany.optimus.core.v1beta1.ValidateRequest.from_outside:type_name -> gotocompany.optimus.core.v1beta1.ValidateRequest.FromOutside - 65, // 18: gotocompany.optimus.core.v1beta1.ValidateResponse.results_by_job_name:type_name -> gotocompany.optimus.core.v1beta1.ValidateResponse.ResultsByJobNameEntry + 86, // 15: gotocompany.optimus.core.v1beta1.CheckJobSpecificationsResponse.log_status:type_name -> gotocompany.optimus.core.v1beta1.Log + 65, // 16: gotocompany.optimus.core.v1beta1.ValidateRequest.from_server:type_name -> gotocompany.optimus.core.v1beta1.ValidateRequest.FromServer + 66, // 17: gotocompany.optimus.core.v1beta1.ValidateRequest.from_outside:type_name -> gotocompany.optimus.core.v1beta1.ValidateRequest.FromOutside + 69, // 18: gotocompany.optimus.core.v1beta1.ValidateResponse.results_by_job_name:type_name -> gotocompany.optimus.core.v1beta1.ValidateResponse.ResultsByJobNameEntry 31, // 19: gotocompany.optimus.core.v1beta1.JobSpecification.config:type_name -> gotocompany.optimus.core.v1beta1.JobConfigItem - 66, // 20: gotocompany.optimus.core.v1beta1.JobSpecification.window:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Window + 70, // 20: gotocompany.optimus.core.v1beta1.JobSpecification.window:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Window 28, // 21: gotocompany.optimus.core.v1beta1.JobSpecification.dependencies:type_name -> gotocompany.optimus.core.v1beta1.JobDependency - 67, // 22: gotocompany.optimus.core.v1beta1.JobSpecification.assets:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.AssetsEntry + 71, // 22: gotocompany.optimus.core.v1beta1.JobSpecification.assets:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.AssetsEntry 30, // 23: gotocompany.optimus.core.v1beta1.JobSpecification.hooks:type_name -> gotocompany.optimus.core.v1beta1.JobSpecHook - 68, // 24: gotocompany.optimus.core.v1beta1.JobSpecification.labels:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.LabelsEntry - 69, // 25: gotocompany.optimus.core.v1beta1.JobSpecification.behavior:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior + 72, // 24: gotocompany.optimus.core.v1beta1.JobSpecification.labels:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.LabelsEntry + 73, // 25: gotocompany.optimus.core.v1beta1.JobSpecification.behavior:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior 33, // 26: gotocompany.optimus.core.v1beta1.JobSpecification.metadata:type_name -> gotocompany.optimus.core.v1beta1.JobMetadata 29, // 27: gotocompany.optimus.core.v1beta1.JobDependency.http_dependency:type_name -> gotocompany.optimus.core.v1beta1.HttpDependency - 76, // 28: gotocompany.optimus.core.v1beta1.HttpDependency.headers:type_name -> gotocompany.optimus.core.v1beta1.HttpDependency.HeadersEntry - 77, // 29: gotocompany.optimus.core.v1beta1.HttpDependency.params:type_name -> gotocompany.optimus.core.v1beta1.HttpDependency.ParamsEntry + 80, // 28: gotocompany.optimus.core.v1beta1.HttpDependency.headers:type_name -> gotocompany.optimus.core.v1beta1.HttpDependency.HeadersEntry + 81, // 29: gotocompany.optimus.core.v1beta1.HttpDependency.params:type_name -> gotocompany.optimus.core.v1beta1.HttpDependency.ParamsEntry 31, // 30: gotocompany.optimus.core.v1beta1.JobSpecHook.config:type_name -> gotocompany.optimus.core.v1beta1.JobConfigItem 1, // 31: gotocompany.optimus.core.v1beta1.JobEvent.type:type_name -> gotocompany.optimus.core.v1beta1.JobEvent.Type - 84, // 32: gotocompany.optimus.core.v1beta1.JobEvent.value:type_name -> google.protobuf.Struct + 88, // 32: gotocompany.optimus.core.v1beta1.JobEvent.value:type_name -> google.protobuf.Struct 34, // 33: gotocompany.optimus.core.v1beta1.JobMetadata.resource:type_name -> gotocompany.optimus.core.v1beta1.JobSpecMetadataResource 36, // 34: gotocompany.optimus.core.v1beta1.JobMetadata.airflow:type_name -> gotocompany.optimus.core.v1beta1.JobSpecMetadataAirflow 35, // 35: gotocompany.optimus.core.v1beta1.JobSpecMetadataResource.request:type_name -> gotocompany.optimus.core.v1beta1.JobSpecMetadataResourceConfig 35, // 36: gotocompany.optimus.core.v1beta1.JobSpecMetadataResource.limit:type_name -> gotocompany.optimus.core.v1beta1.JobSpecMetadataResourceConfig - 82, // 37: gotocompany.optimus.core.v1beta1.RefreshJobsResponse.log_status:type_name -> gotocompany.optimus.core.v1beta1.Log + 86, // 37: gotocompany.optimus.core.v1beta1.RefreshJobsResponse.log_status:type_name -> gotocompany.optimus.core.v1beta1.Log 41, // 38: gotocompany.optimus.core.v1beta1.GetDeployJobsStatusResponse.failures:type_name -> gotocompany.optimus.core.v1beta1.DeployJobFailure - 78, // 39: gotocompany.optimus.core.v1beta1.GetDeployJobsStatusResponse.unknown_dependencies:type_name -> gotocompany.optimus.core.v1beta1.GetDeployJobsStatusResponse.UnknownDependenciesEntry - 27, // 40: gotocompany.optimus.core.v1beta1.GetJobSpecificationsResponse.jobs:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification - 44, // 41: gotocompany.optimus.core.v1beta1.GetJobSpecificationsResponse.job_specification_responses:type_name -> gotocompany.optimus.core.v1beta1.JobSpecificationResponse - 27, // 42: gotocompany.optimus.core.v1beta1.JobSpecificationResponse.job:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification - 27, // 43: gotocompany.optimus.core.v1beta1.ReplaceAllJobSpecificationsRequest.jobs:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification - 82, // 44: gotocompany.optimus.core.v1beta1.ReplaceAllJobSpecificationsResponse.log_status:type_name -> gotocompany.optimus.core.v1beta1.Log - 49, // 45: gotocompany.optimus.core.v1beta1.GetJobTaskResponse.task:type_name -> gotocompany.optimus.core.v1beta1.JobTask - 79, // 46: gotocompany.optimus.core.v1beta1.JobTask.destination:type_name -> gotocompany.optimus.core.v1beta1.JobTask.Destination - 80, // 47: gotocompany.optimus.core.v1beta1.JobTask.dependencies:type_name -> gotocompany.optimus.core.v1beta1.JobTask.Dependency - 83, // 48: gotocompany.optimus.core.v1beta1.GetWindowRequest.scheduled_at:type_name -> google.protobuf.Timestamp - 83, // 49: gotocompany.optimus.core.v1beta1.GetWindowResponse.start:type_name -> google.protobuf.Timestamp - 83, // 50: gotocompany.optimus.core.v1beta1.GetWindowResponse.end:type_name -> google.protobuf.Timestamp - 0, // 51: gotocompany.optimus.core.v1beta1.UpdateJobsStateRequest.state:type_name -> gotocompany.optimus.core.v1beta1.JobState - 81, // 52: gotocompany.optimus.core.v1beta1.SyncJobsStateRequest.job_states:type_name -> gotocompany.optimus.core.v1beta1.SyncJobsStateRequest.JobStatePair - 27, // 53: gotocompany.optimus.core.v1beta1.JobInspectResponse.BasicInfoSection.job:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification - 82, // 54: gotocompany.optimus.core.v1beta1.JobInspectResponse.BasicInfoSection.notice:type_name -> gotocompany.optimus.core.v1beta1.Log - 9, // 55: gotocompany.optimus.core.v1beta1.JobInspectResponse.JobDependency.runs:type_name -> gotocompany.optimus.core.v1beta1.JobRun - 57, // 56: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.external_dependency:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.JobDependency - 57, // 57: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.internal_dependency:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.JobDependency - 29, // 58: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.http_dependency:type_name -> gotocompany.optimus.core.v1beta1.HttpDependency - 60, // 59: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.unknown_dependencies:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.UnknownDependencies - 82, // 60: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.notice:type_name -> gotocompany.optimus.core.v1beta1.Log - 57, // 61: gotocompany.optimus.core.v1beta1.JobInspectResponse.DownstreamSection.downstream_jobs:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.JobDependency - 82, // 62: gotocompany.optimus.core.v1beta1.JobInspectResponse.DownstreamSection.notice:type_name -> gotocompany.optimus.core.v1beta1.Log - 27, // 63: gotocompany.optimus.core.v1beta1.ValidateRequest.FromOutside.jobs:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification - 63, // 64: gotocompany.optimus.core.v1beta1.ValidateResponse.ResultList.results:type_name -> gotocompany.optimus.core.v1beta1.ValidateResponse.Result - 64, // 65: gotocompany.optimus.core.v1beta1.ValidateResponse.ResultsByJobNameEntry.value:type_name -> gotocompany.optimus.core.v1beta1.ValidateResponse.ResultList - 70, // 66: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.retry:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Retry - 71, // 67: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.notify:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Notifiers - 72, // 68: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.webhook:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook - 85, // 69: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Retry.delay:type_name -> google.protobuf.Duration - 1, // 70: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Notifiers.on:type_name -> gotocompany.optimus.core.v1beta1.JobEvent.Type - 73, // 71: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Notifiers.config:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Notifiers.ConfigEntry - 1, // 72: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.on:type_name -> gotocompany.optimus.core.v1beta1.JobEvent.Type - 74, // 73: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.endpoints:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.WebhookEndpoint - 75, // 74: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.WebhookEndpoint.headers:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.WebhookEndpoint.HeadersEntry - 0, // 75: gotocompany.optimus.core.v1beta1.SyncJobsStateRequest.JobStatePair.state:type_name -> gotocompany.optimus.core.v1beta1.JobState - 2, // 76: gotocompany.optimus.core.v1beta1.JobSpecificationService.DeployJobSpecification:input_type -> gotocompany.optimus.core.v1beta1.DeployJobSpecificationRequest - 8, // 77: gotocompany.optimus.core.v1beta1.JobSpecificationService.JobInspect:input_type -> gotocompany.optimus.core.v1beta1.JobInspectRequest - 11, // 78: gotocompany.optimus.core.v1beta1.JobSpecificationService.CreateJobSpecification:input_type -> gotocompany.optimus.core.v1beta1.CreateJobSpecificationRequest - 4, // 79: gotocompany.optimus.core.v1beta1.JobSpecificationService.AddJobSpecifications:input_type -> gotocompany.optimus.core.v1beta1.AddJobSpecificationsRequest - 6, // 80: gotocompany.optimus.core.v1beta1.JobSpecificationService.UpdateJobSpecifications:input_type -> gotocompany.optimus.core.v1beta1.UpdateJobSpecificationsRequest - 13, // 81: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobSpecification:input_type -> gotocompany.optimus.core.v1beta1.GetJobSpecificationRequest - 42, // 82: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobSpecifications:input_type -> gotocompany.optimus.core.v1beta1.GetJobSpecificationsRequest - 15, // 83: gotocompany.optimus.core.v1beta1.JobSpecificationService.DeleteJobSpecification:input_type -> gotocompany.optimus.core.v1beta1.DeleteJobSpecificationRequest - 17, // 84: gotocompany.optimus.core.v1beta1.JobSpecificationService.ChangeJobNamespace:input_type -> gotocompany.optimus.core.v1beta1.ChangeJobNamespaceRequest - 19, // 85: gotocompany.optimus.core.v1beta1.JobSpecificationService.ListJobSpecification:input_type -> gotocompany.optimus.core.v1beta1.ListJobSpecificationRequest - 21, // 86: gotocompany.optimus.core.v1beta1.JobSpecificationService.CheckJobSpecification:input_type -> gotocompany.optimus.core.v1beta1.CheckJobSpecificationRequest - 23, // 87: gotocompany.optimus.core.v1beta1.JobSpecificationService.CheckJobSpecifications:input_type -> gotocompany.optimus.core.v1beta1.CheckJobSpecificationsRequest - 25, // 88: gotocompany.optimus.core.v1beta1.JobSpecificationService.Validate:input_type -> gotocompany.optimus.core.v1beta1.ValidateRequest - 37, // 89: gotocompany.optimus.core.v1beta1.JobSpecificationService.RefreshJobs:input_type -> gotocompany.optimus.core.v1beta1.RefreshJobsRequest - 39, // 90: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetDeployJobsStatus:input_type -> gotocompany.optimus.core.v1beta1.GetDeployJobsStatusRequest - 45, // 91: gotocompany.optimus.core.v1beta1.JobSpecificationService.ReplaceAllJobSpecifications:input_type -> gotocompany.optimus.core.v1beta1.ReplaceAllJobSpecificationsRequest - 47, // 92: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobTask:input_type -> gotocompany.optimus.core.v1beta1.GetJobTaskRequest - 50, // 93: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetWindow:input_type -> gotocompany.optimus.core.v1beta1.GetWindowRequest - 52, // 94: gotocompany.optimus.core.v1beta1.JobSpecificationService.UpdateJobsState:input_type -> gotocompany.optimus.core.v1beta1.UpdateJobsStateRequest - 54, // 95: gotocompany.optimus.core.v1beta1.JobSpecificationService.SyncJobsState:input_type -> gotocompany.optimus.core.v1beta1.SyncJobsStateRequest - 3, // 96: gotocompany.optimus.core.v1beta1.JobSpecificationService.DeployJobSpecification:output_type -> gotocompany.optimus.core.v1beta1.DeployJobSpecificationResponse - 10, // 97: gotocompany.optimus.core.v1beta1.JobSpecificationService.JobInspect:output_type -> gotocompany.optimus.core.v1beta1.JobInspectResponse - 12, // 98: gotocompany.optimus.core.v1beta1.JobSpecificationService.CreateJobSpecification:output_type -> gotocompany.optimus.core.v1beta1.CreateJobSpecificationResponse - 5, // 99: gotocompany.optimus.core.v1beta1.JobSpecificationService.AddJobSpecifications:output_type -> gotocompany.optimus.core.v1beta1.AddJobSpecificationsResponse - 7, // 100: gotocompany.optimus.core.v1beta1.JobSpecificationService.UpdateJobSpecifications:output_type -> gotocompany.optimus.core.v1beta1.UpdateJobSpecificationsResponse - 14, // 101: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobSpecification:output_type -> gotocompany.optimus.core.v1beta1.GetJobSpecificationResponse - 43, // 102: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobSpecifications:output_type -> gotocompany.optimus.core.v1beta1.GetJobSpecificationsResponse - 16, // 103: gotocompany.optimus.core.v1beta1.JobSpecificationService.DeleteJobSpecification:output_type -> gotocompany.optimus.core.v1beta1.DeleteJobSpecificationResponse - 18, // 104: gotocompany.optimus.core.v1beta1.JobSpecificationService.ChangeJobNamespace:output_type -> gotocompany.optimus.core.v1beta1.ChangeJobNamespaceResponse - 20, // 105: gotocompany.optimus.core.v1beta1.JobSpecificationService.ListJobSpecification:output_type -> gotocompany.optimus.core.v1beta1.ListJobSpecificationResponse - 22, // 106: gotocompany.optimus.core.v1beta1.JobSpecificationService.CheckJobSpecification:output_type -> gotocompany.optimus.core.v1beta1.CheckJobSpecificationResponse - 24, // 107: gotocompany.optimus.core.v1beta1.JobSpecificationService.CheckJobSpecifications:output_type -> gotocompany.optimus.core.v1beta1.CheckJobSpecificationsResponse - 26, // 108: gotocompany.optimus.core.v1beta1.JobSpecificationService.Validate:output_type -> gotocompany.optimus.core.v1beta1.ValidateResponse - 38, // 109: gotocompany.optimus.core.v1beta1.JobSpecificationService.RefreshJobs:output_type -> gotocompany.optimus.core.v1beta1.RefreshJobsResponse - 40, // 110: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetDeployJobsStatus:output_type -> gotocompany.optimus.core.v1beta1.GetDeployJobsStatusResponse - 46, // 111: gotocompany.optimus.core.v1beta1.JobSpecificationService.ReplaceAllJobSpecifications:output_type -> gotocompany.optimus.core.v1beta1.ReplaceAllJobSpecificationsResponse - 48, // 112: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobTask:output_type -> gotocompany.optimus.core.v1beta1.GetJobTaskResponse - 51, // 113: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetWindow:output_type -> gotocompany.optimus.core.v1beta1.GetWindowResponse - 53, // 114: gotocompany.optimus.core.v1beta1.JobSpecificationService.UpdateJobsState:output_type -> gotocompany.optimus.core.v1beta1.UpdateJobsStateResponse - 55, // 115: gotocompany.optimus.core.v1beta1.JobSpecificationService.SyncJobsState:output_type -> gotocompany.optimus.core.v1beta1.SyncJobsStateResponse - 96, // [96:116] is the sub-list for method output_type - 76, // [76:96] is the sub-list for method input_type - 76, // [76:76] is the sub-list for extension type_name - 76, // [76:76] is the sub-list for extension extendee - 0, // [0:76] is the sub-list for field type_name + 82, // 39: gotocompany.optimus.core.v1beta1.GetDeployJobsStatusResponse.unknown_dependencies:type_name -> gotocompany.optimus.core.v1beta1.GetDeployJobsStatusResponse.UnknownDependenciesEntry + 43, // 40: gotocompany.optimus.core.v1beta1.JobChangelog.change:type_name -> gotocompany.optimus.core.v1beta1.JobChange + 44, // 41: gotocompany.optimus.core.v1beta1.GetJobChangelogResponse.history:type_name -> gotocompany.optimus.core.v1beta1.JobChangelog + 27, // 42: gotocompany.optimus.core.v1beta1.GetJobSpecificationsResponse.jobs:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification + 48, // 43: gotocompany.optimus.core.v1beta1.GetJobSpecificationsResponse.job_specification_responses:type_name -> gotocompany.optimus.core.v1beta1.JobSpecificationResponse + 27, // 44: gotocompany.optimus.core.v1beta1.JobSpecificationResponse.job:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification + 27, // 45: gotocompany.optimus.core.v1beta1.ReplaceAllJobSpecificationsRequest.jobs:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification + 86, // 46: gotocompany.optimus.core.v1beta1.ReplaceAllJobSpecificationsResponse.log_status:type_name -> gotocompany.optimus.core.v1beta1.Log + 53, // 47: gotocompany.optimus.core.v1beta1.GetJobTaskResponse.task:type_name -> gotocompany.optimus.core.v1beta1.JobTask + 83, // 48: gotocompany.optimus.core.v1beta1.JobTask.destination:type_name -> gotocompany.optimus.core.v1beta1.JobTask.Destination + 84, // 49: gotocompany.optimus.core.v1beta1.JobTask.dependencies:type_name -> gotocompany.optimus.core.v1beta1.JobTask.Dependency + 87, // 50: gotocompany.optimus.core.v1beta1.GetWindowRequest.scheduled_at:type_name -> google.protobuf.Timestamp + 87, // 51: gotocompany.optimus.core.v1beta1.GetWindowResponse.start:type_name -> google.protobuf.Timestamp + 87, // 52: gotocompany.optimus.core.v1beta1.GetWindowResponse.end:type_name -> google.protobuf.Timestamp + 0, // 53: gotocompany.optimus.core.v1beta1.UpdateJobsStateRequest.state:type_name -> gotocompany.optimus.core.v1beta1.JobState + 85, // 54: gotocompany.optimus.core.v1beta1.SyncJobsStateRequest.job_states:type_name -> gotocompany.optimus.core.v1beta1.SyncJobsStateRequest.JobStatePair + 27, // 55: gotocompany.optimus.core.v1beta1.JobInspectResponse.BasicInfoSection.job:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification + 86, // 56: gotocompany.optimus.core.v1beta1.JobInspectResponse.BasicInfoSection.notice:type_name -> gotocompany.optimus.core.v1beta1.Log + 9, // 57: gotocompany.optimus.core.v1beta1.JobInspectResponse.JobDependency.runs:type_name -> gotocompany.optimus.core.v1beta1.JobRun + 61, // 58: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.external_dependency:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.JobDependency + 61, // 59: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.internal_dependency:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.JobDependency + 29, // 60: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.http_dependency:type_name -> gotocompany.optimus.core.v1beta1.HttpDependency + 64, // 61: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.unknown_dependencies:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.UnknownDependencies + 86, // 62: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.notice:type_name -> gotocompany.optimus.core.v1beta1.Log + 61, // 63: gotocompany.optimus.core.v1beta1.JobInspectResponse.DownstreamSection.downstream_jobs:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.JobDependency + 86, // 64: gotocompany.optimus.core.v1beta1.JobInspectResponse.DownstreamSection.notice:type_name -> gotocompany.optimus.core.v1beta1.Log + 27, // 65: gotocompany.optimus.core.v1beta1.ValidateRequest.FromOutside.jobs:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification + 67, // 66: gotocompany.optimus.core.v1beta1.ValidateResponse.ResultList.results:type_name -> gotocompany.optimus.core.v1beta1.ValidateResponse.Result + 68, // 67: gotocompany.optimus.core.v1beta1.ValidateResponse.ResultsByJobNameEntry.value:type_name -> gotocompany.optimus.core.v1beta1.ValidateResponse.ResultList + 74, // 68: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.retry:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Retry + 75, // 69: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.notify:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Notifiers + 76, // 70: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.webhook:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook + 89, // 71: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Retry.delay:type_name -> google.protobuf.Duration + 1, // 72: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Notifiers.on:type_name -> gotocompany.optimus.core.v1beta1.JobEvent.Type + 77, // 73: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Notifiers.config:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Notifiers.ConfigEntry + 1, // 74: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.on:type_name -> gotocompany.optimus.core.v1beta1.JobEvent.Type + 78, // 75: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.endpoints:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.WebhookEndpoint + 79, // 76: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.WebhookEndpoint.headers:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.WebhookEndpoint.HeadersEntry + 0, // 77: gotocompany.optimus.core.v1beta1.SyncJobsStateRequest.JobStatePair.state:type_name -> gotocompany.optimus.core.v1beta1.JobState + 2, // 78: gotocompany.optimus.core.v1beta1.JobSpecificationService.DeployJobSpecification:input_type -> gotocompany.optimus.core.v1beta1.DeployJobSpecificationRequest + 8, // 79: gotocompany.optimus.core.v1beta1.JobSpecificationService.JobInspect:input_type -> gotocompany.optimus.core.v1beta1.JobInspectRequest + 11, // 80: gotocompany.optimus.core.v1beta1.JobSpecificationService.CreateJobSpecification:input_type -> gotocompany.optimus.core.v1beta1.CreateJobSpecificationRequest + 4, // 81: gotocompany.optimus.core.v1beta1.JobSpecificationService.AddJobSpecifications:input_type -> gotocompany.optimus.core.v1beta1.AddJobSpecificationsRequest + 6, // 82: gotocompany.optimus.core.v1beta1.JobSpecificationService.UpdateJobSpecifications:input_type -> gotocompany.optimus.core.v1beta1.UpdateJobSpecificationsRequest + 13, // 83: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobSpecification:input_type -> gotocompany.optimus.core.v1beta1.GetJobSpecificationRequest + 46, // 84: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobSpecifications:input_type -> gotocompany.optimus.core.v1beta1.GetJobSpecificationsRequest + 42, // 85: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobChangelog:input_type -> gotocompany.optimus.core.v1beta1.GetJobChangelogRequest + 15, // 86: gotocompany.optimus.core.v1beta1.JobSpecificationService.DeleteJobSpecification:input_type -> gotocompany.optimus.core.v1beta1.DeleteJobSpecificationRequest + 17, // 87: gotocompany.optimus.core.v1beta1.JobSpecificationService.ChangeJobNamespace:input_type -> gotocompany.optimus.core.v1beta1.ChangeJobNamespaceRequest + 19, // 88: gotocompany.optimus.core.v1beta1.JobSpecificationService.ListJobSpecification:input_type -> gotocompany.optimus.core.v1beta1.ListJobSpecificationRequest + 21, // 89: gotocompany.optimus.core.v1beta1.JobSpecificationService.CheckJobSpecification:input_type -> gotocompany.optimus.core.v1beta1.CheckJobSpecificationRequest + 23, // 90: gotocompany.optimus.core.v1beta1.JobSpecificationService.CheckJobSpecifications:input_type -> gotocompany.optimus.core.v1beta1.CheckJobSpecificationsRequest + 25, // 91: gotocompany.optimus.core.v1beta1.JobSpecificationService.Validate:input_type -> gotocompany.optimus.core.v1beta1.ValidateRequest + 37, // 92: gotocompany.optimus.core.v1beta1.JobSpecificationService.RefreshJobs:input_type -> gotocompany.optimus.core.v1beta1.RefreshJobsRequest + 39, // 93: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetDeployJobsStatus:input_type -> gotocompany.optimus.core.v1beta1.GetDeployJobsStatusRequest + 49, // 94: gotocompany.optimus.core.v1beta1.JobSpecificationService.ReplaceAllJobSpecifications:input_type -> gotocompany.optimus.core.v1beta1.ReplaceAllJobSpecificationsRequest + 51, // 95: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobTask:input_type -> gotocompany.optimus.core.v1beta1.GetJobTaskRequest + 54, // 96: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetWindow:input_type -> gotocompany.optimus.core.v1beta1.GetWindowRequest + 56, // 97: gotocompany.optimus.core.v1beta1.JobSpecificationService.UpdateJobsState:input_type -> gotocompany.optimus.core.v1beta1.UpdateJobsStateRequest + 58, // 98: gotocompany.optimus.core.v1beta1.JobSpecificationService.SyncJobsState:input_type -> gotocompany.optimus.core.v1beta1.SyncJobsStateRequest + 3, // 99: gotocompany.optimus.core.v1beta1.JobSpecificationService.DeployJobSpecification:output_type -> gotocompany.optimus.core.v1beta1.DeployJobSpecificationResponse + 10, // 100: gotocompany.optimus.core.v1beta1.JobSpecificationService.JobInspect:output_type -> gotocompany.optimus.core.v1beta1.JobInspectResponse + 12, // 101: gotocompany.optimus.core.v1beta1.JobSpecificationService.CreateJobSpecification:output_type -> gotocompany.optimus.core.v1beta1.CreateJobSpecificationResponse + 5, // 102: gotocompany.optimus.core.v1beta1.JobSpecificationService.AddJobSpecifications:output_type -> gotocompany.optimus.core.v1beta1.AddJobSpecificationsResponse + 7, // 103: gotocompany.optimus.core.v1beta1.JobSpecificationService.UpdateJobSpecifications:output_type -> gotocompany.optimus.core.v1beta1.UpdateJobSpecificationsResponse + 14, // 104: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobSpecification:output_type -> gotocompany.optimus.core.v1beta1.GetJobSpecificationResponse + 47, // 105: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobSpecifications:output_type -> gotocompany.optimus.core.v1beta1.GetJobSpecificationsResponse + 45, // 106: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobChangelog:output_type -> gotocompany.optimus.core.v1beta1.GetJobChangelogResponse + 16, // 107: gotocompany.optimus.core.v1beta1.JobSpecificationService.DeleteJobSpecification:output_type -> gotocompany.optimus.core.v1beta1.DeleteJobSpecificationResponse + 18, // 108: gotocompany.optimus.core.v1beta1.JobSpecificationService.ChangeJobNamespace:output_type -> gotocompany.optimus.core.v1beta1.ChangeJobNamespaceResponse + 20, // 109: gotocompany.optimus.core.v1beta1.JobSpecificationService.ListJobSpecification:output_type -> gotocompany.optimus.core.v1beta1.ListJobSpecificationResponse + 22, // 110: gotocompany.optimus.core.v1beta1.JobSpecificationService.CheckJobSpecification:output_type -> gotocompany.optimus.core.v1beta1.CheckJobSpecificationResponse + 24, // 111: gotocompany.optimus.core.v1beta1.JobSpecificationService.CheckJobSpecifications:output_type -> gotocompany.optimus.core.v1beta1.CheckJobSpecificationsResponse + 26, // 112: gotocompany.optimus.core.v1beta1.JobSpecificationService.Validate:output_type -> gotocompany.optimus.core.v1beta1.ValidateResponse + 38, // 113: gotocompany.optimus.core.v1beta1.JobSpecificationService.RefreshJobs:output_type -> gotocompany.optimus.core.v1beta1.RefreshJobsResponse + 40, // 114: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetDeployJobsStatus:output_type -> gotocompany.optimus.core.v1beta1.GetDeployJobsStatusResponse + 50, // 115: gotocompany.optimus.core.v1beta1.JobSpecificationService.ReplaceAllJobSpecifications:output_type -> gotocompany.optimus.core.v1beta1.ReplaceAllJobSpecificationsResponse + 52, // 116: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobTask:output_type -> gotocompany.optimus.core.v1beta1.GetJobTaskResponse + 55, // 117: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetWindow:output_type -> gotocompany.optimus.core.v1beta1.GetWindowResponse + 57, // 118: gotocompany.optimus.core.v1beta1.JobSpecificationService.UpdateJobsState:output_type -> gotocompany.optimus.core.v1beta1.UpdateJobsStateResponse + 59, // 119: gotocompany.optimus.core.v1beta1.JobSpecificationService.SyncJobsState:output_type -> gotocompany.optimus.core.v1beta1.SyncJobsStateResponse + 99, // [99:120] is the sub-list for method output_type + 78, // [78:99] is the sub-list for method input_type + 78, // [78:78] is the sub-list for extension type_name + 78, // [78:78] is the sub-list for extension extendee + 0, // [0:78] is the sub-list for field type_name } func init() { file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() } @@ -6487,7 +6753,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetJobSpecificationsRequest); i { + switch v := v.(*GetJobChangelogRequest); i { case 0: return &v.state case 1: @@ -6499,7 +6765,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetJobSpecificationsResponse); i { + switch v := v.(*JobChange); i { case 0: return &v.state case 1: @@ -6511,7 +6777,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobSpecificationResponse); i { + switch v := v.(*JobChangelog); i { case 0: return &v.state case 1: @@ -6523,7 +6789,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReplaceAllJobSpecificationsRequest); i { + switch v := v.(*GetJobChangelogResponse); i { case 0: return &v.state case 1: @@ -6535,7 +6801,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReplaceAllJobSpecificationsResponse); i { + switch v := v.(*GetJobSpecificationsRequest); i { case 0: return &v.state case 1: @@ -6547,7 +6813,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetJobTaskRequest); i { + switch v := v.(*GetJobSpecificationsResponse); i { case 0: return &v.state case 1: @@ -6559,7 +6825,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetJobTaskResponse); i { + switch v := v.(*JobSpecificationResponse); i { case 0: return &v.state case 1: @@ -6571,7 +6837,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobTask); i { + switch v := v.(*ReplaceAllJobSpecificationsRequest); i { case 0: return &v.state case 1: @@ -6583,7 +6849,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWindowRequest); i { + switch v := v.(*ReplaceAllJobSpecificationsResponse); i { case 0: return &v.state case 1: @@ -6595,7 +6861,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWindowResponse); i { + switch v := v.(*GetJobTaskRequest); i { case 0: return &v.state case 1: @@ -6607,7 +6873,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateJobsStateRequest); i { + switch v := v.(*GetJobTaskResponse); i { case 0: return &v.state case 1: @@ -6619,7 +6885,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateJobsStateResponse); i { + switch v := v.(*JobTask); i { case 0: return &v.state case 1: @@ -6631,7 +6897,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SyncJobsStateRequest); i { + switch v := v.(*GetWindowRequest); i { case 0: return &v.state case 1: @@ -6643,7 +6909,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SyncJobsStateResponse); i { + switch v := v.(*GetWindowResponse); i { case 0: return &v.state case 1: @@ -6655,7 +6921,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobInspectResponse_BasicInfoSection); i { + switch v := v.(*UpdateJobsStateRequest); i { case 0: return &v.state case 1: @@ -6667,7 +6933,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobInspectResponse_JobDependency); i { + switch v := v.(*UpdateJobsStateResponse); i { case 0: return &v.state case 1: @@ -6679,7 +6945,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobInspectResponse_UpstreamSection); i { + switch v := v.(*SyncJobsStateRequest); i { case 0: return &v.state case 1: @@ -6691,7 +6957,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobInspectResponse_DownstreamSection); i { + switch v := v.(*SyncJobsStateResponse); i { case 0: return &v.state case 1: @@ -6703,7 +6969,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobInspectResponse_UpstreamSection_UnknownDependencies); i { + switch v := v.(*JobInspectResponse_BasicInfoSection); i { case 0: return &v.state case 1: @@ -6715,7 +6981,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateRequest_FromServer); i { + switch v := v.(*JobInspectResponse_JobDependency); i { case 0: return &v.state case 1: @@ -6727,7 +6993,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateRequest_FromOutside); i { + switch v := v.(*JobInspectResponse_UpstreamSection); i { case 0: return &v.state case 1: @@ -6739,7 +7005,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateResponse_Result); i { + switch v := v.(*JobInspectResponse_DownstreamSection); i { case 0: return &v.state case 1: @@ -6751,7 +7017,19 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateResponse_ResultList); i { + switch v := v.(*JobInspectResponse_UpstreamSection_UnknownDependencies); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidateRequest_FromServer); i { case 0: return &v.state case 1: @@ -6763,6 +7041,42 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidateRequest_FromOutside); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidateResponse_Result); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidateResponse_ResultList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobSpecification_Window); i { case 0: return &v.state @@ -6774,7 +7088,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobSpecification_Behavior); i { case 0: return &v.state @@ -6786,7 +7100,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobSpecification_Behavior_Retry); i { case 0: return &v.state @@ -6798,7 +7112,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobSpecification_Behavior_Notifiers); i { case 0: return &v.state @@ -6810,7 +7124,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobSpecification_Behavior_Webhook); i { case 0: return &v.state @@ -6822,7 +7136,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobSpecification_Behavior_Webhook_WebhookEndpoint); i { case 0: return &v.state @@ -6834,7 +7148,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobTask_Destination); i { case 0: return &v.state @@ -6846,7 +7160,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobTask_Dependency); i { case 0: return &v.state @@ -6858,7 +7172,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SyncJobsStateRequest_JobStatePair); i { case 0: return &v.state @@ -6881,7 +7195,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDesc, NumEnums: 2, - NumMessages: 80, + NumMessages: 84, NumExtensions: 0, NumServices: 1, }, diff --git a/protos/gotocompany/optimus/core/v1beta1/job_spec.pb.gw.go b/protos/gotocompany/optimus/core/v1beta1/job_spec.pb.gw.go index 4a16771f3a..80a15f883a 100644 --- a/protos/gotocompany/optimus/core/v1beta1/job_spec.pb.gw.go +++ b/protos/gotocompany/optimus/core/v1beta1/job_spec.pb.gw.go @@ -511,6 +511,78 @@ func local_request_JobSpecificationService_GetJobSpecifications_0(ctx context.Co } +func request_JobSpecificationService_GetJobChangelog_0(ctx context.Context, marshaler runtime.Marshaler, client JobSpecificationServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetJobChangelogRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["project_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "project_name") + } + + protoReq.ProjectName, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "project_name", err) + } + + val, ok = pathParams["job_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "job_name") + } + + protoReq.JobName, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "job_name", err) + } + + msg, err := client.GetJobChangelog(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_JobSpecificationService_GetJobChangelog_0(ctx context.Context, marshaler runtime.Marshaler, server JobSpecificationServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetJobChangelogRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["project_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "project_name") + } + + protoReq.ProjectName, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "project_name", err) + } + + val, ok = pathParams["job_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "job_name") + } + + protoReq.JobName, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "job_name", err) + } + + msg, err := server.GetJobChangelog(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_JobSpecificationService_DeleteJobSpecification_0 = &utilities.DoubleArray{Encoding: map[string]int{"project_name": 0, "namespace_name": 1, "job_name": 2}, Base: []int{1, 1, 2, 3, 0, 0, 0}, Check: []int{0, 1, 1, 1, 2, 3, 4}} ) @@ -1385,6 +1457,29 @@ func RegisterJobSpecificationServiceHandlerServer(ctx context.Context, mux *runt }) + mux.Handle("GET", pattern_JobSpecificationService_GetJobChangelog_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gotocompany.optimus.core.v1beta1.JobSpecificationService/GetJobChangelog", runtime.WithHTTPPathPattern("/v1beta1/project/{project_name}/job/{job_name}/changelog")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_JobSpecificationService_GetJobChangelog_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_JobSpecificationService_GetJobChangelog_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("DELETE", pattern_JobSpecificationService_DeleteJobSpecification_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1753,6 +1848,26 @@ func RegisterJobSpecificationServiceHandlerClient(ctx context.Context, mux *runt }) + mux.Handle("GET", pattern_JobSpecificationService_GetJobChangelog_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gotocompany.optimus.core.v1beta1.JobSpecificationService/GetJobChangelog", runtime.WithHTTPPathPattern("/v1beta1/project/{project_name}/job/{job_name}/changelog")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_JobSpecificationService_GetJobChangelog_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_JobSpecificationService_GetJobChangelog_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("DELETE", pattern_JobSpecificationService_DeleteJobSpecification_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1949,6 +2064,8 @@ var ( pattern_JobSpecificationService_GetJobSpecifications_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1beta1", "jobs"}, "")) + pattern_JobSpecificationService_GetJobChangelog_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"v1beta1", "project", "project_name", "job", "job_name", "changelog"}, "")) + pattern_JobSpecificationService_DeleteJobSpecification_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6}, []string{"v1beta1", "project", "project_name", "namespace", "namespace_name", "job", "job_name"}, "")) pattern_JobSpecificationService_ChangeJobNamespace_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v1beta1", "project", "project_name", "change-job-namespace"}, "")) @@ -1981,6 +2098,8 @@ var ( forward_JobSpecificationService_GetJobSpecifications_0 = runtime.ForwardResponseMessage + forward_JobSpecificationService_GetJobChangelog_0 = runtime.ForwardResponseMessage + forward_JobSpecificationService_DeleteJobSpecification_0 = runtime.ForwardResponseMessage forward_JobSpecificationService_ChangeJobNamespace_0 = runtime.ForwardResponseMessage diff --git a/protos/gotocompany/optimus/core/v1beta1/job_spec.swagger.json b/protos/gotocompany/optimus/core/v1beta1/job_spec.swagger.json index fa9fefaba1..2a6797fc79 100644 --- a/protos/gotocompany/optimus/core/v1beta1/job_spec.swagger.json +++ b/protos/gotocompany/optimus/core/v1beta1/job_spec.swagger.json @@ -157,6 +157,43 @@ ] } }, + "/v1beta1/project/{projectName}/job/{jobName}/changelog": { + "get": { + "summary": "GetJobChangelog get all the changes done on a job", + "operationId": "JobSpecificationService_GetJobChangelog", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1beta1GetJobChangelogResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "projectName", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "jobName", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "JobSpecificationService" + ] + } + }, "/v1beta1/project/{projectName}/namespace/{namespaceName}/job": { "get": { "summary": "ListJobSpecification returns list of jobs created in a project", @@ -1196,6 +1233,17 @@ } } }, + "v1beta1GetJobChangelogResponse": { + "type": "object", + "properties": { + "history": { + "type": "array", + "items": { + "$ref": "#/definitions/v1beta1JobChangelog" + } + } + } + }, "v1beta1GetJobSpecificationResponse": { "type": "object", "properties": { @@ -1265,6 +1313,34 @@ } } }, + "v1beta1JobChange": { + "type": "object", + "properties": { + "attributeName": { + "type": "string" + }, + "diff": { + "type": "string" + } + } + }, + "v1beta1JobChangelog": { + "type": "object", + "properties": { + "eventType": { + "type": "string" + }, + "timestamp": { + "type": "string" + }, + "change": { + "type": "array", + "items": { + "$ref": "#/definitions/v1beta1JobChange" + } + } + } + }, "v1beta1JobConfigItem": { "type": "object", "properties": { diff --git a/protos/gotocompany/optimus/core/v1beta1/job_spec_grpc.pb.go b/protos/gotocompany/optimus/core/v1beta1/job_spec_grpc.pb.go index 114a2e06f4..dfbe280582 100644 --- a/protos/gotocompany/optimus/core/v1beta1/job_spec_grpc.pb.go +++ b/protos/gotocompany/optimus/core/v1beta1/job_spec_grpc.pb.go @@ -40,6 +40,8 @@ type JobSpecificationServiceClient interface { GetJobSpecification(ctx context.Context, in *GetJobSpecificationRequest, opts ...grpc.CallOption) (*GetJobSpecificationResponse, error) // GetJobSpecifications read a job spec for provided filters GetJobSpecifications(ctx context.Context, in *GetJobSpecificationsRequest, opts ...grpc.CallOption) (*GetJobSpecificationsResponse, error) + // GetJobChangelog get all the changes done on a job + GetJobChangelog(ctx context.Context, in *GetJobChangelogRequest, opts ...grpc.CallOption) (*GetJobChangelogResponse, error) // DeleteJobSpecification deletes a job spec of a namespace DeleteJobSpecification(ctx context.Context, in *DeleteJobSpecificationRequest, opts ...grpc.CallOption) (*DeleteJobSpecificationResponse, error) // ChangeJobNamespace move a job spec from one namespace to another @@ -167,6 +169,15 @@ func (c *jobSpecificationServiceClient) GetJobSpecifications(ctx context.Context return out, nil } +func (c *jobSpecificationServiceClient) GetJobChangelog(ctx context.Context, in *GetJobChangelogRequest, opts ...grpc.CallOption) (*GetJobChangelogResponse, error) { + out := new(GetJobChangelogResponse) + err := c.cc.Invoke(ctx, "/gotocompany.optimus.core.v1beta1.JobSpecificationService/GetJobChangelog", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *jobSpecificationServiceClient) DeleteJobSpecification(ctx context.Context, in *DeleteJobSpecificationRequest, opts ...grpc.CallOption) (*DeleteJobSpecificationResponse, error) { out := new(DeleteJobSpecificationResponse) err := c.cc.Invoke(ctx, "/gotocompany.optimus.core.v1beta1.JobSpecificationService/DeleteJobSpecification", in, out, opts...) @@ -377,6 +388,8 @@ type JobSpecificationServiceServer interface { GetJobSpecification(context.Context, *GetJobSpecificationRequest) (*GetJobSpecificationResponse, error) // GetJobSpecifications read a job spec for provided filters GetJobSpecifications(context.Context, *GetJobSpecificationsRequest) (*GetJobSpecificationsResponse, error) + // GetJobChangelog get all the changes done on a job + GetJobChangelog(context.Context, *GetJobChangelogRequest) (*GetJobChangelogResponse, error) // DeleteJobSpecification deletes a job spec of a namespace DeleteJobSpecification(context.Context, *DeleteJobSpecificationRequest) (*DeleteJobSpecificationResponse, error) // ChangeJobNamespace move a job spec from one namespace to another @@ -437,6 +450,9 @@ func (UnimplementedJobSpecificationServiceServer) GetJobSpecification(context.Co func (UnimplementedJobSpecificationServiceServer) GetJobSpecifications(context.Context, *GetJobSpecificationsRequest) (*GetJobSpecificationsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetJobSpecifications not implemented") } +func (UnimplementedJobSpecificationServiceServer) GetJobChangelog(context.Context, *GetJobChangelogRequest) (*GetJobChangelogResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetJobChangelog not implemented") +} func (UnimplementedJobSpecificationServiceServer) DeleteJobSpecification(context.Context, *DeleteJobSpecificationRequest) (*DeleteJobSpecificationResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteJobSpecification not implemented") } @@ -624,6 +640,24 @@ func _JobSpecificationService_GetJobSpecifications_Handler(srv interface{}, ctx return interceptor(ctx, in, info, handler) } +func _JobSpecificationService_GetJobChangelog_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetJobChangelogRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(JobSpecificationServiceServer).GetJobChangelog(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/gotocompany.optimus.core.v1beta1.JobSpecificationService/GetJobChangelog", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(JobSpecificationServiceServer).GetJobChangelog(ctx, req.(*GetJobChangelogRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _JobSpecificationService_DeleteJobSpecification_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeleteJobSpecificationRequest) if err := dec(in); err != nil { @@ -903,6 +937,10 @@ var JobSpecificationService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetJobSpecifications", Handler: _JobSpecificationService_GetJobSpecifications_Handler, }, + { + MethodName: "GetJobChangelog", + Handler: _JobSpecificationService_GetJobChangelog_Handler, + }, { MethodName: "DeleteJobSpecification", Handler: _JobSpecificationService_DeleteJobSpecification_Handler, diff --git a/server/optimus.go b/server/optimus.go index 8b6d070161..2d7be39da5 100644 --- a/server/optimus.go +++ b/server/optimus.go @@ -372,6 +372,8 @@ func (s *OptimusServer) setupHandlers() error { jobInputCompiler, secondaryResourceService, ) + jchangeLogService := jService.NewChangeLogService(jJobRepo) + // Resource Bounded Context primaryResourceService := rService.NewResourceService(s.logger, resourceRepository, jJobService, resourceManager, s.eventHandler, jJobService) backupService := rService.NewBackupService(backupRepository, resourceRepository, resourceManager, s.logger) @@ -398,7 +400,7 @@ func (s *OptimusServer) setupHandlers() error { pb.RegisterRuntimeServiceServer(s.grpcServer, oHandler.NewVersionHandler(s.logger, config.BuildVersion)) // Core Job Handler - pb.RegisterJobSpecificationServiceServer(s.grpcServer, jHandler.NewJobHandler(jJobService, s.logger)) + pb.RegisterJobSpecificationServiceServer(s.grpcServer, jHandler.NewJobHandler(jJobService, jchangeLogService, s.logger)) pb.RegisterReplayServiceServer(s.grpcServer, schedulerHandler.NewReplayHandler(s.logger, replayService))