From 47fe92c0e2a5b7379de94bccd4b5e5b686a2298b Mon Sep 17 00:00:00 2001 From: Oky Setiawan <49467802+okysetiawan@users.noreply.github.com> Date: Wed, 12 Jun 2024 17:18:18 +0700 Subject: [PATCH] Release v0.12.4 (#237) * Revert "Release v0.12.3 (#235)" This reverts commit 28e6b15b9341e195798fd71e280ca524b199f777. * feat: add job deploy command (#231) * feat: add job deploy command * chore: fix lint issue * refactor: remove unused code in job deploy command * refactor: read specs at once in job deploy * feat: add client handle catch error on stream.Send EOF (#232) * feat: add keepalive enforcement policy 2m on server side (#233) * feat: add keepalive enforcement policy 2m on server side * fix: linter magic number on config keepalive enforcement policy --------- Co-authored-by: Arinda Arif <79823430+arinda-arif@users.noreply.github.com> --- .github/workflows/verify.yml | 2 +- .golangci.yml | 132 +- Makefile | 4 +- client/cmd/plugin/validate.go | 3 +- config.sample.yaml | 9 - config/config_server.go | 5 +- core/job/handler/v1beta1/job.go | 46 +- core/job/handler/v1beta1/job_adapter.go | 15 - core/job/handler/v1beta1/job_test.go | 216 +-- core/job/job.go | 3 +- 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 - core/scheduler/service/replay_service.go | 77 +- core/scheduler/service/replay_service_test.go | 199 +- core/tenant/namespace.go | 2 +- core/tenant/project.go | 1 - internal/store/postgres/job/adapter.go | 37 - internal/store/postgres/job/job_repository.go | 130 +- .../000063_create_changelog_table.down.sql | 4 - .../000063_create_changelog_table.up.sql | 24 - internal/telemetry/prometheus.go | 8 - internal/utils/diff.go | 245 --- internal/utils/diff_test.go | 565 ------ internal/utils/myers_diff.go | 185 -- internal/utils/myers_diff_test.go | 135 -- optimus.sample.yaml | 4 +- .../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 | 10 +- tests/setup/database.go | 1 - 34 files changed, 825 insertions(+), 3161 deletions(-) delete mode 100644 core/job/service/changelog_service.go delete mode 100644 internal/store/postgres/migrations/000063_create_changelog_table.down.sql delete mode 100644 internal/store/postgres/migrations/000063_create_changelog_table.up.sql delete mode 100644 internal/utils/diff.go delete mode 100644 internal/utils/diff_test.go delete mode 100644 internal/utils/myers_diff.go delete mode 100644 internal/utils/myers_diff_test.go diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index 032f971336..3bbae401c6 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -19,7 +19,7 @@ jobs: uses: golangci/golangci-lint-action@v3 with: skip-go-installation: true - version: v1.55.2 + version: v1.51.1 unit-test: runs-on: ubuntu-latest steps: diff --git a/.golangci.yml b/.golangci.yml index 87d750d2a3..e6283ce2a3 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,94 +1,89 @@ run: timeout: 5m - go: "1.20" + skip-dirs: + - api/proto + - api/third_party +output: + format: colored-line-number linters: - disable-all: true - enable: - - asasalint - - asciicheck - - bidichk - - bodyclose - - containedctx - - contextcheck - - decorder - - dogsled - - dupword - - durationcheck - - errname - - errorlint - - execinquery - - exportloopref - - forbidigo - - gci - - ginkgolinter - - gocheckcompilerdirectives - - gochecknoinits - - gochecksumtype - - gocritic - - gofmt - - gofumpt - - goheader - - goimports - - gomnd - - gomodguard - - goprintffuncname - - gosec - - gosimple - - govet - - grouper - - importas - - ineffassign - - loggercheck - - makezero - - mirror - - misspell - - nakedret - - nilerr - - nilnil - - noctx - - nosprintfhostport - - predeclared - - reassign - - revive - - sloglint - - sqlclosecheck - - staticcheck - - stylecheck - - tenv - - testableexamples - - testpackage - - thelper - - tparallel - - unconvert - - unparam - - unused - - usestdlibvars - - whitespace - - zerologlint + enable-all: true + disable: + # Rules to review + - varnamelen + - wrapcheck + - tagliatelle + - paralleltest + - nlreturn + - gochecknoglobals + - exhaustivestruct + - forcetypeassert + - exhaustive + - wsl + - scopelint + - promlinter + - interfacer + - godox + - godot + - errcheck + - maintidx + - errchkjson + - nosnakecase + - nonamedreturns + - exhaustruct + - rowserrcheck + - structcheck + - wastedassign + - gomoddirectives + + # Following linters should be enabled after fixing the code + - cyclop + - ireturn + - goerr113 + - prealloc + - nestif + - lll + - maligned + - golint + - gocognit + - funlen + - gocyclo + - dupl + - nolintlint + - musttag + - interfacebloat linters-settings: gofumpt: + lang-version: "1.19" extra-rules: true revive: severity: error rules: - name: atomic - name: context-as-argument +# - name: context-keys-type #perf issue - name: defer - name: dot-imports - name: empty-block - name: error-naming - name: error-return +# - name: error-strings - name: early-return +# - name: errorf #perf issue +# - name: exported - name: if-return - name: increment-decrement - name: indent-error-flow +# - name: flag-parameter - name: modifies-parameter +# - name: modifies-value-receiver #perf issue - name: package-comments - name: range - name: receiver-naming - name: redefines-builtin-id - name: superfluous-else +# - name: time-naming #perf issue - name: unexported-naming +# - name: var-declaration #perf issue - name: var-naming - name: unused-receiver - name: unused-parameter @@ -116,10 +111,12 @@ linters-settings: excludes: - G101 gosimple: + go: "1.19" checks: - "all" - "-S1002" staticcheck: + go: "1.19" checks: - "all" - "-SA1019" @@ -134,16 +131,17 @@ linters-settings: disabled-checks: - ifElseChain - singleCaseSwitch + - hugeParam enabled-tags: - diagnostic +# - style +# - opinionated + - performance unparam: # Inspect exported functions. # XXX: if you enable this setting, unparam will report a lot of false-positives in text editors: check-exported: true issues: - exclude-dirs: - - api/proto - - api/third_party exclude-rules: # Exclude some linters from running on tests files. - path: _test\.go diff --git a/Makefile b/Makefile index 983fece946..9fb20da5aa 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 := "1090b06ae7c9a95bb3086b55d068b949e50b2aa0" +PROTON_COMMIT := "f9c7065042b7465da89125d5a16f0ed930bc9588" .PHONY: build test test-ci generate-proto unit-test-ci integration-test vet coverage clean install lint @@ -58,7 +58,7 @@ lint: install: ## install required dependencies @echo "> installing dependencies" - go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.55.2 + go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.51.1 go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28.0 go install github.com/bufbuild/buf/cmd/buf@v1.5.0 go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2.0 diff --git a/client/cmd/plugin/validate.go b/client/cmd/plugin/validate.go index e9151d5667..c1257b3819 100644 --- a/client/cmd/plugin/validate.go +++ b/client/cmd/plugin/validate.go @@ -87,6 +87,7 @@ func (v *validateCommand) RunE(_ *cobra.Command, _ []string) error { return nil } else if fm.IsDir() { return v.validateDir(v.path) + } else { + return errors.New("invalid path") } - return errors.New("invalid path") } diff --git a/config.sample.yaml b/config.sample.yaml index b69b3b78a3..640c793e63 100644 --- a/config.sample.yaml +++ b/config.sample.yaml @@ -69,12 +69,3 @@ log: # batch_interval_second: 1 # broker_urls: # - localhost:9092 - -# replay: -# plugin_execution_project_config_names: -# bq2bq: EXECUTION_PROJECT -# bq2pg: BQ_EXECUTION_PROJECT -# pg2bq: BQ_EXECUTION_PROJECT -# bq2api: EXECUTION_PROJECT -# clevertap: EXECUTION_PROJECT -# transporterTask: EXECUTION_PROJECT diff --git a/config/config_server.go b/config/config_server.go index c64b921c1f..a47e0e9752 100644 --- a/config/config_server.go +++ b/config/config_server.go @@ -61,9 +61,8 @@ type PluginConfig struct { } type ReplayConfig struct { - ReplayTimeoutInMinutes int `mapstructure:"replay_timeout_in_minutes" default:"180"` - ExecutionIntervalInSeconds int `mapstructure:"execution_interval_in_seconds" default:"120"` - PluginExecutionProjectConfigNames map[string]string `mapstructure:"plugin_execution_project_config_names"` + ReplayTimeoutInMinutes int `mapstructure:"replay_timeout_in_minutes" default:"180"` + ExecutionIntervalInSeconds int `mapstructure:"execution_interval_in_seconds" default:"120"` } type Publisher struct { diff --git a/core/job/handler/v1beta1/job.go b/core/job/handler/v1beta1/job.go index 2161a28b57..6c4f5a7e91 100644 --- a/core/job/handler/v1beta1/job.go +++ b/core/job/handler/v1beta1/job.go @@ -28,18 +28,16 @@ const ( ) type JobHandler struct { - l log.Logger - jobService JobService - changeLogService ChangeLogService + l log.Logger + jobService JobService pb.UnimplementedJobSpecificationServiceServer } -func NewJobHandler(jobService JobService, changeLogService ChangeLogService, logger log.Logger) *JobHandler { +func NewJobHandler(jobService JobService, logger log.Logger) *JobHandler { return &JobHandler{ - jobService: jobService, - changeLogService: changeLogService, - l: logger, + jobService: jobService, + l: logger, } } @@ -62,10 +60,6 @@ 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 { @@ -224,7 +218,7 @@ func (jh *JobHandler) GetJobSpecification(ctx context.Context, req *pb.GetJobSpe } jobName, err := job.NameFrom(req.GetJobName()) if err != nil { - jh.l.Error("error adapting job name [%s]: %s", req.GetJobName(), err) + jh.l.Error("error adapating job name [%s]: %s", req.GetJobName(), err) return nil, err } @@ -241,34 +235,6 @@ 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 b9f5966dbe..9ac5c2f33f 100644 --- a/core/job/handler/v1beta1/job_adapter.go +++ b/core/job/handler/v1beta1/job_adapter.go @@ -540,21 +540,6 @@ 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 f75ab86a97..feeae31aab 100644 --- a/core/job/handler/v1beta1/job_test.go +++ b/core/job/handler/v1beta1/job_test.go @@ -79,9 +79,8 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) jobSpecProto := &pb.JobSpecification{ Version: int32(jobVersion), @@ -112,9 +111,8 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("adds complete job", func(t *testing.T) { jobService := new(JobService) - changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) jobSpecProto := &pb.JobSpecification{ Version: int32(jobVersion), @@ -148,9 +146,8 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) request := pb.AddJobSpecificationsRequest{ NamespaceName: namespace.Name().String(), @@ -163,9 +160,8 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) jobSpecProtos := []*pb.JobSpecification{ { @@ -206,9 +202,8 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) jobSpecProtos := []*pb.JobSpecification{ { @@ -250,9 +245,8 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) jobSpecProtos := []*pb.JobSpecification{ { @@ -294,9 +288,8 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) behaviorWithInvalidAlertConf := &pb.JobSpecification_Behavior{ Retry: &pb.JobSpecification_Behavior_Retry{ExponentialBackoff: false}, @@ -347,9 +340,8 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) jobSpecProtos := []*pb.JobSpecification{ { @@ -376,9 +368,8 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) jobSpecProtos := []*pb.JobSpecification{ { @@ -421,9 +412,8 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) jobSpecProto := &pb.JobSpecification{ Version: int32(jobVersion), @@ -454,9 +444,8 @@ func TestNewJobHandler(t *testing.T) { }) t.Run("update complete jobs", func(t *testing.T) { jobService := new(JobService) - changeLogService := new(ChangeLogService) - jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) jobSpecProto := &pb.JobSpecification{ Version: int32(jobVersion), @@ -490,9 +479,8 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) request := pb.UpdateJobSpecificationsRequest{ NamespaceName: namespace.Name().String(), @@ -504,9 +492,8 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) jobSpecProtos := []*pb.JobSpecification{ { @@ -547,9 +534,8 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) jobSpecProtos := []*pb.JobSpecification{ { @@ -578,9 +564,8 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) jobSpecProtos := []*pb.JobSpecification{ { @@ -626,7 +611,6 @@ 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{ @@ -635,13 +619,12 @@ func TestNewJobHandler(t *testing.T) { JobName: jobAName.String(), NewNamespaceName: newNamespaceName, } - jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, 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") @@ -651,13 +634,12 @@ func TestNewJobHandler(t *testing.T) { JobName: jobAName.String(), NewNamespaceName: "", } - jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, 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{ @@ -666,7 +648,7 @@ func TestNewJobHandler(t *testing.T) { JobName: "", NewNamespaceName: newNamespaceName, } - jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) _, err := jobHandler.ChangeJobNamespace(ctx, request) assert.ErrorContains(t, err, "failed to adapt job name when changing job specification") }) @@ -674,7 +656,6 @@ 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{ @@ -686,13 +667,12 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, 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{ @@ -704,7 +684,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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) _, err := jobHandler.ChangeJobNamespace(ctx, request) assert.ErrorContains(t, err, "error in changing namespace: failed to change job namespace") }) @@ -721,7 +701,7 @@ func TestNewJobHandler(t *testing.T) { JobNames: []string{jobAName.String()}, } - jobHandler := v1beta1.NewJobHandler(nil, nil, log) + jobHandler := v1beta1.NewJobHandler(nil, log) _, err := jobHandler.UpdateJobsState(ctx, request) assert.ErrorContains(t, err, "namespace name is empty") }) @@ -734,7 +714,7 @@ func TestNewJobHandler(t *testing.T) { JobNames: []string{""}, } - jobHandler := v1beta1.NewJobHandler(nil, nil, log) + jobHandler := v1beta1.NewJobHandler(nil, log) _, err := jobHandler.UpdateJobsState(ctx, request) assert.ErrorContains(t, err, "name is empty") }) @@ -746,7 +726,7 @@ func TestNewJobHandler(t *testing.T) { Remark: updateRemark, JobNames: []string{jobAName.String()}, } - jobHandler := v1beta1.NewJobHandler(nil, nil, log) + jobHandler := v1beta1.NewJobHandler(nil, log) _, err := jobHandler.UpdateJobsState(ctx, request) assert.ErrorContains(t, err, "invalid state") }) @@ -759,7 +739,7 @@ func TestNewJobHandler(t *testing.T) { Remark: "", } - jobHandler := v1beta1.NewJobHandler(nil, nil, log) + jobHandler := v1beta1.NewJobHandler(nil, log) _, err := jobHandler.UpdateJobsState(ctx, request) assert.ErrorContains(t, err, "can not update job state without a valid remark") }) @@ -767,7 +747,6 @@ 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{ @@ -780,14 +759,13 @@ func TestNewJobHandler(t *testing.T) { jobService.On("Delete", ctx, sampleTenant, jobAName, false, false).Return(nil, nil) - jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, 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{ @@ -801,14 +779,13 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, 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{ @@ -818,14 +795,13 @@ func TestNewJobHandler(t *testing.T) { Force: true, } - jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, 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(), @@ -834,14 +810,13 @@ func TestNewJobHandler(t *testing.T) { Force: true, } - jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, 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{ @@ -854,7 +829,7 @@ func TestNewJobHandler(t *testing.T) { jobService.On("Delete", ctx, sampleTenant, jobAName, false, true).Return(nil, errors.New("internal error")) - jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) resp, err := jobHandler.DeleteJobSpecification(ctx, request) assert.Error(t, err) assert.Nil(t, resp) @@ -865,7 +840,7 @@ func TestNewJobHandler(t *testing.T) { req := &pb.GetWindowRequest{ ScheduledAt: nil, } - jobHandler := v1beta1.NewJobHandler(nil, nil, log) + jobHandler := v1beta1.NewJobHandler(nil, log) resp, err := jobHandler.GetWindow(ctx, req) assert.Error(t, err) @@ -876,7 +851,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, nil, log) + jobHandler := v1beta1.NewJobHandler(nil, log) resp, err := jobHandler.GetWindow(ctx, req) assert.Error(t, err) @@ -888,7 +863,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, nil, log) + jobHandler := v1beta1.NewJobHandler(nil, log) resp, err := jobHandler.GetWindow(ctx, req) assert.Error(t, err) @@ -902,7 +877,7 @@ func TestNewJobHandler(t *testing.T) { Offset: "0", TruncateTo: "d", } - jobHandler := v1beta1.NewJobHandler(nil, nil, log) + jobHandler := v1beta1.NewJobHandler(nil, log) resp, err := jobHandler.GetWindow(ctx, req) assert.NoError(t, err) @@ -915,7 +890,7 @@ func TestNewJobHandler(t *testing.T) { Offset: "0", TruncateTo: "d", } - jobHandler := v1beta1.NewJobHandler(nil, nil, log) + jobHandler := v1beta1.NewJobHandler(nil, log) resp, err := jobHandler.GetWindow(ctx, req) assert.NoError(t, err) @@ -926,9 +901,8 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) jobProtos := []*pb.JobSpecification{ { @@ -993,9 +967,8 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) jobProtos := []*pb.JobSpecification{ { @@ -1040,9 +1013,8 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) jobProtos := []*pb.JobSpecification{ { @@ -1083,9 +1055,8 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) jobProtos := []*pb.JobSpecification{ { @@ -1135,9 +1106,8 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) jobProtos := []*pb.JobSpecification{ { @@ -1187,9 +1157,8 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) request := &pb.RefreshJobsRequest{ ProjectName: project.Name().String(), @@ -1208,9 +1177,8 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) request := &pb.RefreshJobsRequest{ NamespaceNames: []string{namespace.Name().String()}, @@ -1226,9 +1194,8 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) request := &pb.RefreshJobsRequest{ ProjectName: project.Name().String(), @@ -1249,19 +1216,17 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, 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{ @@ -1269,14 +1234,13 @@ func TestNewJobHandler(t *testing.T) { NamespaceName: sampleTenant.NamespaceName().String(), } - jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, 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{ @@ -1286,14 +1250,13 @@ func TestNewJobHandler(t *testing.T) { } jobService.On("Get", ctx, sampleTenant, job.Name("job-A")).Return(nil, errors.New("error encountered")) - jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, 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() @@ -1306,7 +1269,7 @@ func TestNewJobHandler(t *testing.T) { } jobService.On("Get", ctx, sampleTenant, jobA.Spec().Name()).Return(jobA, nil) - jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) resp, err := jobHandler.GetJobSpecification(ctx, &request) assert.NoError(t, err) assert.NotNil(t, resp) @@ -1318,13 +1281,12 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) resp, err := jobHandler.GetJobSpecifications(ctx, &request) assert.Error(t, err) assert.NotNil(t, resp) @@ -1332,7 +1294,6 @@ 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{} @@ -1343,7 +1304,7 @@ func TestNewJobHandler(t *testing.T) { jobB := job.NewJob(sampleTenant, specB, "table-B", []job.ResourceURN{"table-C"}, false) jobService.On("GetByFilter", ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]*job.Job{jobA, jobB}, nil) - jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) resp, err := jobHandler.GetJobSpecifications(ctx, &request) assert.NoError(t, err) assert.NotNil(t, resp) @@ -1354,7 +1315,6 @@ 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{ @@ -1367,7 +1327,7 @@ func TestNewJobHandler(t *testing.T) { jobB := job.NewJob(sampleTenant, specB, "table-B", []job.ResourceURN{"table-C"}, false) jobService.On("GetByFilter", ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]*job.Job{jobA, jobB}, nil) - jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) resp, err := jobHandler.GetJobSpecifications(ctx, &request) assert.NoError(t, err) assert.NotNil(t, resp) @@ -1383,13 +1343,12 @@ 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, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) resp, err := jobHandler.ListJobSpecification(ctx, &request) assert.Error(t, err) assert.NotNil(t, resp) @@ -1397,7 +1356,6 @@ 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{ @@ -1411,7 +1369,7 @@ func TestNewJobHandler(t *testing.T) { jobB := job.NewJob(sampleTenant, specB, "table-B", []job.ResourceURN{"table-C"}, false) jobService.On("GetByFilter", ctx, mock.Anything, mock.Anything).Return([]*job.Job{jobA, jobB}, nil) - jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) resp, err := jobHandler.ListJobSpecification(ctx, &request) assert.NoError(t, err) assert.NotNil(t, resp) @@ -1422,7 +1380,6 @@ 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{ @@ -1437,7 +1394,7 @@ func TestNewJobHandler(t *testing.T) { jobB := job.NewJob(sampleTenant, specB, "table-B", []job.ResourceURN{"table-C"}, false) jobService.On("GetByFilter", ctx, mock.Anything, mock.Anything).Return([]*job.Job{jobA, jobB}, nil) - jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) resp, err := jobHandler.ListJobSpecification(ctx, &request) assert.NoError(t, err) assert.NotNil(t, resp) @@ -1450,7 +1407,6 @@ func TestNewJobHandler(t *testing.T) { t.Run("CheckJobSpecifications", func(t *testing.T) { t.Run("return error when creating tenant failed", func(t *testing.T) { jobService := new(JobService) - changeLogService := new(ChangeLogService) defer jobService.AssertExpectations(t) stream := new(CheckJobSpecificationsServer) @@ -1458,14 +1414,13 @@ func TestNewJobHandler(t *testing.T) { request := &pb.CheckJobSpecificationsRequest{} - jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) err := jobHandler.CheckJobSpecifications(request, stream) assert.Error(t, err) assert.Equal(t, "invalid argument for entity project: project name is empty", err.Error()) }) t.Run("return error when job proto conversion failed", func(t *testing.T) { jobService := new(JobService) - changeLogService := new(ChangeLogService) defer jobService.AssertExpectations(t) stream := new(CheckJobSpecificationsServer) @@ -1494,14 +1449,13 @@ func TestNewJobHandler(t *testing.T) { Jobs: jobProtos, } - jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) err := jobHandler.CheckJobSpecifications(request, stream) assert.Error(t, err) assert.Contains(t, err.Error(), "invalid argument for entity job: name is empty") }) t.Run("return error when service validate job is failed", func(t *testing.T) { jobService := new(JobService) - changeLogService := new(ChangeLogService) defer jobService.AssertExpectations(t) stream := new(CheckJobSpecificationsServer) @@ -1530,14 +1484,13 @@ func TestNewJobHandler(t *testing.T) { Jobs: jobProtos, } - jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) err := jobHandler.CheckJobSpecifications(request, stream) assert.Error(t, err) assert.Contains(t, err.Error(), "error encountered") }) t.Run("return success", func(t *testing.T) { jobService := new(JobService) - changeLogService := new(ChangeLogService) defer jobService.AssertExpectations(t) stream := new(CheckJobSpecificationsServer) @@ -1566,7 +1519,7 @@ func TestNewJobHandler(t *testing.T) { Jobs: jobProtos, } - jobHandler := v1beta1.NewJobHandler(jobService, changeLogService, log) + jobHandler := v1beta1.NewJobHandler(jobService, log) err := jobHandler.CheckJobSpecifications(request, stream) assert.NoError(t, err) }) @@ -1580,7 +1533,6 @@ 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() @@ -1679,14 +1631,13 @@ func TestNewJobHandler(t *testing.T) { }, } - handler := v1beta1.NewJobHandler(jobService, changeLogService, log) + handler := v1beta1.NewJobHandler(jobService, 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(). @@ -1816,42 +1767,39 @@ func TestNewJobHandler(t *testing.T) { }, } - handler := v1beta1.NewJobHandler(jobService, changeLogService, log) + handler := v1beta1.NewJobHandler(jobService, 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, changeLogService, log) + handler := v1beta1.NewJobHandler(jobService, 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, changeLogService, log) + handler := v1beta1.NewJobHandler(jobService, 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", @@ -1862,14 +1810,13 @@ func TestNewJobHandler(t *testing.T) { Spec: jobSpecProto, } - handler := v1beta1.NewJobHandler(jobService, changeLogService, log) + handler := v1beta1.NewJobHandler(jobService, 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, "resource-A", nil, false) @@ -1957,14 +1904,13 @@ func TestNewJobHandler(t *testing.T) { }, } - handler := v1beta1.NewJobHandler(jobService, changeLogService, log) + handler := v1beta1.NewJobHandler(jobService, 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() @@ -1981,7 +1927,7 @@ func TestNewJobHandler(t *testing.T) { JobName: specA.Name().String(), } - handler := v1beta1.NewJobHandler(jobService, changeLogService, log) + handler := v1beta1.NewJobHandler(jobService, log) result, err := handler.JobInspect(ctx, req) assert.Nil(t, result) assert.ErrorContains(t, err, "not found") @@ -1990,12 +1936,11 @@ 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, changeLogService, log) + handler := v1beta1.NewJobHandler(jobService, log) resp, err := handler.GetJobTask(ctx, req) assert.Error(t, err) assert.Nil(t, resp) @@ -2003,7 +1948,6 @@ 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{ @@ -2011,7 +1955,7 @@ func TestNewJobHandler(t *testing.T) { NamespaceName: sampleTenant.NamespaceName().String(), } - handler := v1beta1.NewJobHandler(jobService, changeLogService, log) + handler := v1beta1.NewJobHandler(jobService, log) resp, err := handler.GetJobTask(ctx, req) assert.Error(t, err) assert.Nil(t, resp) @@ -2019,7 +1963,6 @@ 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{ @@ -2029,14 +1972,13 @@ func TestNewJobHandler(t *testing.T) { } jobService.On("Get", ctx, sampleTenant, job.Name("job-A")).Return(nil, errors.New("error encountered")) - handler := v1beta1.NewJobHandler(jobService, changeLogService, log) + handler := v1beta1.NewJobHandler(jobService, 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() @@ -2050,14 +1992,13 @@ 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, changeLogService, log) + handler := v1beta1.NewJobHandler(jobService, 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() @@ -2076,7 +2017,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, changeLogService, log) + handler := v1beta1.NewJobHandler(jobService, log) resp, err := handler.GetJobTask(ctx, req) assert.NoError(t, err) assert.NotNil(t, resp) @@ -2085,19 +2026,6 @@ 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 @@ -2257,14 +2185,6 @@ 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/job.go b/core/job/job.go index 0b91448fb9..70b1a73165 100644 --- a/core/job/job.go +++ b/core/job/job.go @@ -9,8 +9,7 @@ import ( ) const ( - EntityJob = "job" - EntityJobChangeLog = "job_change_log" + EntityJob = "job" UpstreamTypeStatic UpstreamType = "static" UpstreamTypeInferred UpstreamType = "inferred" diff --git a/core/job/service/changelog_service.go b/core/job/service/changelog_service.go deleted file mode 100644 index b301bdfbd0..0000000000 --- a/core/job/service/changelog_service.go +++ /dev/null @@ -1,35 +0,0 @@ -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 fcd9132ebe..e7046c7816 100644 --- a/core/job/service/job_service.go +++ b/core/job/service/job_service.go @@ -8,8 +8,6 @@ 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" @@ -34,20 +32,6 @@ 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 @@ -106,13 +90,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 job.ResourceURN) ([]*job.Job, error) GetAllByTenant(ctx context.Context, jobTenant tenant.Tenant) ([]*job.Job, error) @@ -327,23 +311,6 @@ 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 195c8db42f..843b1c5e0a 100644 --- a/core/job/service/job_service_test.go +++ b/core/job/service/job_service_test.go @@ -3882,14 +3882,6 @@ 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 5511fb053f..d9af85d2e1 100644 --- a/core/job/spec.go +++ b/core/job/spec.go @@ -601,17 +601,6 @@ 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/core/scheduler/service/replay_service.go b/core/scheduler/service/replay_service.go index 395e8c566c..ca52baf89e 100644 --- a/core/scheduler/service/replay_service.go +++ b/core/scheduler/service/replay_service.go @@ -18,8 +18,6 @@ const ( getReplaysDayLimit = 30 // TODO: make it configurable via cli metricJobReplay = "jobrun_replay_requests_total" - - tenantReplayExecutionProjectConfigKey = "REPLAY_EXECUTION_PROJECT" ) type SchedulerRunGetter interface { @@ -36,10 +34,6 @@ type ReplayRepository interface { GetReplayByID(ctx context.Context, replayID uuid.UUID) (*scheduler.ReplayWithRun, error) } -type TenantGetter interface { - GetDetails(ctx context.Context, tnnt tenant.Tenant) (*tenant.WithDetails, error) -} - type ReplayValidator interface { Validate(ctx context.Context, replayRequest *scheduler.Replay, jobCron *cron.ScheduleSpec) error } @@ -56,14 +50,7 @@ type ReplayService struct { validator ReplayValidator executor ReplayExecutor - tenantGetter TenantGetter - logger log.Logger - - // stores mapping of task names (optimus plugin names) to its respective execution project config names. - // this mapping is needed because our bq plugins supporting execution project uses different config names inside the plugins. - // after the config naming is standardized, this map can be omitted - pluginToExecutionProjectKeyMap map[string]string } func (r *ReplayService) CreateReplay(ctx context.Context, tenant tenant.Tenant, jobName scheduler.JobName, config *scheduler.ReplayConfig) (replayID uuid.UUID, err error) { @@ -73,13 +60,6 @@ func (r *ReplayService) CreateReplay(ctx context.Context, tenant tenant.Tenant, return uuid.Nil, err } - newConfig, err := r.injectJobConfigWithTenantConfigs(ctx, tenant, jobName, config) - if err != nil { - r.logger.Error("unable to get namespace details for job %s: %s", jobName.String(), err) - return uuid.Nil, err - } - config.JobConfig = newConfig - replayReq := scheduler.NewReplayRequest(jobName, tenant, config, scheduler.ReplayStateCreated) if err := r.validator.Validate(ctx, replayReq, jobCron); err != nil { r.logger.Error("error validating replay request: %s", err) @@ -104,41 +84,6 @@ func (r *ReplayService) CreateReplay(ctx context.Context, tenant tenant.Tenant, return replayID, nil } -func (r *ReplayService) injectJobConfigWithTenantConfigs(ctx context.Context, tnnt tenant.Tenant, jobName scheduler.JobName, config *scheduler.ReplayConfig) (map[string]string, error) { - // copy ReplayConfig to a new map to mutate it - newConfig := map[string]string{} - for cfgKey, cfgVal := range config.JobConfig { - newConfig[cfgKey] = cfgVal - } - - // get tenant (project & namespace) configuration to obtain the execution project specifically for replay. - // note that the current behavior of GetDetails in the implementing struct prioritized namespace config over project config. - tenantWithDetails, err := r.tenantGetter.GetDetails(ctx, tnnt) - if err != nil { - return nil, errors.AddErrContext(err, scheduler.EntityReplay, - fmt.Sprintf("failed to get tenant details for project [%s], namespace [%s]", - tnnt.ProjectName(), tnnt.NamespaceName())) - } - - job, err := r.jobRepo.GetJob(ctx, tnnt.ProjectName(), jobName) - if err != nil { - return nil, errors.AddErrContext(err, scheduler.EntityReplay, - fmt.Sprintf("failed to get job for job name [%s]", jobName)) - } - - tenantConfig := tenantWithDetails.GetConfigs() - - // override the default execution project with the one in tenant config. - // only inject tenant-level config if execution project is not provided in ReplayConfig - overridedConfigKey, isSupported := r.pluginToExecutionProjectKeyMap[job.Task.Name] - tenantExecutionProject := tenantConfig[tenantReplayExecutionProjectConfigKey] - if isSupported && tenantExecutionProject != "" { - newConfig[overridedConfigKey] = tenantExecutionProject - } - - return newConfig, nil -} - func (r *ReplayService) GetReplayList(ctx context.Context, projectName tenant.ProjectName) (replays []*scheduler.Replay, err error) { return r.replayRepo.GetReplaysByProject(ctx, projectName, getReplaysDayLimit) } @@ -185,26 +130,8 @@ func (r *ReplayService) CancelReplay(ctx context.Context, replayWithRun *schedul return r.replayRepo.UpdateReplayStatus(ctx, replayWithRun.Replay.ID(), scheduler.ReplayStateCancelled, cancelMessage) } -func NewReplayService( - replayRepo ReplayRepository, - jobRepo JobRepository, - tenantGetter TenantGetter, - validator ReplayValidator, - worker ReplayExecutor, - runGetter SchedulerRunGetter, - logger log.Logger, - pluginToExecutionProjectKeyMap map[string]string, -) *ReplayService { - return &ReplayService{ - replayRepo: replayRepo, - jobRepo: jobRepo, - tenantGetter: tenantGetter, - validator: validator, - executor: worker, - runGetter: runGetter, - logger: logger, - pluginToExecutionProjectKeyMap: pluginToExecutionProjectKeyMap, - } +func NewReplayService(replayRepo ReplayRepository, jobRepo JobRepository, validator ReplayValidator, worker ReplayExecutor, runGetter SchedulerRunGetter, logger log.Logger) *ReplayService { + return &ReplayService{replayRepo: replayRepo, jobRepo: jobRepo, validator: validator, executor: worker, runGetter: runGetter, logger: logger} } func getJobCron(ctx context.Context, l log.Logger, jobRepo JobRepository, tnnt tenant.Tenant, jobName scheduler.JobName) (*cron.ScheduleSpec, error) { diff --git a/core/scheduler/service/replay_service_test.go b/core/scheduler/service/replay_service_test.go index 09001c2d10..dac666a5e3 100644 --- a/core/scheduler/service/replay_service_test.go +++ b/core/scheduler/service/replay_service_test.go @@ -21,7 +21,7 @@ import ( func TestReplayService(t *testing.T) { ctx := context.Background() projName := tenant.ProjectName("proj") - namespaceName := tenant.NamespaceName("ns1") + namespaceName := tenant.ProjectName("ns1") jobName := scheduler.JobName("sample_select") startTimeStr := "2023-01-02T15:00:00Z" startTime, _ := time.Parse(scheduler.ISODateFormat, startTimeStr) @@ -35,9 +35,6 @@ func TestReplayService(t *testing.T) { job := scheduler.Job{ Name: jobName, Tenant: tnnt, - Task: &scheduler.Task{ - Name: "bq2bq", - }, } jobWithDetails := &scheduler.JobWithDetails{ Job: &job, @@ -53,22 +50,6 @@ func TestReplayService(t *testing.T) { jobCron, _ := cron.ParseCronSchedule(jobCronStr) message := "sample message" - namespaceCfg := map[string]string{ - "REPLAY_EXECUTION_PROJECT": "example_project_from_namespace", - } - projectCfg := map[string]string{ - "REPLAY_EXECUTION_PROJECT": "example_project_from_project", - "STORAGE_PATH": "file:///tmp/", - "SCHEDULER_HOST": "http://localhost", - } - namespaceEntity, _ := tenant.NewNamespace(namespaceName.String(), projName, namespaceCfg) - projectEntity, _ := tenant.NewProject(projName.String(), projectCfg) - tenantWithDetails, _ := tenant.NewTenantDetails(projectEntity, namespaceEntity, tenant.PlainTextSecrets{}) - - taskNameToExecutionProjectMap := map[string]string{ - "bq2bq": "EXECUTION_PROJECT", - } - logger := log.NewLogrus() t.Run("CreateReplay", func(t *testing.T) { @@ -85,9 +66,6 @@ func TestReplayService(t *testing.T) { replayWorker := new(ReplayExecutor) defer replayWorker.AssertExpectations(t) - tenantGetter := new(TenantGetter) - defer tenantGetter.AssertExpectations(t) - scheduledTime1Str := "2023-01-03T12:00:00Z" scheduledTime1, _ := time.Parse(scheduler.ISODateFormat, scheduledTime1Str) scheduledTime2 := scheduledTime1.Add(24 * time.Hour) @@ -98,113 +76,16 @@ func TestReplayService(t *testing.T) { replayReq := scheduler.NewReplayRequest(jobName, tnnt, replayConfig, scheduler.ReplayStateCreated) jobRepository.On("GetJobDetails", ctx, projName, jobName).Return(jobWithDetails, nil) - tenantGetter.On("GetDetails", ctx, tnnt).Return(tenantWithDetails, nil) - jobRepository.On("GetJob", ctx, projName, jobName).Return(&job, nil) replayValidator.On("Validate", ctx, replayReq, jobCron).Return(nil) replayRepository.On("RegisterReplay", ctx, replayReq, replayRuns).Return(replayID, nil) replayWorker.On("Execute", replayID, tnnt, jobName).Return().Maybe() - replayService := service.NewReplayService(replayRepository, jobRepository, tenantGetter, replayValidator, replayWorker, nil, logger, taskNameToExecutionProjectMap) + replayService := service.NewReplayService(replayRepository, jobRepository, replayValidator, replayWorker, nil, logger) result, err := replayService.CreateReplay(ctx, tnnt, jobName, replayConfig) assert.NoError(t, err) assert.Equal(t, replayID, result) }) - t.Run("should use namespace config EXECUTION_PROJECT if not provided in replay config", func(t *testing.T) { - replayRepository := new(ReplayRepository) - defer replayRepository.AssertExpectations(t) - - jobRepository := new(JobRepository) - defer jobRepository.AssertExpectations(t) - - replayValidator := new(ReplayValidator) - defer replayValidator.AssertExpectations(t) - - replayWorker := new(ReplayExecutor) - defer replayWorker.AssertExpectations(t) - - tenantGetter := new(TenantGetter) - defer tenantGetter.AssertExpectations(t) - - replayConfigEmptyJobConfig := scheduler.NewReplayConfig(startTime, endTime, parallel, map[string]string{}, description) - replayConfigWithNamespaceConfig := scheduler.NewReplayConfig(startTime, endTime, parallel, map[string]string{"EXECUTION_PROJECT": "example_project_from_namespace"}, description) - - scheduledTime1Str := "2023-01-03T12:00:00Z" - scheduledTime1, _ := time.Parse(scheduler.ISODateFormat, scheduledTime1Str) - scheduledTime2 := scheduledTime1.Add(24 * time.Hour) - replayRuns := []*scheduler.JobRunStatus{ - {ScheduledAt: scheduledTime1, State: scheduler.StatePending}, - {ScheduledAt: scheduledTime2, State: scheduler.StatePending}, - } - replayReq := scheduler.NewReplayRequest(jobName, tnnt, replayConfigWithNamespaceConfig, scheduler.ReplayStateCreated) - - jobRepository.On("GetJobDetails", ctx, projName, jobName).Return(jobWithDetails, nil) - tenantGetter.On("GetDetails", ctx, tnnt).Return(tenantWithDetails, nil) - jobRepository.On("GetJob", ctx, projName, jobName).Return(&job, nil) - replayValidator.On("Validate", ctx, replayReq, jobCron).Return(nil) - replayRepository.On("RegisterReplay", ctx, replayReq, replayRuns).Return(replayID, nil) - replayWorker.On("Execute", replayID, tnnt, jobName).Return().Maybe() - - replayService := service.NewReplayService(replayRepository, jobRepository, tenantGetter, replayValidator, replayWorker, nil, logger, taskNameToExecutionProjectMap) - result, err := replayService.CreateReplay(ctx, tnnt, jobName, replayConfigEmptyJobConfig) - assert.NoError(t, err) - assert.Equal(t, replayID, result) - }) - - t.Run("should return error if get tenant error", func(t *testing.T) { - replayRepository := new(ReplayRepository) - defer replayRepository.AssertExpectations(t) - - jobRepository := new(JobRepository) - defer jobRepository.AssertExpectations(t) - - replayValidator := new(ReplayValidator) - defer replayValidator.AssertExpectations(t) - - replayWorker := new(ReplayExecutor) - defer replayWorker.AssertExpectations(t) - - tenantGetter := new(TenantGetter) - defer tenantGetter.AssertExpectations(t) - - replayConfigEmptyJobConfig := scheduler.NewReplayConfig(startTime, endTime, parallel, map[string]string{}, description) - - internalErr := errors.New("internal error") - jobRepository.On("GetJobDetails", ctx, projName, jobName).Return(jobWithDetails, nil) - tenantGetter.On("GetDetails", ctx, tnnt).Return(nil, internalErr) - - replayService := service.NewReplayService(replayRepository, jobRepository, tenantGetter, replayValidator, replayWorker, nil, logger, taskNameToExecutionProjectMap) - result, err := replayService.CreateReplay(ctx, tnnt, jobName, replayConfigEmptyJobConfig) - assert.ErrorIs(t, err, internalErr) - assert.Equal(t, uuid.Nil, result) - }) - - t.Run("should return error if get job in inject config returns error", func(t *testing.T) { - replayRepository := new(ReplayRepository) - defer replayRepository.AssertExpectations(t) - - jobRepository := new(JobRepository) - defer jobRepository.AssertExpectations(t) - - replayValidator := new(ReplayValidator) - defer replayValidator.AssertExpectations(t) - - replayWorker := new(ReplayExecutor) - defer replayWorker.AssertExpectations(t) - - tenantGetter := new(TenantGetter) - defer tenantGetter.AssertExpectations(t) - - jobRepository.On("GetJobDetails", ctx, projName, jobName).Return(jobWithDetails, nil) - tenantGetter.On("GetDetails", ctx, tnnt).Return(tenantWithDetails, nil) - jobRepository.On("GetJob", ctx, projName, jobName).Return(nil, errors.New("internal error")) - - replayService := service.NewReplayService(replayRepository, jobRepository, tenantGetter, replayValidator, replayWorker, nil, logger, taskNameToExecutionProjectMap) - result, err := replayService.CreateReplay(ctx, tnnt, jobName, replayConfig) - assert.ErrorContains(t, err, "failed to get job for job name") - assert.Equal(t, uuid.Nil, result) - }) - t.Run("should return error if not pass validation", func(t *testing.T) { replayRepository := new(ReplayRepository) defer replayRepository.AssertExpectations(t) @@ -218,17 +99,12 @@ func TestReplayService(t *testing.T) { replayWorker := new(ReplayExecutor) defer replayWorker.AssertExpectations(t) - tenantGetter := new(TenantGetter) - defer tenantGetter.AssertExpectations(t) - replayReq := scheduler.NewReplayRequest(jobName, tnnt, replayConfig, scheduler.ReplayStateCreated) jobRepository.On("GetJobDetails", ctx, projName, jobName).Return(jobWithDetails, nil) - tenantGetter.On("GetDetails", ctx, tnnt).Return(tenantWithDetails, nil) - jobRepository.On("GetJob", ctx, projName, jobName).Return(&job, nil) replayValidator.On("Validate", ctx, replayReq, jobCron).Return(errors.New("not passed validation")) - replayService := service.NewReplayService(replayRepository, jobRepository, tenantGetter, replayValidator, replayWorker, nil, logger, taskNameToExecutionProjectMap) + replayService := service.NewReplayService(replayRepository, jobRepository, replayValidator, replayWorker, nil, logger) result, err := replayService.CreateReplay(ctx, tnnt, jobName, replayConfig) assert.ErrorContains(t, err, "not passed validation") assert.Equal(t, uuid.Nil, result) @@ -244,13 +120,10 @@ func TestReplayService(t *testing.T) { replayValidator := new(ReplayValidator) defer replayValidator.AssertExpectations(t) - tenantGetter := new(TenantGetter) - defer tenantGetter.AssertExpectations(t) - internalErr := errors.New("internal error") jobRepository.On("GetJobDetails", ctx, projName, jobName).Return(nil, internalErr) - replayService := service.NewReplayService(replayRepository, jobRepository, tenantGetter, replayValidator, nil, nil, logger, taskNameToExecutionProjectMap) + replayService := service.NewReplayService(replayRepository, jobRepository, replayValidator, nil, nil, logger) result, err := replayService.CreateReplay(ctx, tnnt, jobName, replayConfig) assert.ErrorIs(t, err, internalErr) assert.Equal(t, uuid.Nil, result) @@ -269,14 +142,11 @@ func TestReplayService(t *testing.T) { replayWorker := new(ReplayExecutor) defer replayWorker.AssertExpectations(t) - tenantGetter := new(TenantGetter) - defer tenantGetter.AssertExpectations(t) - invalidTenant, _ := tenant.NewTenant(projName.String(), "invalid-namespace") jobRepository.On("GetJobDetails", ctx, projName, jobName).Return(jobWithDetails, nil) - replayService := service.NewReplayService(replayRepository, jobRepository, tenantGetter, replayValidator, replayWorker, nil, logger, taskNameToExecutionProjectMap) + replayService := service.NewReplayService(replayRepository, jobRepository, replayValidator, replayWorker, nil, logger) result, err := replayService.CreateReplay(ctx, invalidTenant, jobName, replayConfig) assert.ErrorContains(t, err, "job sample_select does not exist in invalid-namespace namespace") assert.Equal(t, uuid.Nil, result) @@ -293,7 +163,7 @@ func TestReplayService(t *testing.T) { replayRepository.On("GetReplaysByProject", ctx, mock.Anything, mock.Anything).Return(replays, nil) defer replayRepository.AssertExpectations(t) - replayService := service.NewReplayService(replayRepository, nil, nil, nil, nil, nil, logger, nil) + replayService := service.NewReplayService(replayRepository, nil, nil, nil, nil, logger) result, err := replayService.GetReplayList(ctx, tnnt.ProjectName()) assert.NoError(t, err) assert.Len(t, result, 3) @@ -304,7 +174,7 @@ func TestReplayService(t *testing.T) { replayRepository.On("GetReplaysByProject", ctx, mock.Anything, mock.Anything).Return(nil, errors.New("some error")) defer replayRepository.AssertExpectations(t) - replayService := service.NewReplayService(replayRepository, nil, nil, nil, nil, nil, logger, nil) + replayService := service.NewReplayService(replayRepository, nil, nil, nil, nil, logger) result, err := replayService.GetReplayList(ctx, tnnt.ProjectName()) assert.Error(t, err) assert.Nil(t, result) @@ -318,7 +188,7 @@ func TestReplayService(t *testing.T) { replayID := uuid.New() replayRepository.On("GetReplayByID", ctx, replayID).Return(nil, errs.NotFound("entity", "not found")) - replayService := service.NewReplayService(replayRepository, nil, nil, nil, nil, nil, logger, nil) + replayService := service.NewReplayService(replayRepository, nil, nil, nil, nil, logger) result, err := replayService.GetReplayByID(ctx, replayID) assert.True(t, errs.IsErrorType(err, errs.ErrNotFound)) assert.Empty(t, result) @@ -330,7 +200,7 @@ func TestReplayService(t *testing.T) { replayID := uuid.New() replayRepository.On("GetReplayByID", ctx, replayID).Return(nil, errors.New("internal error")) - replayService := service.NewReplayService(replayRepository, nil, nil, nil, nil, nil, logger, nil) + replayService := service.NewReplayService(replayRepository, nil, nil, nil, nil, logger) result, err := replayService.GetReplayByID(ctx, replayID) assert.Error(t, err) assert.Nil(t, result) @@ -351,7 +221,7 @@ func TestReplayService(t *testing.T) { }, }, nil) - replayService := service.NewReplayService(replayRepository, nil, nil, nil, nil, nil, logger, nil) + replayService := service.NewReplayService(replayRepository, nil, nil, nil, nil, logger) result, err := replayService.GetReplayByID(ctx, replayID) assert.NoError(t, err) assert.NotNil(t, result) @@ -375,7 +245,7 @@ func TestReplayService(t *testing.T) { }, } - replayService := service.NewReplayService(replayRepository, nil, nil, nil, nil, nil, logger, nil) + replayService := service.NewReplayService(replayRepository, nil, nil, nil, nil, logger) err := replayService.CancelReplay(ctx, replayWithRun) assert.ErrorContains(t, err, "replay has already been terminated with status success") }) @@ -397,7 +267,7 @@ func TestReplayService(t *testing.T) { errorMsg := "internal error" replayRepository.On("UpdateReplayStatus", mock.Anything, replay.ID(), scheduler.ReplayStateCancelled, mock.Anything).Return(errors.New(errorMsg)).Once() - replayService := service.NewReplayService(replayRepository, nil, nil, nil, nil, nil, logger, nil) + replayService := service.NewReplayService(replayRepository, nil, nil, nil, nil, logger) err := replayService.CancelReplay(ctx, replayWithRun) assert.ErrorContains(t, err, errorMsg) }) @@ -418,7 +288,7 @@ func TestReplayService(t *testing.T) { replayRepository.On("UpdateReplayStatus", mock.Anything, replay.ID(), scheduler.ReplayStateCancelled, mock.Anything).Return(nil).Once() - replayService := service.NewReplayService(replayRepository, nil, nil, nil, nil, nil, logger, nil) + replayService := service.NewReplayService(replayRepository, nil, nil, nil, nil, logger) err := replayService.CancelReplay(ctx, replayWithRun) assert.NoError(t, err) }) @@ -431,7 +301,7 @@ func TestReplayService(t *testing.T) { jobRepository.On("GetJobDetails", mock.Anything, projName, jobName).Return(nil, errors.New("internal error")) - replayService := service.NewReplayService(nil, jobRepository, nil, nil, nil, nil, logger, nil) + replayService := service.NewReplayService(nil, jobRepository, nil, nil, nil, logger) result, err := replayService.GetRunsStatus(ctx, tnnt, jobName, replayConfig) assert.Error(t, err) assert.Nil(t, result) @@ -446,7 +316,7 @@ func TestReplayService(t *testing.T) { jobRepository.On("GetJobDetails", mock.Anything, projName, jobName).Return(jobWithDetails, nil) schedulerRunGetter.On("GetJobRuns", ctx, tnnt, mock.Anything, mock.Anything).Return(nil, errors.New("internal error")) - replayService := service.NewReplayService(nil, jobRepository, nil, nil, nil, schedulerRunGetter, logger, nil) + replayService := service.NewReplayService(nil, jobRepository, nil, nil, schedulerRunGetter, logger) result, err := replayService.GetRunsStatus(ctx, tnnt, jobName, replayConfig) assert.Error(t, err) assert.Nil(t, result) @@ -463,7 +333,7 @@ func TestReplayService(t *testing.T) { jobRepository.On("GetJobDetails", mock.Anything, projName, jobName).Return(jobWithDetails, nil) schedulerRunGetter.On("GetJobRuns", ctx, tnnt, mock.Anything, mock.Anything).Return(runs, nil) - replayService := service.NewReplayService(nil, jobRepository, nil, nil, nil, schedulerRunGetter, logger, nil) + replayService := service.NewReplayService(nil, jobRepository, nil, nil, schedulerRunGetter, logger) result, err := replayService.GetRunsStatus(ctx, tnnt, jobName, replayConfig) assert.NoError(t, err) assert.NotNil(t, result) @@ -488,7 +358,7 @@ func TestReplayService(t *testing.T) { jobRepository.On("GetJobDetails", mock.Anything, projName, jobName).Return(jobWithDetails, nil) schedulerRunGetter.On("GetJobRuns", ctx, tnnt, mock.Anything, mock.Anything).Return(runs, nil) - replayService := service.NewReplayService(nil, jobRepository, nil, nil, nil, schedulerRunGetter, logger, nil) + replayService := service.NewReplayService(nil, jobRepository, nil, nil, schedulerRunGetter, logger) result, err := replayService.GetRunsStatus(ctx, tnnt, jobName, replayConfig) assert.NoError(t, err) assert.NotNil(t, result) @@ -683,38 +553,3 @@ type ReplayExecutor struct { func (_m *ReplayExecutor) Execute(replayID uuid.UUID, jobTenant tenant.Tenant, jobName scheduler.JobName) { _m.Called(replayID, jobTenant, jobName) } - -// TenantGetter is an autogenerated mock type for the TenantGetter type -type TenantGetter struct { - mock.Mock -} - -// GetDetails provides a mock function with given fields: ctx, tnnt -func (_m *TenantGetter) GetDetails(ctx context.Context, tnnt tenant.Tenant) (*tenant.WithDetails, error) { - ret := _m.Called(ctx, tnnt) - - if len(ret) == 0 { - panic("no return value specified for GetDetails") - } - - var r0 *tenant.WithDetails - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, tenant.Tenant) (*tenant.WithDetails, error)); ok { - return rf(ctx, tnnt) - } - if rf, ok := ret.Get(0).(func(context.Context, tenant.Tenant) *tenant.WithDetails); ok { - r0 = rf(ctx, tnnt) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*tenant.WithDetails) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, tenant.Tenant) error); ok { - r1 = rf(ctx, tnnt) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} diff --git a/core/tenant/namespace.go b/core/tenant/namespace.go index 75d6ec00e2..7824c5b297 100644 --- a/core/tenant/namespace.go +++ b/core/tenant/namespace.go @@ -12,7 +12,7 @@ func NamespaceNameFrom(name string) (NamespaceName, error) { if name == "" { return "", errors.InvalidArgument(EntityNamespace, "namespace name is empty") } - // TODO: add condition, that namespace name should not have "." as this will break the standard URN design + return NamespaceName(name), nil } diff --git a/core/tenant/project.go b/core/tenant/project.go index a5c3a23746..82fdd22026 100644 --- a/core/tenant/project.go +++ b/core/tenant/project.go @@ -21,7 +21,6 @@ func ProjectNameFrom(name string) (ProjectName, error) { if name == "" { return "", errors.InvalidArgument(EntityProject, "project name is empty") } - // TODO: add condition, that project name should not have "." as this will break the standard URN design return ProjectName(name), nil } diff --git a/internal/store/postgres/job/adapter.go b/internal/store/postgres/job/adapter.go index 28ae2f9046..0e3407cf22 100644 --- a/internal/store/postgres/job/adapter.go +++ b/internal/store/postgres/job/adapter.go @@ -56,17 +56,6 @@ type Spec struct { IsDirty bool } -type Change struct { - Property string `json:"attribute_name"` - Diff string `json:"diff"` -} - -type ChangeLog struct { - Change []Change - Type string - Time time.Time -} - type Schedule struct { StartDate time.Time EndDate *time.Time `json:",omitempty"` @@ -381,20 +370,6 @@ 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 @@ -677,18 +652,6 @@ 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 bd436b9255..47d0c8ee1b 100644 --- a/internal/store/postgres/job/job_repository.go +++ b/internal/store/postgres/job/job_repository.go @@ -3,22 +3,18 @@ package job import ( "context" "database/sql" - "encoding/json" "fmt" "strings" "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/pgconn" "github.com/jackc/pgx/v5/pgxpool" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" "github.com/goto/optimus/core/job" "github.com/goto/optimus/core/resource" "github.com/goto/optimus/core/tenant" "github.com/goto/optimus/internal/errors" "github.com/goto/optimus/internal/store/postgres" - "github.com/goto/optimus/internal/utils" ) const ( @@ -28,11 +24,6 @@ const ( jobColumns = `id, ` + jobColumnsToStore + `, deleted_at, is_dirty` ) -var changelogMetrics = promauto.NewCounterVec(prometheus.CounterOpts{ - Name: "job_repository_changelog_metrics_error", - Help: "success or failure metrics", -}, []string{"project", "namespace", "name", "msg"}) - type JobRepository struct { db *pgxpool.Pool } @@ -56,20 +47,20 @@ func (j JobRepository) Add(ctx context.Context, jobs []*job.Job) ([]*job.Job, er func (j JobRepository) insertJobSpec(ctx context.Context, jobEntity *job.Job) error { existingJob, err := j.get(ctx, jobEntity.ProjectName(), jobEntity.Spec().Name(), false) - if err != nil { - if errors.IsErrorType(err, errors.ErrNotFound) { - return j.triggerInsert(ctx, jobEntity) - } + if err != nil && !errors.IsErrorType(err, errors.ErrNotFound) { return errors.NewError(errors.ErrInternalError, job.EntityJob, fmt.Sprintf("failed to check job %s in db: %s", jobEntity.Spec().Name().String(), err.Error())) } - if existingJob.DeletedAt.Valid { - if existingJob.NamespaceName == jobEntity.Tenant().NamespaceName().String() { - return j.updateAndPersistChangelog(ctx, jobEntity) - } + if err == nil && !existingJob.DeletedAt.Valid { + return errors.NewError(errors.ErrAlreadyExists, job.EntityJob, fmt.Sprintf("job %s already exists in namespace %s", existingJob.Name, existingJob.NamespaceName)) + } + if err == nil && existingJob.DeletedAt.Valid && existingJob.NamespaceName != jobEntity.Tenant().NamespaceName().String() { errorMsg := fmt.Sprintf("job %s already exists and soft deleted in namespace %s. consider hard delete the job before inserting to this namespace.", existingJob.Name, existingJob.NamespaceName) return errors.NewError(errors.ErrAlreadyExists, job.EntityJob, errorMsg) } - return errors.NewError(errors.ErrAlreadyExists, job.EntityJob, fmt.Sprintf("job %s already exists in namespace %s", existingJob.Name, existingJob.NamespaceName)) + if err == nil && existingJob.DeletedAt.Valid && existingJob.NamespaceName == jobEntity.Tenant().NamespaceName().String() { + return j.triggerUpdate(ctx, jobEntity) + } + return j.triggerInsert(ctx, jobEntity) } func (j JobRepository) triggerInsert(ctx context.Context, jobEntity *job.Job) error { @@ -106,7 +97,7 @@ func (j JobRepository) Update(ctx context.Context, jobs []*job.Job) ([]*job.Job, me.Append(err) continue } - if err := j.updateAndPersistChangelog(ctx, jobEntity); err != nil { + if err := j.triggerUpdate(ctx, jobEntity); err != nil { me.Append(err) continue } @@ -257,107 +248,6 @@ func (j JobRepository) preCheckUpdate(ctx context.Context, jobEntity *job.Job) e return nil } -func getJobDiff(storageSpecOld *Spec, newJobEntity *job.Job) ([]Change, error) { - toIgnore := map[string]struct{}{ - "ID": {}, - "CreatedAt": {}, - "UpdatedAt": {}, - } - var changelog []Change - storageSpecNew, err := toStorageSpec(newJobEntity) - if err != nil { - return changelog, err - } - - diff, err := utils.GetDiffs(*storageSpecOld, *storageSpecNew, nil) - if err != nil { - return changelog, err - } - - for _, d := range diff { - if _, ok := toIgnore[d.Field]; !ok { - changelog = append(changelog, Change{ - Property: d.Field, - Diff: d.Diff, - }) - } - } - - return changelog, nil -} - -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 - } - insertChangeLogQuery := `INSERT INTO changelog ( entity_type , name , project_name , change_type , changes , created_at ) - VALUES ($1, $2, $3, $4, $5, NOW());` - - tag, err := j.db.Exec(ctx, insertChangeLogQuery, "job", jobName, projectName, "update", string(changeLogBytes)) - if err != nil { - return errors.Wrap(job.EntityJobChangeLog, "unable to insert job changelog", err) - } - - if tag.RowsAffected() == 0 { - return errors.InternalError(job.EntityJobChangeLog, "unable to insert job changelog, rows affected 0", nil) - } - 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 { - return err - } - return j.insertChangelog(ctx, incomingJobEntity.Spec().Name(), incomingJobEntity.Tenant().ProjectName(), changeLog) -} - -func (j JobRepository) updateAndPersistChangelog(ctx context.Context, incomingJobEntity *job.Job) error { - existingJob, err := j.get(ctx, incomingJobEntity.ProjectName(), incomingJobEntity.Spec().Name(), false) - if err != nil { - return err - } - - if err := j.triggerUpdate(ctx, incomingJobEntity); err != nil { - return err - } - - if err = j.computeAndPersistChangeLog(ctx, existingJob, incomingJobEntity); err != nil { - changelogMetrics.WithLabelValues( - incomingJobEntity.ProjectName().String(), - incomingJobEntity.Tenant().NamespaceName().String(), - incomingJobEntity.GetName(), - err.Error(), - ).Inc() - } - return nil -} - func (j JobRepository) triggerUpdate(ctx context.Context, jobEntity *job.Job) error { storageJob, err := toStorageSpec(jobEntity) if err != nil { diff --git a/internal/store/postgres/migrations/000063_create_changelog_table.down.sql b/internal/store/postgres/migrations/000063_create_changelog_table.down.sql deleted file mode 100644 index 040d90ce54..0000000000 --- a/internal/store/postgres/migrations/000063_create_changelog_table.down.sql +++ /dev/null @@ -1,4 +0,0 @@ -DROP TABLE IF EXISTS changelog; - -DROP TYPE IF EXISTS ENTITY_TYPE; -DROP TYPE IF EXISTS CHANGE_TYPE; \ No newline at end of file diff --git a/internal/store/postgres/migrations/000063_create_changelog_table.up.sql b/internal/store/postgres/migrations/000063_create_changelog_table.up.sql deleted file mode 100644 index 52089ee610..0000000000 --- a/internal/store/postgres/migrations/000063_create_changelog_table.up.sql +++ /dev/null @@ -1,24 +0,0 @@ -DO $$ BEGIN - CREATE TYPE ENTITY_TYPE AS ENUM ('job', 'resource'); -EXCEPTION - WHEN duplicate_object THEN null; -END $$; - -DO $$ BEGIN - CREATE TYPE CHANGE_TYPE AS ENUM ('create', 'update', 'delete'); -EXCEPTION - WHEN duplicate_object THEN null; -END $$; - -CREATE TABLE IF NOT EXISTS changelog ( - id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), - - entity_type ENTITY_TYPE NOT NULL, - name VARCHAR(100) NOT NULL, - project_name VARCHAR(100) NOT NULL, - change_type CHANGE_TYPE NOT NULL, - changes JSONB NOT NULL, - 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); \ No newline at end of file diff --git a/internal/telemetry/prometheus.go b/internal/telemetry/prometheus.go index ec30f5fbeb..e14545849b 100644 --- a/internal/telemetry/prometheus.go +++ b/internal/telemetry/prometheus.go @@ -18,18 +18,10 @@ var ( gaugeMetricMutex = sync.Mutex{} MetricServer string - - panicMetric = promauto.NewCounterVec(prometheus.CounterOpts{ - Name: "panics_recovered", - }, []string{"entity", "msg"}) ) const metricsPushJob = "optimus_push" -func LogPanic(entity, message string) { - panicMetric.WithLabelValues(entity, message).Inc() -} - func getKey(metric string, labels map[string]string) string { eventMetricKey := metric keys := make([]string, 0, len(labels)) diff --git a/internal/utils/diff.go b/internal/utils/diff.go deleted file mode 100644 index a21082fa41..0000000000 --- a/internal/utils/diff.go +++ /dev/null @@ -1,245 +0,0 @@ -package utils - -import ( - "encoding/json" - "fmt" - "hash/fnv" - "os" - "reflect" - "strconv" - "strings" - - "github.com/goto/optimus/internal/telemetry" -) - -const ( - strLenThreshold = 250 - maxStringDiffLength = 3000 - - entityDiff = "utils-diff" - - // number of lines to include below and above the changed lines - maxDiffContextLength = 2 -) - -type Diff struct { - Field string - Diff string -} - -type AttributePath string - -func (a AttributePath) Add(propName string) AttributePath { - if a == "" { - return AttributePath(propName) - } - return AttributePath(string(a) + "." + propName) -} - -func (a AttributePath) String() string { - return string(a) -} - -func getHash(s string) uint64 { - h := fnv.New64() - h.Write([]byte(s)) - return h.Sum64() -} - -type elementTracker[V any] struct { - index int - item V -} - -type CmpOptions struct { - IgnoreOrderList bool -} - -func compareLargeStrings(prefix AttributePath, text1, text2 string) (stringDiff []Diff) { - defer func() { - if r := recover(); r != nil { - telemetry.LogPanic(entityDiff, fmt.Sprintf("compareLargeStrings: err:%v", r)) - _, _ = fmt.Fprintf(os.Stderr, "Panic Recovered in compareLargeStrings err:%v\n", r) - } - }() - - unifiedDiff := GetMyersDiff(strings.Split(text1, "\n"), strings.Split(text2, "\n"), maxDiffContextLength) - - if len(unifiedDiff) > maxStringDiffLength { - unifiedDiff = unifiedDiff[:maxStringDiffLength] + "\n ...\n Diff Truncated due to huge size..." - } - stringDiff = append(stringDiff, Diff{ - Field: prefix.String(), - Diff: unifiedDiff, - }) - return -} - -func getUnifiedDiff(oldVal, newVal any) string { - return fmt.Sprintf("- %v\n+ %v", oldVal, newVal) -} - -func compareString(prefix AttributePath, text1, text2 string) []Diff { - if !(text1 != text2) { - return nil - } - if len(text1) > strLenThreshold || len(text2) > strLenThreshold { - stringDiff := compareLargeStrings(prefix, text1, text2) - if stringDiff != nil { - return stringDiff - } - return []Diff{{ // panic recovery case - Field: prefix.String(), - Diff: getUnifiedDiff(text1[strLenThreshold:], text2[strLenThreshold:]), - }} - } - return []Diff{{ - Field: prefix.String(), - Diff: getUnifiedDiff(text1, text2), - }} -} - -// compareList remove all unchanged items and return an associative array -func compareList[V any](prefix AttributePath, list1, list2 []V, opt *CmpOptions) []Diff { //nolint - list1Dict := make(map[uint64]elementTracker[V]) - list2Dict := make(map[uint64]elementTracker[V]) - // make map of all items that are there in list1 - for i, item := range list1 { - list1Dict[getHash(fmt.Sprintf("%v", item))] = elementTracker[V]{ - index: i, - item: item, - } - } - // find items that are there in list 2 but not in list 1 - for i, item := range list2 { - hash := getHash(fmt.Sprintf("%v", item)) - if v, ok := list1Dict[hash]; ok { - if opt != nil && opt.IgnoreOrderList { - // delete unmodified items that are even out of order - delete(list1Dict, hash) - continue - } - if v.index == i { - delete(list1Dict, hash) - continue - } - } - list2Dict[getHash(fmt.Sprintf("%v", item))] = elementTracker[V]{ - index: i, - item: item, - } - } - oldList := make(map[string]V) - newList := make(map[string]V) - for _, element := range list1Dict { - oldList[strconv.Itoa(element.index)] = element.item - } - for _, element := range list2Dict { - newList[strconv.Itoa(element.index)] = element.item - } - if len(oldList) == 0 && len(newList) == 0 { - return nil - } - oldListStr, _ := json.Marshal(oldList) - newListStr, _ := json.Marshal(newList) - return []Diff{{ - Field: prefix.Add("indicesModified").String(), - Diff: getUnifiedDiff(string(oldListStr), string(newListStr)), - }} -} - -func nestedMapDiff(prefix AttributePath, map1, map2 reflect.Value, opt *CmpOptions) []Diff { //nolint - var diffs []Diff - map1Keys := map1.MapKeys() - map2Keys := map2.MapKeys() - - map1Set := make(map[interface{}]bool) - map2Set := make(map[interface{}]bool) - - for _, k := range map1Keys { - map1Set[k.Interface()] = true - } - - for _, k := range map2Keys { - map2Set[k.Interface()] = true - } - - for _, k := range map1Keys { - key := k.Interface() - qualifiedField := prefix.Add(fmt.Sprintf("%v", key)) - v1 := map1.MapIndex(k).Interface() - v2 := map2.MapIndex(k).Interface() - if _, ok := map2Set[key]; ok { - if reflect.TypeOf(v1) == reflect.TypeOf(v2) { - switch { - case reflect.ValueOf(v1).Kind() == reflect.Map: - nestedMap1 := reflect.ValueOf(v1) - nestedMap2 := reflect.ValueOf(v2) - iterDiffs := nestedMapDiff(qualifiedField, nestedMap1, nestedMap2, opt) - diffs = append(diffs, iterDiffs...) - continue - case reflect.ValueOf(v1).Kind() == reflect.Slice: - diffs = append(diffs, compareList[any](qualifiedField, v1.([]any), v2.([]any), opt)...) - continue - case reflect.ValueOf(v1).Kind() == reflect.String: - diffs = append(diffs, compareString(qualifiedField, v1.(string), v2.(string))...) - continue - case !reflect.DeepEqual(v1, v2): - diffs = append(diffs, Diff{Field: qualifiedField.String(), Diff: getUnifiedDiff(v1, v2)}) - continue - } - } else { - diffs = append(diffs, Diff{Field: qualifiedField.String(), Diff: getUnifiedDiff(v1, v2)}) - } - } else { - diffs = append(diffs, Diff{Field: qualifiedField.String(), Diff: getUnifiedDiff(v1, nil)}) - } - } - - for _, k := range map2Keys { - key := k.Interface() - qualifiedField := prefix.Add(fmt.Sprintf("%v", key)) - if _, ok := map1Set[key]; !ok { - v2 := map2.MapIndex(k).Interface() - diffs = append(diffs, Diff{Field: qualifiedField.String(), Diff: getUnifiedDiff(nil, v2)}) - } - } - - return diffs -} - -func unMarshalRawJSON(j json.RawMessage) (map[string]interface{}, error) { - var val map[string]interface{} - err := json.Unmarshal(j, &val) - if err != nil { - return nil, err - } - return val, nil -} - -// GetDiffs compares two interfaces and returns a slice of Diff containing differences. Does not compare unexported attributes -func GetDiffs(i1, i2 interface{}, opt *CmpOptions) ([]Diff, error) { - defer func() { - if r := recover(); r != nil { - telemetry.LogPanic(entityDiff, fmt.Sprintf("GetDiffs: err:%v", r)) - _, _ = fmt.Fprintf(os.Stderr, "Recovered in GetDiffs err:%v\n", r) - } - }() - k, err := json.Marshal(i1) - if err != nil { - return nil, err - } - l, err := json.Marshal(i2) - if err != nil { - return nil, err - } - i1map, err := unMarshalRawJSON(k) - if err != nil { - return nil, err - } - i2map, err := unMarshalRawJSON(l) - if err != nil { - return nil, err - } - return nestedMapDiff("", reflect.ValueOf(i1map), reflect.ValueOf(i2map), opt), nil -} diff --git a/internal/utils/diff_test.go b/internal/utils/diff_test.go deleted file mode 100644 index def59777c4..0000000000 --- a/internal/utils/diff_test.go +++ /dev/null @@ -1,565 +0,0 @@ -package utils_test - -import ( - "encoding/json" - "testing" - - "github.com/stretchr/testify/assert" - - "github.com/goto/optimus/internal/utils" -) - -type Type3 struct { - Type31 string - Type32 int -} - -type Type2 struct { - SomeField string - SomeField1 int -} - -type Type1 struct { - Field1 string - Field2 int - Field3 map[string]string - Field4 Type2 - Field5 float64 - Field6 *Type3 - Field7 []string -} - -func assertDiff(t *testing.T, expected map[string]string, diff []utils.Diff) { - t.Helper() - assert.Equal(t, len(expected), len(diff)) - for _, d := range diff { - _, ok := expected[d.Field] - assert.True(t, ok, "%s was not expected to be in diff", d) - } - for key, msg := range expected { - var found bool - for _, diff := range diff { - if diff.Field == key { - found = true - break - } - } - assert.Truef(t, found, "expected %s to be found in diff, failed %s", key, msg) - } -} - -func TestGetDiffs(t *testing.T) { - type3Object := Type3{ - Type31: "baseValue", - Type32: -12, - } - type2Object := Type2{ - SomeField: "k", - SomeField1: 1, - } - - baseObject := Type1{ - Field1: "some", - Field2: 1, - Field3: map[string]string{ - "a": "c", - "B": "d", - }, - Field4: type2Object, - Field5: 11.0, - Field6: &type3Object, - } - t.Run("get diff of two interface of same kind", func(t *testing.T) { - t.Run("case involving maps and raw json", func(t *testing.T) { - type newType4 string - - type newType3 struct { - A map[string]string - B map[string]int - } - - type newType2 struct { - A json.RawMessage - B newType3 - } - - type newType struct { - A string - B newType2 - C newType4 - D int - } - - o1 := newType{ - A: "abcd", - B: newType2{ - A: json.RawMessage("{\n \"name\": \"John Doe\",\n \"age\": 30,\n \"city\": \"New York\",\n \"isMarried\": true,\n \"children\": [\"Alice\", \"Bob\"],\n \"address\": {\n \"street\": \"123 Main Street\",\n \"city\": \"New York\",\n \"zip\": \"10001\"\n }\n}"), - B: newType3{ - A: map[string]string{ - "A": "a", - "B": "B", - }, - B: map[string]int{ - "A": 1, - "B": 2, - }, - }, - }, - C: "cake", - } - o2 := newType{ - A: "abcd", - B: newType2{ - A: json.RawMessage("{\n \"name\": \"John Doe1\",\n \"age\": 30,\n \"city\": \"New York\",\n \"isMarried\": true,\n \"children\": [\"Alice\", \"Bob1\"],\n \"address\": {\n \"street\": \"123 Main Street1\",\n \"city\": \"New York\",\n \"zip\": \"10001\"\n }\n}"), - B: newType3{ - A: map[string]string{ - "A": "a", - "B": "b", - }, - B: map[string]int{ - "B": 1, - "A": 1, - }, - }, - }, - C: "cake1", - } - expectedDiff := map[string]string{ - "B.A.children.indicesModified": "array in a raw json", - "B.A.address.street": "json object in a raw json", - "B.A.name": "compare raw json", - "B.B.A.B": "key in a map which is in a struct object", - "B.B.B.B": "comparing int in a map", - "C": "simple string", - } - - diffs, err := utils.GetDiffs(o1, o2, nil) - assert.Nil(t, err) - assertDiff(t, expectedDiff, diffs) - }) - t.Run("when objects are identical, diff must be 0 length", func(t *testing.T) { - newType3Object := Type3{ - Type31: "baseValue", - Type32: -12, - } - objectToCompare := Type1{ - Field1: "some", - Field2: 1, - Field3: map[string]string{ - "B": "d", - "a": "c", - }, - Field4: type2Object, - Field5: 11.0, - Field6: &newType3Object, - } - expectedDiff := map[string]string{} - - diffs, err := utils.GetDiffs(baseObject, objectToCompare, nil) - assert.Nil(t, err) - assertDiff(t, expectedDiff, diffs) - }) - t.Run("when pointer types are involved", func(t *testing.T) { - t.Run("if one of the pointer is nil", func(t *testing.T) { - objectToCompare := Type1{ - Field1: "some", - Field2: 1, - Field3: map[string]string{ - "B": "d", - "a": "c", - }, - Field4: type2Object, - Field5: 11.0, - } - expectedDiff := map[string]string{ - "Field6": "nil pointer comparison", - } - - diffs, err := utils.GetDiffs(baseObject, objectToCompare, nil) - assert.Nil(t, err) - assertDiff(t, expectedDiff, diffs) - }) - t.Run("if both the pointers are nil", func(t *testing.T) { - objectToCompare := Type1{ - Field1: "some", - Field2: 1, - Field3: map[string]string{ - "B": "d", - "a": "c", - }, - Field4: type2Object, - Field5: 11.0, - } - anotherObjectToCompare := Type1{ - Field1: "some", - Field2: 1, - Field3: map[string]string{ - "B": "d", - "a": "c", - }, - Field4: type2Object, - Field5: 11.0, - } - expectedDiff := map[string]string{} - - diffs, err := utils.GetDiffs(objectToCompare, anotherObjectToCompare, nil) - assert.Nil(t, err) - assertDiff(t, expectedDiff, diffs) - }) - t.Run("if both the pointers are not nil", func(t *testing.T) { - t.Run("non identical", func(t *testing.T) { - newType3Object := Type3{ - Type31: "baseValue", - Type32: -121, - } - objectToCompare := Type1{ - Field1: "some", - Field2: 1, - Field3: map[string]string{ - "B": "d", - "a": "c", - }, - Field4: type2Object, - Field5: 11.0, - Field6: &newType3Object, - } - expectedDiff := map[string]string{ - "Field6.Type32": "pointer field comparison", - } - diffs, err := utils.GetDiffs(baseObject, objectToCompare, nil) - assert.Nil(t, err) - assertDiff(t, expectedDiff, diffs) - }) - }) - }) - t.Run("when objects are not identical", func(t *testing.T) { - t.Run("diff must not be empty", func(t *testing.T) { - newType3Object := Type3{ - Type31: "baseValue", - Type32: -122, - } - objectToCompare := Type1{ - Field1: "some", - Field2: 2, - Field3: map[string]string{ - "a": "c", - "B": "c", - }, - Field4: type2Object, - Field5: 11.0, - Field6: &newType3Object, - } - diffs, err := utils.GetDiffs(baseObject, objectToCompare, nil) - assert.Nil(t, err) - expectedDiff := map[string]string{ - "Field6.Type32": "nested objects test", - "Field3.B": "full map comparison", - "Field2": "integer comparison", - } - assertDiff(t, expectedDiff, diffs) - }) - t.Run("comparing Large texts should return unified diffs", func(t *testing.T) { - text1 := ` -version: 1 -name: sample_select -owner: "@data-batching-devs" -description: "dasDEsp" -schedule: - start_date: "2021-08-01" - interval: '*/5 * * * *' -behavior: - depends_on_past: true - retry: {} - webhook: - - "on": success - endpoints: - - url: https://dfa0-2401-4900-5fcf-dd77-1a9-d6d4-f35b-f6b9.ngrok-free.app - - url: http://localhost:8001/path/to/the/webhook?some=somethingStatic - headers: - auth-header1: 'bearer: {{.secret.WEBHOOK_SECRET}}' - header2: '' - - "on": failure - endpoints: - - url: http://localhost:8000/path/to/the/webhook1 - headers: - auth: 'bearer: {{.secret.WEBHOOK_SECRET}}' - - "on": sla_miss - endpoints: - - url: http://localhost:8000/path/to/the/webhook1 - headers: - auth: 'bearer: {{.secret.WEBHOOK_SECRET}}' - notify: - - "on": failure - channels: - - slack://#de-illuminati-alerts -task: - name: bq2bq - config: - BQ_SERVICE_ACCOUNT: '{{.secret.BQ_SERVICE_ACCOUNT}}' - DATASET: playground - LOAD_METHOD: APPEND - PROJECT: pilotdata-integration - SQL_TYPE: STANDARD - TABLE: sample_select1 - YASH: '{{.secret.BQ_SERVICE_ACCOUNT}}' - window: - size: 24h - offset: "0" - truncate_to: h -labels: - orchestrator: optimus - owner: yash -hooks: [] -dependencies: [] -metadata: - resource: - request: - memory: 128Mi - cpu: 250m - limit: - memory: 2048Mi - cpu: 500m - airflow: - pool: "" - queue: "" - -` - text2 := ` -version: 1 -name: sample_select -owner: "@data-batching-devs" -description: "dasDEsp" -schedule: - start_date: "2021-08-01" - interval: '*/5 * * * *' -behavior: - depends_on_past: true - retry: {} - webhook: - - "on": success - endpoints: - - url: https://dfa0-2401-4900-5fcf-dd77-1a9-d6d4-f35b-f6b9.ngrok-free.app - headers: - auth-header1: 'bearer: {{.secret.WEBHOOK_SECRET}}' - header2: 'something static ' - - url: http://localhost:8001/path/to/the/webhook?some=somethingStatic - headers: - auth-header1: 'bearer: {{.secret.WEBHOOK_SECRET}}' - header2: '' - - "on": failure - endpoints: - - url: http://localhost:8000/path/to/the/webhook1 - headers: - auth: 'bearer: {{.secret.WEBHOOK_SECRET}}' - - "on": sla_miss - endpoints: - - url: http://localhost:8000/path/to/the/webhook1 - headers: - auth: 'bearer: {{.secret.WEBHOOK_SECRET}}' - notify: - - "on": failure - channels: - - slack://#de-illuminati-alerts -task: - name: bq2bq - config: - BQ_SERVICE_ACCOUNT: '{{.secret.BQ_SERVICE_ACCOUNT}}' - DATASET: playground - LOAD_METHOD: APPEND1 - PROJECT: pilotdata-integration - SQL_TYPE: STANDARD - TABLE: sample_select1 - YASH: '{{.secret.BQ_SERVICE_ACCOUNT}}' - window: - size: 24h - offset: "0" - truncate_to: h - truncate_to: h -labels: - orchestrator: optimus - owner: yash - - -hooks: [] -dependencies: [] -metadata: - resource: - request: - cpu: 250m - memory: 128Mi - limit: - memory: 2048Mi - cpu: 500m - airflow: - pool: "" - queue: "" -` - type spec struct { - Assets map[string]string - } - baseObject1 := spec{ - Assets: map[string]string{ - "query.sql": text1, - }, - } - objectToCompare := spec{ - Assets: map[string]string{ - "query.sql": text2, - }, - } - - diffs, err := utils.GetDiffs(baseObject1, objectToCompare, nil) - assert.Nil(t, err) - expectedDiff := map[string]string{ - "Assets.query.sql": "large string with unified diff", - } - assertDiff(t, expectedDiff, diffs) - }) - t.Run("comparing Large texts should return unified diffs1", func(t *testing.T) { - text1 := "select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;" - text2 := "select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;\n select\n EXTRACT(DAY1 FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;select\n EXTRACT(DAY FROM CURRENT_TIMESTAMP()) + 8000 as `column1`,\n CAST(\"{{ .EXECUTION_TIME }}\" AS TIMESTAMP) as `column2`;" - type spec struct { - Assets map[string]string - } - baseObject1 := spec{ - Assets: map[string]string{ - "query.sql": text1, - }, - } - objectToCompare := spec{ - Assets: map[string]string{ - "query.sql": text2, - }, - } - - diffs, err := utils.GetDiffs(baseObject1, objectToCompare, nil) - assert.Nil(t, err) - expectedDiff := map[string]string{ - "Assets.query.sql": "large string with unified diff", - } - assertDiff(t, expectedDiff, diffs) - }) - - t.Run("comparing small texts should return non unified diffs", func(t *testing.T) { - type spec struct { - Assets map[string]string - } - baseObject1 := spec{ - Assets: map[string]string{ - "app.py": ` -def apple1(): - print("hello world!") -`, - }, - } - objectToCompare := spec{ - Assets: map[string]string{ - "app.py": ` -def apple(): - print("hello world!") -`, - }, - } - - diffs, err := utils.GetDiffs(baseObject1, objectToCompare, nil) - assert.Nil(t, err) - expectedDiff := map[string]string{ - "Assets.app.py": "small string with non unified diff", - } - assertDiff(t, expectedDiff, diffs) - }) - t.Run("if an array ", func(t *testing.T) { - newBaseObject := Type1{ - Field1: "some", - Field2: 1, - Field3: map[string]string{ - "a": "c", - "B": "d", - }, - Field7: []string{ - "apple", - "orange", - "banana", - }, - } - t.Run("when array are identical", func(t *testing.T) { - objectToCompare := Type1{ - Field1: "some", - Field2: 1, - Field3: map[string]string{ - "a": "c", - "B": "d", - }, - Field7: []string{ - "apple", - "orange", - "banana", - }, - } - diffs, err := utils.GetDiffs(newBaseObject, objectToCompare, nil) - assert.Nil(t, err) - expectedDiff := map[string]string{} - assertDiff(t, expectedDiff, diffs) - }) - t.Run("when items are missing", func(t *testing.T) { - objectToCompare := Type1{ - Field1: "some", - Field2: 1, - Field3: map[string]string{ - "a": "c", - "B": "d", - }, - } - diffs, err := utils.GetDiffs(newBaseObject, objectToCompare, nil) - assert.Nil(t, err) - expectedDiff := map[string]string{ - "Field7": "array comparison", - } - assertDiff(t, expectedDiff, diffs) - }) - t.Run("when items are out of order and IgnoreOrderList is true", func(t *testing.T) { - objectToCompare := Type1{ - Field1: "some", - Field2: 1, - Field3: map[string]string{ - "a": "c", - "B": "d", - }, - Field7: []string{ - "apple", - "banana", - "orange", - }, - } - diffs, err := utils.GetDiffs(newBaseObject, objectToCompare, &utils.CmpOptions{ - IgnoreOrderList: true, - }) - assert.Nil(t, err) - expectedDiff := map[string]string{} - assertDiff(t, expectedDiff, diffs) - }) - t.Run("when items are out of order and IgnoreOrderList is false", func(t *testing.T) { - objectToCompare := Type1{ - Field1: "some", - Field2: 1, - Field3: map[string]string{ - "a": "c", - "B": "d", - }, - Field7: []string{ - "apple", - "banana", - "orange", - }, - } - diffs, err := utils.GetDiffs(newBaseObject, objectToCompare, &utils.CmpOptions{}) - assert.Nil(t, err) - expectedDiff := map[string]string{ - "Field7.indicesModified": "array items reordered ", - } - assertDiff(t, expectedDiff, diffs) - }) - }) - }) - }) -} diff --git a/internal/utils/myers_diff.go b/internal/utils/myers_diff.go deleted file mode 100644 index 5a77d04c42..0000000000 --- a/internal/utils/myers_diff.go +++ /dev/null @@ -1,185 +0,0 @@ -package utils - -import ( - "fmt" - "strings" -) - -type operation string - -const ( - ADD operation = "add" - SUB operation = "sub" - EQ operation = "eq" -) - -func GetMyersDiff(src, dst []string, maxNeighbouringLines int) string { - script := shortestEditScript(src, dst) - - srcIndex, dstIndex := 0, 0 - - type stringChange struct { - Op operation - Text string - } - var changeBuffer []stringChange - - for _, op := range script { - switch op { - case ADD: - changeBuffer = append(changeBuffer, stringChange{ - Op: op, - Text: dst[dstIndex], - }) - dstIndex++ - case EQ: - changeBuffer = append(changeBuffer, stringChange{ - Op: op, - Text: src[srcIndex], - }) - srcIndex++ - dstIndex++ - - case SUB: - changeBuffer = append(changeBuffer, stringChange{ - Op: op, - Text: src[srcIndex], - }) - srcIndex++ - } - } - - eqDiffLookAheadLR := make([]int, len(changeBuffer)) - eqObserverSoFar := maxNeighbouringLines + 1 - for i, delta := range changeBuffer { - switch delta.Op { - case SUB, ADD: - eqDiffLookAheadLR[i] = eqObserverSoFar - eqObserverSoFar = 0 - case EQ: - eqDiffLookAheadLR[i] = eqObserverSoFar - eqObserverSoFar++ - } - } - eqDiffLookAheadRL := make([]int, len(changeBuffer)) - eqObserverSoFar = 2 - for i := len(changeBuffer) - 1; i >= 0; i-- { - switch changeBuffer[i].Op { - case SUB, ADD: - eqDiffLookAheadRL[i] = eqObserverSoFar - eqObserverSoFar = 0 - case EQ: - eqDiffLookAheadRL[i] = eqObserverSoFar - eqObserverSoFar++ - } - } - - var buffer []string - var skippingHunk bool - for i, delta := range changeBuffer { - switch delta.Op { - case SUB: - buffer = append(buffer, fmt.Sprintf("- %s", changeBuffer[i].Text)) - case EQ: - if eqDiffLookAheadRL[i] < maxNeighbouringLines || eqDiffLookAheadLR[i] < maxNeighbouringLines { - buffer = append(buffer, fmt.Sprintf(" %s", changeBuffer[i].Text)) - skippingHunk = false - } else { - if !skippingHunk { - buffer = append(buffer, "......") - } - skippingHunk = true - } - case ADD: - buffer = append(buffer, fmt.Sprintf("+ %s", changeBuffer[i].Text)) - } - } - if len(buffer) == 1 && buffer[0] == "......" { - return "" - } - return strings.Join(buffer, "\n") -} - -func shortestEditScript(src, dst []string) []operation { - n := len(src) - m := len(dst) - max := n + m - var trace []map[int]int - var x, y int - -loop: - for d := 0; d <= max; d++ { - v := make(map[int]int, d+2) //nolint: gomnd - trace = append(trace, v) - if d == 0 { - t := 0 - for len(src) > t && len(dst) > t && src[t] == dst[t] { - t++ - } - v[0] = t - if t == len(src) && t == len(dst) { //nolint: gocritic - break loop - } - continue - } - lastV := trace[d-1] - for k := -d; k <= d; k += 2 { - if k == -d || (k != d && lastV[k-1] < lastV[k+1]) { - x = lastV[k+1] - } else { - x = lastV[k-1] + 1 - } - y = x - k - for x < n && y < m && src[x] == dst[y] { - x, y = x+1, y+1 - } - v[k] = x - if x == n && y == m { - break loop - } - } - } - - // Backtracking - var script []operation - x = n - y = m - var k, prevK, prevX, prevY int - for d := len(trace) - 1; d > 0; d-- { - k = x - y - lastV := trace[d-1] - if k == -d || (k != d && lastV[k-1] < lastV[k+1]) { - prevK = k + 1 - } else { - prevK = k - 1 - } - prevX = lastV[prevK] - prevY = prevX - prevK - for x > prevX && y > prevY { - script = append(script, EQ) - x-- - y-- - } - if x == prevX { - script = append(script, ADD) - } else { - script = append(script, SUB) - } - x, y = prevX, prevY - } - if trace[0][0] != 0 { - for i := 0; i < trace[0][0]; i++ { - script = append(script, EQ) - } - } - - return reverse(script) -} - -func reverse(s []operation) []operation { - result := make([]operation, len(s)) - for i, v := range s { - result[len(s)-1-i] = v - } - return result -} diff --git a/internal/utils/myers_diff_test.go b/internal/utils/myers_diff_test.go deleted file mode 100644 index 4659a88d0d..0000000000 --- a/internal/utils/myers_diff_test.go +++ /dev/null @@ -1,135 +0,0 @@ -package utils_test - -import ( - "strings" - "testing" - - "github.com/stretchr/testify/assert" - - "github.com/goto/optimus/internal/utils" -) - -func TestGetMyersDiff(t *testing.T) { - text1 := ` -this is line 1 -this is line 2 -this is line 3 -this is line 4 -this is line 5 -this is line 6 -this is line 7 -this is line 8 -this is line 9 -this is line 10 -` - t.Run("get diff of two empty files", func(t *testing.T) { - text11 := `` - text22 := `` - diff := utils.GetMyersDiff(strings.Split(text11, "\n"), strings.Split(text22, "\n"), 2) - assert.Len(t, diff, 0) - }) - - t.Run("get diff of two identical files", func(t *testing.T) { - text2 := text1 - diff := utils.GetMyersDiff(strings.Split(text1, "\n"), strings.Split(text2, "\n"), 1) - assert.Len(t, diff, 0) - }) - - t.Run("get diff of two files with rows re arranged", func(t *testing.T) { - text2 := ` -this is line 1 -this is line 2 -this is line 3 -this is line 4 -this is line 6 -this is line 5 -this is line 7 -this is line 8 -this is line 9 -this is line 10 -` - diff := utils.GetMyersDiff(strings.Split(text1, "\n"), strings.Split(text2, "\n"), 2) - assert.Equal(t, diff, `...... - this is line 3 - this is line 4 -- this is line 5 - this is line 6 -+ this is line 5 - this is line 7 - this is line 8 -......`) - }) - - t.Run("get diff rows re deleted", func(t *testing.T) { - text2 := ` -this is line 1 -this is line 2 -this is line 3 -this is line 4 -this is line 6 -this is line 7 -this is line 8 -this is line 9 -this is line 10 -` - diff := utils.GetMyersDiff(strings.Split(text1, "\n"), strings.Split(text2, "\n"), 2) - assert.Equal(t, diff, `...... - this is line 3 - this is line 4 -- this is line 5 - this is line 6 - this is line 7 -......`) - }) - - t.Run("get diff rows re added", func(t *testing.T) { - text2 := ` -this is line 1 -this is line 2 -this is line 3 -this is line 4 -this is line 5 -this is line 51 -this is line 6 -this is line 7 -this is line 8 -this is line 9 -this is line 10 -` - diff := utils.GetMyersDiff(strings.Split(text1, "\n"), strings.Split(text2, "\n"), 2) - assert.Equal(t, diff, `...... - this is line 4 - this is line 5 -+ this is line 51 - this is line 6 - this is line 7 -......`) - }) - - t.Run("get diff rows re modified", func(t *testing.T) { - text2 := ` -this is line 1 -this is line 2 -this is line 3 -this is line 4 -this is line 51 -this is line 6 -this is line 71 -this is line 8 -this is line 9 -this is line 10 -` - diff := utils.GetMyersDiff(strings.Split(text1, "\n"), strings.Split(text2, "\n"), 2) - assert.Equal(t, diff, `...... - this is line 3 - this is line 4 -- this is line 5 -+ this is line 51 - this is line 6 -- this is line 7 -+ this is line 71 - this is line 8 - this is line 9 -......`) - }) -} diff --git a/optimus.sample.yaml b/optimus.sample.yaml index 592bb6a067..dd2a77a71c 100644 --- a/optimus.sample.yaml +++ b/optimus.sample.yaml @@ -38,9 +38,7 @@ project: # # relative path where resource spec for BQ are stored # path: "bq" # # namespace variables usable in specifications -# config: -# # for bq-related jobs, execution project specific to replay jobs are stored here -# replay_execution_project: "data_replay_project" +# config: {} #- name: sample_namespace_2 # job: # path: "ns2/job" diff --git a/protos/gotocompany/optimus/core/v1beta1/job_spec.pb.go b/protos/gotocompany/optimus/core/v1beta1/job_spec.pb.go index b495eb6587..bef27fba8e 100644 --- a/protos/gotocompany/optimus/core/v1beta1/job_spec.pb.go +++ b/protos/gotocompany/optimus/core/v1beta1/job_spec.pb.go @@ -2702,226 +2702,6 @@ 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 @@ -2937,7 +2717,7 @@ type GetJobSpecificationsRequest struct { func (x *GetJobSpecificationsRequest) Reset() { *x = GetJobSpecificationsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[44] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2950,7 +2730,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[44] + 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 { @@ -2963,7 +2743,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{44} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{40} } func (x *GetJobSpecificationsRequest) GetProjectName() string { @@ -3014,7 +2794,7 @@ type GetJobSpecificationsResponse struct { func (x *GetJobSpecificationsResponse) Reset() { *x = GetJobSpecificationsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[45] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3027,7 +2807,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[45] + 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 { @@ -3040,7 +2820,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{45} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{41} } // Deprecated: Do not use. @@ -3071,7 +2851,7 @@ type JobSpecificationResponse struct { func (x *JobSpecificationResponse) Reset() { *x = JobSpecificationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[46] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3084,7 +2864,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[46] + 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 { @@ -3097,7 +2877,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{46} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{42} } func (x *JobSpecificationResponse) GetProjectName() string { @@ -3134,7 +2914,7 @@ type ReplaceAllJobSpecificationsRequest struct { func (x *ReplaceAllJobSpecificationsRequest) Reset() { *x = ReplaceAllJobSpecificationsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[47] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3147,7 +2927,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[47] + 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 { @@ -3160,7 +2940,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{47} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{43} } func (x *ReplaceAllJobSpecificationsRequest) GetProjectName() string { @@ -3195,7 +2975,7 @@ type ReplaceAllJobSpecificationsResponse struct { func (x *ReplaceAllJobSpecificationsResponse) Reset() { *x = ReplaceAllJobSpecificationsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[48] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3208,7 +2988,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[48] + 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 { @@ -3221,7 +3001,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{48} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{44} } func (x *ReplaceAllJobSpecificationsResponse) GetLogStatus() *Log { @@ -3244,7 +3024,7 @@ type GetJobTaskRequest struct { func (x *GetJobTaskRequest) Reset() { *x = GetJobTaskRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[49] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3257,7 +3037,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[49] + 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 { @@ -3270,7 +3050,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{49} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{45} } func (x *GetJobTaskRequest) GetProjectName() string { @@ -3305,7 +3085,7 @@ type GetJobTaskResponse struct { func (x *GetJobTaskResponse) Reset() { *x = GetJobTaskResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[50] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3318,7 +3098,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[50] + 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 { @@ -3331,7 +3111,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{50} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{46} } func (x *GetJobTaskResponse) GetTask() *JobTask { @@ -3358,7 +3138,7 @@ type JobTask struct { func (x *JobTask) Reset() { *x = JobTask{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[51] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3371,7 +3151,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[51] + 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 { @@ -3384,7 +3164,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{51} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{47} } func (x *JobTask) GetName() string { @@ -3438,7 +3218,7 @@ type GetWindowRequest struct { func (x *GetWindowRequest) Reset() { *x = GetWindowRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[52] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3451,7 +3231,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[52] + 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 { @@ -3464,7 +3244,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{52} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{48} } func (x *GetWindowRequest) GetScheduledAt() *timestamppb.Timestamp { @@ -3515,7 +3295,7 @@ type GetWindowResponse struct { func (x *GetWindowResponse) Reset() { *x = GetWindowResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[53] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3528,7 +3308,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[53] + 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 { @@ -3541,7 +3321,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{53} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{49} } func (x *GetWindowResponse) GetStart() *timestamppb.Timestamp { @@ -3573,7 +3353,7 @@ type UpdateJobsStateRequest struct { func (x *UpdateJobsStateRequest) Reset() { *x = UpdateJobsStateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[54] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3586,7 +3366,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[54] + 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 { @@ -3599,7 +3379,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{54} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{50} } func (x *UpdateJobsStateRequest) GetProjectName() string { @@ -3646,7 +3426,7 @@ type UpdateJobsStateResponse struct { func (x *UpdateJobsStateResponse) Reset() { *x = UpdateJobsStateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[55] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3659,7 +3439,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[55] + 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 { @@ -3672,7 +3452,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{55} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{51} } type SyncJobsStateRequest struct { @@ -3688,7 +3468,7 @@ type SyncJobsStateRequest struct { func (x *SyncJobsStateRequest) Reset() { *x = SyncJobsStateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[56] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3701,7 +3481,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[56] + 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 { @@ -3714,7 +3494,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{56} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{52} } func (x *SyncJobsStateRequest) GetProjectName() string { @@ -3747,7 +3527,7 @@ type SyncJobsStateResponse struct { func (x *SyncJobsStateResponse) Reset() { *x = SyncJobsStateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[57] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3760,7 +3540,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[57] + 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 { @@ -3773,7 +3553,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{57} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{53} } type JobInspectResponse_BasicInfoSection struct { @@ -3790,7 +3570,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[58] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3803,7 +3583,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[58] + 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 { @@ -3863,7 +3643,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[59] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3876,7 +3656,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[59] + 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 { @@ -3949,7 +3729,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[60] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3962,7 +3742,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[60] + 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 { @@ -4025,7 +3805,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[61] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4038,7 +3818,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[61] + 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 { @@ -4081,7 +3861,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[62] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4094,7 +3874,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[62] + 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 { @@ -4143,7 +3923,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[63] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4156,7 +3936,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[63] + 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 { @@ -4197,7 +3977,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[64] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4210,7 +3990,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[64] + 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 { @@ -4246,7 +4026,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[65] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4259,7 +4039,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[65] + 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 { @@ -4307,7 +4087,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[66] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4320,7 +4100,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[66] + 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 { @@ -4360,7 +4140,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[68] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4373,7 +4153,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[68] + 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 { @@ -4445,7 +4225,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[71] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4458,7 +4238,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[71] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4509,7 +4289,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[72] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4522,7 +4302,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[72] + 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 { @@ -4573,7 +4353,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[73] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4586,7 +4366,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[73] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4635,7 +4415,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[74] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4648,7 +4428,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[74] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4690,7 +4470,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[76] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4703,7 +4483,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[76] + 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 { @@ -4745,7 +4525,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[81] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4758,7 +4538,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[81] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4771,7 +4551,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{51, 0} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{47, 0} } func (x *JobTask_Destination) GetDestination() string { @@ -4799,7 +4579,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[82] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4812,7 +4592,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[82] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4825,7 +4605,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{51, 1} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{47, 1} } func (x *JobTask_Dependency) GetDependency() string { @@ -4847,7 +4627,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[83] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4860,7 +4640,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[83] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4873,7 +4653,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{56, 0} + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{52, 0} } func (x *SyncJobsStateRequest_JobStatePair) GetJobName() string { @@ -5573,462 +5353,424 @@ 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, - 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, + 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, 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, + 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, 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, 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, + 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, 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, + 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, 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, 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, + 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, 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, + 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, 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, 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, + 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, 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, + 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, + 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, 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, - 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, + 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, 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, + 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, 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, + 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, 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, 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, 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, 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, + 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, 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, 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, + 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, - 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, + 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, 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, + 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, 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, + 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, 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, 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, + 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, 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, + 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, 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, + 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, 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, + 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 ( @@ -6044,7 +5786,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, 84) +var file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes = make([]protoimpl.MessageInfo, 80) 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 @@ -6088,181 +5830,173 @@ 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 - (*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 + (*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 } 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 - 86, // 1: gotocompany.optimus.core.v1beta1.DeployJobSpecificationResponse.log_status:type_name -> gotocompany.optimus.core.v1beta1.Log + 82, // 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 - 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 + 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 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 - 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 + 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 31, // 19: gotocompany.optimus.core.v1beta1.JobSpecification.config:type_name -> gotocompany.optimus.core.v1beta1.JobConfigItem - 70, // 20: gotocompany.optimus.core.v1beta1.JobSpecification.window:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Window + 66, // 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 - 71, // 22: gotocompany.optimus.core.v1beta1.JobSpecification.assets:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.AssetsEntry + 67, // 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 - 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 + 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 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 - 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 + 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 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 - 88, // 32: gotocompany.optimus.core.v1beta1.JobEvent.value:type_name -> google.protobuf.Struct + 84, // 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 - 86, // 37: gotocompany.optimus.core.v1beta1.RefreshJobsResponse.log_status:type_name -> gotocompany.optimus.core.v1beta1.Log + 82, // 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 - 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 + 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 } func init() { file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() } @@ -6753,54 +6487,6 @@ 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.(*GetJobChangelogRequest); 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[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobChange); 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[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobChangelog); 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[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetJobChangelogResponse); 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[44].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetJobSpecificationsRequest); i { case 0: return &v.state @@ -6812,7 +6498,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetJobSpecificationsResponse); i { case 0: return &v.state @@ -6824,7 +6510,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobSpecificationResponse); i { case 0: return &v.state @@ -6836,7 +6522,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReplaceAllJobSpecificationsRequest); i { case 0: return &v.state @@ -6848,7 +6534,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReplaceAllJobSpecificationsResponse); i { case 0: return &v.state @@ -6860,7 +6546,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetJobTaskRequest); i { case 0: return &v.state @@ -6872,7 +6558,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetJobTaskResponse); i { case 0: return &v.state @@ -6884,7 +6570,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobTask); i { case 0: return &v.state @@ -6896,7 +6582,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWindowRequest); i { case 0: return &v.state @@ -6908,7 +6594,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWindowResponse); i { case 0: return &v.state @@ -6920,7 +6606,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpdateJobsStateRequest); i { case 0: return &v.state @@ -6932,7 +6618,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpdateJobsStateResponse); i { case 0: return &v.state @@ -6944,7 +6630,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SyncJobsStateRequest); i { case 0: return &v.state @@ -6956,7 +6642,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SyncJobsStateResponse); i { case 0: return &v.state @@ -6968,7 +6654,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobInspectResponse_BasicInfoSection); i { case 0: return &v.state @@ -6980,7 +6666,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobInspectResponse_JobDependency); i { case 0: return &v.state @@ -6992,7 +6678,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobInspectResponse_UpstreamSection); i { case 0: return &v.state @@ -7004,7 +6690,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobInspectResponse_DownstreamSection); i { case 0: return &v.state @@ -7016,7 +6702,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobInspectResponse_UpstreamSection_UnknownDependencies); i { case 0: return &v.state @@ -7028,7 +6714,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidateRequest_FromServer); i { case 0: return &v.state @@ -7040,7 +6726,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidateRequest_FromOutside); i { case 0: return &v.state @@ -7052,7 +6738,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidateResponse_Result); i { case 0: return &v.state @@ -7064,7 +6750,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidateResponse_ResultList); i { case 0: return &v.state @@ -7076,7 +6762,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[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobSpecification_Window); i { case 0: return &v.state @@ -7088,7 +6774,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobSpecification_Behavior); i { case 0: return &v.state @@ -7100,7 +6786,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[68].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobSpecification_Behavior_Retry); i { case 0: return &v.state @@ -7112,7 +6798,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobSpecification_Behavior_Notifiers); i { case 0: return &v.state @@ -7124,7 +6810,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobSpecification_Behavior_Webhook); i { case 0: return &v.state @@ -7136,7 +6822,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[76].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_Webhook_WebhookEndpoint); i { case 0: return &v.state @@ -7148,7 +6834,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobTask_Destination); i { case 0: return &v.state @@ -7160,7 +6846,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobTask_Dependency); i { case 0: return &v.state @@ -7172,7 +6858,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SyncJobsStateRequest_JobStatePair); i { case 0: return &v.state @@ -7195,7 +6881,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: 84, + NumMessages: 80, 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 80a15f883a..4a16771f3a 100644 --- a/protos/gotocompany/optimus/core/v1beta1/job_spec.pb.gw.go +++ b/protos/gotocompany/optimus/core/v1beta1/job_spec.pb.gw.go @@ -511,78 +511,6 @@ 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}} ) @@ -1457,29 +1385,6 @@ 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() @@ -1848,26 +1753,6 @@ 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() @@ -2064,8 +1949,6 @@ 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"}, "")) @@ -2098,8 +1981,6 @@ 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 2a6797fc79..fa9fefaba1 100644 --- a/protos/gotocompany/optimus/core/v1beta1/job_spec.swagger.json +++ b/protos/gotocompany/optimus/core/v1beta1/job_spec.swagger.json @@ -157,43 +157,6 @@ ] } }, - "/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", @@ -1233,17 +1196,6 @@ } } }, - "v1beta1GetJobChangelogResponse": { - "type": "object", - "properties": { - "history": { - "type": "array", - "items": { - "$ref": "#/definitions/v1beta1JobChangelog" - } - } - } - }, "v1beta1GetJobSpecificationResponse": { "type": "object", "properties": { @@ -1313,34 +1265,6 @@ } } }, - "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 dfbe280582..114a2e06f4 100644 --- a/protos/gotocompany/optimus/core/v1beta1/job_spec_grpc.pb.go +++ b/protos/gotocompany/optimus/core/v1beta1/job_spec_grpc.pb.go @@ -40,8 +40,6 @@ 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 @@ -169,15 +167,6 @@ 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...) @@ -388,8 +377,6 @@ 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 @@ -450,9 +437,6 @@ 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") } @@ -640,24 +624,6 @@ 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 { @@ -937,10 +903,6 @@ 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 49f8b04f48..80d6a2e540 100644 --- a/server/optimus.go +++ b/server/optimus.go @@ -338,11 +338,7 @@ func (s *OptimusServer) setupHandlers() error { replayRepository := schedulerRepo.NewReplayRepository(s.dbPool) replayWorker := schedulerService.NewReplayWorker(s.logger, replayRepository, jobProviderRepo, newScheduler, s.conf.Replay) replayValidator := schedulerService.NewValidator(replayRepository, newScheduler, jobProviderRepo) - replayService := schedulerService.NewReplayService( - replayRepository, jobProviderRepo, tenantService, - replayValidator, replayWorker, newScheduler, - s.logger, s.conf.Replay.PluginExecutionProjectConfigNames, - ) + replayService := schedulerService.NewReplayService(replayRepository, jobProviderRepo, replayValidator, replayWorker, newScheduler, s.logger) newJobRunService := schedulerService.NewJobRunService( s.logger, jobProviderRepo, jobRunRepo, replayRepository, operatorRunRepository, @@ -361,8 +357,6 @@ func (s *OptimusServer) setupHandlers() error { jUpstreamResolver := jResolver.NewUpstreamResolver(jJobRepo, jExternalUpstreamResolver, jInternalUpstreamResolver) jJobService := jService.NewJobService(jJobRepo, jJobRepo, jJobRepo, pluginService, jUpstreamResolver, tenantService, s.eventHandler, s.logger, newJobRunService, newEngine) - jchangeLogService := jService.NewChangeLogService(jJobRepo) - // Resource Bounded Context resourceRepository := resource.NewRepository(s.dbPool) backupRepository := resource.NewBackupRepository(s.dbPool) @@ -392,7 +386,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, jchangeLogService, s.logger)) + pb.RegisterJobSpecificationServiceServer(s.grpcServer, jHandler.NewJobHandler(jJobService, s.logger)) pb.RegisterReplayServiceServer(s.grpcServer, schedulerHandler.NewReplayHandler(s.logger, replayService)) diff --git a/tests/setup/database.go b/tests/setup/database.go index e163a50d7f..4278f673e4 100644 --- a/tests/setup/database.go +++ b/tests/setup/database.go @@ -149,7 +149,6 @@ func TruncateTablesWith(pool *pgxpool.Pool) { pool.Exec(ctx, "TRUNCATE TABLE project CASCADE") pool.Exec(ctx, "TRUNCATE TABLE project_old, namespace_old, secret_old CASCADE") pool.Exec(ctx, "TRUNCATE TABLE preset CASCADE") - pool.Exec(ctx, "TRUNCATE TABLE changelog CASCADE") pool.Exec(ctx, "TRUNCATE TABLE job_deployment CASCADE")