From 06bccc01c6360c4f6da5201fffb4b03c59060c8c Mon Sep 17 00:00:00 2001 From: "Ahmad N. F." Date: Thu, 25 Jul 2024 11:01:18 +0700 Subject: [PATCH] feat: bulk delete jobs API & modify Optimus Apply to use bulk delete (#255) * feat: add service logic * feat: integrate bulk delete to client * feat: update job service logic & handler * feat: update proton * feat: fix client * feat: fix test * feat: refactor approach * feat: restructure downstream deletion * feat: fix after sync with master * feat: fix tracker already exists * feat: unit test * feat: fix variable naming & remove excessive logs * feat: update logic to only use deletionTrakerMap * fix: intermittent unit test fix * fix: handling empty job * feat: update proton commit --- Makefile | 2 +- client/cmd/apply/apply.go | 55 +- core/job/dto/request.go | 17 + core/job/handler/v1beta1/job.go | 36 + core/job/handler/v1beta1/job_test.go | 30 + core/job/service/job_service.go | 169 ++- core/job/service/job_service_test.go | 240 +++- .../optimus/core/v1beta1/job_spec.pb.go | 1221 +++++++++++------ .../optimus/core/v1beta1/job_spec.pb.gw.go | 117 ++ .../core/v1beta1/job_spec.swagger.json | 64 + .../optimus/core/v1beta1/job_spec_grpc.pb.go | 40 + 11 files changed, 1500 insertions(+), 491 deletions(-) create mode 100644 core/job/dto/request.go diff --git a/Makefile b/Makefile index eb786bdfcb..13b3275f67 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 := "01ffd0ca223431ae24a8de44827de0d96afef9b2" +PROTON_COMMIT := "10aa548f6af9b12a1560a9f2f80610a7e46fdf13" .PHONY: build test test-ci generate-proto unit-test-ci integration-test vet coverage clean install lint diff --git a/client/cmd/apply/apply.go b/client/cmd/apply/apply.go index c57c76f83d..91bbc8317d 100644 --- a/client/cmd/apply/apply.go +++ b/client/cmd/apply/apply.go @@ -116,7 +116,7 @@ func (c *applyCommand) RunE(cmd *cobra.Command, _ []string) error { var ( addJobRequest = []*pb.AddJobSpecificationsRequest{} updateJobRequest = []*pb.UpdateJobSpecificationsRequest{} - deleteJobRequest = []*pb.DeleteJobSpecificationRequest{} + deleteJobRequest = []*pb.BulkDeleteJobsRequest_JobToDelete{} migrateJobRequest = []*pb.ChangeJobNamespaceRequest{} addResourceRequest = []*pb.CreateResourceRequest{} updateResourceRequest = []*pb.UpdateResourceRequest{} @@ -130,7 +130,7 @@ func (c *applyCommand) RunE(cmd *cobra.Command, _ []string) error { addJobRequest = append(addJobRequest, c.getAddJobRequest(namespace, plans)...) updateJobRequest = append(updateJobRequest, c.getUpdateJobRequest(namespace, plans)...) updateJobRequest = append(updateJobRequest, updateFromMigrateJobs...) - deleteJobRequest = append(deleteJobRequest, c.getDeleteJobRequest(namespace, plans)...) + deleteJobRequest = append(deleteJobRequest, c.getBulkDeleteJobsRequest(namespace, plans)...) migrateJobRequest = append(migrateJobRequest, migrateJobs...) // resource request preparation migrateResources, updateFromMigrateResources := c.getMigrateResourceRequest(namespace, plans) @@ -149,7 +149,7 @@ func (c *applyCommand) RunE(cmd *cobra.Command, _ []string) error { migratedJobs := c.executeJobMigrate(ctx, jobClient, migrateJobRequest) updatedJobs := c.executeJobUpdate(ctx, jobClient, updateJobRequest) // job deletion < resource deletion - deletedJobs := c.executeJobDelete(ctx, jobClient, deleteJobRequest) + deletedJobs := c.executeJobBulkDelete(ctx, jobClient, &pb.BulkDeleteJobsRequest{ProjectName: plans.ProjectName, Jobs: deleteJobRequest}) deletedResources := c.executeResourceDelete(ctx, resourceClient, deleteResourceRequest) // update plan file, delete successful operations @@ -185,17 +185,41 @@ func (c *applyCommand) printFailed(namespaceName, operation, kind, name, cause s c.isOperationFail = true } -func (c *applyCommand) executeJobDelete(ctx context.Context, client pb.JobSpecificationServiceClient, requests []*pb.DeleteJobSpecificationRequest) []string { +func (c *applyCommand) printFailedAll(operation, kind, cause string) { + c.logger.Error("[all] %s: %s %s ❌", operation, kind) + if c.verbose && cause != "" { + c.logger.Error(cause) + } + c.isOperationFail = true +} + +func (c *applyCommand) executeJobBulkDelete(ctx context.Context, client pb.JobSpecificationServiceClient, request *pb.BulkDeleteJobsRequest) []string { + if len(request.Jobs) == 0 { + return []string{} + } + + response, err := client.BulkDeleteJobs(ctx, request) + if err != nil { + c.printFailedAll("bulk-delete", "job", err.Error()) + return nil + } + + // if no failure, check the status of each bulk deletion deletedJobs := []string{} - for _, request := range requests { - _, err := client.DeleteJobSpecification(ctx, request) - if err != nil { - c.printFailed(request.NamespaceName, "delete", "job", request.GetJobName(), err.Error()) + for _, jobToDelete := range request.Jobs { + result, found := response.ResultsByJobName[jobToDelete.JobName] + if !found { continue } - c.printSuccess(request.NamespaceName, "delete", "job", request.GetJobName()) - deletedJobs = append(deletedJobs, request.GetJobName()) + + if result.GetSuccess() { + c.printSuccess(jobToDelete.NamespaceName, "bulk-delete", "job", jobToDelete.JobName) + deletedJobs = append(deletedJobs, jobToDelete.JobName) + } else { + c.printFailed(jobToDelete.NamespaceName, "bulk-delete", "job", jobToDelete.JobName, result.GetMessage()) + } } + return deletedJobs } @@ -386,18 +410,15 @@ func (c *applyCommand) getUpdateJobRequest(namespace *config.Namespace, plans pl } } -func (c *applyCommand) getDeleteJobRequest(namespace *config.Namespace, plans plan.Plan) []*pb.DeleteJobSpecificationRequest { - jobsToBeDeleted := []*pb.DeleteJobSpecificationRequest{} +func (*applyCommand) getBulkDeleteJobsRequest(namespace *config.Namespace, plans plan.Plan) []*pb.BulkDeleteJobsRequest_JobToDelete { + jobsToDelete := []*pb.BulkDeleteJobsRequest_JobToDelete{} for _, currentPlan := range plans.Job.Delete.GetByNamespace(namespace.Name) { - jobsToBeDeleted = append(jobsToBeDeleted, &pb.DeleteJobSpecificationRequest{ - ProjectName: c.config.Project.Name, + jobsToDelete = append(jobsToDelete, &pb.BulkDeleteJobsRequest_JobToDelete{ NamespaceName: namespace.Name, JobName: currentPlan.Name, - CleanHistory: false, - Force: false, }) } - return jobsToBeDeleted + return jobsToDelete } func (c *applyCommand) getMigrateJobRequest(namespace *config.Namespace, plans plan.Plan) ([]*pb.ChangeJobNamespaceRequest, []*pb.UpdateJobSpecificationsRequest) { diff --git a/core/job/dto/request.go b/core/job/dto/request.go new file mode 100644 index 0000000000..4af06159a2 --- /dev/null +++ b/core/job/dto/request.go @@ -0,0 +1,17 @@ +package dto + +import ( + "github.com/goto/optimus/core/job" + "github.com/goto/optimus/core/tenant" +) + +type JobToDeleteRequest struct { + Namespace tenant.NamespaceName + JobName job.Name +} + +type BulkDeleteTracker struct { + JobName string + Message string + Success bool +} diff --git a/core/job/handler/v1beta1/job.go b/core/job/handler/v1beta1/job.go index 76d18232a3..f6c29992de 100644 --- a/core/job/handler/v1beta1/job.go +++ b/core/job/handler/v1beta1/job.go @@ -50,6 +50,7 @@ type JobModificationService interface { Delete(ctx context.Context, jobTenant tenant.Tenant, jobName job.Name, cleanFlag, forceFlag bool) (affectedDownstream []job.FullName, err error) ReplaceAll(ctx context.Context, jobTenant tenant.Tenant, jobs []*job.Spec, jobNamesWithInvalidSpec []job.Name, logWriter writer.LogWriter) error ChangeNamespace(ctx context.Context, jobSourceTenant, jobNewTenant tenant.Tenant, jobName job.Name) error + BulkDeleteJobs(ctx context.Context, projectName tenant.ProjectName, jobsToDelete []*dto.JobToDeleteRequest) (map[string]dto.BulkDeleteTracker, error) } type JobQueryService interface { @@ -158,6 +159,41 @@ func (jh *JobHandler) DeleteJobSpecification(ctx context.Context, deleteRequest }, nil } +func (jh *JobHandler) BulkDeleteJobs(ctx context.Context, bulkDeleteRequest *pb.BulkDeleteJobsRequest) (*pb.BulkDeleteJobsResponse, error) { + jobsToDelete := []*dto.JobToDeleteRequest{} + for _, j := range bulkDeleteRequest.GetJobs() { + jobsToDelete = append(jobsToDelete, &dto.JobToDeleteRequest{ + Namespace: tenant.NamespaceName(j.NamespaceName), + JobName: job.Name(j.JobName), + }) + } + projectName := tenant.ProjectName(bulkDeleteRequest.GetProjectName()) + + bulkDeleteTracker, err := jh.jobService.BulkDeleteJobs(ctx, projectName, jobsToDelete) + if err != nil { + errorMsg := "failed to do bulk delete" + jh.l.Error(fmt.Sprintf("%s: %s", errorMsg, err.Error())) + return nil, errors.GRPCErr(err, errorMsg) + } + + responseMap := map[string]*pb.BulkDeleteJobsResponse_JobDeletionStatus{} + for _, jobToDelete := range bulkDeleteRequest.GetJobs() { + jobResult, found := bulkDeleteTracker[jobToDelete.GetJobName()] + if !found { + continue + } + + responseMap[jobToDelete.GetJobName()] = &pb.BulkDeleteJobsResponse_JobDeletionStatus{ + Message: jobResult.Message, + Success: jobResult.Success, + } + } + + return &pb.BulkDeleteJobsResponse{ + ResultsByJobName: responseMap, + }, nil +} + func (jh *JobHandler) ChangeJobNamespace(ctx context.Context, changeRequest *pb.ChangeJobNamespaceRequest) (*pb.ChangeJobNamespaceResponse, error) { jobSourceTenant, err := tenant.NewTenant(changeRequest.ProjectName, changeRequest.NamespaceName) if err != nil { diff --git a/core/job/handler/v1beta1/job_test.go b/core/job/handler/v1beta1/job_test.go index 3289823483..7f95bcafa3 100644 --- a/core/job/handler/v1beta1/job_test.go +++ b/core/job/handler/v1beta1/job_test.go @@ -2580,6 +2580,36 @@ func (_m *JobService) Validate(ctx context.Context, request dto.ValidateRequest) return r0, r1 } +// BulkDeleteJobs provides a mock function with given fields: ctx, projectName, jobsToDelete +func (_m *JobService) BulkDeleteJobs(ctx context.Context, projectName tenant.ProjectName, jobsToDelete []*dto.JobToDeleteRequest) (map[string]dto.BulkDeleteTracker, error) { + ret := _m.Called(ctx, projectName, jobsToDelete) + + if len(ret) == 0 { + panic("no return value specified for BulkDeleteJobs") + } + + var r0 map[string]dto.BulkDeleteTracker + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, tenant.ProjectName, []*dto.JobToDeleteRequest) (map[string]dto.BulkDeleteTracker, error)); ok { + return rf(ctx, projectName, jobsToDelete) + } + if rf, ok := ret.Get(0).(func(context.Context, tenant.ProjectName, []*dto.JobToDeleteRequest) map[string]dto.BulkDeleteTracker); ok { + r0 = rf(ctx, projectName, jobsToDelete) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(map[string]dto.BulkDeleteTracker) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, tenant.ProjectName, []*dto.JobToDeleteRequest) error); ok { + r1 = rf(ctx, projectName, jobsToDelete) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // ReplaceAllJobSpecificationsServer is an autogenerated mock type for the ReplaceAllJobSpecificationsServer type type ReplaceAllJobSpecificationsServer struct { mock.Mock diff --git a/core/job/service/job_service.go b/core/job/service/job_service.go index b6164103d9..e284fb8eeb 100644 --- a/core/job/service/job_service.go +++ b/core/job/service/job_service.go @@ -822,7 +822,7 @@ func (j *JobService) RefreshResourceDownstream(ctx context.Context, resourceURNs return me.ToErr() } -func validateDeleteJob(jobTenant tenant.Tenant, downstreamsPerLevel [][]*job.Downstream, toDeleteMap map[job.FullName]*job.Spec, jobToDelete *job.Spec, logWriter writer.LogWriter, me *errors.MultiError) bool { +func validateDeleteJob(downstreamsPerLevel [][]*job.Downstream, toDeleteMap map[job.FullName]*job.Spec) error { notDeleted, safeToDelete := isJobSafeToDelete(toDeleteMap, downstreamsPerLevel) if !safeToDelete { @@ -833,15 +833,12 @@ func validateDeleteJob(jobTenant tenant.Tenant, downstreamsPerLevel [][]*job.Dow directDownstreams = downstreamsPerLevel[0] } - // TODO: refactor to put the log writer outside jobFullNames := job.DownstreamList(directDownstreams).GetDownstreamFullNames() - errorMsg := fmt.Sprintf("deletion of job %s will fail. job is being used by %s", jobToDelete.Name().String(), jobFullNames.String()) - logWriter.Write(writer.LogLevelError, fmt.Sprintf("[%s] %s", jobTenant.NamespaceName().String(), errorMsg)) - me.Append(errors.NewError(errors.ErrFailedPrecond, job.EntityJob, errorMsg)) - return false + errorMsg := fmt.Sprintf("job is being used by %s", jobFullNames.String()) + return errors.NewError(errors.ErrFailedPrecond, job.EntityJob, errorMsg) } - return true + return nil } func isJobSafeToDelete(toDeleteMap map[job.FullName]*job.Spec, downstreamsPerLevel [][]*job.Downstream) ([][]*job.Downstream, bool) { @@ -1007,9 +1004,11 @@ func (j *JobService) bulkDelete(ctx context.Context, jobTenant tenant.Tenant, to continue } - isSafeToDelete := validateDeleteJob(jobTenant, downstreamsPerLevel, toDeleteMap, spec, logWriter, me) - if !isSafeToDelete { - j.logger.Warn("job [%s] is not safe to be deleted", spec.Name()) + err = validateDeleteJob(downstreamsPerLevel, toDeleteMap) + if err != nil { + j.logger.Warn("job [%s] is not safe to be deleted: %s", spec.Name(), err) + logWriter.Write(writer.LogLevelError, fmt.Sprintf("[%s] deletion of job %s will fail. %s", jobTenant.NamespaceName().String(), spec.Name(), err)) + me.Append(err) continue } @@ -1511,17 +1510,12 @@ func (j *JobService) validateOneJobForDeletion( return []dto.ValidateResult{result} } - me := errors.NewMultiError("validating job for deletion errors") - safeToDelete := validateDeleteJob(jobTenant, downstreams, specByFullName, spec, writer.NewSafeBufferedLogger(), me) + err = validateDeleteJob(downstreams, specByFullName) var messages []string success := true - if !safeToDelete { - messages = []string{"job is not safe for deletion"} - if err := me.ToErr(); err != nil { - messages = append(messages, err.Error()) - } - + if err != nil { + messages = []string{"job is not safe for deletion", err.Error()} success = false } else { messages = []string{"job is safe for deletion"} @@ -1999,3 +1993,142 @@ func (j *JobService) getDownstreamJobs(ctx context.Context, projectName tenant.P } return downstreamJobs, me.ToErr() } + +func (j *JobService) BulkDeleteJobs(ctx context.Context, projectName tenant.ProjectName, jobsToDelete []*dto.JobToDeleteRequest) (map[string]dto.BulkDeleteTracker, error) { + // initiate deletion status per jobs to be deleted + deletionTrackerMap := map[string]dto.BulkDeleteTracker{} + + toDeleteJobs := job.Jobs{} + for _, jobToDelete := range jobsToDelete { + existingJob, err := j.jobRepo.GetByJobName(ctx, projectName, jobToDelete.JobName) + if err != nil && !errors.IsErrorType(err, errors.ErrNotFound) { + j.logger.Error("error getting existing job %s: %s", jobToDelete.JobName.String(), err) + return deletionTrackerMap, err + } + + if existingJob != nil { + toDeleteJobs = append(toDeleteJobs, existingJob) + } + } + + toDeleteMap := toDeleteJobs.GetNameMap() + toDeleteSpecMap := toDeleteJobs.GetFullNameToSpecMap() + + deletedJobs := job.Jobs{} + for _, toDeleteJob := range toDeleteJobs { + if _, alreadyProcessed := deletionTrackerMap[toDeleteJob.GetName()]; alreadyProcessed { + continue + } + + deletionTrackers, _ := j.resolveJobAndDownstreamsDeletion(ctx, toDeleteJob, toDeleteSpecMap, deletionTrackerMap) + for _, tracker := range deletionTrackers { + deletedJob := toDeleteMap[job.Name(tracker.JobName)] + deletionTrackerMap[tracker.JobName] = tracker + if tracker.Success { + deletedJobs = append(deletedJobs, deletedJob) + } + } + } + + me := errors.NewMultiError("error cleanup jobs in scheduler") + deletedJobsPerNamespace := deletedJobs.GetNamespaceNameAndJobsMap() + for namespaceName, deletedJobs := range deletedJobsPerNamespace { + tnnt, _ := tenant.NewTenant(projectName.String(), namespaceName.String()) + err := j.uploadJobs(ctx, tnnt, nil, job.Jobs(deletedJobs).GetJobNames()) + if err != nil { + me.Append(err) + } + } + + return deletionTrackerMap, me.ToErr() +} + +func (j *JobService) validateDeleteWithDownstreams(ctx context.Context, toDeleteJob *job.Job, toDeleteSpecMap map[job.FullName]*job.Spec) ([]*job.Downstream, error) { + downstreamsPerLevel, err := j.getAllDownstreams(ctx, toDeleteJob.ProjectName(), toDeleteJob.Spec().Name(), map[job.FullName]bool{}, 0) + if err != nil { + return nil, err + } + + err = validateDeleteJob(downstreamsPerLevel, toDeleteSpecMap) + if err != nil { + return nil, err + } + + // flatten downstreams per level into a single list, + // with direct downstreams will be put first & the leaf downstreams at the end + downstreams := []*job.Downstream{} + for _, currentDownstreams := range downstreamsPerLevel { + downstreams = append(downstreams, currentDownstreams...) + } + + return downstreams, nil +} + +func (j *JobService) resolveJobAndDownstreamsDeletion(ctx context.Context, toDeleteJob *job.Job, toDeleteSpecMap map[job.FullName]*job.Spec, currentTrackerMap map[string]dto.BulkDeleteTracker) ([]dto.BulkDeleteTracker, []job.Name) { + deletionTrackers := []dto.BulkDeleteTracker{} + deletedJobNames := []job.Name{} + + jobName := toDeleteJob.Spec().Name() + jobTenant := toDeleteJob.Tenant() + + handleDeletion := func(jobName job.Name, err error) { + tracker := dto.BulkDeleteTracker{ + JobName: jobName.String(), + Success: true, + } + if err != nil { + j.logger.Error("error deleting job [%s]: %s", jobName.String(), err) + tracker.Message = err.Error() + tracker.Success = false + } + deletionTrackers = append(deletionTrackers, tracker) + } + + downstreams, err := j.validateDeleteWithDownstreams(ctx, toDeleteJob, toDeleteSpecMap) + if err != nil { + handleDeletion(toDeleteJob.Spec().Name(), err) + return deletionTrackers, nil + } + + isDeletionFail := false + // delete its downstreams first + for i := len(downstreams) - 1; i >= 0 && !isDeletionFail; i-- { + downstream := downstreams[i] + if _, alreadyProcessed := currentTrackerMap[downstream.Name().String()]; alreadyProcessed { + continue + } + + if err = j.jobRepo.Delete(ctx, downstream.ProjectName(), downstream.Name(), false); err != nil { + handleDeletion(downstream.Name(), err) + isDeletionFail = true + } else { + j.raiseDeleteEvent(jobTenant, downstream.Name()) + raiseJobEventMetric(jobTenant, job.MetricJobEventStateDeleted, 1) + + deletedJobNames = append(deletedJobNames, downstream.Name()) + handleDeletion(downstream.Name(), nil) + } + } + + // then delete the current job + if _, alreadyProcessed := currentTrackerMap[jobName.String()]; alreadyProcessed { + j.logger.Warn("job [%s] deletion is skipped [already deleted]", jobName) + return deletionTrackers, deletedJobNames + } + if isDeletionFail { + handleDeletion(jobName, fmt.Errorf("one or more job downstreams cannot be deleted")) + return deletionTrackers, deletedJobNames + } + if err = j.jobRepo.Delete(ctx, jobTenant.ProjectName(), jobName, false); err != nil { + handleDeletion(jobName, err) + return deletionTrackers, deletedJobNames + } + + j.raiseDeleteEvent(jobTenant, jobName) + raiseJobEventMetric(jobTenant, job.MetricJobEventStateDeleted, 1) + + deletedJobNames = append(deletedJobNames, toDeleteJob.Spec().Name()) + handleDeletion(jobName, nil) + + return deletionTrackers, deletedJobNames +} diff --git a/core/job/service/job_service_test.go b/core/job/service/job_service_test.go index 9a85a0d248..2ee7b19b8a 100644 --- a/core/job/service/job_service_test.go +++ b/core/job/service/job_service_test.go @@ -4157,7 +4157,7 @@ func TestJobService(t *testing.T) { "job2": { { Stage: "validation for deletion", - Messages: []string{"job is not safe for deletion", "validating job for deletion errors:\n failed precondition for entity job: deletion of job job2 will fail. job is being used by test-proj/job3"}, + Messages: []string{"job is not safe for deletion", "failed precondition for entity job: job is being used by test-proj/job3"}, Success: false, }, }, @@ -4217,7 +4217,7 @@ func TestJobService(t *testing.T) { "job1": { { Stage: "validation for deletion", - Messages: []string{"job is not safe for deletion", "validating job for deletion errors:\n failed precondition for entity job: deletion of job job1 will fail. job is being used by test-proj/job2"}, + Messages: []string{"job is not safe for deletion", "failed precondition for entity job: job is being used by test-proj/job2"}, Success: false, }, }, @@ -4278,14 +4278,14 @@ func TestJobService(t *testing.T) { "job1": { { Stage: "validation for deletion", - Messages: []string{"job is not safe for deletion", "validating job for deletion errors:\n failed precondition for entity job: deletion of job job1 will fail. job is being used by test-proj/job2"}, + Messages: []string{"job is not safe for deletion", "failed precondition for entity job: job is being used by test-proj/job2"}, Success: false, }, }, "job2": { { Stage: "validation for deletion", - Messages: []string{"job is not safe for deletion", "validating job for deletion errors:\n failed precondition for entity job: deletion of job job2 will fail. job is being used by test-proj/job3"}, + Messages: []string{"job is not safe for deletion", "failed precondition for entity job: job is being used by test-proj/job3"}, Success: false, }, }, @@ -5276,6 +5276,238 @@ func TestJobService(t *testing.T) { assert.Nil(t, actual) }) }) + + t.Run("BulkDeleteJobs", func(t *testing.T) { + t.Run("successfully deletes a job & its downstream", func(t *testing.T) { + jobRepo := new(JobRepository) + defer jobRepo.AssertExpectations(t) + + upstreamRepo := new(UpstreamRepository) + defer upstreamRepo.AssertExpectations(t) + + downstreamRepo := new(DownstreamRepository) + defer downstreamRepo.AssertExpectations(t) + + pluginService := NewPluginService(t) + + upstreamResolver := new(UpstreamResolver) + defer upstreamResolver.AssertExpectations(t) + + tenantDetailsGetter := new(TenantDetailsGetter) + defer tenantDetailsGetter.AssertExpectations(t) + + jobDeploymentService := new(JobDeploymentService) + defer jobDeploymentService.AssertExpectations(t) + + eventHandler := newEventHandler(t) + + specA, _ := job.NewSpecBuilder(jobVersion, "job-A", "sample-owner", jobSchedule, jobWindow, jobTask).WithAsset(jobAsset).Build() + specB, _ := job.NewSpecBuilder(jobVersion, "job-B", "sample-owner", jobSchedule, jobWindow, jobTask).WithAsset(jobAsset).Build() + jobA := job.NewJob(sampleTenant, specA, resource.ZeroURN(), nil, false) + jobB := job.NewJob(sampleTenant, specB, resource.ZeroURN(), nil, false) + + downstreamA := []*job.Downstream{ + job.NewDownstream("job-B", project.Name(), namespace.Name(), taskName), + } + + jobRepo.On("GetByJobName", ctx, project.Name(), job.Name("job-A")).Return(jobA, nil).Once() + jobRepo.On("GetByJobName", ctx, project.Name(), job.Name("job-B")).Return(jobB, nil).Once() + downstreamRepo.On("GetDownstreamByJobName", ctx, project.Name(), specA.Name()).Return(downstreamA, nil) + downstreamRepo.On("GetDownstreamByJobName", ctx, project.Name(), specB.Name()).Return(nil, nil) + jobRepo.On("Delete", ctx, project.Name(), jobB.Spec().Name(), false).Return(nil).Once() + jobRepo.On("Delete", ctx, project.Name(), jobA.Spec().Name(), false).Return(nil).Once() + eventHandler.On("HandleEvent", mock.Anything).Times(2) + + jobDeploymentService.On("UploadJobs", ctx, sampleTenant, mock.Anything, []string{specB.Name().String(), specA.Name().String()}).Return(nil) + + jobService := service.NewJobService(jobRepo, upstreamRepo, downstreamRepo, pluginService, upstreamResolver, tenantDetailsGetter, eventHandler, log, jobDeploymentService, compiler.NewEngine(), nil, nil) + deletionTracker, err := jobService.BulkDeleteJobs(ctx, project.Name(), []*dto.JobToDeleteRequest{ + { + Namespace: sampleTenant.NamespaceName(), + JobName: "job-A", + }, + { + Namespace: sampleTenant.NamespaceName(), + JobName: "job-B", + }, + }) + + assert.NoError(t, err) + // assess each job's deletion status: all deletion should be successful + jobADeletion := deletionTracker["job-A"] + assert.NotNil(t, jobADeletion) + assert.True(t, jobADeletion.Success) + assert.Empty(t, jobADeletion.Message) + jobBDeletion := deletionTracker["job-B"] + assert.NotNil(t, jobBDeletion) + assert.True(t, jobBDeletion.Success) + assert.Empty(t, jobBDeletion.Message) + }) + + t.Run("error when fetching one of job details", func(t *testing.T) { + jobRepo := new(JobRepository) + defer jobRepo.AssertExpectations(t) + + upstreamRepo := new(UpstreamRepository) + defer upstreamRepo.AssertExpectations(t) + + downstreamRepo := new(DownstreamRepository) + defer downstreamRepo.AssertExpectations(t) + + pluginService := NewPluginService(t) + + upstreamResolver := new(UpstreamResolver) + defer upstreamResolver.AssertExpectations(t) + + tenantDetailsGetter := new(TenantDetailsGetter) + defer tenantDetailsGetter.AssertExpectations(t) + + jobDeploymentService := new(JobDeploymentService) + defer jobDeploymentService.AssertExpectations(t) + + eventHandler := newEventHandler(t) + + jobRepo.On("GetByJobName", ctx, project.Name(), job.Name("job-A")).Return(nil, errors.New("error")).Once() + + jobService := service.NewJobService(jobRepo, upstreamRepo, downstreamRepo, pluginService, upstreamResolver, tenantDetailsGetter, eventHandler, log, jobDeploymentService, compiler.NewEngine(), nil, nil) + deletionTracker, err := jobService.BulkDeleteJobs(ctx, project.Name(), []*dto.JobToDeleteRequest{ + { + Namespace: sampleTenant.NamespaceName(), + JobName: "job-A", + }, + }) + + assert.Error(t, err) + assert.Empty(t, deletionTracker) + }) + + t.Run("fail to delete a job because its downstream is failed to be deleted", func(t *testing.T) { + jobRepo := new(JobRepository) + defer jobRepo.AssertExpectations(t) + + upstreamRepo := new(UpstreamRepository) + defer upstreamRepo.AssertExpectations(t) + + downstreamRepo := new(DownstreamRepository) + defer downstreamRepo.AssertExpectations(t) + + pluginService := NewPluginService(t) + + upstreamResolver := new(UpstreamResolver) + defer upstreamResolver.AssertExpectations(t) + + tenantDetailsGetter := new(TenantDetailsGetter) + defer tenantDetailsGetter.AssertExpectations(t) + + jobDeploymentService := new(JobDeploymentService) + defer jobDeploymentService.AssertExpectations(t) + + eventHandler := newEventHandler(t) + + specA, _ := job.NewSpecBuilder(jobVersion, "job-A", "sample-owner", jobSchedule, jobWindow, jobTask).WithAsset(jobAsset).Build() + specB, _ := job.NewSpecBuilder(jobVersion, "job-B", "sample-owner", jobSchedule, jobWindow, jobTask).WithAsset(jobAsset).Build() + jobA := job.NewJob(sampleTenant, specA, resource.ZeroURN(), nil, false) + jobB := job.NewJob(sampleTenant, specB, resource.ZeroURN(), nil, false) + + downstreamA := []*job.Downstream{ + job.NewDownstream("job-B", project.Name(), namespace.Name(), taskName), + } + + jobRepo.On("GetByJobName", ctx, project.Name(), job.Name("job-A")).Return(jobA, nil).Once() + jobRepo.On("GetByJobName", ctx, project.Name(), job.Name("job-B")).Return(jobB, nil).Once() + downstreamRepo.On("GetDownstreamByJobName", ctx, project.Name(), specA.Name()).Return(downstreamA, nil) + downstreamRepo.On("GetDownstreamByJobName", ctx, project.Name(), specB.Name()).Return(nil, nil) + jobRepo.On("Delete", ctx, project.Name(), jobB.Spec().Name(), false).Return(errors.New("error deleting job-B")) + + jobService := service.NewJobService(jobRepo, upstreamRepo, downstreamRepo, pluginService, upstreamResolver, tenantDetailsGetter, eventHandler, log, jobDeploymentService, compiler.NewEngine(), nil, nil) + deletionTracker, err := jobService.BulkDeleteJobs(ctx, project.Name(), []*dto.JobToDeleteRequest{ + { + Namespace: sampleTenant.NamespaceName(), + JobName: "job-A", + }, + { + Namespace: sampleTenant.NamespaceName(), + JobName: "job-B", + }, + }) + + assert.NoError(t, err) + jobADeletion := deletionTracker["job-A"] + assert.NotNil(t, jobADeletion) + assert.False(t, jobADeletion.Success) + assert.Equal(t, "one or more job downstreams cannot be deleted", jobADeletion.Message) + jobBDeletion := deletionTracker["job-B"] + assert.NotNil(t, jobBDeletion) + assert.False(t, jobBDeletion.Success) + assert.Equal(t, "error deleting job-B", jobBDeletion.Message) + }) + + t.Run("fail to delete one or more jobs because there are existing downstream", func(t *testing.T) { + jobRepo := new(JobRepository) + defer jobRepo.AssertExpectations(t) + + upstreamRepo := new(UpstreamRepository) + defer upstreamRepo.AssertExpectations(t) + + downstreamRepo := new(DownstreamRepository) + defer downstreamRepo.AssertExpectations(t) + + pluginService := NewPluginService(t) + + upstreamResolver := new(UpstreamResolver) + defer upstreamResolver.AssertExpectations(t) + + tenantDetailsGetter := new(TenantDetailsGetter) + defer tenantDetailsGetter.AssertExpectations(t) + + jobDeploymentService := new(JobDeploymentService) + defer jobDeploymentService.AssertExpectations(t) + + eventHandler := newEventHandler(t) + + specA, _ := job.NewSpecBuilder(jobVersion, "job-A", "sample-owner", jobSchedule, jobWindow, jobTask).WithAsset(jobAsset).Build() + specB, _ := job.NewSpecBuilder(jobVersion, "job-B", "sample-owner", jobSchedule, jobWindow, jobTask).WithAsset(jobAsset).Build() + specC, _ := job.NewSpecBuilder(jobVersion, "job-C", "sample-owner", jobSchedule, jobWindow, jobTask).WithAsset(jobAsset).Build() + jobA := job.NewJob(sampleTenant, specA, resource.ZeroURN(), nil, false) + jobB := job.NewJob(sampleTenant, specB, resource.ZeroURN(), nil, false) + _ = job.NewJob(sampleTenant, specC, resource.ZeroURN(), nil, false) + + downstreamA := []*job.Downstream{ + job.NewDownstream("job-B", project.Name(), namespace.Name(), taskName), + } + downstreamB := []*job.Downstream{ + job.NewDownstream("job-C", project.Name(), namespace.Name(), taskName), + } + + jobRepo.On("GetByJobName", ctx, project.Name(), job.Name("job-A")).Return(jobA, nil).Once() + jobRepo.On("GetByJobName", ctx, project.Name(), job.Name("job-B")).Return(jobB, nil).Once() + downstreamRepo.On("GetDownstreamByJobName", ctx, project.Name(), specA.Name()).Return(downstreamA, nil) + downstreamRepo.On("GetDownstreamByJobName", ctx, project.Name(), specB.Name()).Return(downstreamB, nil) + downstreamRepo.On("GetDownstreamByJobName", ctx, project.Name(), specC.Name()).Return(nil, nil) + + jobService := service.NewJobService(jobRepo, upstreamRepo, downstreamRepo, pluginService, upstreamResolver, tenantDetailsGetter, eventHandler, log, jobDeploymentService, compiler.NewEngine(), nil, nil) + deletionTracker, err := jobService.BulkDeleteJobs(ctx, project.Name(), []*dto.JobToDeleteRequest{ + { + Namespace: sampleTenant.NamespaceName(), + JobName: "job-A", + }, + { + Namespace: sampleTenant.NamespaceName(), + JobName: "job-B", + }, + }) + + assert.NoError(t, err) + jobADeletion := deletionTracker["job-A"] + assert.NotNil(t, jobADeletion) + assert.False(t, jobADeletion.Success) + assert.Equal(t, "failed precondition for entity job: job is being used by test-proj/job-B", jobADeletion.Message) + jobBDeletion := deletionTracker["job-B"] + assert.NotNil(t, jobBDeletion) + assert.False(t, jobBDeletion.Success) + assert.Equal(t, "failed precondition for entity job: job is being used by test-proj/job-C", jobBDeletion.Message) + }) + }) } // JobRepository is an autogenerated mock type for the JobRepository type diff --git a/protos/gotocompany/optimus/core/v1beta1/job_spec.pb.go b/protos/gotocompany/optimus/core/v1beta1/job_spec.pb.go index 2aa8273020..b64c1fc018 100644 --- a/protos/gotocompany/optimus/core/v1beta1/job_spec.pb.go +++ b/protos/gotocompany/optimus/core/v1beta1/job_spec.pb.go @@ -3926,6 +3926,108 @@ func (*SyncJobsStateResponse) Descriptor() ([]byte, []int) { return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{59} } +type BulkDeleteJobsRequest 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"` + Jobs []*BulkDeleteJobsRequest_JobToDelete `protobuf:"bytes,2,rep,name=jobs,proto3" json:"jobs,omitempty"` +} + +func (x *BulkDeleteJobsRequest) Reset() { + *x = BulkDeleteJobsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[60] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BulkDeleteJobsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BulkDeleteJobsRequest) ProtoMessage() {} + +func (x *BulkDeleteJobsRequest) ProtoReflect() protoreflect.Message { + 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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BulkDeleteJobsRequest.ProtoReflect.Descriptor instead. +func (*BulkDeleteJobsRequest) Descriptor() ([]byte, []int) { + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{60} +} + +func (x *BulkDeleteJobsRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *BulkDeleteJobsRequest) GetJobs() []*BulkDeleteJobsRequest_JobToDelete { + if x != nil { + return x.Jobs + } + return nil +} + +type BulkDeleteJobsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ResultsByJobName map[string]*BulkDeleteJobsResponse_JobDeletionStatus `protobuf:"bytes,1,rep,name=results_by_job_name,json=resultsByJobName,proto3" json:"results_by_job_name,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *BulkDeleteJobsResponse) Reset() { + *x = BulkDeleteJobsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BulkDeleteJobsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BulkDeleteJobsResponse) ProtoMessage() {} + +func (x *BulkDeleteJobsResponse) ProtoReflect() protoreflect.Message { + 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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BulkDeleteJobsResponse.ProtoReflect.Descriptor instead. +func (*BulkDeleteJobsResponse) Descriptor() ([]byte, []int) { + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{61} +} + +func (x *BulkDeleteJobsResponse) GetResultsByJobName() map[string]*BulkDeleteJobsResponse_JobDeletionStatus { + if x != nil { + return x.ResultsByJobName + } + return nil +} + type JobInspectResponse_BasicInfoSection struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3940,7 +4042,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[60] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3953,7 +4055,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[60] + 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 { @@ -4013,7 +4115,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[61] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4026,7 +4128,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[61] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4099,7 +4201,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[62] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4112,7 +4214,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[62] + 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 { @@ -4175,7 +4277,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[63] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4188,7 +4290,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[63] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4231,7 +4333,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[64] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4244,7 +4346,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[64] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4293,7 +4395,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[65] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4306,7 +4408,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[65] + 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 { @@ -4347,7 +4449,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[66] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4360,7 +4462,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[66] + 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 { @@ -4396,7 +4498,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[67] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4409,7 +4511,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[67] + 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 { @@ -4457,7 +4559,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[68] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4470,7 +4572,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[68] + 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 { @@ -4510,7 +4612,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[70] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4523,7 +4625,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[70] + 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 { @@ -4595,7 +4697,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[73] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4608,7 +4710,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[73] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4659,7 +4761,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[74] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4672,7 +4774,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[74] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4723,7 +4825,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[75] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4736,7 +4838,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[75] + 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 { @@ -4785,7 +4887,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[76] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4798,7 +4900,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[76] + 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 { @@ -4840,7 +4942,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[78] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4853,7 +4955,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[78] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4895,7 +4997,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[83] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4908,7 +5010,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[83] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4949,7 +5051,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[84] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4962,7 +5064,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[84] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4997,7 +5099,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[85] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5010,7 +5112,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[85] + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5040,6 +5142,116 @@ func (x *SyncJobsStateRequest_JobStatePair) GetState() JobState { return JobState_JOB_STATE_UNSPECIFIED } +type BulkDeleteJobsRequest_JobToDelete struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NamespaceName string `protobuf:"bytes,1,opt,name=namespace_name,json=namespaceName,proto3" json:"namespace_name,omitempty"` + JobName string `protobuf:"bytes,2,opt,name=job_name,json=jobName,proto3" json:"job_name,omitempty"` +} + +func (x *BulkDeleteJobsRequest_JobToDelete) Reset() { + *x = BulkDeleteJobsRequest_JobToDelete{} + if protoimpl.UnsafeEnabled { + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[88] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BulkDeleteJobsRequest_JobToDelete) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BulkDeleteJobsRequest_JobToDelete) ProtoMessage() {} + +func (x *BulkDeleteJobsRequest_JobToDelete) ProtoReflect() protoreflect.Message { + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[88] + 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 BulkDeleteJobsRequest_JobToDelete.ProtoReflect.Descriptor instead. +func (*BulkDeleteJobsRequest_JobToDelete) Descriptor() ([]byte, []int) { + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{60, 0} +} + +func (x *BulkDeleteJobsRequest_JobToDelete) GetNamespaceName() string { + if x != nil { + return x.NamespaceName + } + return "" +} + +func (x *BulkDeleteJobsRequest_JobToDelete) GetJobName() string { + if x != nil { + return x.JobName + } + return "" +} + +type BulkDeleteJobsResponse_JobDeletionStatus struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` +} + +func (x *BulkDeleteJobsResponse_JobDeletionStatus) Reset() { + *x = BulkDeleteJobsResponse_JobDeletionStatus{} + if protoimpl.UnsafeEnabled { + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[89] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BulkDeleteJobsResponse_JobDeletionStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BulkDeleteJobsResponse_JobDeletionStatus) ProtoMessage() {} + +func (x *BulkDeleteJobsResponse_JobDeletionStatus) ProtoReflect() protoreflect.Message { + mi := &file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[89] + 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 BulkDeleteJobsResponse_JobDeletionStatus.ProtoReflect.Descriptor instead. +func (*BulkDeleteJobsResponse_JobDeletionStatus) Descriptor() ([]byte, []int) { + return file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDescGZIP(), []int{61, 0} +} + +func (x *BulkDeleteJobsResponse_JobDeletionStatus) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +func (x *BulkDeleteJobsResponse_JobDeletionStatus) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + var File_gotocompany_optimus_core_v1beta1_job_spec_proto protoreflect.FileDescriptor var file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDesc = []byte{ @@ -5928,302 +6140,351 @@ var file_gotocompany_optimus_core_v1beta1_job_spec_proto_rawDesc = []byte{ 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, 0xe5, 0x22, 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, 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, + 0x73, 0x65, 0x22, 0xe4, 0x01, 0x0a, 0x15, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4a, 0x6f, 0x62, 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, + 0x57, 0x0a, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x02, 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, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x6f, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x1a, 0x4f, 0x0a, 0x0b, 0x4a, 0x6f, 0x62, 0x54, + 0x6f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 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, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xf2, 0x02, 0x0a, 0x16, 0x42, 0x75, + 0x6c, 0x6b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7d, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, + 0x62, 0x79, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x4e, 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, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, + 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x42, 0x79, 0x4a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x4a, 0x6f, 0x62, 0x4e, + 0x61, 0x6d, 0x65, 0x1a, 0x47, 0x0a, 0x11, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 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, 0x1a, 0x8f, 0x01, 0x0a, + 0x15, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x4a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x60, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4a, 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, + 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 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, 0xa4, 0x24, 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, 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, - 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, 0x22, 0x46, 0x2f, 0x76, 0x31, 0x62, + 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, 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, 0x3a, 0x01, + 0x2a, 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, 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, 0x3a, 0x01, 0x2a, 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, 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, 0x2f, 0x69, 0x6e, 0x73, 0x70, 0x65, - 0x63, 0x74, 0x3a, 0x01, 0x2a, 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, 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, 0x3a, 0x01, 0x2a, 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, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x73, 0x3a, 0x01, 0x2a, 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, 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, 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, 0x3a, 0x01, 0x2a, 0x12, 0xf1, 0x01, 0x0a, 0x17, + 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 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, 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, 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, 0x3a, - 0x01, 0x2a, 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, 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, + 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, + 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, 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, 0x73, + 0x65, 0x72, 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, 0x51, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x4b, 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, 0x73, 0x2d, 0x75, 0x70, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x12, + 0xe5, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, + 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, + 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 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, 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, 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, 0x3a, 0x01, 0x2a, 0x12, - 0xf1, 0x01, 0x0a, 0x17, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 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, 0x55, - 0x70, 0x73, 0x65, 0x72, 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, 0x41, 0x2e, + 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, 0x55, 0x70, 0x73, 0x65, 0x72, 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, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4b, 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, 0x73, 0x2d, 0x75, 0x70, 0x73, 0x65, 0x72, 0x74, - 0x3a, 0x01, 0x2a, 0x12, 0xe5, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x70, - 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x2e, 0x67, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, - 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x67, 0x6f, 0x74, 0x6f, + 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, 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, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x4a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, + 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x4a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 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, 0x3a, 0x01, 0x2a, 0x12, 0xdd, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, + 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x47, 0x65, 0x74, 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, + 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, 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, + 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, - 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, + 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, 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, 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, - 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, 0x3a, 0x01, 0x2a, 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, + 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, 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, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x4a, 0x6f, + 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, 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, + 0x3a, 0x01, 0x2a, 0x12, 0x7e, 0x0a, 0x0b, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x4a, 0x6f, + 0x62, 0x73, 0x12, 0x34, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, + 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x4a, 0x6f, 0x62, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x30, 0x01, 0x12, 0x94, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x4a, 0x6f, 0x62, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3c, 0x2e, 0x67, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, + 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4a, 0x6f, 0x62, 0x73, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x67, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4a, 0x6f, 0x62, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xb0, 0x01, 0x0a, 0x1b, 0x52, + 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x41, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x44, 0x2e, 0x67, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 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, 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, 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, 0x3a, 0x01, 0x2a, 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, + 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, - 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, + 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, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4a, 0x6f, 0x62, 0x73, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xb0, - 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x41, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, - 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x44, - 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, - 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x41, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x53, - 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x45, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, - 0x6e, 0x79, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x41, - 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, - 0x01, 0x12, 0xcf, 0x01, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x54, 0x61, 0x73, 0x6b, - 0x12, 0x33, 0x2e, 0x67, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x2e, 0x6f, + 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, 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, + 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, 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, - 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, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x6a, 0x6f, 0x62, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x3a, 0x01, 0x2a, 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, 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, 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, 0x3a, 0x01, 0x2a, 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, 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, 0x3a, 0x01, 0x2a, - 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, + 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, 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, 0x3a, 0x01, 0x2a, 0x12, 0xbc, 0x01, 0x0a, + 0x0e, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x12, + 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, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 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, 0x42, 0x75, 0x6c, 0x6b, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x2a, 0x2f, 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, + 0x62, 0x75, 0x6c, 0x6b, 0x2d, 0x64, 0x65, 0x6c, 0x65, 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 ( @@ -6239,7 +6500,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, 86) +var file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes = make([]protoimpl.MessageInfo, 91) 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 @@ -6303,166 +6564,176 @@ var file_gotocompany_optimus_core_v1beta1_job_spec_proto_goTypes = []interface{} (*UpdateJobsStateResponse)(nil), // 59: gotocompany.optimus.core.v1beta1.UpdateJobsStateResponse (*SyncJobsStateRequest)(nil), // 60: gotocompany.optimus.core.v1beta1.SyncJobsStateRequest (*SyncJobsStateResponse)(nil), // 61: gotocompany.optimus.core.v1beta1.SyncJobsStateResponse - (*JobInspectResponse_BasicInfoSection)(nil), // 62: gotocompany.optimus.core.v1beta1.JobInspectResponse.BasicInfoSection - (*JobInspectResponse_JobDependency)(nil), // 63: gotocompany.optimus.core.v1beta1.JobInspectResponse.JobDependency - (*JobInspectResponse_UpstreamSection)(nil), // 64: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection - (*JobInspectResponse_DownstreamSection)(nil), // 65: gotocompany.optimus.core.v1beta1.JobInspectResponse.DownstreamSection - (*JobInspectResponse_UpstreamSection_UnknownDependencies)(nil), // 66: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.UnknownDependencies - (*ValidateRequest_FromServer)(nil), // 67: gotocompany.optimus.core.v1beta1.ValidateRequest.FromServer - (*ValidateRequest_FromOutside)(nil), // 68: gotocompany.optimus.core.v1beta1.ValidateRequest.FromOutside - (*ValidateResponse_Result)(nil), // 69: gotocompany.optimus.core.v1beta1.ValidateResponse.Result - (*ValidateResponse_ResultList)(nil), // 70: gotocompany.optimus.core.v1beta1.ValidateResponse.ResultList - nil, // 71: gotocompany.optimus.core.v1beta1.ValidateResponse.ResultsByJobNameEntry - (*JobSpecification_Window)(nil), // 72: gotocompany.optimus.core.v1beta1.JobSpecification.Window - nil, // 73: gotocompany.optimus.core.v1beta1.JobSpecification.AssetsEntry - nil, // 74: gotocompany.optimus.core.v1beta1.JobSpecification.LabelsEntry - (*JobSpecification_Behavior)(nil), // 75: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior - (*JobSpecification_Behavior_Retry)(nil), // 76: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Retry - (*JobSpecification_Behavior_Notifiers)(nil), // 77: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Notifiers - (*JobSpecification_Behavior_Webhook)(nil), // 78: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook - nil, // 79: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Notifiers.ConfigEntry - (*JobSpecification_Behavior_Webhook_WebhookEndpoint)(nil), // 80: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.WebhookEndpoint - nil, // 81: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.WebhookEndpoint.HeadersEntry - nil, // 82: gotocompany.optimus.core.v1beta1.HttpDependency.HeadersEntry - nil, // 83: gotocompany.optimus.core.v1beta1.HttpDependency.ParamsEntry - nil, // 84: gotocompany.optimus.core.v1beta1.GetDeployJobsStatusResponse.UnknownDependenciesEntry - (*JobTask_Destination)(nil), // 85: gotocompany.optimus.core.v1beta1.JobTask.Destination - (*JobTask_Dependency)(nil), // 86: gotocompany.optimus.core.v1beta1.JobTask.Dependency - (*SyncJobsStateRequest_JobStatePair)(nil), // 87: gotocompany.optimus.core.v1beta1.SyncJobsStateRequest.JobStatePair - (*Log)(nil), // 88: gotocompany.optimus.core.v1beta1.Log - (*timestamppb.Timestamp)(nil), // 89: google.protobuf.Timestamp - (*structpb.Struct)(nil), // 90: google.protobuf.Struct - (*durationpb.Duration)(nil), // 91: google.protobuf.Duration + (*BulkDeleteJobsRequest)(nil), // 62: gotocompany.optimus.core.v1beta1.BulkDeleteJobsRequest + (*BulkDeleteJobsResponse)(nil), // 63: gotocompany.optimus.core.v1beta1.BulkDeleteJobsResponse + (*JobInspectResponse_BasicInfoSection)(nil), // 64: gotocompany.optimus.core.v1beta1.JobInspectResponse.BasicInfoSection + (*JobInspectResponse_JobDependency)(nil), // 65: gotocompany.optimus.core.v1beta1.JobInspectResponse.JobDependency + (*JobInspectResponse_UpstreamSection)(nil), // 66: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection + (*JobInspectResponse_DownstreamSection)(nil), // 67: gotocompany.optimus.core.v1beta1.JobInspectResponse.DownstreamSection + (*JobInspectResponse_UpstreamSection_UnknownDependencies)(nil), // 68: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.UnknownDependencies + (*ValidateRequest_FromServer)(nil), // 69: gotocompany.optimus.core.v1beta1.ValidateRequest.FromServer + (*ValidateRequest_FromOutside)(nil), // 70: gotocompany.optimus.core.v1beta1.ValidateRequest.FromOutside + (*ValidateResponse_Result)(nil), // 71: gotocompany.optimus.core.v1beta1.ValidateResponse.Result + (*ValidateResponse_ResultList)(nil), // 72: gotocompany.optimus.core.v1beta1.ValidateResponse.ResultList + nil, // 73: gotocompany.optimus.core.v1beta1.ValidateResponse.ResultsByJobNameEntry + (*JobSpecification_Window)(nil), // 74: gotocompany.optimus.core.v1beta1.JobSpecification.Window + nil, // 75: gotocompany.optimus.core.v1beta1.JobSpecification.AssetsEntry + nil, // 76: gotocompany.optimus.core.v1beta1.JobSpecification.LabelsEntry + (*JobSpecification_Behavior)(nil), // 77: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior + (*JobSpecification_Behavior_Retry)(nil), // 78: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Retry + (*JobSpecification_Behavior_Notifiers)(nil), // 79: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Notifiers + (*JobSpecification_Behavior_Webhook)(nil), // 80: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook + nil, // 81: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Notifiers.ConfigEntry + (*JobSpecification_Behavior_Webhook_WebhookEndpoint)(nil), // 82: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.WebhookEndpoint + nil, // 83: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.WebhookEndpoint.HeadersEntry + nil, // 84: gotocompany.optimus.core.v1beta1.HttpDependency.HeadersEntry + nil, // 85: gotocompany.optimus.core.v1beta1.HttpDependency.ParamsEntry + nil, // 86: gotocompany.optimus.core.v1beta1.GetDeployJobsStatusResponse.UnknownDependenciesEntry + (*JobTask_Destination)(nil), // 87: gotocompany.optimus.core.v1beta1.JobTask.Destination + (*JobTask_Dependency)(nil), // 88: gotocompany.optimus.core.v1beta1.JobTask.Dependency + (*SyncJobsStateRequest_JobStatePair)(nil), // 89: gotocompany.optimus.core.v1beta1.SyncJobsStateRequest.JobStatePair + (*BulkDeleteJobsRequest_JobToDelete)(nil), // 90: gotocompany.optimus.core.v1beta1.BulkDeleteJobsRequest.JobToDelete + (*BulkDeleteJobsResponse_JobDeletionStatus)(nil), // 91: gotocompany.optimus.core.v1beta1.BulkDeleteJobsResponse.JobDeletionStatus + nil, // 92: gotocompany.optimus.core.v1beta1.BulkDeleteJobsResponse.ResultsByJobNameEntry + (*Log)(nil), // 93: gotocompany.optimus.core.v1beta1.Log + (*timestamppb.Timestamp)(nil), // 94: google.protobuf.Timestamp + (*structpb.Struct)(nil), // 95: google.protobuf.Struct + (*durationpb.Duration)(nil), // 96: google.protobuf.Duration } var file_gotocompany_optimus_core_v1beta1_job_spec_proto_depIdxs = []int32{ 29, // 0: gotocompany.optimus.core.v1beta1.DeployJobSpecificationRequest.jobs:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification - 88, // 1: gotocompany.optimus.core.v1beta1.DeployJobSpecificationResponse.log_status:type_name -> gotocompany.optimus.core.v1beta1.Log + 93, // 1: gotocompany.optimus.core.v1beta1.DeployJobSpecificationResponse.log_status:type_name -> gotocompany.optimus.core.v1beta1.Log 29, // 2: gotocompany.optimus.core.v1beta1.AddJobSpecificationsRequest.specs:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification 29, // 3: gotocompany.optimus.core.v1beta1.UpdateJobSpecificationsRequest.specs:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification 29, // 4: gotocompany.optimus.core.v1beta1.UpsertJobSpecificationsRequest.specs:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification 29, // 5: gotocompany.optimus.core.v1beta1.JobInspectRequest.spec:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification - 89, // 6: gotocompany.optimus.core.v1beta1.JobInspectRequest.scheduled_at:type_name -> google.protobuf.Timestamp - 89, // 7: gotocompany.optimus.core.v1beta1.JobRun.scheduled_at:type_name -> google.protobuf.Timestamp - 62, // 8: gotocompany.optimus.core.v1beta1.JobInspectResponse.basic_info:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.BasicInfoSection - 64, // 9: gotocompany.optimus.core.v1beta1.JobInspectResponse.upstreams:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection - 65, // 10: gotocompany.optimus.core.v1beta1.JobInspectResponse.downstreams:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.DownstreamSection + 94, // 6: gotocompany.optimus.core.v1beta1.JobInspectRequest.scheduled_at:type_name -> google.protobuf.Timestamp + 94, // 7: gotocompany.optimus.core.v1beta1.JobRun.scheduled_at:type_name -> google.protobuf.Timestamp + 64, // 8: gotocompany.optimus.core.v1beta1.JobInspectResponse.basic_info:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.BasicInfoSection + 66, // 9: gotocompany.optimus.core.v1beta1.JobInspectResponse.upstreams:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection + 67, // 10: gotocompany.optimus.core.v1beta1.JobInspectResponse.downstreams:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.DownstreamSection 29, // 11: gotocompany.optimus.core.v1beta1.CreateJobSpecificationRequest.spec:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification 29, // 12: gotocompany.optimus.core.v1beta1.GetJobSpecificationResponse.spec:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification 29, // 13: gotocompany.optimus.core.v1beta1.ListJobSpecificationResponse.jobs:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification 29, // 14: gotocompany.optimus.core.v1beta1.CheckJobSpecificationRequest.job:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification 29, // 15: gotocompany.optimus.core.v1beta1.CheckJobSpecificationsRequest.jobs:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification - 88, // 16: gotocompany.optimus.core.v1beta1.CheckJobSpecificationsResponse.log_status:type_name -> gotocompany.optimus.core.v1beta1.Log - 67, // 17: gotocompany.optimus.core.v1beta1.ValidateRequest.from_server:type_name -> gotocompany.optimus.core.v1beta1.ValidateRequest.FromServer - 68, // 18: gotocompany.optimus.core.v1beta1.ValidateRequest.from_outside:type_name -> gotocompany.optimus.core.v1beta1.ValidateRequest.FromOutside - 71, // 19: gotocompany.optimus.core.v1beta1.ValidateResponse.results_by_job_name:type_name -> gotocompany.optimus.core.v1beta1.ValidateResponse.ResultsByJobNameEntry + 93, // 16: gotocompany.optimus.core.v1beta1.CheckJobSpecificationsResponse.log_status:type_name -> gotocompany.optimus.core.v1beta1.Log + 69, // 17: gotocompany.optimus.core.v1beta1.ValidateRequest.from_server:type_name -> gotocompany.optimus.core.v1beta1.ValidateRequest.FromServer + 70, // 18: gotocompany.optimus.core.v1beta1.ValidateRequest.from_outside:type_name -> gotocompany.optimus.core.v1beta1.ValidateRequest.FromOutside + 73, // 19: gotocompany.optimus.core.v1beta1.ValidateResponse.results_by_job_name:type_name -> gotocompany.optimus.core.v1beta1.ValidateResponse.ResultsByJobNameEntry 33, // 20: gotocompany.optimus.core.v1beta1.JobSpecification.config:type_name -> gotocompany.optimus.core.v1beta1.JobConfigItem - 72, // 21: gotocompany.optimus.core.v1beta1.JobSpecification.window:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Window + 74, // 21: gotocompany.optimus.core.v1beta1.JobSpecification.window:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Window 30, // 22: gotocompany.optimus.core.v1beta1.JobSpecification.dependencies:type_name -> gotocompany.optimus.core.v1beta1.JobDependency - 73, // 23: gotocompany.optimus.core.v1beta1.JobSpecification.assets:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.AssetsEntry + 75, // 23: gotocompany.optimus.core.v1beta1.JobSpecification.assets:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.AssetsEntry 32, // 24: gotocompany.optimus.core.v1beta1.JobSpecification.hooks:type_name -> gotocompany.optimus.core.v1beta1.JobSpecHook - 74, // 25: gotocompany.optimus.core.v1beta1.JobSpecification.labels:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.LabelsEntry - 75, // 26: gotocompany.optimus.core.v1beta1.JobSpecification.behavior:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior + 76, // 25: gotocompany.optimus.core.v1beta1.JobSpecification.labels:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.LabelsEntry + 77, // 26: gotocompany.optimus.core.v1beta1.JobSpecification.behavior:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior 35, // 27: gotocompany.optimus.core.v1beta1.JobSpecification.metadata:type_name -> gotocompany.optimus.core.v1beta1.JobMetadata 31, // 28: gotocompany.optimus.core.v1beta1.JobDependency.http_dependency:type_name -> gotocompany.optimus.core.v1beta1.HttpDependency - 82, // 29: gotocompany.optimus.core.v1beta1.HttpDependency.headers:type_name -> gotocompany.optimus.core.v1beta1.HttpDependency.HeadersEntry - 83, // 30: gotocompany.optimus.core.v1beta1.HttpDependency.params:type_name -> gotocompany.optimus.core.v1beta1.HttpDependency.ParamsEntry + 84, // 29: gotocompany.optimus.core.v1beta1.HttpDependency.headers:type_name -> gotocompany.optimus.core.v1beta1.HttpDependency.HeadersEntry + 85, // 30: gotocompany.optimus.core.v1beta1.HttpDependency.params:type_name -> gotocompany.optimus.core.v1beta1.HttpDependency.ParamsEntry 33, // 31: gotocompany.optimus.core.v1beta1.JobSpecHook.config:type_name -> gotocompany.optimus.core.v1beta1.JobConfigItem 1, // 32: gotocompany.optimus.core.v1beta1.JobEvent.type:type_name -> gotocompany.optimus.core.v1beta1.JobEvent.Type - 90, // 33: gotocompany.optimus.core.v1beta1.JobEvent.value:type_name -> google.protobuf.Struct + 95, // 33: gotocompany.optimus.core.v1beta1.JobEvent.value:type_name -> google.protobuf.Struct 36, // 34: gotocompany.optimus.core.v1beta1.JobMetadata.resource:type_name -> gotocompany.optimus.core.v1beta1.JobSpecMetadataResource 38, // 35: gotocompany.optimus.core.v1beta1.JobMetadata.airflow:type_name -> gotocompany.optimus.core.v1beta1.JobSpecMetadataAirflow 37, // 36: gotocompany.optimus.core.v1beta1.JobSpecMetadataResource.request:type_name -> gotocompany.optimus.core.v1beta1.JobSpecMetadataResourceConfig 37, // 37: gotocompany.optimus.core.v1beta1.JobSpecMetadataResource.limit:type_name -> gotocompany.optimus.core.v1beta1.JobSpecMetadataResourceConfig - 88, // 38: gotocompany.optimus.core.v1beta1.RefreshJobsResponse.log_status:type_name -> gotocompany.optimus.core.v1beta1.Log + 93, // 38: gotocompany.optimus.core.v1beta1.RefreshJobsResponse.log_status:type_name -> gotocompany.optimus.core.v1beta1.Log 43, // 39: gotocompany.optimus.core.v1beta1.GetDeployJobsStatusResponse.failures:type_name -> gotocompany.optimus.core.v1beta1.DeployJobFailure - 84, // 40: gotocompany.optimus.core.v1beta1.GetDeployJobsStatusResponse.unknown_dependencies:type_name -> gotocompany.optimus.core.v1beta1.GetDeployJobsStatusResponse.UnknownDependenciesEntry + 86, // 40: gotocompany.optimus.core.v1beta1.GetDeployJobsStatusResponse.unknown_dependencies:type_name -> gotocompany.optimus.core.v1beta1.GetDeployJobsStatusResponse.UnknownDependenciesEntry 45, // 41: gotocompany.optimus.core.v1beta1.JobChangelog.change:type_name -> gotocompany.optimus.core.v1beta1.JobChange 46, // 42: gotocompany.optimus.core.v1beta1.GetJobChangelogResponse.history:type_name -> gotocompany.optimus.core.v1beta1.JobChangelog 29, // 43: gotocompany.optimus.core.v1beta1.GetJobSpecificationsResponse.jobs:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification 50, // 44: gotocompany.optimus.core.v1beta1.GetJobSpecificationsResponse.job_specification_responses:type_name -> gotocompany.optimus.core.v1beta1.JobSpecificationResponse 29, // 45: gotocompany.optimus.core.v1beta1.JobSpecificationResponse.job:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification 29, // 46: gotocompany.optimus.core.v1beta1.ReplaceAllJobSpecificationsRequest.jobs:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification - 88, // 47: gotocompany.optimus.core.v1beta1.ReplaceAllJobSpecificationsResponse.log_status:type_name -> gotocompany.optimus.core.v1beta1.Log + 93, // 47: gotocompany.optimus.core.v1beta1.ReplaceAllJobSpecificationsResponse.log_status:type_name -> gotocompany.optimus.core.v1beta1.Log 55, // 48: gotocompany.optimus.core.v1beta1.GetJobTaskResponse.task:type_name -> gotocompany.optimus.core.v1beta1.JobTask - 85, // 49: gotocompany.optimus.core.v1beta1.JobTask.destination:type_name -> gotocompany.optimus.core.v1beta1.JobTask.Destination - 86, // 50: gotocompany.optimus.core.v1beta1.JobTask.dependencies:type_name -> gotocompany.optimus.core.v1beta1.JobTask.Dependency - 89, // 51: gotocompany.optimus.core.v1beta1.GetWindowRequest.scheduled_at:type_name -> google.protobuf.Timestamp - 89, // 52: gotocompany.optimus.core.v1beta1.GetWindowResponse.start:type_name -> google.protobuf.Timestamp - 89, // 53: gotocompany.optimus.core.v1beta1.GetWindowResponse.end:type_name -> google.protobuf.Timestamp + 87, // 49: gotocompany.optimus.core.v1beta1.JobTask.destination:type_name -> gotocompany.optimus.core.v1beta1.JobTask.Destination + 88, // 50: gotocompany.optimus.core.v1beta1.JobTask.dependencies:type_name -> gotocompany.optimus.core.v1beta1.JobTask.Dependency + 94, // 51: gotocompany.optimus.core.v1beta1.GetWindowRequest.scheduled_at:type_name -> google.protobuf.Timestamp + 94, // 52: gotocompany.optimus.core.v1beta1.GetWindowResponse.start:type_name -> google.protobuf.Timestamp + 94, // 53: gotocompany.optimus.core.v1beta1.GetWindowResponse.end:type_name -> google.protobuf.Timestamp 0, // 54: gotocompany.optimus.core.v1beta1.UpdateJobsStateRequest.state:type_name -> gotocompany.optimus.core.v1beta1.JobState - 87, // 55: gotocompany.optimus.core.v1beta1.SyncJobsStateRequest.job_states:type_name -> gotocompany.optimus.core.v1beta1.SyncJobsStateRequest.JobStatePair - 29, // 56: gotocompany.optimus.core.v1beta1.JobInspectResponse.BasicInfoSection.job:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification - 88, // 57: gotocompany.optimus.core.v1beta1.JobInspectResponse.BasicInfoSection.notice:type_name -> gotocompany.optimus.core.v1beta1.Log - 11, // 58: gotocompany.optimus.core.v1beta1.JobInspectResponse.JobDependency.runs:type_name -> gotocompany.optimus.core.v1beta1.JobRun - 63, // 59: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.external_dependency:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.JobDependency - 63, // 60: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.internal_dependency:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.JobDependency - 31, // 61: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.http_dependency:type_name -> gotocompany.optimus.core.v1beta1.HttpDependency - 66, // 62: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.unknown_dependencies:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.UnknownDependencies - 88, // 63: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.notice:type_name -> gotocompany.optimus.core.v1beta1.Log - 63, // 64: gotocompany.optimus.core.v1beta1.JobInspectResponse.DownstreamSection.downstream_jobs:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.JobDependency - 88, // 65: gotocompany.optimus.core.v1beta1.JobInspectResponse.DownstreamSection.notice:type_name -> gotocompany.optimus.core.v1beta1.Log - 29, // 66: gotocompany.optimus.core.v1beta1.ValidateRequest.FromOutside.jobs:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification - 69, // 67: gotocompany.optimus.core.v1beta1.ValidateResponse.ResultList.results:type_name -> gotocompany.optimus.core.v1beta1.ValidateResponse.Result - 70, // 68: gotocompany.optimus.core.v1beta1.ValidateResponse.ResultsByJobNameEntry.value:type_name -> gotocompany.optimus.core.v1beta1.ValidateResponse.ResultList - 76, // 69: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.retry:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Retry - 77, // 70: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.notify:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Notifiers - 78, // 71: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.webhook:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook - 91, // 72: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Retry.delay:type_name -> google.protobuf.Duration - 1, // 73: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Notifiers.on:type_name -> gotocompany.optimus.core.v1beta1.JobEvent.Type - 79, // 74: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Notifiers.config:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Notifiers.ConfigEntry - 1, // 75: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.on:type_name -> gotocompany.optimus.core.v1beta1.JobEvent.Type - 80, // 76: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.endpoints:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.WebhookEndpoint - 81, // 77: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.WebhookEndpoint.headers:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.WebhookEndpoint.HeadersEntry - 0, // 78: gotocompany.optimus.core.v1beta1.SyncJobsStateRequest.JobStatePair.state:type_name -> gotocompany.optimus.core.v1beta1.JobState - 2, // 79: gotocompany.optimus.core.v1beta1.JobSpecificationService.DeployJobSpecification:input_type -> gotocompany.optimus.core.v1beta1.DeployJobSpecificationRequest - 10, // 80: gotocompany.optimus.core.v1beta1.JobSpecificationService.JobInspect:input_type -> gotocompany.optimus.core.v1beta1.JobInspectRequest - 13, // 81: gotocompany.optimus.core.v1beta1.JobSpecificationService.CreateJobSpecification:input_type -> gotocompany.optimus.core.v1beta1.CreateJobSpecificationRequest - 4, // 82: gotocompany.optimus.core.v1beta1.JobSpecificationService.AddJobSpecifications:input_type -> gotocompany.optimus.core.v1beta1.AddJobSpecificationsRequest - 6, // 83: gotocompany.optimus.core.v1beta1.JobSpecificationService.UpdateJobSpecifications:input_type -> gotocompany.optimus.core.v1beta1.UpdateJobSpecificationsRequest - 8, // 84: gotocompany.optimus.core.v1beta1.JobSpecificationService.UpsertJobSpecifications:input_type -> gotocompany.optimus.core.v1beta1.UpsertJobSpecificationsRequest - 15, // 85: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobSpecification:input_type -> gotocompany.optimus.core.v1beta1.GetJobSpecificationRequest - 48, // 86: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobSpecifications:input_type -> gotocompany.optimus.core.v1beta1.GetJobSpecificationsRequest - 44, // 87: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobChangelog:input_type -> gotocompany.optimus.core.v1beta1.GetJobChangelogRequest - 17, // 88: gotocompany.optimus.core.v1beta1.JobSpecificationService.DeleteJobSpecification:input_type -> gotocompany.optimus.core.v1beta1.DeleteJobSpecificationRequest - 19, // 89: gotocompany.optimus.core.v1beta1.JobSpecificationService.ChangeJobNamespace:input_type -> gotocompany.optimus.core.v1beta1.ChangeJobNamespaceRequest - 21, // 90: gotocompany.optimus.core.v1beta1.JobSpecificationService.ListJobSpecification:input_type -> gotocompany.optimus.core.v1beta1.ListJobSpecificationRequest - 23, // 91: gotocompany.optimus.core.v1beta1.JobSpecificationService.CheckJobSpecification:input_type -> gotocompany.optimus.core.v1beta1.CheckJobSpecificationRequest - 25, // 92: gotocompany.optimus.core.v1beta1.JobSpecificationService.CheckJobSpecifications:input_type -> gotocompany.optimus.core.v1beta1.CheckJobSpecificationsRequest - 27, // 93: gotocompany.optimus.core.v1beta1.JobSpecificationService.Validate:input_type -> gotocompany.optimus.core.v1beta1.ValidateRequest - 39, // 94: gotocompany.optimus.core.v1beta1.JobSpecificationService.RefreshJobs:input_type -> gotocompany.optimus.core.v1beta1.RefreshJobsRequest - 41, // 95: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetDeployJobsStatus:input_type -> gotocompany.optimus.core.v1beta1.GetDeployJobsStatusRequest - 51, // 96: gotocompany.optimus.core.v1beta1.JobSpecificationService.ReplaceAllJobSpecifications:input_type -> gotocompany.optimus.core.v1beta1.ReplaceAllJobSpecificationsRequest - 53, // 97: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobTask:input_type -> gotocompany.optimus.core.v1beta1.GetJobTaskRequest - 56, // 98: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetWindow:input_type -> gotocompany.optimus.core.v1beta1.GetWindowRequest - 58, // 99: gotocompany.optimus.core.v1beta1.JobSpecificationService.UpdateJobsState:input_type -> gotocompany.optimus.core.v1beta1.UpdateJobsStateRequest - 60, // 100: gotocompany.optimus.core.v1beta1.JobSpecificationService.SyncJobsState:input_type -> gotocompany.optimus.core.v1beta1.SyncJobsStateRequest - 3, // 101: gotocompany.optimus.core.v1beta1.JobSpecificationService.DeployJobSpecification:output_type -> gotocompany.optimus.core.v1beta1.DeployJobSpecificationResponse - 12, // 102: gotocompany.optimus.core.v1beta1.JobSpecificationService.JobInspect:output_type -> gotocompany.optimus.core.v1beta1.JobInspectResponse - 14, // 103: gotocompany.optimus.core.v1beta1.JobSpecificationService.CreateJobSpecification:output_type -> gotocompany.optimus.core.v1beta1.CreateJobSpecificationResponse - 5, // 104: gotocompany.optimus.core.v1beta1.JobSpecificationService.AddJobSpecifications:output_type -> gotocompany.optimus.core.v1beta1.AddJobSpecificationsResponse - 7, // 105: gotocompany.optimus.core.v1beta1.JobSpecificationService.UpdateJobSpecifications:output_type -> gotocompany.optimus.core.v1beta1.UpdateJobSpecificationsResponse - 9, // 106: gotocompany.optimus.core.v1beta1.JobSpecificationService.UpsertJobSpecifications:output_type -> gotocompany.optimus.core.v1beta1.UpsertJobSpecificationsResponse - 16, // 107: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobSpecification:output_type -> gotocompany.optimus.core.v1beta1.GetJobSpecificationResponse - 49, // 108: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobSpecifications:output_type -> gotocompany.optimus.core.v1beta1.GetJobSpecificationsResponse - 47, // 109: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobChangelog:output_type -> gotocompany.optimus.core.v1beta1.GetJobChangelogResponse - 18, // 110: gotocompany.optimus.core.v1beta1.JobSpecificationService.DeleteJobSpecification:output_type -> gotocompany.optimus.core.v1beta1.DeleteJobSpecificationResponse - 20, // 111: gotocompany.optimus.core.v1beta1.JobSpecificationService.ChangeJobNamespace:output_type -> gotocompany.optimus.core.v1beta1.ChangeJobNamespaceResponse - 22, // 112: gotocompany.optimus.core.v1beta1.JobSpecificationService.ListJobSpecification:output_type -> gotocompany.optimus.core.v1beta1.ListJobSpecificationResponse - 24, // 113: gotocompany.optimus.core.v1beta1.JobSpecificationService.CheckJobSpecification:output_type -> gotocompany.optimus.core.v1beta1.CheckJobSpecificationResponse - 26, // 114: gotocompany.optimus.core.v1beta1.JobSpecificationService.CheckJobSpecifications:output_type -> gotocompany.optimus.core.v1beta1.CheckJobSpecificationsResponse - 28, // 115: gotocompany.optimus.core.v1beta1.JobSpecificationService.Validate:output_type -> gotocompany.optimus.core.v1beta1.ValidateResponse - 40, // 116: gotocompany.optimus.core.v1beta1.JobSpecificationService.RefreshJobs:output_type -> gotocompany.optimus.core.v1beta1.RefreshJobsResponse - 42, // 117: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetDeployJobsStatus:output_type -> gotocompany.optimus.core.v1beta1.GetDeployJobsStatusResponse - 52, // 118: gotocompany.optimus.core.v1beta1.JobSpecificationService.ReplaceAllJobSpecifications:output_type -> gotocompany.optimus.core.v1beta1.ReplaceAllJobSpecificationsResponse - 54, // 119: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobTask:output_type -> gotocompany.optimus.core.v1beta1.GetJobTaskResponse - 57, // 120: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetWindow:output_type -> gotocompany.optimus.core.v1beta1.GetWindowResponse - 59, // 121: gotocompany.optimus.core.v1beta1.JobSpecificationService.UpdateJobsState:output_type -> gotocompany.optimus.core.v1beta1.UpdateJobsStateResponse - 61, // 122: gotocompany.optimus.core.v1beta1.JobSpecificationService.SyncJobsState:output_type -> gotocompany.optimus.core.v1beta1.SyncJobsStateResponse - 101, // [101:123] is the sub-list for method output_type - 79, // [79:101] is the sub-list for method input_type - 79, // [79:79] is the sub-list for extension type_name - 79, // [79:79] is the sub-list for extension extendee - 0, // [0:79] is the sub-list for field type_name + 89, // 55: gotocompany.optimus.core.v1beta1.SyncJobsStateRequest.job_states:type_name -> gotocompany.optimus.core.v1beta1.SyncJobsStateRequest.JobStatePair + 90, // 56: gotocompany.optimus.core.v1beta1.BulkDeleteJobsRequest.jobs:type_name -> gotocompany.optimus.core.v1beta1.BulkDeleteJobsRequest.JobToDelete + 92, // 57: gotocompany.optimus.core.v1beta1.BulkDeleteJobsResponse.results_by_job_name:type_name -> gotocompany.optimus.core.v1beta1.BulkDeleteJobsResponse.ResultsByJobNameEntry + 29, // 58: gotocompany.optimus.core.v1beta1.JobInspectResponse.BasicInfoSection.job:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification + 93, // 59: gotocompany.optimus.core.v1beta1.JobInspectResponse.BasicInfoSection.notice:type_name -> gotocompany.optimus.core.v1beta1.Log + 11, // 60: gotocompany.optimus.core.v1beta1.JobInspectResponse.JobDependency.runs:type_name -> gotocompany.optimus.core.v1beta1.JobRun + 65, // 61: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.external_dependency:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.JobDependency + 65, // 62: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.internal_dependency:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.JobDependency + 31, // 63: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.http_dependency:type_name -> gotocompany.optimus.core.v1beta1.HttpDependency + 68, // 64: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.unknown_dependencies:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.UnknownDependencies + 93, // 65: gotocompany.optimus.core.v1beta1.JobInspectResponse.UpstreamSection.notice:type_name -> gotocompany.optimus.core.v1beta1.Log + 65, // 66: gotocompany.optimus.core.v1beta1.JobInspectResponse.DownstreamSection.downstream_jobs:type_name -> gotocompany.optimus.core.v1beta1.JobInspectResponse.JobDependency + 93, // 67: gotocompany.optimus.core.v1beta1.JobInspectResponse.DownstreamSection.notice:type_name -> gotocompany.optimus.core.v1beta1.Log + 29, // 68: gotocompany.optimus.core.v1beta1.ValidateRequest.FromOutside.jobs:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification + 71, // 69: gotocompany.optimus.core.v1beta1.ValidateResponse.ResultList.results:type_name -> gotocompany.optimus.core.v1beta1.ValidateResponse.Result + 72, // 70: gotocompany.optimus.core.v1beta1.ValidateResponse.ResultsByJobNameEntry.value:type_name -> gotocompany.optimus.core.v1beta1.ValidateResponse.ResultList + 78, // 71: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.retry:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Retry + 79, // 72: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.notify:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Notifiers + 80, // 73: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.webhook:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook + 96, // 74: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Retry.delay:type_name -> google.protobuf.Duration + 1, // 75: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Notifiers.on:type_name -> gotocompany.optimus.core.v1beta1.JobEvent.Type + 81, // 76: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Notifiers.config:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Notifiers.ConfigEntry + 1, // 77: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.on:type_name -> gotocompany.optimus.core.v1beta1.JobEvent.Type + 82, // 78: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.endpoints:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.WebhookEndpoint + 83, // 79: gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.WebhookEndpoint.headers:type_name -> gotocompany.optimus.core.v1beta1.JobSpecification.Behavior.Webhook.WebhookEndpoint.HeadersEntry + 0, // 80: gotocompany.optimus.core.v1beta1.SyncJobsStateRequest.JobStatePair.state:type_name -> gotocompany.optimus.core.v1beta1.JobState + 91, // 81: gotocompany.optimus.core.v1beta1.BulkDeleteJobsResponse.ResultsByJobNameEntry.value:type_name -> gotocompany.optimus.core.v1beta1.BulkDeleteJobsResponse.JobDeletionStatus + 2, // 82: gotocompany.optimus.core.v1beta1.JobSpecificationService.DeployJobSpecification:input_type -> gotocompany.optimus.core.v1beta1.DeployJobSpecificationRequest + 10, // 83: gotocompany.optimus.core.v1beta1.JobSpecificationService.JobInspect:input_type -> gotocompany.optimus.core.v1beta1.JobInspectRequest + 13, // 84: gotocompany.optimus.core.v1beta1.JobSpecificationService.CreateJobSpecification:input_type -> gotocompany.optimus.core.v1beta1.CreateJobSpecificationRequest + 4, // 85: gotocompany.optimus.core.v1beta1.JobSpecificationService.AddJobSpecifications:input_type -> gotocompany.optimus.core.v1beta1.AddJobSpecificationsRequest + 6, // 86: gotocompany.optimus.core.v1beta1.JobSpecificationService.UpdateJobSpecifications:input_type -> gotocompany.optimus.core.v1beta1.UpdateJobSpecificationsRequest + 8, // 87: gotocompany.optimus.core.v1beta1.JobSpecificationService.UpsertJobSpecifications:input_type -> gotocompany.optimus.core.v1beta1.UpsertJobSpecificationsRequest + 15, // 88: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobSpecification:input_type -> gotocompany.optimus.core.v1beta1.GetJobSpecificationRequest + 48, // 89: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobSpecifications:input_type -> gotocompany.optimus.core.v1beta1.GetJobSpecificationsRequest + 44, // 90: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobChangelog:input_type -> gotocompany.optimus.core.v1beta1.GetJobChangelogRequest + 17, // 91: gotocompany.optimus.core.v1beta1.JobSpecificationService.DeleteJobSpecification:input_type -> gotocompany.optimus.core.v1beta1.DeleteJobSpecificationRequest + 19, // 92: gotocompany.optimus.core.v1beta1.JobSpecificationService.ChangeJobNamespace:input_type -> gotocompany.optimus.core.v1beta1.ChangeJobNamespaceRequest + 21, // 93: gotocompany.optimus.core.v1beta1.JobSpecificationService.ListJobSpecification:input_type -> gotocompany.optimus.core.v1beta1.ListJobSpecificationRequest + 23, // 94: gotocompany.optimus.core.v1beta1.JobSpecificationService.CheckJobSpecification:input_type -> gotocompany.optimus.core.v1beta1.CheckJobSpecificationRequest + 25, // 95: gotocompany.optimus.core.v1beta1.JobSpecificationService.CheckJobSpecifications:input_type -> gotocompany.optimus.core.v1beta1.CheckJobSpecificationsRequest + 27, // 96: gotocompany.optimus.core.v1beta1.JobSpecificationService.Validate:input_type -> gotocompany.optimus.core.v1beta1.ValidateRequest + 39, // 97: gotocompany.optimus.core.v1beta1.JobSpecificationService.RefreshJobs:input_type -> gotocompany.optimus.core.v1beta1.RefreshJobsRequest + 41, // 98: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetDeployJobsStatus:input_type -> gotocompany.optimus.core.v1beta1.GetDeployJobsStatusRequest + 51, // 99: gotocompany.optimus.core.v1beta1.JobSpecificationService.ReplaceAllJobSpecifications:input_type -> gotocompany.optimus.core.v1beta1.ReplaceAllJobSpecificationsRequest + 53, // 100: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobTask:input_type -> gotocompany.optimus.core.v1beta1.GetJobTaskRequest + 56, // 101: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetWindow:input_type -> gotocompany.optimus.core.v1beta1.GetWindowRequest + 58, // 102: gotocompany.optimus.core.v1beta1.JobSpecificationService.UpdateJobsState:input_type -> gotocompany.optimus.core.v1beta1.UpdateJobsStateRequest + 60, // 103: gotocompany.optimus.core.v1beta1.JobSpecificationService.SyncJobsState:input_type -> gotocompany.optimus.core.v1beta1.SyncJobsStateRequest + 62, // 104: gotocompany.optimus.core.v1beta1.JobSpecificationService.BulkDeleteJobs:input_type -> gotocompany.optimus.core.v1beta1.BulkDeleteJobsRequest + 3, // 105: gotocompany.optimus.core.v1beta1.JobSpecificationService.DeployJobSpecification:output_type -> gotocompany.optimus.core.v1beta1.DeployJobSpecificationResponse + 12, // 106: gotocompany.optimus.core.v1beta1.JobSpecificationService.JobInspect:output_type -> gotocompany.optimus.core.v1beta1.JobInspectResponse + 14, // 107: gotocompany.optimus.core.v1beta1.JobSpecificationService.CreateJobSpecification:output_type -> gotocompany.optimus.core.v1beta1.CreateJobSpecificationResponse + 5, // 108: gotocompany.optimus.core.v1beta1.JobSpecificationService.AddJobSpecifications:output_type -> gotocompany.optimus.core.v1beta1.AddJobSpecificationsResponse + 7, // 109: gotocompany.optimus.core.v1beta1.JobSpecificationService.UpdateJobSpecifications:output_type -> gotocompany.optimus.core.v1beta1.UpdateJobSpecificationsResponse + 9, // 110: gotocompany.optimus.core.v1beta1.JobSpecificationService.UpsertJobSpecifications:output_type -> gotocompany.optimus.core.v1beta1.UpsertJobSpecificationsResponse + 16, // 111: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobSpecification:output_type -> gotocompany.optimus.core.v1beta1.GetJobSpecificationResponse + 49, // 112: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobSpecifications:output_type -> gotocompany.optimus.core.v1beta1.GetJobSpecificationsResponse + 47, // 113: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobChangelog:output_type -> gotocompany.optimus.core.v1beta1.GetJobChangelogResponse + 18, // 114: gotocompany.optimus.core.v1beta1.JobSpecificationService.DeleteJobSpecification:output_type -> gotocompany.optimus.core.v1beta1.DeleteJobSpecificationResponse + 20, // 115: gotocompany.optimus.core.v1beta1.JobSpecificationService.ChangeJobNamespace:output_type -> gotocompany.optimus.core.v1beta1.ChangeJobNamespaceResponse + 22, // 116: gotocompany.optimus.core.v1beta1.JobSpecificationService.ListJobSpecification:output_type -> gotocompany.optimus.core.v1beta1.ListJobSpecificationResponse + 24, // 117: gotocompany.optimus.core.v1beta1.JobSpecificationService.CheckJobSpecification:output_type -> gotocompany.optimus.core.v1beta1.CheckJobSpecificationResponse + 26, // 118: gotocompany.optimus.core.v1beta1.JobSpecificationService.CheckJobSpecifications:output_type -> gotocompany.optimus.core.v1beta1.CheckJobSpecificationsResponse + 28, // 119: gotocompany.optimus.core.v1beta1.JobSpecificationService.Validate:output_type -> gotocompany.optimus.core.v1beta1.ValidateResponse + 40, // 120: gotocompany.optimus.core.v1beta1.JobSpecificationService.RefreshJobs:output_type -> gotocompany.optimus.core.v1beta1.RefreshJobsResponse + 42, // 121: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetDeployJobsStatus:output_type -> gotocompany.optimus.core.v1beta1.GetDeployJobsStatusResponse + 52, // 122: gotocompany.optimus.core.v1beta1.JobSpecificationService.ReplaceAllJobSpecifications:output_type -> gotocompany.optimus.core.v1beta1.ReplaceAllJobSpecificationsResponse + 54, // 123: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetJobTask:output_type -> gotocompany.optimus.core.v1beta1.GetJobTaskResponse + 57, // 124: gotocompany.optimus.core.v1beta1.JobSpecificationService.GetWindow:output_type -> gotocompany.optimus.core.v1beta1.GetWindowResponse + 59, // 125: gotocompany.optimus.core.v1beta1.JobSpecificationService.UpdateJobsState:output_type -> gotocompany.optimus.core.v1beta1.UpdateJobsStateResponse + 61, // 126: gotocompany.optimus.core.v1beta1.JobSpecificationService.SyncJobsState:output_type -> gotocompany.optimus.core.v1beta1.SyncJobsStateResponse + 63, // 127: gotocompany.optimus.core.v1beta1.JobSpecificationService.BulkDeleteJobs:output_type -> gotocompany.optimus.core.v1beta1.BulkDeleteJobsResponse + 105, // [105:128] is the sub-list for method output_type + 82, // [82:105] is the sub-list for method input_type + 82, // [82:82] is the sub-list for extension type_name + 82, // [82:82] is the sub-list for extension extendee + 0, // [0:82] is the sub-list for field type_name } func init() { file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() } @@ -7193,7 +7464,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobInspectResponse_BasicInfoSection); i { + switch v := v.(*BulkDeleteJobsRequest); i { case 0: return &v.state case 1: @@ -7205,7 +7476,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobInspectResponse_JobDependency); i { + switch v := v.(*BulkDeleteJobsResponse); i { case 0: return &v.state case 1: @@ -7217,7 +7488,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobInspectResponse_UpstreamSection); i { + switch v := v.(*JobInspectResponse_BasicInfoSection); i { case 0: return &v.state case 1: @@ -7229,7 +7500,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobInspectResponse_DownstreamSection); i { + switch v := v.(*JobInspectResponse_JobDependency); i { case 0: return &v.state case 1: @@ -7241,7 +7512,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobInspectResponse_UpstreamSection_UnknownDependencies); i { + switch v := v.(*JobInspectResponse_UpstreamSection); i { case 0: return &v.state case 1: @@ -7253,7 +7524,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateRequest_FromServer); i { + switch v := v.(*JobInspectResponse_DownstreamSection); i { case 0: return &v.state case 1: @@ -7265,7 +7536,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateRequest_FromOutside); i { + switch v := v.(*JobInspectResponse_UpstreamSection_UnknownDependencies); i { case 0: return &v.state case 1: @@ -7277,7 +7548,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateResponse_Result); i { + switch v := v.(*ValidateRequest_FromServer); i { case 0: return &v.state case 1: @@ -7289,7 +7560,19 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateResponse_ResultList); i { + switch v := v.(*ValidateRequest_FromOutside); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidateResponse_Result); i { case 0: return &v.state case 1: @@ -7301,6 +7584,18 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { } } file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidateResponse_ResultList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobSpecification_Window); i { case 0: return &v.state @@ -7312,7 +7607,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[75].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobSpecification_Behavior); i { case 0: return &v.state @@ -7324,7 +7619,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[76].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobSpecification_Behavior_Retry); i { case 0: return &v.state @@ -7336,7 +7631,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[75].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.(*JobSpecification_Behavior_Notifiers); i { case 0: return &v.state @@ -7348,7 +7643,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[78].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobSpecification_Behavior_Webhook); i { case 0: return &v.state @@ -7360,7 +7655,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobSpecification_Behavior_Webhook_WebhookEndpoint); i { case 0: return &v.state @@ -7372,7 +7667,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[85].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobTask_Destination); i { case 0: return &v.state @@ -7384,7 +7679,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobTask_Dependency); i { case 0: return &v.state @@ -7396,7 +7691,7 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } - file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SyncJobsStateRequest_JobStatePair); i { case 0: return &v.state @@ -7408,6 +7703,30 @@ func file_gotocompany_optimus_core_v1beta1_job_spec_proto_init() { return nil } } + file_gotocompany_optimus_core_v1beta1_job_spec_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BulkDeleteJobsRequest_JobToDelete); 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[89].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BulkDeleteJobsResponse_JobDeletionStatus); 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[25].OneofWrappers = []interface{}{ (*ValidateRequest_FromServer_)(nil), @@ -7419,7 +7738,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: 86, + NumMessages: 91, 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 c8d371a908..84d5dc7e68 100644 --- a/protos/gotocompany/optimus/core/v1beta1/job_spec.pb.gw.go +++ b/protos/gotocompany/optimus/core/v1beta1/job_spec.pb.gw.go @@ -1401,6 +1401,76 @@ func local_request_JobSpecificationService_SyncJobsState_0(ctx context.Context, } +var ( + filter_JobSpecificationService_BulkDeleteJobs_0 = &utilities.DoubleArray{Encoding: map[string]int{"project_name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +) + +func request_JobSpecificationService_BulkDeleteJobs_0(ctx context.Context, marshaler runtime.Marshaler, client JobSpecificationServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq BulkDeleteJobsRequest + 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) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_JobSpecificationService_BulkDeleteJobs_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.BulkDeleteJobs(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_JobSpecificationService_BulkDeleteJobs_0(ctx context.Context, marshaler runtime.Marshaler, server JobSpecificationServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq BulkDeleteJobsRequest + 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) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_JobSpecificationService_BulkDeleteJobs_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.BulkDeleteJobs(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterJobSpecificationServiceHandlerServer registers the http handlers for service JobSpecificationService to "mux". // UnaryRPC :call JobSpecificationServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -1798,6 +1868,29 @@ func RegisterJobSpecificationServiceHandlerServer(ctx context.Context, mux *runt }) + mux.Handle("DELETE", pattern_JobSpecificationService_BulkDeleteJobs_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/BulkDeleteJobs", runtime.WithHTTPPathPattern("/v1beta1/project/{project_name}/job/bulk-delete")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_JobSpecificationService_BulkDeleteJobs_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_BulkDeleteJobs_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -2179,6 +2272,26 @@ func RegisterJobSpecificationServiceHandlerClient(ctx context.Context, mux *runt }) + mux.Handle("DELETE", pattern_JobSpecificationService_BulkDeleteJobs_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/BulkDeleteJobs", runtime.WithHTTPPathPattern("/v1beta1/project/{project_name}/job/bulk-delete")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_JobSpecificationService_BulkDeleteJobs_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_BulkDeleteJobs_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -2216,6 +2329,8 @@ var ( pattern_JobSpecificationService_UpdateJobsState_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", "namespace", "namespace_name", "update-job-state"}, "")) pattern_JobSpecificationService_SyncJobsState_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", "namespace", "namespace_name", "sync-job-state"}, "")) + + pattern_JobSpecificationService_BulkDeleteJobs_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 2, 4}, []string{"v1beta1", "project", "project_name", "job", "bulk-delete"}, "")) ) var ( @@ -2252,4 +2367,6 @@ var ( forward_JobSpecificationService_UpdateJobsState_0 = runtime.ForwardResponseMessage forward_JobSpecificationService_SyncJobsState_0 = runtime.ForwardResponseMessage + + forward_JobSpecificationService_BulkDeleteJobs_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 8b5f156122..ed3f1aa510 100644 --- a/protos/gotocompany/optimus/core/v1beta1/job_spec.swagger.json +++ b/protos/gotocompany/optimus/core/v1beta1/job_spec.swagger.json @@ -126,6 +126,37 @@ ] } }, + "/v1beta1/project/{projectName}/job/bulk-delete": { + "delete": { + "summary": "BulkDeleteJobs deletes one or more jobs in bulk operation,\nwhile following postorder deletion, starting from jobs with no dependencies", + "operationId": "JobSpecificationService_BulkDeleteJobs", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1beta1BulkDeleteJobsResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "projectName", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "JobSpecificationService" + ] + } + }, "/v1beta1/project/{projectName}/job/check": { "post": { "summary": "CheckJobSpecification checks if a job specification is valid", @@ -913,6 +944,28 @@ } } }, + "BulkDeleteJobsRequestJobToDelete": { + "type": "object", + "properties": { + "namespaceName": { + "type": "string" + }, + "jobName": { + "type": "string" + } + } + }, + "BulkDeleteJobsResponseJobDeletionStatus": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "message": { + "type": "string" + } + } + }, "JobInspectResponseBasicInfoSection": { "type": "object", "properties": { @@ -1200,6 +1253,17 @@ } } }, + "v1beta1BulkDeleteJobsResponse": { + "type": "object", + "properties": { + "resultsByJobName": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/BulkDeleteJobsResponseJobDeletionStatus" + } + } + } + }, "v1beta1ChangeJobNamespaceResponse": { "type": "object" }, 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 bb5d3494ab..e155b4593a 100644 --- a/protos/gotocompany/optimus/core/v1beta1/job_spec_grpc.pb.go +++ b/protos/gotocompany/optimus/core/v1beta1/job_spec_grpc.pb.go @@ -76,6 +76,9 @@ type JobSpecificationServiceClient interface { UpdateJobsState(ctx context.Context, in *UpdateJobsStateRequest, opts ...grpc.CallOption) (*UpdateJobsStateResponse, error) // SyncJobsState enable / disable job on scheuler SyncJobsState(ctx context.Context, in *SyncJobsStateRequest, opts ...grpc.CallOption) (*SyncJobsStateResponse, error) + // BulkDeleteJobs deletes one or more jobs in bulk operation, + // while following postorder deletion, starting from jobs with no dependencies + BulkDeleteJobs(ctx context.Context, in *BulkDeleteJobsRequest, opts ...grpc.CallOption) (*BulkDeleteJobsResponse, error) } type jobSpecificationServiceClient struct { @@ -377,6 +380,15 @@ func (c *jobSpecificationServiceClient) SyncJobsState(ctx context.Context, in *S return out, nil } +func (c *jobSpecificationServiceClient) BulkDeleteJobs(ctx context.Context, in *BulkDeleteJobsRequest, opts ...grpc.CallOption) (*BulkDeleteJobsResponse, error) { + out := new(BulkDeleteJobsResponse) + err := c.cc.Invoke(ctx, "/gotocompany.optimus.core.v1beta1.JobSpecificationService/BulkDeleteJobs", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // JobSpecificationServiceServer is the server API for JobSpecificationService service. // All implementations must embed UnimplementedJobSpecificationServiceServer // for forward compatibility @@ -435,6 +447,9 @@ type JobSpecificationServiceServer interface { UpdateJobsState(context.Context, *UpdateJobsStateRequest) (*UpdateJobsStateResponse, error) // SyncJobsState enable / disable job on scheuler SyncJobsState(context.Context, *SyncJobsStateRequest) (*SyncJobsStateResponse, error) + // BulkDeleteJobs deletes one or more jobs in bulk operation, + // while following postorder deletion, starting from jobs with no dependencies + BulkDeleteJobs(context.Context, *BulkDeleteJobsRequest) (*BulkDeleteJobsResponse, error) mustEmbedUnimplementedJobSpecificationServiceServer() } @@ -508,6 +523,9 @@ func (UnimplementedJobSpecificationServiceServer) UpdateJobsState(context.Contex func (UnimplementedJobSpecificationServiceServer) SyncJobsState(context.Context, *SyncJobsStateRequest) (*SyncJobsStateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method SyncJobsState not implemented") } +func (UnimplementedJobSpecificationServiceServer) BulkDeleteJobs(context.Context, *BulkDeleteJobsRequest) (*BulkDeleteJobsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method BulkDeleteJobs not implemented") +} func (UnimplementedJobSpecificationServiceServer) mustEmbedUnimplementedJobSpecificationServiceServer() { } @@ -940,6 +958,24 @@ func _JobSpecificationService_SyncJobsState_Handler(srv interface{}, ctx context return interceptor(ctx, in, info, handler) } +func _JobSpecificationService_BulkDeleteJobs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(BulkDeleteJobsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(JobSpecificationServiceServer).BulkDeleteJobs(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/gotocompany.optimus.core.v1beta1.JobSpecificationService/BulkDeleteJobs", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(JobSpecificationServiceServer).BulkDeleteJobs(ctx, req.(*BulkDeleteJobsRequest)) + } + return interceptor(ctx, in, info, handler) +} + // JobSpecificationService_ServiceDesc is the grpc.ServiceDesc for JobSpecificationService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -1019,6 +1055,10 @@ var JobSpecificationService_ServiceDesc = grpc.ServiceDesc{ MethodName: "SyncJobsState", Handler: _JobSpecificationService_SyncJobsState_Handler, }, + { + MethodName: "BulkDeleteJobs", + Handler: _JobSpecificationService_BulkDeleteJobs_Handler, + }, }, Streams: []grpc.StreamDesc{ {