diff --git a/caraml-store-protobuf/src/main/proto/feast_spark/api/JobService.proto b/caraml-store-protobuf/src/main/proto/feast_spark/api/JobService.proto index eab0e4b..451cc74 100644 --- a/caraml-store-protobuf/src/main/proto/feast_spark/api/JobService.proto +++ b/caraml-store-protobuf/src/main/proto/feast_spark/api/JobService.proto @@ -25,6 +25,9 @@ service JobService { // List all types of jobs rpc ListJobs (ListJobsRequest) returns (ListJobsResponse); + // List all scheduled jobs + rpc ListScheduledJob (ListScheduledJobRequest) returns (ListScheduledJobResponse); + // Cancel a single job rpc CancelJob (CancelJobRequest) returns (CancelJobResponse); @@ -55,6 +58,17 @@ enum JobStatus { JOB_STATUS_ERROR = 4; } +message ScheduledJob { + // Identifier of the Job + string id = 1; + string table_name = 2; + string project = 3; + // Timespan of the ingested data per job, in days. The data from end of the day - timespan till end of the day will be ingested. Eg. if the job execution date is 10/4/2021, and ingestion timespan is 2, then data from 9/4/2021 00:00 to 10/4/2021 23:59 (inclusive) will be ingested. + int32 ingestion_timespan = 4; + // Crontab string. Eg. 0 13 * * * + string cron_schedule = 5; +} + message Job { // Identifier of the Job string id = 1; @@ -191,10 +205,19 @@ message ListJobsRequest { string project = 3; } +message ListScheduledJobRequest { + string project = 1; + string table_name = 2; +} + message ListJobsResponse { repeated Job jobs = 1; } +message ListScheduledJobResponse { + repeated ScheduledJob jobs = 1; +} + message GetJobRequest { string job_id = 1; } diff --git a/caraml-store-registry/src/main/java/dev/caraml/store/api/JobGrpcServiceImpl.java b/caraml-store-registry/src/main/java/dev/caraml/store/api/JobGrpcServiceImpl.java index 2aa31e5..a895dde 100644 --- a/caraml-store-registry/src/main/java/dev/caraml/store/api/JobGrpcServiceImpl.java +++ b/caraml-store-registry/src/main/java/dev/caraml/store/api/JobGrpcServiceImpl.java @@ -1,6 +1,7 @@ package dev.caraml.store.api; import dev.caraml.store.protobuf.jobservice.JobServiceGrpc; +import dev.caraml.store.protobuf.jobservice.JobServiceProto; import dev.caraml.store.protobuf.jobservice.JobServiceProto.GetHistoricalFeaturesRequest; import dev.caraml.store.protobuf.jobservice.JobServiceProto.GetHistoricalFeaturesResponse; import dev.caraml.store.protobuf.jobservice.JobServiceProto.GetJobRequest; @@ -10,6 +11,7 @@ import dev.caraml.store.protobuf.jobservice.JobServiceProto.ListJobsResponse; import dev.caraml.store.protobuf.jobservice.JobServiceProto.ScheduleOfflineToOnlineIngestionJobRequest; import dev.caraml.store.protobuf.jobservice.JobServiceProto.ScheduleOfflineToOnlineIngestionJobResponse; +import dev.caraml.store.protobuf.jobservice.JobServiceProto.ScheduledJob; import dev.caraml.store.protobuf.jobservice.JobServiceProto.StartOfflineToOnlineIngestionJobRequest; import dev.caraml.store.protobuf.jobservice.JobServiceProto.StartOfflineToOnlineIngestionJobResponse; import dev.caraml.store.sparkjob.JobNotFoundException; @@ -97,6 +99,17 @@ public void listJobs(ListJobsRequest request, StreamObserver r responseObserver.onCompleted(); } + public void listScheduledJobs( + JobServiceProto.ListScheduledJobRequest request, + StreamObserver responseObserver) { + List jobs = + jobService.listScheduledJobs(request.getProject(), request.getTableName()); + JobServiceProto.ListScheduledJobResponse response = + JobServiceProto.ListScheduledJobResponse.newBuilder().addAllJobs(jobs).build(); + responseObserver.onNext(response); + responseObserver.onCompleted(); + } + @Override public void getJob(GetJobRequest request, StreamObserver responseObserver) { GetJobResponse response = diff --git a/caraml-store-registry/src/main/java/dev/caraml/store/sparkjob/JobService.java b/caraml-store-registry/src/main/java/dev/caraml/store/sparkjob/JobService.java index 72197db..331353d 100644 --- a/caraml-store-registry/src/main/java/dev/caraml/store/sparkjob/JobService.java +++ b/caraml-store-registry/src/main/java/dev/caraml/store/sparkjob/JobService.java @@ -13,6 +13,7 @@ import dev.caraml.store.protobuf.jobservice.JobServiceProto.Job; import dev.caraml.store.protobuf.jobservice.JobServiceProto.JobStatus; import dev.caraml.store.protobuf.jobservice.JobServiceProto.JobType; +import dev.caraml.store.protobuf.jobservice.JobServiceProto.ScheduledJob; import dev.caraml.store.sparkjob.adapter.BatchIngestionArgumentAdapter; import dev.caraml.store.sparkjob.adapter.HistoricalRetrievalArgumentAdapter; import dev.caraml.store.sparkjob.adapter.ScheduledBatchIngestionArgumentAdapter; @@ -144,6 +145,20 @@ private Job sparkApplicationToJob(SparkApplication app) { return builder.build(); } + private ScheduledJob scheduledSparkApplicationToScheduledJob(ScheduledSparkApplication app) { + Map labels = app.getMetadata().getLabels(); + List args = app.getSpec().getTemplate().getArguments(); + int ingestionTimespan = Integer.parseInt(args.get(args.size() - 1)); + ScheduledJob.Builder builder = + ScheduledJob.newBuilder() + .setId(app.getMetadata().getName()) + .setTableName(labels.getOrDefault(FEATURE_TABLE_LABEL, "")) + .setProject(labels.getOrDefault(PROJECT_LABEL, "")) + .setCronSchedule(app.getSpec().getSchedule()) + .setIngestionTimespan(ingestionTimespan); + return builder.build(); + } + public Job createOrUpdateStreamingIngestionJob(String project, String featureTableName) { FeatureTableSpec spec = tableRepository @@ -484,13 +499,7 @@ public List listJobs(Boolean includeTerminated, String project, String tabl .stream() .filter(es -> !es.getValue().isEmpty()) .map(es -> String.format("%s=%s", es.getKey(), es.getValue())); - String jobSets = - Stream.of(JobType.BATCH_INGESTION_JOB, JobType.STREAM_INGESTION_JOB, JobType.RETRIEVAL_JOB) - .map(Enum::toString) - .collect(Collectors.joining(",")); - Stream setSelectors = Stream.of(String.format("%s in (%s)", JOB_TYPE_LABEL, jobSets)); - String labelSelectors = - Stream.concat(equalitySelectors, setSelectors).collect(Collectors.joining(",")); + String labelSelectors = equalitySelectors.collect(Collectors.joining(",")); Stream jobStream = sparkOperatorApi.list(namespace, labelSelectors).stream().map(this::sparkApplicationToJob); if (!includeTerminated) { @@ -499,6 +508,23 @@ public List listJobs(Boolean includeTerminated, String project, String tabl return jobStream.toList(); } + public List listScheduledJobs(String project, String tableName) { + String labelSelectors = ""; + Map selectorMap = new HashMap<>(); + if (!project.isEmpty()) { + selectorMap.put(PROJECT_LABEL, project); + } + if (!tableName.isEmpty()) { + selectorMap.put(FEATURE_TABLE_LABEL, tableName); + } + selectorMap.entrySet().stream() + .map(es -> String.format("%s=%s", es.getKey(), es.getValue())) + .collect(Collectors.joining(",")); + return sparkOperatorApi.listScheduled(namespace, labelSelectors).stream() + .map(this::scheduledSparkApplicationToScheduledJob) + .toList(); + } + public Optional getJob(String id) { return sparkOperatorApi.getSparkApplication(namespace, id).map(this::sparkApplicationToJob); } diff --git a/caraml-store-registry/src/main/java/dev/caraml/store/sparkjob/SparkOperatorApi.java b/caraml-store-registry/src/main/java/dev/caraml/store/sparkjob/SparkOperatorApi.java index cb194e7..29c9399 100644 --- a/caraml-store-registry/src/main/java/dev/caraml/store/sparkjob/SparkOperatorApi.java +++ b/caraml-store-registry/src/main/java/dev/caraml/store/sparkjob/SparkOperatorApi.java @@ -21,6 +21,9 @@ List list(String namespace, String labelSelector) Optional getSparkApplication(String namespace, String name) throws SparkOperatorApiException; + List listScheduled(String namespace, String labelSelector) + throws SparkOperatorApiException; + Optional getScheduledSparkApplication(String namespace, String name) throws SparkOperatorApiException; } diff --git a/caraml-store-registry/src/main/java/dev/caraml/store/sparkjob/SparkOperatorApiImpl.java b/caraml-store-registry/src/main/java/dev/caraml/store/sparkjob/SparkOperatorApiImpl.java index bc6d087..d3cd03b 100644 --- a/caraml-store-registry/src/main/java/dev/caraml/store/sparkjob/SparkOperatorApiImpl.java +++ b/caraml-store-registry/src/main/java/dev/caraml/store/sparkjob/SparkOperatorApiImpl.java @@ -90,7 +90,9 @@ public ScheduledSparkApplication create(ScheduledSparkApplication app) public List list(String namespace, String labelSelector) throws SparkOperatorApiException { ListOptions options = new ListOptions(); - options.setLabelSelector(labelSelector); + if (!labelSelector.isEmpty()) { + options.setLabelSelector(labelSelector); + } try { return sparkApplicationApi .list(namespace, options) @@ -112,6 +114,24 @@ public Optional getSparkApplication(String namespace, String n }; } + @Override + public List listScheduled(String namespace, String labelSelector) + throws SparkOperatorApiException { + ListOptions options = new ListOptions(); + if (!labelSelector.isEmpty()) { + options.setLabelSelector(labelSelector); + } + try { + return scheduledSparkApplicationApi + .list(namespace, options) + .throwsApiException() + .getObject() + .getItems(); + } catch (ApiException e) { + throw new SparkOperatorApiException(e.getMessage()); + } + } + @Override public Optional getScheduledSparkApplication( String namespace, String name) throws SparkOperatorApiException { diff --git a/caraml-store-sdk/go/protos/feast_spark/api/JobService.pb.go b/caraml-store-sdk/go/protos/feast_spark/api/JobService.pb.go index d0d9d26..31ece5a 100644 --- a/caraml-store-sdk/go/protos/feast_spark/api/JobService.pb.go +++ b/caraml-store-sdk/go/protos/feast_spark/api/JobService.pb.go @@ -133,6 +133,88 @@ func (JobStatus) EnumDescriptor() ([]byte, []int) { return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{1} } +type ScheduledJob struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Identifier of the Job + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + TableName string `protobuf:"bytes,2,opt,name=table_name,json=tableName,proto3" json:"table_name,omitempty"` + Project string `protobuf:"bytes,3,opt,name=project,proto3" json:"project,omitempty"` + // Timespan of the ingested data per job, in days. The data from end of the day - timespan till end of the day will be ingested. Eg. if the job execution date is 10/4/2021, and ingestion timespan is 2, then data from 9/4/2021 00:00 to 10/4/2021 23:59 (inclusive) will be ingested. + IngestionTimespan int32 `protobuf:"varint,4,opt,name=ingestion_timespan,json=ingestionTimespan,proto3" json:"ingestion_timespan,omitempty"` + // Crontab string. Eg. 0 13 * * * + CronSchedule string `protobuf:"bytes,5,opt,name=cron_schedule,json=cronSchedule,proto3" json:"cron_schedule,omitempty"` +} + +func (x *ScheduledJob) Reset() { + *x = ScheduledJob{} + if protoimpl.UnsafeEnabled { + mi := &file_feast_spark_api_JobService_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ScheduledJob) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ScheduledJob) ProtoMessage() {} + +func (x *ScheduledJob) ProtoReflect() protoreflect.Message { + mi := &file_feast_spark_api_JobService_proto_msgTypes[0] + 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 ScheduledJob.ProtoReflect.Descriptor instead. +func (*ScheduledJob) Descriptor() ([]byte, []int) { + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{0} +} + +func (x *ScheduledJob) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *ScheduledJob) GetTableName() string { + if x != nil { + return x.TableName + } + return "" +} + +func (x *ScheduledJob) GetProject() string { + if x != nil { + return x.Project + } + return "" +} + +func (x *ScheduledJob) GetIngestionTimespan() int32 { + if x != nil { + return x.IngestionTimespan + } + return 0 +} + +func (x *ScheduledJob) GetCronSchedule() string { + if x != nil { + return x.CronSchedule + } + return "" +} + type Job struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -165,7 +247,7 @@ type Job struct { func (x *Job) Reset() { *x = Job{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[0] + mi := &file_feast_spark_api_JobService_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -178,7 +260,7 @@ func (x *Job) String() string { func (*Job) ProtoMessage() {} func (x *Job) ProtoReflect() protoreflect.Message { - mi := &file_feast_spark_api_JobService_proto_msgTypes[0] + mi := &file_feast_spark_api_JobService_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -191,7 +273,7 @@ func (x *Job) ProtoReflect() protoreflect.Message { // Deprecated: Use Job.ProtoReflect.Descriptor instead. func (*Job) Descriptor() ([]byte, []int) { - return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{0} + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{1} } func (x *Job) GetId() string { @@ -313,7 +395,7 @@ type StartOfflineToOnlineIngestionJobRequest struct { func (x *StartOfflineToOnlineIngestionJobRequest) Reset() { *x = StartOfflineToOnlineIngestionJobRequest{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[1] + mi := &file_feast_spark_api_JobService_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -326,7 +408,7 @@ func (x *StartOfflineToOnlineIngestionJobRequest) String() string { func (*StartOfflineToOnlineIngestionJobRequest) ProtoMessage() {} func (x *StartOfflineToOnlineIngestionJobRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_spark_api_JobService_proto_msgTypes[1] + mi := &file_feast_spark_api_JobService_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -339,7 +421,7 @@ func (x *StartOfflineToOnlineIngestionJobRequest) ProtoReflect() protoreflect.Me // Deprecated: Use StartOfflineToOnlineIngestionJobRequest.ProtoReflect.Descriptor instead. func (*StartOfflineToOnlineIngestionJobRequest) Descriptor() ([]byte, []int) { - return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{1} + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{2} } func (x *StartOfflineToOnlineIngestionJobRequest) GetProject() string { @@ -395,7 +477,7 @@ type StartOfflineToOnlineIngestionJobResponse struct { func (x *StartOfflineToOnlineIngestionJobResponse) Reset() { *x = StartOfflineToOnlineIngestionJobResponse{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[2] + mi := &file_feast_spark_api_JobService_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -408,7 +490,7 @@ func (x *StartOfflineToOnlineIngestionJobResponse) String() string { func (*StartOfflineToOnlineIngestionJobResponse) ProtoMessage() {} func (x *StartOfflineToOnlineIngestionJobResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_spark_api_JobService_proto_msgTypes[2] + mi := &file_feast_spark_api_JobService_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -421,7 +503,7 @@ func (x *StartOfflineToOnlineIngestionJobResponse) ProtoReflect() protoreflect.M // Deprecated: Use StartOfflineToOnlineIngestionJobResponse.ProtoReflect.Descriptor instead. func (*StartOfflineToOnlineIngestionJobResponse) Descriptor() ([]byte, []int) { - return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{2} + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{3} } func (x *StartOfflineToOnlineIngestionJobResponse) GetId() string { @@ -469,7 +551,7 @@ type ScheduleOfflineToOnlineIngestionJobRequest struct { func (x *ScheduleOfflineToOnlineIngestionJobRequest) Reset() { *x = ScheduleOfflineToOnlineIngestionJobRequest{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[3] + mi := &file_feast_spark_api_JobService_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -482,7 +564,7 @@ func (x *ScheduleOfflineToOnlineIngestionJobRequest) String() string { func (*ScheduleOfflineToOnlineIngestionJobRequest) ProtoMessage() {} func (x *ScheduleOfflineToOnlineIngestionJobRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_spark_api_JobService_proto_msgTypes[3] + mi := &file_feast_spark_api_JobService_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -495,7 +577,7 @@ func (x *ScheduleOfflineToOnlineIngestionJobRequest) ProtoReflect() protoreflect // Deprecated: Use ScheduleOfflineToOnlineIngestionJobRequest.ProtoReflect.Descriptor instead. func (*ScheduleOfflineToOnlineIngestionJobRequest) Descriptor() ([]byte, []int) { - return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{3} + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{4} } func (x *ScheduleOfflineToOnlineIngestionJobRequest) GetProject() string { @@ -535,7 +617,7 @@ type ScheduleOfflineToOnlineIngestionJobResponse struct { func (x *ScheduleOfflineToOnlineIngestionJobResponse) Reset() { *x = ScheduleOfflineToOnlineIngestionJobResponse{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[4] + mi := &file_feast_spark_api_JobService_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -548,7 +630,7 @@ func (x *ScheduleOfflineToOnlineIngestionJobResponse) String() string { func (*ScheduleOfflineToOnlineIngestionJobResponse) ProtoMessage() {} func (x *ScheduleOfflineToOnlineIngestionJobResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_spark_api_JobService_proto_msgTypes[4] + mi := &file_feast_spark_api_JobService_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -561,7 +643,7 @@ func (x *ScheduleOfflineToOnlineIngestionJobResponse) ProtoReflect() protoreflec // Deprecated: Use ScheduleOfflineToOnlineIngestionJobResponse.ProtoReflect.Descriptor instead. func (*ScheduleOfflineToOnlineIngestionJobResponse) Descriptor() ([]byte, []int) { - return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{4} + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{5} } type UnscheduleOfflineToOnlineIngestionJobRequest struct { @@ -576,7 +658,7 @@ type UnscheduleOfflineToOnlineIngestionJobRequest struct { func (x *UnscheduleOfflineToOnlineIngestionJobRequest) Reset() { *x = UnscheduleOfflineToOnlineIngestionJobRequest{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[5] + mi := &file_feast_spark_api_JobService_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -589,7 +671,7 @@ func (x *UnscheduleOfflineToOnlineIngestionJobRequest) String() string { func (*UnscheduleOfflineToOnlineIngestionJobRequest) ProtoMessage() {} func (x *UnscheduleOfflineToOnlineIngestionJobRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_spark_api_JobService_proto_msgTypes[5] + mi := &file_feast_spark_api_JobService_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -602,7 +684,7 @@ func (x *UnscheduleOfflineToOnlineIngestionJobRequest) ProtoReflect() protorefle // Deprecated: Use UnscheduleOfflineToOnlineIngestionJobRequest.ProtoReflect.Descriptor instead. func (*UnscheduleOfflineToOnlineIngestionJobRequest) Descriptor() ([]byte, []int) { - return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{5} + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{6} } func (x *UnscheduleOfflineToOnlineIngestionJobRequest) GetProject() string { @@ -628,7 +710,7 @@ type UnscheduleOfflineToOnlineIngestionJobResponse struct { func (x *UnscheduleOfflineToOnlineIngestionJobResponse) Reset() { *x = UnscheduleOfflineToOnlineIngestionJobResponse{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[6] + mi := &file_feast_spark_api_JobService_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -641,7 +723,7 @@ func (x *UnscheduleOfflineToOnlineIngestionJobResponse) String() string { func (*UnscheduleOfflineToOnlineIngestionJobResponse) ProtoMessage() {} func (x *UnscheduleOfflineToOnlineIngestionJobResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_spark_api_JobService_proto_msgTypes[6] + mi := &file_feast_spark_api_JobService_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -654,7 +736,7 @@ func (x *UnscheduleOfflineToOnlineIngestionJobResponse) ProtoReflect() protorefl // Deprecated: Use UnscheduleOfflineToOnlineIngestionJobResponse.ProtoReflect.Descriptor instead. func (*UnscheduleOfflineToOnlineIngestionJobResponse) Descriptor() ([]byte, []int) { - return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{6} + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{7} } type GetHistoricalFeaturesRequest struct { @@ -684,7 +766,7 @@ type GetHistoricalFeaturesRequest struct { func (x *GetHistoricalFeaturesRequest) Reset() { *x = GetHistoricalFeaturesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[7] + mi := &file_feast_spark_api_JobService_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -697,7 +779,7 @@ func (x *GetHistoricalFeaturesRequest) String() string { func (*GetHistoricalFeaturesRequest) ProtoMessage() {} func (x *GetHistoricalFeaturesRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_spark_api_JobService_proto_msgTypes[7] + mi := &file_feast_spark_api_JobService_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -710,7 +792,7 @@ func (x *GetHistoricalFeaturesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetHistoricalFeaturesRequest.ProtoReflect.Descriptor instead. func (*GetHistoricalFeaturesRequest) Descriptor() ([]byte, []int) { - return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{7} + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{8} } func (x *GetHistoricalFeaturesRequest) GetFeatureRefs() []string { @@ -766,7 +848,7 @@ type GetHistoricalFeaturesResponse struct { func (x *GetHistoricalFeaturesResponse) Reset() { *x = GetHistoricalFeaturesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[8] + mi := &file_feast_spark_api_JobService_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -779,7 +861,7 @@ func (x *GetHistoricalFeaturesResponse) String() string { func (*GetHistoricalFeaturesResponse) ProtoMessage() {} func (x *GetHistoricalFeaturesResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_spark_api_JobService_proto_msgTypes[8] + mi := &file_feast_spark_api_JobService_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -792,7 +874,7 @@ func (x *GetHistoricalFeaturesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetHistoricalFeaturesResponse.ProtoReflect.Descriptor instead. func (*GetHistoricalFeaturesResponse) Descriptor() ([]byte, []int) { - return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{8} + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{9} } func (x *GetHistoricalFeaturesResponse) GetId() string { @@ -836,7 +918,7 @@ type ListJobsRequest struct { func (x *ListJobsRequest) Reset() { *x = ListJobsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[9] + mi := &file_feast_spark_api_JobService_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -849,7 +931,7 @@ func (x *ListJobsRequest) String() string { func (*ListJobsRequest) ProtoMessage() {} func (x *ListJobsRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_spark_api_JobService_proto_msgTypes[9] + mi := &file_feast_spark_api_JobService_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -862,7 +944,7 @@ func (x *ListJobsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListJobsRequest.ProtoReflect.Descriptor instead. func (*ListJobsRequest) Descriptor() ([]byte, []int) { - return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{9} + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{10} } func (x *ListJobsRequest) GetIncludeTerminated() bool { @@ -886,6 +968,61 @@ func (x *ListJobsRequest) GetProject() string { return "" } +type ListScheduledJobRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"` + TableName string `protobuf:"bytes,2,opt,name=table_name,json=tableName,proto3" json:"table_name,omitempty"` +} + +func (x *ListScheduledJobRequest) Reset() { + *x = ListScheduledJobRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_feast_spark_api_JobService_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListScheduledJobRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListScheduledJobRequest) ProtoMessage() {} + +func (x *ListScheduledJobRequest) ProtoReflect() protoreflect.Message { + mi := &file_feast_spark_api_JobService_proto_msgTypes[11] + 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 ListScheduledJobRequest.ProtoReflect.Descriptor instead. +func (*ListScheduledJobRequest) Descriptor() ([]byte, []int) { + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{11} +} + +func (x *ListScheduledJobRequest) GetProject() string { + if x != nil { + return x.Project + } + return "" +} + +func (x *ListScheduledJobRequest) GetTableName() string { + if x != nil { + return x.TableName + } + return "" +} + type ListJobsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -897,7 +1034,7 @@ type ListJobsResponse struct { func (x *ListJobsResponse) Reset() { *x = ListJobsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[10] + mi := &file_feast_spark_api_JobService_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -910,7 +1047,7 @@ func (x *ListJobsResponse) String() string { func (*ListJobsResponse) ProtoMessage() {} func (x *ListJobsResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_spark_api_JobService_proto_msgTypes[10] + mi := &file_feast_spark_api_JobService_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -923,7 +1060,7 @@ func (x *ListJobsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListJobsResponse.ProtoReflect.Descriptor instead. func (*ListJobsResponse) Descriptor() ([]byte, []int) { - return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{10} + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{12} } func (x *ListJobsResponse) GetJobs() []*Job { @@ -933,6 +1070,53 @@ func (x *ListJobsResponse) GetJobs() []*Job { return nil } +type ListScheduledJobResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Jobs []*ScheduledJob `protobuf:"bytes,1,rep,name=jobs,proto3" json:"jobs,omitempty"` +} + +func (x *ListScheduledJobResponse) Reset() { + *x = ListScheduledJobResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_feast_spark_api_JobService_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListScheduledJobResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListScheduledJobResponse) ProtoMessage() {} + +func (x *ListScheduledJobResponse) ProtoReflect() protoreflect.Message { + mi := &file_feast_spark_api_JobService_proto_msgTypes[13] + 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 ListScheduledJobResponse.ProtoReflect.Descriptor instead. +func (*ListScheduledJobResponse) Descriptor() ([]byte, []int) { + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{13} +} + +func (x *ListScheduledJobResponse) GetJobs() []*ScheduledJob { + if x != nil { + return x.Jobs + } + return nil +} + type GetJobRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -944,7 +1128,7 @@ type GetJobRequest struct { func (x *GetJobRequest) Reset() { *x = GetJobRequest{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[11] + mi := &file_feast_spark_api_JobService_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -957,7 +1141,7 @@ func (x *GetJobRequest) String() string { func (*GetJobRequest) ProtoMessage() {} func (x *GetJobRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_spark_api_JobService_proto_msgTypes[11] + mi := &file_feast_spark_api_JobService_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -970,7 +1154,7 @@ func (x *GetJobRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetJobRequest.ProtoReflect.Descriptor instead. func (*GetJobRequest) Descriptor() ([]byte, []int) { - return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{11} + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{14} } func (x *GetJobRequest) GetJobId() string { @@ -991,7 +1175,7 @@ type GetJobResponse struct { func (x *GetJobResponse) Reset() { *x = GetJobResponse{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[12] + mi := &file_feast_spark_api_JobService_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1004,7 +1188,7 @@ func (x *GetJobResponse) String() string { func (*GetJobResponse) ProtoMessage() {} func (x *GetJobResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_spark_api_JobService_proto_msgTypes[12] + mi := &file_feast_spark_api_JobService_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1017,7 +1201,7 @@ func (x *GetJobResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetJobResponse.ProtoReflect.Descriptor instead. func (*GetJobResponse) Descriptor() ([]byte, []int) { - return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{12} + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{15} } func (x *GetJobResponse) GetJob() *Job { @@ -1038,7 +1222,7 @@ type CancelJobRequest struct { func (x *CancelJobRequest) Reset() { *x = CancelJobRequest{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[13] + mi := &file_feast_spark_api_JobService_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1051,7 +1235,7 @@ func (x *CancelJobRequest) String() string { func (*CancelJobRequest) ProtoMessage() {} func (x *CancelJobRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_spark_api_JobService_proto_msgTypes[13] + mi := &file_feast_spark_api_JobService_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1064,7 +1248,7 @@ func (x *CancelJobRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CancelJobRequest.ProtoReflect.Descriptor instead. func (*CancelJobRequest) Descriptor() ([]byte, []int) { - return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{13} + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{16} } func (x *CancelJobRequest) GetJobId() string { @@ -1083,7 +1267,7 @@ type CancelJobResponse struct { func (x *CancelJobResponse) Reset() { *x = CancelJobResponse{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[14] + mi := &file_feast_spark_api_JobService_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1096,7 +1280,7 @@ func (x *CancelJobResponse) String() string { func (*CancelJobResponse) ProtoMessage() {} func (x *CancelJobResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_spark_api_JobService_proto_msgTypes[14] + mi := &file_feast_spark_api_JobService_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1109,7 +1293,7 @@ func (x *CancelJobResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CancelJobResponse.ProtoReflect.Descriptor instead. func (*CancelJobResponse) Descriptor() ([]byte, []int) { - return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{14} + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{17} } type GetHealthMetricsRequest struct { @@ -1124,7 +1308,7 @@ type GetHealthMetricsRequest struct { func (x *GetHealthMetricsRequest) Reset() { *x = GetHealthMetricsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[15] + mi := &file_feast_spark_api_JobService_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1137,7 +1321,7 @@ func (x *GetHealthMetricsRequest) String() string { func (*GetHealthMetricsRequest) ProtoMessage() {} func (x *GetHealthMetricsRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_spark_api_JobService_proto_msgTypes[15] + mi := &file_feast_spark_api_JobService_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1150,7 +1334,7 @@ func (x *GetHealthMetricsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetHealthMetricsRequest.ProtoReflect.Descriptor instead. func (*GetHealthMetricsRequest) Descriptor() ([]byte, []int) { - return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{15} + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{18} } func (x *GetHealthMetricsRequest) GetProject() string { @@ -1179,7 +1363,7 @@ type GetHealthMetricsResponse struct { func (x *GetHealthMetricsResponse) Reset() { *x = GetHealthMetricsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[16] + mi := &file_feast_spark_api_JobService_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1192,7 +1376,7 @@ func (x *GetHealthMetricsResponse) String() string { func (*GetHealthMetricsResponse) ProtoMessage() {} func (x *GetHealthMetricsResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_spark_api_JobService_proto_msgTypes[16] + mi := &file_feast_spark_api_JobService_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1205,7 +1389,7 @@ func (x *GetHealthMetricsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetHealthMetricsResponse.ProtoReflect.Descriptor instead. func (*GetHealthMetricsResponse) Descriptor() ([]byte, []int) { - return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{16} + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{19} } func (x *GetHealthMetricsResponse) GetPassed() []string { @@ -1233,7 +1417,7 @@ type Job_RetrievalJobMeta struct { func (x *Job_RetrievalJobMeta) Reset() { *x = Job_RetrievalJobMeta{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[17] + mi := &file_feast_spark_api_JobService_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1246,7 +1430,7 @@ func (x *Job_RetrievalJobMeta) String() string { func (*Job_RetrievalJobMeta) ProtoMessage() {} func (x *Job_RetrievalJobMeta) ProtoReflect() protoreflect.Message { - mi := &file_feast_spark_api_JobService_proto_msgTypes[17] + mi := &file_feast_spark_api_JobService_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1259,7 +1443,7 @@ func (x *Job_RetrievalJobMeta) ProtoReflect() protoreflect.Message { // Deprecated: Use Job_RetrievalJobMeta.ProtoReflect.Descriptor instead. func (*Job_RetrievalJobMeta) Descriptor() ([]byte, []int) { - return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{0, 0} + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{1, 0} } func (x *Job_RetrievalJobMeta) GetOutputLocation() string { @@ -1280,7 +1464,7 @@ type Job_OfflineToOnlineMeta struct { func (x *Job_OfflineToOnlineMeta) Reset() { *x = Job_OfflineToOnlineMeta{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[18] + mi := &file_feast_spark_api_JobService_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1293,7 +1477,7 @@ func (x *Job_OfflineToOnlineMeta) String() string { func (*Job_OfflineToOnlineMeta) ProtoMessage() {} func (x *Job_OfflineToOnlineMeta) ProtoReflect() protoreflect.Message { - mi := &file_feast_spark_api_JobService_proto_msgTypes[18] + mi := &file_feast_spark_api_JobService_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1306,7 +1490,7 @@ func (x *Job_OfflineToOnlineMeta) ProtoReflect() protoreflect.Message { // Deprecated: Use Job_OfflineToOnlineMeta.ProtoReflect.Descriptor instead. func (*Job_OfflineToOnlineMeta) Descriptor() ([]byte, []int) { - return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{0, 1} + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{1, 1} } func (x *Job_OfflineToOnlineMeta) GetTableName() string { @@ -1327,7 +1511,7 @@ type Job_StreamToOnlineMeta struct { func (x *Job_StreamToOnlineMeta) Reset() { *x = Job_StreamToOnlineMeta{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[19] + mi := &file_feast_spark_api_JobService_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1340,7 +1524,7 @@ func (x *Job_StreamToOnlineMeta) String() string { func (*Job_StreamToOnlineMeta) ProtoMessage() {} func (x *Job_StreamToOnlineMeta) ProtoReflect() protoreflect.Message { - mi := &file_feast_spark_api_JobService_proto_msgTypes[19] + mi := &file_feast_spark_api_JobService_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1353,7 +1537,7 @@ func (x *Job_StreamToOnlineMeta) ProtoReflect() protoreflect.Message { // Deprecated: Use Job_StreamToOnlineMeta.ProtoReflect.Descriptor instead. func (*Job_StreamToOnlineMeta) Descriptor() ([]byte, []int) { - return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{0, 2} + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{1, 2} } func (x *Job_StreamToOnlineMeta) GetTableName() string { @@ -1373,242 +1557,270 @@ var file_feast_spark_api_JobService_proto_rawDesc = []byte{ 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x22, 0xa6, 0x05, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, - 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, - 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, - 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, - 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x09, 0x72, 0x65, - 0x74, 0x72, 0x69, 0x65, 0x76, 0x61, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, - 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x4a, 0x6f, 0x62, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x61, 0x6c, 0x4a, 0x6f, 0x62, - 0x4d, 0x65, 0x74, 0x61, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x61, - 0x6c, 0x12, 0x53, 0x0a, 0x0f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x67, 0x65, 0x73, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x66, 0x65, 0x61, - 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4a, 0x6f, 0x62, - 0x2e, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0e, 0x62, 0x61, 0x74, 0x63, 0x68, 0x49, 0x6e, 0x67, - 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, 0x10, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x5f, 0x69, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x27, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x6f, 0x4f, - 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0f, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, - 0x6c, 0x6f, 0x67, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, - 0x6f, 0x67, 0x55, 0x72, 0x69, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x3b, 0x0a, 0x10, 0x52, 0x65, - 0x74, 0x72, 0x69, 0x65, 0x76, 0x61, 0x6c, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x27, - 0x0a, 0x0f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x4c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x34, 0x0a, 0x13, 0x4f, 0x66, 0x66, 0x6c, 0x69, - 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1d, - 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x33, 0x0a, - 0x12, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, - 0x65, 0x74, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x22, 0xfd, 0x01, 0x0a, 0x27, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, - 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, - 0x64, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x44, 0x61, 0x74, - 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x69, 0x6e, 0x67, 0x65, 0x73, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x65, 0x6c, 0x74, - 0x61, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb4, 0x01, 0x0a, 0x28, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, - 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x40, 0x0a, 0x0e, 0x6a, 0x6f, 0x62, 0x5f, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x6f, 0x22, 0xab, 0x01, 0x0a, 0x0c, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x4a, + 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x69, + 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x69, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, + 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x22, + 0xa6, 0x05, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, + 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, + 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, + 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x39, 0x0a, + 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x72, + 0x69, 0x65, 0x76, 0x61, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x66, 0x65, + 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4a, 0x6f, + 0x62, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x61, 0x6c, 0x4a, 0x6f, 0x62, 0x4d, 0x65, + 0x74, 0x61, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x61, 0x6c, 0x12, + 0x53, 0x0a, 0x0f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, + 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4a, 0x6f, 0x62, 0x2e, 0x4f, + 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x48, 0x00, 0x52, 0x0e, 0x62, 0x61, 0x74, 0x63, 0x68, 0x49, 0x6e, 0x67, 0x65, 0x73, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, 0x10, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, + 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, + 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0f, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x6c, 0x6f, + 0x67, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x6f, 0x67, + 0x55, 0x72, 0x69, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x3b, 0x0a, 0x10, 0x52, 0x65, 0x74, 0x72, + 0x69, 0x65, 0x76, 0x61, 0x6c, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x27, 0x0a, 0x0f, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x4c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x34, 0x0a, 0x13, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, + 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1d, 0x0a, 0x0a, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x33, 0x0a, 0x12, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x42, 0x06, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x22, 0xfd, 0x01, 0x0a, 0x27, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, + 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, + 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, + 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x44, 0x61, 0x74, 0x65, 0x12, + 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x69, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x49, + 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb4, 0x01, 0x0a, 0x28, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, + 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x40, 0x0a, 0x0e, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6a, 0x6f, 0x62, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6c, 0x6f, 0x67, 0x5f, 0x75, 0x72, + 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x6f, 0x67, 0x55, 0x72, 0x69, 0x22, + 0xb9, 0x01, 0x0a, 0x2a, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x4f, 0x66, 0x66, 0x6c, + 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, + 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, + 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x69, 0x6e, 0x67, 0x65, 0x73, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x11, 0x69, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, + 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x2b, 0x53, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, + 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, + 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x67, 0x0a, 0x2c, 0x55, 0x6e, + 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, + 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, + 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0x2f, 0x0a, 0x2d, 0x55, 0x6e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xe6, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x5f, 0x72, 0x65, 0x66, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x66, 0x73, 0x12, 0x3b, 0x0a, 0x0d, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0c, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, + 0x27, 0x0a, 0x0f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0xb2, 0x01, + 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x46, + 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x26, 0x0a, 0x0f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x75, + 0x72, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x46, 0x69, 0x6c, 0x65, 0x55, 0x72, 0x69, 0x12, 0x40, 0x0a, 0x0e, 0x6a, 0x6f, 0x62, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6a, 0x6f, 0x62, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6c, 0x6f, 0x67, 0x5f, - 0x75, 0x72, 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x6f, 0x67, 0x55, 0x72, - 0x69, 0x22, 0xb9, 0x01, 0x0a, 0x2a, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x4f, 0x66, - 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, - 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x69, 0x6e, 0x67, - 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x69, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, - 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2d, 0x0a, - 0x2b, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, - 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, - 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x67, 0x0a, 0x2c, - 0x55, 0x6e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6c, 0x6f, 0x67, + 0x5f, 0x75, 0x72, 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x6f, 0x67, 0x55, + 0x72, 0x69, 0x22, 0x79, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x61, 0x74, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x52, 0x0a, + 0x17, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x4a, 0x6f, + 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x22, 0x3c, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, + 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x22, + 0x4d, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, + 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x04, 0x6a, + 0x6f, 0x62, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x66, 0x65, 0x61, 0x73, + 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x22, 0x26, + 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x38, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, + 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x6a, 0x6f, 0x62, + 0x22, 0x29, 0x0a, 0x10, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x13, 0x0a, 0x11, 0x43, + 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x54, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x4a, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x2a, 0x60, 0x0a, 0x07, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, + 0x0b, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x00, 0x12, 0x17, + 0x0a, 0x13, 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x49, 0x4e, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x54, 0x52, 0x45, 0x41, + 0x4d, 0x5f, 0x49, 0x4e, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4a, 0x4f, 0x42, 0x10, + 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x54, 0x52, 0x49, 0x45, 0x56, 0x41, 0x4c, 0x5f, 0x4a, + 0x4f, 0x42, 0x10, 0x04, 0x2a, 0x7e, 0x0a, 0x09, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x16, 0x0a, 0x12, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, + 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x4a, 0x4f, 0x42, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, + 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, + 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x4a, 0x4f, 0x42, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x4f, 0x4e, 0x45, 0x10, 0x03, 0x12, 0x14, + 0x0a, 0x10, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x10, 0x04, 0x32, 0xac, 0x08, 0x0a, 0x0a, 0x4a, 0x6f, 0x62, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x97, 0x01, 0x0a, 0x20, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x66, + 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, + 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x12, 0x38, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, + 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, + 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, - 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2f, 0x0a, 0x2d, 0x55, 0x6e, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, - 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xe6, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x66, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x66, 0x73, 0x12, 0x3b, 0x0a, 0x0d, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0c, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, - 0xb2, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, - 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, - 0x5f, 0x75, 0x72, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x55, 0x72, 0x69, 0x12, 0x40, 0x0a, 0x0e, 0x6a, 0x6f, 0x62, - 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6a, - 0x6f, 0x62, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6c, - 0x6f, 0x67, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x6f, - 0x67, 0x55, 0x72, 0x69, 0x22, 0x79, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x65, 0x72, 0x6d, - 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, - 0x3c, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x22, 0x26, 0x0a, - 0x0d, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, - 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x38, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, - 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x22, - 0x29, 0x0a, 0x10, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x13, 0x0a, 0x11, 0x43, 0x61, - 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x54, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x4a, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x06, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x69, - 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, - 0x64, 0x2a, 0x60, 0x0a, 0x07, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, - 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x00, 0x12, 0x17, 0x0a, - 0x13, 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x49, 0x4e, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, - 0x5f, 0x49, 0x4e, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x02, - 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x54, 0x52, 0x49, 0x45, 0x56, 0x41, 0x4c, 0x5f, 0x4a, 0x4f, - 0x42, 0x10, 0x04, 0x2a, 0x7e, 0x0a, 0x09, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x16, 0x0a, 0x12, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x4a, 0x4f, 0x42, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, - 0x12, 0x16, 0x0a, 0x12, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, - 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x4a, 0x4f, 0x42, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x4f, 0x4e, 0x45, 0x10, 0x03, 0x12, 0x14, 0x0a, - 0x10, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x10, 0x04, 0x32, 0xc3, 0x07, 0x0a, 0x0a, 0x4a, 0x6f, 0x62, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x97, 0x01, 0x0a, 0x20, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x66, 0x6c, - 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, - 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x12, 0x38, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, - 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, - 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, - 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x39, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, - 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, - 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0xa0, 0x01, 0x0a, - 0x23, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, - 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, - 0x6e, 0x4a, 0x6f, 0x62, 0x12, 0x3b, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, - 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x4f, + 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0xa0, 0x01, + 0x0a, 0x23, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, + 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, + 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x12, 0x3b, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, + 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, + 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x4f, 0x66, 0x66, + 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, + 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0xa6, 0x01, 0x0a, 0x25, 0x55, 0x6e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, - 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x3c, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x4f, 0x66, 0x66, 0x6c, - 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, - 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0xa6, 0x01, 0x0a, 0x25, 0x55, 0x6e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x4f, 0x66, - 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, - 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x12, 0x3d, 0x2e, 0x66, 0x65, 0x61, 0x73, + 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x12, 0x3d, 0x2e, 0x66, 0x65, 0x61, + 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x6e, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, + 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, + 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x6e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, - 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, - 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x6e, 0x73, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x4f, 0x6e, - 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x48, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x73, 0x12, 0x2d, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, + 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x15, 0x47, 0x65, 0x74, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, + 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2e, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, - 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2e, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, - 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x4f, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x20, 0x2e, 0x66, - 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x52, 0x0a, 0x09, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x21, - 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x22, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x12, - 0x1e, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1f, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x67, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x12, 0x28, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, - 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, + 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x4f, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x20, 0x2e, + 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x67, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x12, 0x28, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, + 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x29, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, + 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x09, 0x43, + 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x21, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, + 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, + 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x66, 0x65, + 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x61, + 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x49, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x1e, 0x2e, 0x66, 0x65, 0x61, 0x73, + 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4a, + 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x65, 0x61, 0x73, + 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4a, + 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x10, 0x47, 0x65, + 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x28, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x86, 0x01, 0x0a, 0x24, 0x64, 0x65, - 0x76, 0x2e, 0x63, 0x61, 0x72, 0x61, 0x6d, 0x6c, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x42, 0x0f, 0x4a, 0x6f, 0x62, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x5a, 0x4d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x63, 0x61, 0x72, 0x61, 0x6d, 0x6c, 0x2d, 0x64, 0x65, 0x76, 0x2f, 0x63, 0x61, 0x72, 0x61, 0x6d, - 0x6c, 0x2d, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x61, 0x72, 0x61, 0x6d, 0x6c, 0x2d, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x73, 0x2f, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2f, 0x61, - 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, + 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x48, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x42, 0x86, 0x01, 0x0a, 0x24, 0x64, 0x65, 0x76, 0x2e, 0x63, 0x61, 0x72, 0x61, + 0x6d, 0x6c, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x6a, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x0f, 0x4a, 0x6f, + 0x62, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x4d, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x61, 0x72, 0x61, 0x6d, 0x6c, + 0x2d, 0x64, 0x65, 0x76, 0x2f, 0x63, 0x61, 0x72, 0x61, 0x6d, 0x6c, 0x2d, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x2f, 0x63, 0x61, 0x72, 0x61, 0x6d, 0x6c, 0x2d, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2d, 0x73, + 0x64, 0x6b, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x66, 0x65, 0x61, + 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1624,68 +1836,74 @@ func file_feast_spark_api_JobService_proto_rawDescGZIP() []byte { } var file_feast_spark_api_JobService_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_feast_spark_api_JobService_proto_msgTypes = make([]protoimpl.MessageInfo, 20) +var file_feast_spark_api_JobService_proto_msgTypes = make([]protoimpl.MessageInfo, 23) var file_feast_spark_api_JobService_proto_goTypes = []interface{}{ - (JobType)(0), // 0: feast_spark.api.JobType - (JobStatus)(0), // 1: feast_spark.api.JobStatus - (*Job)(nil), // 2: feast_spark.api.Job - (*StartOfflineToOnlineIngestionJobRequest)(nil), // 3: feast_spark.api.StartOfflineToOnlineIngestionJobRequest - (*StartOfflineToOnlineIngestionJobResponse)(nil), // 4: feast_spark.api.StartOfflineToOnlineIngestionJobResponse - (*ScheduleOfflineToOnlineIngestionJobRequest)(nil), // 5: feast_spark.api.ScheduleOfflineToOnlineIngestionJobRequest - (*ScheduleOfflineToOnlineIngestionJobResponse)(nil), // 6: feast_spark.api.ScheduleOfflineToOnlineIngestionJobResponse - (*UnscheduleOfflineToOnlineIngestionJobRequest)(nil), // 7: feast_spark.api.UnscheduleOfflineToOnlineIngestionJobRequest - (*UnscheduleOfflineToOnlineIngestionJobResponse)(nil), // 8: feast_spark.api.UnscheduleOfflineToOnlineIngestionJobResponse - (*GetHistoricalFeaturesRequest)(nil), // 9: feast_spark.api.GetHistoricalFeaturesRequest - (*GetHistoricalFeaturesResponse)(nil), // 10: feast_spark.api.GetHistoricalFeaturesResponse - (*ListJobsRequest)(nil), // 11: feast_spark.api.ListJobsRequest - (*ListJobsResponse)(nil), // 12: feast_spark.api.ListJobsResponse - (*GetJobRequest)(nil), // 13: feast_spark.api.GetJobRequest - (*GetJobResponse)(nil), // 14: feast_spark.api.GetJobResponse - (*CancelJobRequest)(nil), // 15: feast_spark.api.CancelJobRequest - (*CancelJobResponse)(nil), // 16: feast_spark.api.CancelJobResponse - (*GetHealthMetricsRequest)(nil), // 17: feast_spark.api.GetHealthMetricsRequest - (*GetHealthMetricsResponse)(nil), // 18: feast_spark.api.GetHealthMetricsResponse - (*Job_RetrievalJobMeta)(nil), // 19: feast_spark.api.Job.RetrievalJobMeta - (*Job_OfflineToOnlineMeta)(nil), // 20: feast_spark.api.Job.OfflineToOnlineMeta - (*Job_StreamToOnlineMeta)(nil), // 21: feast_spark.api.Job.StreamToOnlineMeta - (*timestamppb.Timestamp)(nil), // 22: google.protobuf.Timestamp - (*core.DataSource)(nil), // 23: feast.core.DataSource + (JobType)(0), // 0: feast_spark.api.JobType + (JobStatus)(0), // 1: feast_spark.api.JobStatus + (*ScheduledJob)(nil), // 2: feast_spark.api.ScheduledJob + (*Job)(nil), // 3: feast_spark.api.Job + (*StartOfflineToOnlineIngestionJobRequest)(nil), // 4: feast_spark.api.StartOfflineToOnlineIngestionJobRequest + (*StartOfflineToOnlineIngestionJobResponse)(nil), // 5: feast_spark.api.StartOfflineToOnlineIngestionJobResponse + (*ScheduleOfflineToOnlineIngestionJobRequest)(nil), // 6: feast_spark.api.ScheduleOfflineToOnlineIngestionJobRequest + (*ScheduleOfflineToOnlineIngestionJobResponse)(nil), // 7: feast_spark.api.ScheduleOfflineToOnlineIngestionJobResponse + (*UnscheduleOfflineToOnlineIngestionJobRequest)(nil), // 8: feast_spark.api.UnscheduleOfflineToOnlineIngestionJobRequest + (*UnscheduleOfflineToOnlineIngestionJobResponse)(nil), // 9: feast_spark.api.UnscheduleOfflineToOnlineIngestionJobResponse + (*GetHistoricalFeaturesRequest)(nil), // 10: feast_spark.api.GetHistoricalFeaturesRequest + (*GetHistoricalFeaturesResponse)(nil), // 11: feast_spark.api.GetHistoricalFeaturesResponse + (*ListJobsRequest)(nil), // 12: feast_spark.api.ListJobsRequest + (*ListScheduledJobRequest)(nil), // 13: feast_spark.api.ListScheduledJobRequest + (*ListJobsResponse)(nil), // 14: feast_spark.api.ListJobsResponse + (*ListScheduledJobResponse)(nil), // 15: feast_spark.api.ListScheduledJobResponse + (*GetJobRequest)(nil), // 16: feast_spark.api.GetJobRequest + (*GetJobResponse)(nil), // 17: feast_spark.api.GetJobResponse + (*CancelJobRequest)(nil), // 18: feast_spark.api.CancelJobRequest + (*CancelJobResponse)(nil), // 19: feast_spark.api.CancelJobResponse + (*GetHealthMetricsRequest)(nil), // 20: feast_spark.api.GetHealthMetricsRequest + (*GetHealthMetricsResponse)(nil), // 21: feast_spark.api.GetHealthMetricsResponse + (*Job_RetrievalJobMeta)(nil), // 22: feast_spark.api.Job.RetrievalJobMeta + (*Job_OfflineToOnlineMeta)(nil), // 23: feast_spark.api.Job.OfflineToOnlineMeta + (*Job_StreamToOnlineMeta)(nil), // 24: feast_spark.api.Job.StreamToOnlineMeta + (*timestamppb.Timestamp)(nil), // 25: google.protobuf.Timestamp + (*core.DataSource)(nil), // 26: feast.core.DataSource } var file_feast_spark_api_JobService_proto_depIdxs = []int32{ 0, // 0: feast_spark.api.Job.type:type_name -> feast_spark.api.JobType 1, // 1: feast_spark.api.Job.status:type_name -> feast_spark.api.JobStatus - 22, // 2: feast_spark.api.Job.start_time:type_name -> google.protobuf.Timestamp - 19, // 3: feast_spark.api.Job.retrieval:type_name -> feast_spark.api.Job.RetrievalJobMeta - 20, // 4: feast_spark.api.Job.batch_ingestion:type_name -> feast_spark.api.Job.OfflineToOnlineMeta - 21, // 5: feast_spark.api.Job.stream_ingestion:type_name -> feast_spark.api.Job.StreamToOnlineMeta - 22, // 6: feast_spark.api.StartOfflineToOnlineIngestionJobRequest.start_date:type_name -> google.protobuf.Timestamp - 22, // 7: feast_spark.api.StartOfflineToOnlineIngestionJobRequest.end_date:type_name -> google.protobuf.Timestamp - 22, // 8: feast_spark.api.StartOfflineToOnlineIngestionJobResponse.job_start_time:type_name -> google.protobuf.Timestamp - 23, // 9: feast_spark.api.GetHistoricalFeaturesRequest.entity_source:type_name -> feast.core.DataSource - 22, // 10: feast_spark.api.GetHistoricalFeaturesResponse.job_start_time:type_name -> google.protobuf.Timestamp - 2, // 11: feast_spark.api.ListJobsResponse.jobs:type_name -> feast_spark.api.Job - 2, // 12: feast_spark.api.GetJobResponse.job:type_name -> feast_spark.api.Job - 3, // 13: feast_spark.api.JobService.StartOfflineToOnlineIngestionJob:input_type -> feast_spark.api.StartOfflineToOnlineIngestionJobRequest - 5, // 14: feast_spark.api.JobService.ScheduleOfflineToOnlineIngestionJob:input_type -> feast_spark.api.ScheduleOfflineToOnlineIngestionJobRequest - 7, // 15: feast_spark.api.JobService.UnscheduleOfflineToOnlineIngestionJob:input_type -> feast_spark.api.UnscheduleOfflineToOnlineIngestionJobRequest - 9, // 16: feast_spark.api.JobService.GetHistoricalFeatures:input_type -> feast_spark.api.GetHistoricalFeaturesRequest - 11, // 17: feast_spark.api.JobService.ListJobs:input_type -> feast_spark.api.ListJobsRequest - 15, // 18: feast_spark.api.JobService.CancelJob:input_type -> feast_spark.api.CancelJobRequest - 13, // 19: feast_spark.api.JobService.GetJob:input_type -> feast_spark.api.GetJobRequest - 17, // 20: feast_spark.api.JobService.GetHealthMetrics:input_type -> feast_spark.api.GetHealthMetricsRequest - 4, // 21: feast_spark.api.JobService.StartOfflineToOnlineIngestionJob:output_type -> feast_spark.api.StartOfflineToOnlineIngestionJobResponse - 6, // 22: feast_spark.api.JobService.ScheduleOfflineToOnlineIngestionJob:output_type -> feast_spark.api.ScheduleOfflineToOnlineIngestionJobResponse - 8, // 23: feast_spark.api.JobService.UnscheduleOfflineToOnlineIngestionJob:output_type -> feast_spark.api.UnscheduleOfflineToOnlineIngestionJobResponse - 10, // 24: feast_spark.api.JobService.GetHistoricalFeatures:output_type -> feast_spark.api.GetHistoricalFeaturesResponse - 12, // 25: feast_spark.api.JobService.ListJobs:output_type -> feast_spark.api.ListJobsResponse - 16, // 26: feast_spark.api.JobService.CancelJob:output_type -> feast_spark.api.CancelJobResponse - 14, // 27: feast_spark.api.JobService.GetJob:output_type -> feast_spark.api.GetJobResponse - 18, // 28: feast_spark.api.JobService.GetHealthMetrics:output_type -> feast_spark.api.GetHealthMetricsResponse - 21, // [21:29] is the sub-list for method output_type - 13, // [13:21] is the sub-list for method input_type - 13, // [13:13] is the sub-list for extension type_name - 13, // [13:13] is the sub-list for extension extendee - 0, // [0:13] is the sub-list for field type_name + 25, // 2: feast_spark.api.Job.start_time:type_name -> google.protobuf.Timestamp + 22, // 3: feast_spark.api.Job.retrieval:type_name -> feast_spark.api.Job.RetrievalJobMeta + 23, // 4: feast_spark.api.Job.batch_ingestion:type_name -> feast_spark.api.Job.OfflineToOnlineMeta + 24, // 5: feast_spark.api.Job.stream_ingestion:type_name -> feast_spark.api.Job.StreamToOnlineMeta + 25, // 6: feast_spark.api.StartOfflineToOnlineIngestionJobRequest.start_date:type_name -> google.protobuf.Timestamp + 25, // 7: feast_spark.api.StartOfflineToOnlineIngestionJobRequest.end_date:type_name -> google.protobuf.Timestamp + 25, // 8: feast_spark.api.StartOfflineToOnlineIngestionJobResponse.job_start_time:type_name -> google.protobuf.Timestamp + 26, // 9: feast_spark.api.GetHistoricalFeaturesRequest.entity_source:type_name -> feast.core.DataSource + 25, // 10: feast_spark.api.GetHistoricalFeaturesResponse.job_start_time:type_name -> google.protobuf.Timestamp + 3, // 11: feast_spark.api.ListJobsResponse.jobs:type_name -> feast_spark.api.Job + 2, // 12: feast_spark.api.ListScheduledJobResponse.jobs:type_name -> feast_spark.api.ScheduledJob + 3, // 13: feast_spark.api.GetJobResponse.job:type_name -> feast_spark.api.Job + 4, // 14: feast_spark.api.JobService.StartOfflineToOnlineIngestionJob:input_type -> feast_spark.api.StartOfflineToOnlineIngestionJobRequest + 6, // 15: feast_spark.api.JobService.ScheduleOfflineToOnlineIngestionJob:input_type -> feast_spark.api.ScheduleOfflineToOnlineIngestionJobRequest + 8, // 16: feast_spark.api.JobService.UnscheduleOfflineToOnlineIngestionJob:input_type -> feast_spark.api.UnscheduleOfflineToOnlineIngestionJobRequest + 10, // 17: feast_spark.api.JobService.GetHistoricalFeatures:input_type -> feast_spark.api.GetHistoricalFeaturesRequest + 12, // 18: feast_spark.api.JobService.ListJobs:input_type -> feast_spark.api.ListJobsRequest + 13, // 19: feast_spark.api.JobService.ListScheduledJob:input_type -> feast_spark.api.ListScheduledJobRequest + 18, // 20: feast_spark.api.JobService.CancelJob:input_type -> feast_spark.api.CancelJobRequest + 16, // 21: feast_spark.api.JobService.GetJob:input_type -> feast_spark.api.GetJobRequest + 20, // 22: feast_spark.api.JobService.GetHealthMetrics:input_type -> feast_spark.api.GetHealthMetricsRequest + 5, // 23: feast_spark.api.JobService.StartOfflineToOnlineIngestionJob:output_type -> feast_spark.api.StartOfflineToOnlineIngestionJobResponse + 7, // 24: feast_spark.api.JobService.ScheduleOfflineToOnlineIngestionJob:output_type -> feast_spark.api.ScheduleOfflineToOnlineIngestionJobResponse + 9, // 25: feast_spark.api.JobService.UnscheduleOfflineToOnlineIngestionJob:output_type -> feast_spark.api.UnscheduleOfflineToOnlineIngestionJobResponse + 11, // 26: feast_spark.api.JobService.GetHistoricalFeatures:output_type -> feast_spark.api.GetHistoricalFeaturesResponse + 14, // 27: feast_spark.api.JobService.ListJobs:output_type -> feast_spark.api.ListJobsResponse + 15, // 28: feast_spark.api.JobService.ListScheduledJob:output_type -> feast_spark.api.ListScheduledJobResponse + 19, // 29: feast_spark.api.JobService.CancelJob:output_type -> feast_spark.api.CancelJobResponse + 17, // 30: feast_spark.api.JobService.GetJob:output_type -> feast_spark.api.GetJobResponse + 21, // 31: feast_spark.api.JobService.GetHealthMetrics:output_type -> feast_spark.api.GetHealthMetricsResponse + 23, // [23:32] is the sub-list for method output_type + 14, // [14:23] is the sub-list for method input_type + 14, // [14:14] is the sub-list for extension type_name + 14, // [14:14] is the sub-list for extension extendee + 0, // [0:14] is the sub-list for field type_name } func init() { file_feast_spark_api_JobService_proto_init() } @@ -1695,7 +1913,7 @@ func file_feast_spark_api_JobService_proto_init() { } if !protoimpl.UnsafeEnabled { file_feast_spark_api_JobService_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Job); i { + switch v := v.(*ScheduledJob); i { case 0: return &v.state case 1: @@ -1707,7 +1925,7 @@ func file_feast_spark_api_JobService_proto_init() { } } file_feast_spark_api_JobService_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartOfflineToOnlineIngestionJobRequest); i { + switch v := v.(*Job); i { case 0: return &v.state case 1: @@ -1719,7 +1937,7 @@ func file_feast_spark_api_JobService_proto_init() { } } file_feast_spark_api_JobService_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartOfflineToOnlineIngestionJobResponse); i { + switch v := v.(*StartOfflineToOnlineIngestionJobRequest); i { case 0: return &v.state case 1: @@ -1731,7 +1949,7 @@ func file_feast_spark_api_JobService_proto_init() { } } file_feast_spark_api_JobService_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ScheduleOfflineToOnlineIngestionJobRequest); i { + switch v := v.(*StartOfflineToOnlineIngestionJobResponse); i { case 0: return &v.state case 1: @@ -1743,7 +1961,7 @@ func file_feast_spark_api_JobService_proto_init() { } } file_feast_spark_api_JobService_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ScheduleOfflineToOnlineIngestionJobResponse); i { + switch v := v.(*ScheduleOfflineToOnlineIngestionJobRequest); i { case 0: return &v.state case 1: @@ -1755,7 +1973,7 @@ func file_feast_spark_api_JobService_proto_init() { } } file_feast_spark_api_JobService_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnscheduleOfflineToOnlineIngestionJobRequest); i { + switch v := v.(*ScheduleOfflineToOnlineIngestionJobResponse); i { case 0: return &v.state case 1: @@ -1767,7 +1985,7 @@ func file_feast_spark_api_JobService_proto_init() { } } file_feast_spark_api_JobService_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnscheduleOfflineToOnlineIngestionJobResponse); i { + switch v := v.(*UnscheduleOfflineToOnlineIngestionJobRequest); i { case 0: return &v.state case 1: @@ -1779,7 +1997,7 @@ func file_feast_spark_api_JobService_proto_init() { } } file_feast_spark_api_JobService_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetHistoricalFeaturesRequest); i { + switch v := v.(*UnscheduleOfflineToOnlineIngestionJobResponse); i { case 0: return &v.state case 1: @@ -1791,7 +2009,7 @@ func file_feast_spark_api_JobService_proto_init() { } } file_feast_spark_api_JobService_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetHistoricalFeaturesResponse); i { + switch v := v.(*GetHistoricalFeaturesRequest); i { case 0: return &v.state case 1: @@ -1803,7 +2021,7 @@ func file_feast_spark_api_JobService_proto_init() { } } file_feast_spark_api_JobService_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListJobsRequest); i { + switch v := v.(*GetHistoricalFeaturesResponse); i { case 0: return &v.state case 1: @@ -1815,7 +2033,7 @@ func file_feast_spark_api_JobService_proto_init() { } } file_feast_spark_api_JobService_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListJobsResponse); i { + switch v := v.(*ListJobsRequest); i { case 0: return &v.state case 1: @@ -1827,7 +2045,7 @@ func file_feast_spark_api_JobService_proto_init() { } } file_feast_spark_api_JobService_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetJobRequest); i { + switch v := v.(*ListScheduledJobRequest); i { case 0: return &v.state case 1: @@ -1839,7 +2057,7 @@ func file_feast_spark_api_JobService_proto_init() { } } file_feast_spark_api_JobService_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetJobResponse); i { + switch v := v.(*ListJobsResponse); i { case 0: return &v.state case 1: @@ -1851,7 +2069,7 @@ func file_feast_spark_api_JobService_proto_init() { } } file_feast_spark_api_JobService_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CancelJobRequest); i { + switch v := v.(*ListScheduledJobResponse); i { case 0: return &v.state case 1: @@ -1863,7 +2081,7 @@ func file_feast_spark_api_JobService_proto_init() { } } file_feast_spark_api_JobService_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CancelJobResponse); i { + switch v := v.(*GetJobRequest); i { case 0: return &v.state case 1: @@ -1875,7 +2093,7 @@ func file_feast_spark_api_JobService_proto_init() { } } file_feast_spark_api_JobService_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetHealthMetricsRequest); i { + switch v := v.(*GetJobResponse); i { case 0: return &v.state case 1: @@ -1887,7 +2105,7 @@ func file_feast_spark_api_JobService_proto_init() { } } file_feast_spark_api_JobService_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetHealthMetricsResponse); i { + switch v := v.(*CancelJobRequest); i { case 0: return &v.state case 1: @@ -1899,7 +2117,7 @@ func file_feast_spark_api_JobService_proto_init() { } } file_feast_spark_api_JobService_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Job_RetrievalJobMeta); i { + switch v := v.(*CancelJobResponse); i { case 0: return &v.state case 1: @@ -1911,7 +2129,7 @@ func file_feast_spark_api_JobService_proto_init() { } } file_feast_spark_api_JobService_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Job_OfflineToOnlineMeta); i { + switch v := v.(*GetHealthMetricsRequest); i { case 0: return &v.state case 1: @@ -1923,6 +2141,42 @@ func file_feast_spark_api_JobService_proto_init() { } } file_feast_spark_api_JobService_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetHealthMetricsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_feast_spark_api_JobService_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Job_RetrievalJobMeta); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_feast_spark_api_JobService_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Job_OfflineToOnlineMeta); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_feast_spark_api_JobService_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Job_StreamToOnlineMeta); i { case 0: return &v.state @@ -1935,7 +2189,7 @@ func file_feast_spark_api_JobService_proto_init() { } } } - file_feast_spark_api_JobService_proto_msgTypes[0].OneofWrappers = []interface{}{ + file_feast_spark_api_JobService_proto_msgTypes[1].OneofWrappers = []interface{}{ (*Job_Retrieval)(nil), (*Job_BatchIngestion)(nil), (*Job_StreamIngestion)(nil), @@ -1946,7 +2200,7 @@ func file_feast_spark_api_JobService_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_feast_spark_api_JobService_proto_rawDesc, NumEnums: 2, - NumMessages: 20, + NumMessages: 23, NumExtensions: 0, NumServices: 1, }, diff --git a/caraml-store-sdk/go/protos/feast_spark/api/JobService_grpc.pb.go b/caraml-store-sdk/go/protos/feast_spark/api/JobService_grpc.pb.go index 393e4b6..c7ba8ce 100644 --- a/caraml-store-sdk/go/protos/feast_spark/api/JobService_grpc.pb.go +++ b/caraml-store-sdk/go/protos/feast_spark/api/JobService_grpc.pb.go @@ -24,6 +24,7 @@ const ( JobService_UnscheduleOfflineToOnlineIngestionJob_FullMethodName = "/feast_spark.api.JobService/UnscheduleOfflineToOnlineIngestionJob" JobService_GetHistoricalFeatures_FullMethodName = "/feast_spark.api.JobService/GetHistoricalFeatures" JobService_ListJobs_FullMethodName = "/feast_spark.api.JobService/ListJobs" + JobService_ListScheduledJob_FullMethodName = "/feast_spark.api.JobService/ListScheduledJob" JobService_CancelJob_FullMethodName = "/feast_spark.api.JobService/CancelJob" JobService_GetJob_FullMethodName = "/feast_spark.api.JobService/GetJob" JobService_GetHealthMetrics_FullMethodName = "/feast_spark.api.JobService/GetHealthMetrics" @@ -43,6 +44,8 @@ type JobServiceClient interface { GetHistoricalFeatures(ctx context.Context, in *GetHistoricalFeaturesRequest, opts ...grpc.CallOption) (*GetHistoricalFeaturesResponse, error) // List all types of jobs ListJobs(ctx context.Context, in *ListJobsRequest, opts ...grpc.CallOption) (*ListJobsResponse, error) + // List all scheduled jobs + ListScheduledJob(ctx context.Context, in *ListScheduledJobRequest, opts ...grpc.CallOption) (*ListScheduledJobResponse, error) // Cancel a single job CancelJob(ctx context.Context, in *CancelJobRequest, opts ...grpc.CallOption) (*CancelJobResponse, error) // Get details of a single job @@ -104,6 +107,15 @@ func (c *jobServiceClient) ListJobs(ctx context.Context, in *ListJobsRequest, op return out, nil } +func (c *jobServiceClient) ListScheduledJob(ctx context.Context, in *ListScheduledJobRequest, opts ...grpc.CallOption) (*ListScheduledJobResponse, error) { + out := new(ListScheduledJobResponse) + err := c.cc.Invoke(ctx, JobService_ListScheduledJob_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *jobServiceClient) CancelJob(ctx context.Context, in *CancelJobRequest, opts ...grpc.CallOption) (*CancelJobResponse, error) { out := new(CancelJobResponse) err := c.cc.Invoke(ctx, JobService_CancelJob_FullMethodName, in, out, opts...) @@ -145,6 +157,8 @@ type JobServiceServer interface { GetHistoricalFeatures(context.Context, *GetHistoricalFeaturesRequest) (*GetHistoricalFeaturesResponse, error) // List all types of jobs ListJobs(context.Context, *ListJobsRequest) (*ListJobsResponse, error) + // List all scheduled jobs + ListScheduledJob(context.Context, *ListScheduledJobRequest) (*ListScheduledJobResponse, error) // Cancel a single job CancelJob(context.Context, *CancelJobRequest) (*CancelJobResponse, error) // Get details of a single job @@ -172,6 +186,9 @@ func (UnimplementedJobServiceServer) GetHistoricalFeatures(context.Context, *Get func (UnimplementedJobServiceServer) ListJobs(context.Context, *ListJobsRequest) (*ListJobsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListJobs not implemented") } +func (UnimplementedJobServiceServer) ListScheduledJob(context.Context, *ListScheduledJobRequest) (*ListScheduledJobResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListScheduledJob not implemented") +} func (UnimplementedJobServiceServer) CancelJob(context.Context, *CancelJobRequest) (*CancelJobResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CancelJob not implemented") } @@ -283,6 +300,24 @@ func _JobService_ListJobs_Handler(srv interface{}, ctx context.Context, dec func return interceptor(ctx, in, info, handler) } +func _JobService_ListScheduledJob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListScheduledJobRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(JobServiceServer).ListScheduledJob(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: JobService_ListScheduledJob_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(JobServiceServer).ListScheduledJob(ctx, req.(*ListScheduledJobRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _JobService_CancelJob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CancelJobRequest) if err := dec(in); err != nil { @@ -364,6 +399,10 @@ var JobService_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListJobs", Handler: _JobService_ListJobs_Handler, }, + { + MethodName: "ListScheduledJob", + Handler: _JobService_ListScheduledJob_Handler, + }, { MethodName: "CancelJob", Handler: _JobService_CancelJob_Handler, diff --git a/caraml-store-sdk/python/feast/client.py b/caraml-store-sdk/python/feast/client.py index c5a0aa4..0bfeaf5 100644 --- a/caraml-store-sdk/python/feast/client.py +++ b/caraml-store-sdk/python/feast/client.py @@ -33,7 +33,7 @@ GetJobRequest, ListJobsRequest, Job, - ScheduleOfflineToOnlineIngestionJobRequest, + ScheduleOfflineToOnlineIngestionJobRequest, ScheduledJob, ListScheduledJobRequest, ) from feast_spark.api.JobService_pb2_grpc import JobServiceStub @@ -386,6 +386,18 @@ def list_job(self, table: str, project: str, include_terminated=True) -> List[Jo response = self._job_service.ListJobs(request) return response.jobs + def list_scheduled_job(self, project = "", table_name = "") -> List[ScheduledJob]: + """ + List scheduled jobs + Args: + project: Filter by project, if non empty. + table_name: Filter by table name, if non empty + Returns: List of Scheduled Job protobuf object + """ + request = ListScheduledJobRequest(project=project, table_name=table_name) + response = self._job_service.ListScheduledJob(request) + return response.jobs + def delete_feature_table(self, feature_table: str, project: str): """ Delete Feature Table diff --git a/caraml-store-sdk/python/feast_spark/api/JobService_pb2.py b/caraml-store-sdk/python/feast_spark/api/JobService_pb2.py index 2239e36..913e867 100644 --- a/caraml-store-sdk/python/feast_spark/api/JobService_pb2.py +++ b/caraml-store-sdk/python/feast_spark/api/JobService_pb2.py @@ -15,7 +15,7 @@ from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n feast_spark/api/JobService.proto\x12\x0f\x66\x65\x61st_spark.api\x1a\x1b\x66\x65\x61st/core/DataSource.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xa6\x05\n\x03Job\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12,\n\x04type\x18\x02 \x01(\x0e\x32\x18.feast_spark.api.JobTypeR\x04type\x12\x32\n\x06status\x18\x03 \x01(\x0e\x32\x1a.feast_spark.api.JobStatusR\x06status\x12\x12\n\x04hash\x18\x04 \x01(\tR\x04hash\x12\x39\n\nstart_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tstartTime\x12\x45\n\tretrieval\x18\x06 \x01(\x0b\x32%.feast_spark.api.Job.RetrievalJobMetaH\x00R\tretrieval\x12S\n\x0f\x62\x61tch_ingestion\x18\x07 \x01(\x0b\x32(.feast_spark.api.Job.OfflineToOnlineMetaH\x00R\x0e\x62\x61tchIngestion\x12T\n\x10stream_ingestion\x18\x08 \x01(\x0b\x32\'.feast_spark.api.Job.StreamToOnlineMetaH\x00R\x0fstreamIngestion\x12\x17\n\x07log_uri\x18\t \x01(\tR\x06logUri\x12#\n\rerror_message\x18\n \x01(\tR\x0c\x65rrorMessage\x1a;\n\x10RetrievalJobMeta\x12\'\n\x0foutput_location\x18\x01 \x01(\tR\x0eoutputLocation\x1a\x34\n\x13OfflineToOnlineMeta\x12\x1d\n\ntable_name\x18\x01 \x01(\tR\ttableName\x1a\x33\n\x12StreamToOnlineMeta\x12\x1d\n\ntable_name\x18\x01 \x01(\tR\ttableNameB\x06\n\x04meta\"\xfd\x01\n\'StartOfflineToOnlineIngestionJobRequest\x12\x18\n\x07project\x18\x01 \x01(\tR\x07project\x12\x1d\n\ntable_name\x18\x02 \x01(\tR\ttableName\x12\x39\n\nstart_date\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tstartDate\x12\x35\n\x08\x65nd_date\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x07\x65ndDate\x12\'\n\x0f\x64\x65lta_ingestion\x18\x05 \x01(\x08R\x0e\x64\x65ltaIngestion\"\xb4\x01\n(StartOfflineToOnlineIngestionJobResponse\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12@\n\x0ejob_start_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x0cjobStartTime\x12\x1d\n\ntable_name\x18\x03 \x01(\tR\ttableName\x12\x17\n\x07log_uri\x18\x04 \x01(\tR\x06logUri\"\xb9\x01\n*ScheduleOfflineToOnlineIngestionJobRequest\x12\x18\n\x07project\x18\x01 \x01(\tR\x07project\x12\x1d\n\ntable_name\x18\x02 \x01(\tR\ttableName\x12-\n\x12ingestion_timespan\x18\x03 \x01(\x05R\x11ingestionTimespan\x12#\n\rcron_schedule\x18\x04 \x01(\tR\x0c\x63ronSchedule\"-\n+ScheduleOfflineToOnlineIngestionJobResponse\"g\n,UnscheduleOfflineToOnlineIngestionJobRequest\x12\x18\n\x07project\x18\x01 \x01(\tR\x07project\x12\x1d\n\ntable_name\x18\x02 \x01(\tR\ttableName\"/\n-UnscheduleOfflineToOnlineIngestionJobResponse\"\xe6\x01\n\x1cGetHistoricalFeaturesRequest\x12!\n\x0c\x66\x65\x61ture_refs\x18\x01 \x03(\tR\x0b\x66\x65\x61tureRefs\x12;\n\rentity_source\x18\x02 \x01(\x0b\x32\x16.feast.core.DataSourceR\x0c\x65ntitySource\x12\x18\n\x07project\x18\x03 \x01(\tR\x07project\x12\'\n\x0foutput_location\x18\x04 \x01(\tR\x0eoutputLocation\x12#\n\routput_format\x18\x05 \x01(\tR\x0coutputFormat\"\xb2\x01\n\x1dGetHistoricalFeaturesResponse\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12&\n\x0foutput_file_uri\x18\x02 \x01(\tR\routputFileUri\x12@\n\x0ejob_start_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x0cjobStartTime\x12\x17\n\x07log_uri\x18\x04 \x01(\tR\x06logUri\"y\n\x0fListJobsRequest\x12-\n\x12include_terminated\x18\x01 \x01(\x08R\x11includeTerminated\x12\x1d\n\ntable_name\x18\x02 \x01(\tR\ttableName\x12\x18\n\x07project\x18\x03 \x01(\tR\x07project\"<\n\x10ListJobsResponse\x12(\n\x04jobs\x18\x01 \x03(\x0b\x32\x14.feast_spark.api.JobR\x04jobs\"&\n\rGetJobRequest\x12\x15\n\x06job_id\x18\x01 \x01(\tR\x05jobId\"8\n\x0eGetJobResponse\x12&\n\x03job\x18\x01 \x01(\x0b\x32\x14.feast_spark.api.JobR\x03job\")\n\x10\x43\x61ncelJobRequest\x12\x15\n\x06job_id\x18\x01 \x01(\tR\x05jobId\"\x13\n\x11\x43\x61ncelJobResponse\"T\n\x17GetHealthMetricsRequest\x12\x18\n\x07project\x18\x01 \x01(\tR\x07project\x12\x1f\n\x0btable_names\x18\x02 \x03(\tR\ntableNames\"J\n\x18GetHealthMetricsResponse\x12\x16\n\x06passed\x18\x01 \x03(\tR\x06passed\x12\x16\n\x06\x66\x61iled\x18\x02 \x03(\tR\x06\x66\x61iled*`\n\x07JobType\x12\x0f\n\x0bINVALID_JOB\x10\x00\x12\x17\n\x13\x42\x41TCH_INGESTION_JOB\x10\x01\x12\x18\n\x14STREAM_INGESTION_JOB\x10\x02\x12\x11\n\rRETRIEVAL_JOB\x10\x04*~\n\tJobStatus\x12\x16\n\x12JOB_STATUS_INVALID\x10\x00\x12\x16\n\x12JOB_STATUS_PENDING\x10\x01\x12\x16\n\x12JOB_STATUS_RUNNING\x10\x02\x12\x13\n\x0fJOB_STATUS_DONE\x10\x03\x12\x14\n\x10JOB_STATUS_ERROR\x10\x04\x32\xc3\x07\n\nJobService\x12\x97\x01\n StartOfflineToOnlineIngestionJob\x12\x38.feast_spark.api.StartOfflineToOnlineIngestionJobRequest\x1a\x39.feast_spark.api.StartOfflineToOnlineIngestionJobResponse\x12\xa0\x01\n#ScheduleOfflineToOnlineIngestionJob\x12;.feast_spark.api.ScheduleOfflineToOnlineIngestionJobRequest\x1a<.feast_spark.api.ScheduleOfflineToOnlineIngestionJobResponse\x12\xa6\x01\n%UnscheduleOfflineToOnlineIngestionJob\x12=.feast_spark.api.UnscheduleOfflineToOnlineIngestionJobRequest\x1a>.feast_spark.api.UnscheduleOfflineToOnlineIngestionJobResponse\x12v\n\x15GetHistoricalFeatures\x12-.feast_spark.api.GetHistoricalFeaturesRequest\x1a..feast_spark.api.GetHistoricalFeaturesResponse\x12O\n\x08ListJobs\x12 .feast_spark.api.ListJobsRequest\x1a!.feast_spark.api.ListJobsResponse\x12R\n\tCancelJob\x12!.feast_spark.api.CancelJobRequest\x1a\".feast_spark.api.CancelJobResponse\x12I\n\x06GetJob\x12\x1e.feast_spark.api.GetJobRequest\x1a\x1f.feast_spark.api.GetJobResponse\x12g\n\x10GetHealthMetrics\x12(.feast_spark.api.GetHealthMetricsRequest\x1a).feast_spark.api.GetHealthMetricsResponseB\x86\x01\n$dev.caraml.store.protobuf.jobserviceB\x0fJobServiceProtoZMgithub.com/caraml-dev/caraml-store/caraml-store-sdk/go/protos/feast_spark/apib\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n feast_spark/api/JobService.proto\x12\x0f\x66\x65\x61st_spark.api\x1a\x1b\x66\x65\x61st/core/DataSource.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xab\x01\n\x0cScheduledJob\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x1d\n\ntable_name\x18\x02 \x01(\tR\ttableName\x12\x18\n\x07project\x18\x03 \x01(\tR\x07project\x12-\n\x12ingestion_timespan\x18\x04 \x01(\x05R\x11ingestionTimespan\x12#\n\rcron_schedule\x18\x05 \x01(\tR\x0c\x63ronSchedule\"\xa6\x05\n\x03Job\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12,\n\x04type\x18\x02 \x01(\x0e\x32\x18.feast_spark.api.JobTypeR\x04type\x12\x32\n\x06status\x18\x03 \x01(\x0e\x32\x1a.feast_spark.api.JobStatusR\x06status\x12\x12\n\x04hash\x18\x04 \x01(\tR\x04hash\x12\x39\n\nstart_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tstartTime\x12\x45\n\tretrieval\x18\x06 \x01(\x0b\x32%.feast_spark.api.Job.RetrievalJobMetaH\x00R\tretrieval\x12S\n\x0f\x62\x61tch_ingestion\x18\x07 \x01(\x0b\x32(.feast_spark.api.Job.OfflineToOnlineMetaH\x00R\x0e\x62\x61tchIngestion\x12T\n\x10stream_ingestion\x18\x08 \x01(\x0b\x32\'.feast_spark.api.Job.StreamToOnlineMetaH\x00R\x0fstreamIngestion\x12\x17\n\x07log_uri\x18\t \x01(\tR\x06logUri\x12#\n\rerror_message\x18\n \x01(\tR\x0c\x65rrorMessage\x1a;\n\x10RetrievalJobMeta\x12\'\n\x0foutput_location\x18\x01 \x01(\tR\x0eoutputLocation\x1a\x34\n\x13OfflineToOnlineMeta\x12\x1d\n\ntable_name\x18\x01 \x01(\tR\ttableName\x1a\x33\n\x12StreamToOnlineMeta\x12\x1d\n\ntable_name\x18\x01 \x01(\tR\ttableNameB\x06\n\x04meta\"\xfd\x01\n\'StartOfflineToOnlineIngestionJobRequest\x12\x18\n\x07project\x18\x01 \x01(\tR\x07project\x12\x1d\n\ntable_name\x18\x02 \x01(\tR\ttableName\x12\x39\n\nstart_date\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tstartDate\x12\x35\n\x08\x65nd_date\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x07\x65ndDate\x12\'\n\x0f\x64\x65lta_ingestion\x18\x05 \x01(\x08R\x0e\x64\x65ltaIngestion\"\xb4\x01\n(StartOfflineToOnlineIngestionJobResponse\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12@\n\x0ejob_start_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x0cjobStartTime\x12\x1d\n\ntable_name\x18\x03 \x01(\tR\ttableName\x12\x17\n\x07log_uri\x18\x04 \x01(\tR\x06logUri\"\xb9\x01\n*ScheduleOfflineToOnlineIngestionJobRequest\x12\x18\n\x07project\x18\x01 \x01(\tR\x07project\x12\x1d\n\ntable_name\x18\x02 \x01(\tR\ttableName\x12-\n\x12ingestion_timespan\x18\x03 \x01(\x05R\x11ingestionTimespan\x12#\n\rcron_schedule\x18\x04 \x01(\tR\x0c\x63ronSchedule\"-\n+ScheduleOfflineToOnlineIngestionJobResponse\"g\n,UnscheduleOfflineToOnlineIngestionJobRequest\x12\x18\n\x07project\x18\x01 \x01(\tR\x07project\x12\x1d\n\ntable_name\x18\x02 \x01(\tR\ttableName\"/\n-UnscheduleOfflineToOnlineIngestionJobResponse\"\xe6\x01\n\x1cGetHistoricalFeaturesRequest\x12!\n\x0c\x66\x65\x61ture_refs\x18\x01 \x03(\tR\x0b\x66\x65\x61tureRefs\x12;\n\rentity_source\x18\x02 \x01(\x0b\x32\x16.feast.core.DataSourceR\x0c\x65ntitySource\x12\x18\n\x07project\x18\x03 \x01(\tR\x07project\x12\'\n\x0foutput_location\x18\x04 \x01(\tR\x0eoutputLocation\x12#\n\routput_format\x18\x05 \x01(\tR\x0coutputFormat\"\xb2\x01\n\x1dGetHistoricalFeaturesResponse\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12&\n\x0foutput_file_uri\x18\x02 \x01(\tR\routputFileUri\x12@\n\x0ejob_start_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x0cjobStartTime\x12\x17\n\x07log_uri\x18\x04 \x01(\tR\x06logUri\"y\n\x0fListJobsRequest\x12-\n\x12include_terminated\x18\x01 \x01(\x08R\x11includeTerminated\x12\x1d\n\ntable_name\x18\x02 \x01(\tR\ttableName\x12\x18\n\x07project\x18\x03 \x01(\tR\x07project\"R\n\x17ListScheduledJobRequest\x12\x18\n\x07project\x18\x01 \x01(\tR\x07project\x12\x1d\n\ntable_name\x18\x02 \x01(\tR\ttableName\"<\n\x10ListJobsResponse\x12(\n\x04jobs\x18\x01 \x03(\x0b\x32\x14.feast_spark.api.JobR\x04jobs\"M\n\x18ListScheduledJobResponse\x12\x31\n\x04jobs\x18\x01 \x03(\x0b\x32\x1d.feast_spark.api.ScheduledJobR\x04jobs\"&\n\rGetJobRequest\x12\x15\n\x06job_id\x18\x01 \x01(\tR\x05jobId\"8\n\x0eGetJobResponse\x12&\n\x03job\x18\x01 \x01(\x0b\x32\x14.feast_spark.api.JobR\x03job\")\n\x10\x43\x61ncelJobRequest\x12\x15\n\x06job_id\x18\x01 \x01(\tR\x05jobId\"\x13\n\x11\x43\x61ncelJobResponse\"T\n\x17GetHealthMetricsRequest\x12\x18\n\x07project\x18\x01 \x01(\tR\x07project\x12\x1f\n\x0btable_names\x18\x02 \x03(\tR\ntableNames\"J\n\x18GetHealthMetricsResponse\x12\x16\n\x06passed\x18\x01 \x03(\tR\x06passed\x12\x16\n\x06\x66\x61iled\x18\x02 \x03(\tR\x06\x66\x61iled*`\n\x07JobType\x12\x0f\n\x0bINVALID_JOB\x10\x00\x12\x17\n\x13\x42\x41TCH_INGESTION_JOB\x10\x01\x12\x18\n\x14STREAM_INGESTION_JOB\x10\x02\x12\x11\n\rRETRIEVAL_JOB\x10\x04*~\n\tJobStatus\x12\x16\n\x12JOB_STATUS_INVALID\x10\x00\x12\x16\n\x12JOB_STATUS_PENDING\x10\x01\x12\x16\n\x12JOB_STATUS_RUNNING\x10\x02\x12\x13\n\x0fJOB_STATUS_DONE\x10\x03\x12\x14\n\x10JOB_STATUS_ERROR\x10\x04\x32\xac\x08\n\nJobService\x12\x97\x01\n StartOfflineToOnlineIngestionJob\x12\x38.feast_spark.api.StartOfflineToOnlineIngestionJobRequest\x1a\x39.feast_spark.api.StartOfflineToOnlineIngestionJobResponse\x12\xa0\x01\n#ScheduleOfflineToOnlineIngestionJob\x12;.feast_spark.api.ScheduleOfflineToOnlineIngestionJobRequest\x1a<.feast_spark.api.ScheduleOfflineToOnlineIngestionJobResponse\x12\xa6\x01\n%UnscheduleOfflineToOnlineIngestionJob\x12=.feast_spark.api.UnscheduleOfflineToOnlineIngestionJobRequest\x1a>.feast_spark.api.UnscheduleOfflineToOnlineIngestionJobResponse\x12v\n\x15GetHistoricalFeatures\x12-.feast_spark.api.GetHistoricalFeaturesRequest\x1a..feast_spark.api.GetHistoricalFeaturesResponse\x12O\n\x08ListJobs\x12 .feast_spark.api.ListJobsRequest\x1a!.feast_spark.api.ListJobsResponse\x12g\n\x10ListScheduledJob\x12(.feast_spark.api.ListScheduledJobRequest\x1a).feast_spark.api.ListScheduledJobResponse\x12R\n\tCancelJob\x12!.feast_spark.api.CancelJobRequest\x1a\".feast_spark.api.CancelJobResponse\x12I\n\x06GetJob\x12\x1e.feast_spark.api.GetJobRequest\x1a\x1f.feast_spark.api.GetJobResponse\x12g\n\x10GetHealthMetrics\x12(.feast_spark.api.GetHealthMetricsRequest\x1a).feast_spark.api.GetHealthMetricsResponseB\x86\x01\n$dev.caraml.store.protobuf.jobserviceB\x0fJobServiceProtoZMgithub.com/caraml-dev/caraml-store/caraml-store-sdk/go/protos/feast_spark/apib\x06proto3') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'feast_spark.api.JobService_pb2', globals()) @@ -23,50 +23,56 @@ DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b'\n$dev.caraml.store.protobuf.jobserviceB\017JobServiceProtoZMgithub.com/caraml-dev/caraml-store/caraml-store-sdk/go/protos/feast_spark/api' - _JOBTYPE._serialized_start=2547 - _JOBTYPE._serialized_end=2643 - _JOBSTATUS._serialized_start=2645 - _JOBSTATUS._serialized_end=2771 - _JOB._serialized_start=116 - _JOB._serialized_end=794 - _JOB_RETRIEVALJOBMETA._serialized_start=620 - _JOB_RETRIEVALJOBMETA._serialized_end=679 - _JOB_OFFLINETOONLINEMETA._serialized_start=681 - _JOB_OFFLINETOONLINEMETA._serialized_end=733 - _JOB_STREAMTOONLINEMETA._serialized_start=735 - _JOB_STREAMTOONLINEMETA._serialized_end=786 - _STARTOFFLINETOONLINEINGESTIONJOBREQUEST._serialized_start=797 - _STARTOFFLINETOONLINEINGESTIONJOBREQUEST._serialized_end=1050 - _STARTOFFLINETOONLINEINGESTIONJOBRESPONSE._serialized_start=1053 - _STARTOFFLINETOONLINEINGESTIONJOBRESPONSE._serialized_end=1233 - _SCHEDULEOFFLINETOONLINEINGESTIONJOBREQUEST._serialized_start=1236 - _SCHEDULEOFFLINETOONLINEINGESTIONJOBREQUEST._serialized_end=1421 - _SCHEDULEOFFLINETOONLINEINGESTIONJOBRESPONSE._serialized_start=1423 - _SCHEDULEOFFLINETOONLINEINGESTIONJOBRESPONSE._serialized_end=1468 - _UNSCHEDULEOFFLINETOONLINEINGESTIONJOBREQUEST._serialized_start=1470 - _UNSCHEDULEOFFLINETOONLINEINGESTIONJOBREQUEST._serialized_end=1573 - _UNSCHEDULEOFFLINETOONLINEINGESTIONJOBRESPONSE._serialized_start=1575 - _UNSCHEDULEOFFLINETOONLINEINGESTIONJOBRESPONSE._serialized_end=1622 - _GETHISTORICALFEATURESREQUEST._serialized_start=1625 - _GETHISTORICALFEATURESREQUEST._serialized_end=1855 - _GETHISTORICALFEATURESRESPONSE._serialized_start=1858 - _GETHISTORICALFEATURESRESPONSE._serialized_end=2036 - _LISTJOBSREQUEST._serialized_start=2038 - _LISTJOBSREQUEST._serialized_end=2159 - _LISTJOBSRESPONSE._serialized_start=2161 - _LISTJOBSRESPONSE._serialized_end=2221 - _GETJOBREQUEST._serialized_start=2223 - _GETJOBREQUEST._serialized_end=2261 - _GETJOBRESPONSE._serialized_start=2263 - _GETJOBRESPONSE._serialized_end=2319 - _CANCELJOBREQUEST._serialized_start=2321 - _CANCELJOBREQUEST._serialized_end=2362 - _CANCELJOBRESPONSE._serialized_start=2364 - _CANCELJOBRESPONSE._serialized_end=2383 - _GETHEALTHMETRICSREQUEST._serialized_start=2385 - _GETHEALTHMETRICSREQUEST._serialized_end=2469 - _GETHEALTHMETRICSRESPONSE._serialized_start=2471 - _GETHEALTHMETRICSRESPONSE._serialized_end=2545 - _JOBSERVICE._serialized_start=2774 - _JOBSERVICE._serialized_end=3737 + _JOBTYPE._serialized_start=2884 + _JOBTYPE._serialized_end=2980 + _JOBSTATUS._serialized_start=2982 + _JOBSTATUS._serialized_end=3108 + _SCHEDULEDJOB._serialized_start=116 + _SCHEDULEDJOB._serialized_end=287 + _JOB._serialized_start=290 + _JOB._serialized_end=968 + _JOB_RETRIEVALJOBMETA._serialized_start=794 + _JOB_RETRIEVALJOBMETA._serialized_end=853 + _JOB_OFFLINETOONLINEMETA._serialized_start=855 + _JOB_OFFLINETOONLINEMETA._serialized_end=907 + _JOB_STREAMTOONLINEMETA._serialized_start=909 + _JOB_STREAMTOONLINEMETA._serialized_end=960 + _STARTOFFLINETOONLINEINGESTIONJOBREQUEST._serialized_start=971 + _STARTOFFLINETOONLINEINGESTIONJOBREQUEST._serialized_end=1224 + _STARTOFFLINETOONLINEINGESTIONJOBRESPONSE._serialized_start=1227 + _STARTOFFLINETOONLINEINGESTIONJOBRESPONSE._serialized_end=1407 + _SCHEDULEOFFLINETOONLINEINGESTIONJOBREQUEST._serialized_start=1410 + _SCHEDULEOFFLINETOONLINEINGESTIONJOBREQUEST._serialized_end=1595 + _SCHEDULEOFFLINETOONLINEINGESTIONJOBRESPONSE._serialized_start=1597 + _SCHEDULEOFFLINETOONLINEINGESTIONJOBRESPONSE._serialized_end=1642 + _UNSCHEDULEOFFLINETOONLINEINGESTIONJOBREQUEST._serialized_start=1644 + _UNSCHEDULEOFFLINETOONLINEINGESTIONJOBREQUEST._serialized_end=1747 + _UNSCHEDULEOFFLINETOONLINEINGESTIONJOBRESPONSE._serialized_start=1749 + _UNSCHEDULEOFFLINETOONLINEINGESTIONJOBRESPONSE._serialized_end=1796 + _GETHISTORICALFEATURESREQUEST._serialized_start=1799 + _GETHISTORICALFEATURESREQUEST._serialized_end=2029 + _GETHISTORICALFEATURESRESPONSE._serialized_start=2032 + _GETHISTORICALFEATURESRESPONSE._serialized_end=2210 + _LISTJOBSREQUEST._serialized_start=2212 + _LISTJOBSREQUEST._serialized_end=2333 + _LISTSCHEDULEDJOBREQUEST._serialized_start=2335 + _LISTSCHEDULEDJOBREQUEST._serialized_end=2417 + _LISTJOBSRESPONSE._serialized_start=2419 + _LISTJOBSRESPONSE._serialized_end=2479 + _LISTSCHEDULEDJOBRESPONSE._serialized_start=2481 + _LISTSCHEDULEDJOBRESPONSE._serialized_end=2558 + _GETJOBREQUEST._serialized_start=2560 + _GETJOBREQUEST._serialized_end=2598 + _GETJOBRESPONSE._serialized_start=2600 + _GETJOBRESPONSE._serialized_end=2656 + _CANCELJOBREQUEST._serialized_start=2658 + _CANCELJOBREQUEST._serialized_end=2699 + _CANCELJOBRESPONSE._serialized_start=2701 + _CANCELJOBRESPONSE._serialized_end=2720 + _GETHEALTHMETRICSREQUEST._serialized_start=2722 + _GETHEALTHMETRICSREQUEST._serialized_end=2806 + _GETHEALTHMETRICSRESPONSE._serialized_start=2808 + _GETHEALTHMETRICSRESPONSE._serialized_end=2882 + _JOBSERVICE._serialized_start=3111 + _JOBSERVICE._serialized_end=4179 # @@protoc_insertion_point(module_scope) diff --git a/caraml-store-sdk/python/feast_spark/api/JobService_pb2.pyi b/caraml-store-sdk/python/feast_spark/api/JobService_pb2.pyi index 260bb06..1930af3 100644 --- a/caraml-store-sdk/python/feast_spark/api/JobService_pb2.pyi +++ b/caraml-store-sdk/python/feast_spark/api/JobService_pb2.pyi @@ -136,6 +136,20 @@ class ListJobsResponse(_message.Message): jobs: _containers.RepeatedCompositeFieldContainer[Job] def __init__(self, jobs: _Optional[_Iterable[_Union[Job, _Mapping]]] = ...) -> None: ... +class ListScheduledJobRequest(_message.Message): + __slots__ = ["project", "table_name"] + PROJECT_FIELD_NUMBER: _ClassVar[int] + TABLE_NAME_FIELD_NUMBER: _ClassVar[int] + project: str + table_name: str + def __init__(self, project: _Optional[str] = ..., table_name: _Optional[str] = ...) -> None: ... + +class ListScheduledJobResponse(_message.Message): + __slots__ = ["jobs"] + JOBS_FIELD_NUMBER: _ClassVar[int] + jobs: _containers.RepeatedCompositeFieldContainer[ScheduledJob] + def __init__(self, jobs: _Optional[_Iterable[_Union[ScheduledJob, _Mapping]]] = ...) -> None: ... + class ScheduleOfflineToOnlineIngestionJobRequest(_message.Message): __slots__ = ["cron_schedule", "ingestion_timespan", "project", "table_name"] CRON_SCHEDULE_FIELD_NUMBER: _ClassVar[int] @@ -152,6 +166,20 @@ class ScheduleOfflineToOnlineIngestionJobResponse(_message.Message): __slots__ = [] def __init__(self) -> None: ... +class ScheduledJob(_message.Message): + __slots__ = ["cron_schedule", "id", "ingestion_timespan", "project", "table_name"] + CRON_SCHEDULE_FIELD_NUMBER: _ClassVar[int] + ID_FIELD_NUMBER: _ClassVar[int] + INGESTION_TIMESPAN_FIELD_NUMBER: _ClassVar[int] + PROJECT_FIELD_NUMBER: _ClassVar[int] + TABLE_NAME_FIELD_NUMBER: _ClassVar[int] + cron_schedule: str + id: str + ingestion_timespan: int + project: str + table_name: str + def __init__(self, id: _Optional[str] = ..., table_name: _Optional[str] = ..., project: _Optional[str] = ..., ingestion_timespan: _Optional[int] = ..., cron_schedule: _Optional[str] = ...) -> None: ... + class StartOfflineToOnlineIngestionJobRequest(_message.Message): __slots__ = ["delta_ingestion", "end_date", "project", "start_date", "table_name"] DELTA_INGESTION_FIELD_NUMBER: _ClassVar[int] diff --git a/caraml-store-sdk/python/feast_spark/api/JobService_pb2_grpc.py b/caraml-store-sdk/python/feast_spark/api/JobService_pb2_grpc.py index 65278bd..b0073e0 100644 --- a/caraml-store-sdk/python/feast_spark/api/JobService_pb2_grpc.py +++ b/caraml-store-sdk/python/feast_spark/api/JobService_pb2_grpc.py @@ -39,6 +39,11 @@ def __init__(self, channel): request_serializer=feast__spark_dot_api_dot_JobService__pb2.ListJobsRequest.SerializeToString, response_deserializer=feast__spark_dot_api_dot_JobService__pb2.ListJobsResponse.FromString, ) + self.ListScheduledJob = channel.unary_unary( + '/feast_spark.api.JobService/ListScheduledJob', + request_serializer=feast__spark_dot_api_dot_JobService__pb2.ListScheduledJobRequest.SerializeToString, + response_deserializer=feast__spark_dot_api_dot_JobService__pb2.ListScheduledJobResponse.FromString, + ) self.CancelJob = channel.unary_unary( '/feast_spark.api.JobService/CancelJob', request_serializer=feast__spark_dot_api_dot_JobService__pb2.CancelJobRequest.SerializeToString, @@ -94,6 +99,13 @@ def ListJobs(self, request, context): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') + def ListScheduledJob(self, request, context): + """List all scheduled jobs + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + def CancelJob(self, request, context): """Cancel a single job """ @@ -143,6 +155,11 @@ def add_JobServiceServicer_to_server(servicer, server): request_deserializer=feast__spark_dot_api_dot_JobService__pb2.ListJobsRequest.FromString, response_serializer=feast__spark_dot_api_dot_JobService__pb2.ListJobsResponse.SerializeToString, ), + 'ListScheduledJob': grpc.unary_unary_rpc_method_handler( + servicer.ListScheduledJob, + request_deserializer=feast__spark_dot_api_dot_JobService__pb2.ListScheduledJobRequest.FromString, + response_serializer=feast__spark_dot_api_dot_JobService__pb2.ListScheduledJobResponse.SerializeToString, + ), 'CancelJob': grpc.unary_unary_rpc_method_handler( servicer.CancelJob, request_deserializer=feast__spark_dot_api_dot_JobService__pb2.CancelJobRequest.FromString, @@ -253,6 +270,23 @@ def ListJobs(request, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + @staticmethod + def ListScheduledJob(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/feast_spark.api.JobService/ListScheduledJob', + feast__spark_dot_api_dot_JobService__pb2.ListScheduledJobRequest.SerializeToString, + feast__spark_dot_api_dot_JobService__pb2.ListScheduledJobResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + @staticmethod def CancelJob(request, target,