From 68a26af40e1f24a84a6580691321e956fb787083 Mon Sep 17 00:00:00 2001 From: Khor Shu Heng Date: Mon, 20 May 2024 11:12:26 +0800 Subject: [PATCH] feat: add delete/unschedule job API --- .../proto/feast_spark/api/JobService.proto | 9 + .../caraml/store/api/JobGrpcServiceImpl.java | 19 + .../dev/caraml/store/sparkjob/JobService.java | 8 + .../store/sparkjob/SparkOperatorApi.java | 5 + .../store/sparkjob/SparkOperatorApiImpl.java | 20 + .../protos/feast_spark/api/JobService.pb.go | 428 +++++++++++------- .../feast_spark/api/JobService_grpc.pb.go | 39 ++ caraml-store-sdk/python/feast/client.py | 20 + .../python/feast_spark/api/JobService_pb2.py | 26 +- .../python/feast_spark/api/JobService_pb2.pyi | 10 + .../feast_spark/api/JobService_pb2_grpc.py | 34 ++ 11 files changed, 455 insertions(+), 163 deletions(-) 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 776a7d9..fd534e1 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 @@ -34,6 +34,9 @@ service JobService { // Cancel a single job rpc CancelJob (CancelJobRequest) returns (CancelJobResponse); + // Unschedule a job + rpc UnscheduleJob (UnscheduleJobRequest) returns (UnscheduleJobResponse); + // Get details of a single job rpc GetJob (GetJobRequest) returns (GetJobResponse); @@ -251,6 +254,12 @@ message CancelJobRequest{ message CancelJobResponse {} +message UnscheduleJobRequest { + string job_id = 1; +} + +message UnscheduleJobResponse {} + message GetHealthMetricsRequest { string project = 1; repeated string table_names = 2; 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 33320da..f51d545 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 @@ -2,6 +2,8 @@ import dev.caraml.store.protobuf.jobservice.JobServiceGrpc; import dev.caraml.store.protobuf.jobservice.JobServiceProto; +import dev.caraml.store.protobuf.jobservice.JobServiceProto.CancelJobRequest; +import dev.caraml.store.protobuf.jobservice.JobServiceProto.CancelJobResponse; import dev.caraml.store.protobuf.jobservice.JobServiceProto.GetHistoricalFeaturesRequest; import dev.caraml.store.protobuf.jobservice.JobServiceProto.GetHistoricalFeaturesResponse; import dev.caraml.store.protobuf.jobservice.JobServiceProto.GetJobRequest; @@ -16,6 +18,8 @@ import dev.caraml.store.protobuf.jobservice.JobServiceProto.StartOfflineToOnlineIngestionJobResponse; import dev.caraml.store.protobuf.jobservice.JobServiceProto.StartStreamIngestionJobRequest; import dev.caraml.store.protobuf.jobservice.JobServiceProto.StartStreamIngestionJobResponse; +import dev.caraml.store.protobuf.jobservice.JobServiceProto.UnscheduleJobRequest; +import dev.caraml.store.protobuf.jobservice.JobServiceProto.UnscheduleJobResponse; import dev.caraml.store.sparkjob.JobNotFoundException; import dev.caraml.store.sparkjob.JobService; import io.grpc.stub.StreamObserver; @@ -139,4 +143,19 @@ public void getJob(GetJobRequest request, StreamObserver respons responseObserver.onNext(response); responseObserver.onCompleted(); } + + @Override + public void cancelJob( + CancelJobRequest request, StreamObserver responseObserver) { + jobService.cancelJob(request.getJobId()); + responseObserver.onNext(CancelJobResponse.getDefaultInstance()); + responseObserver.onCompleted(); + } + + public void unscheduleJob( + UnscheduleJobRequest request, StreamObserver responseObserver) { + jobService.unscheduleJob(request.getJobId()); + responseObserver.onNext(UnscheduleJobResponse.getDefaultInstance()); + responseObserver.onCompleted(); + } } 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 f9cdc75..4f616f1 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 @@ -535,6 +535,14 @@ public Optional getJob(String id) { return sparkOperatorApi.getSparkApplication(namespace, id).map(this::sparkApplicationToJob); } + public void cancelJob(String id) { + sparkOperatorApi.deleteSparkApplication(namespace, id); + } + + public void unscheduleJob(String id) { + sparkOperatorApi.deleteScheduledSparkApplication(namespace, id); + } + private String generateProjectTableHash(String project, String tableName) { return DigestUtils.md5Hex(String.format("%s:%s", project, tableName)); } 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 29c9399..63009da 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 @@ -26,4 +26,9 @@ List listScheduled(String namespace, String labelSele Optional getScheduledSparkApplication(String namespace, String name) throws SparkOperatorApiException; + + void deleteSparkApplication(String namespace, String name) throws SparkOperatorApiException; + + void deleteScheduledSparkApplication(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 d3cd03b..f4ef733 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 @@ -142,4 +142,24 @@ public Optional getScheduledSparkApplication( default -> throw new SparkOperatorApiException(resp.getStatus().toString()); }; } + + @Override + public void deleteSparkApplication(String namespace, String name) + throws SparkOperatorApiException { + try { + sparkApplicationApi.delete(namespace, name).throwsApiException(); + } catch (ApiException e) { + throw new SparkOperatorApiException(e.getMessage()); + } + } + + @Override + public void deleteScheduledSparkApplication(String namespace, String name) + throws SparkOperatorApiException { + try { + scheduledSparkApplicationApi.delete(namespace, name).throwsApiException(); + } catch (ApiException e) { + throw new SparkOperatorApiException(e.getMessage()); + } + } } 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 29d970d..5dfa8f1 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 @@ -1418,6 +1418,91 @@ func (*CancelJobResponse) Descriptor() ([]byte, []int) { return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{19} } +type UnscheduleJobRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + JobId string `protobuf:"bytes,1,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"` +} + +func (x *UnscheduleJobRequest) Reset() { + *x = UnscheduleJobRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_feast_spark_api_JobService_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UnscheduleJobRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UnscheduleJobRequest) ProtoMessage() {} + +func (x *UnscheduleJobRequest) ProtoReflect() protoreflect.Message { + 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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UnscheduleJobRequest.ProtoReflect.Descriptor instead. +func (*UnscheduleJobRequest) Descriptor() ([]byte, []int) { + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{20} +} + +func (x *UnscheduleJobRequest) GetJobId() string { + if x != nil { + return x.JobId + } + return "" +} + +type UnscheduleJobResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *UnscheduleJobResponse) Reset() { + *x = UnscheduleJobResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_feast_spark_api_JobService_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UnscheduleJobResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UnscheduleJobResponse) ProtoMessage() {} + +func (x *UnscheduleJobResponse) ProtoReflect() protoreflect.Message { + 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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UnscheduleJobResponse.ProtoReflect.Descriptor instead. +func (*UnscheduleJobResponse) Descriptor() ([]byte, []int) { + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{21} +} + type GetHealthMetricsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1430,7 +1515,7 @@ type GetHealthMetricsRequest struct { func (x *GetHealthMetricsRequest) Reset() { *x = GetHealthMetricsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[20] + mi := &file_feast_spark_api_JobService_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1443,7 +1528,7 @@ func (x *GetHealthMetricsRequest) String() string { func (*GetHealthMetricsRequest) ProtoMessage() {} func (x *GetHealthMetricsRequest) ProtoReflect() protoreflect.Message { - mi := &file_feast_spark_api_JobService_proto_msgTypes[20] + 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 { @@ -1456,7 +1541,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{20} + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{22} } func (x *GetHealthMetricsRequest) GetProject() string { @@ -1485,7 +1570,7 @@ type GetHealthMetricsResponse struct { func (x *GetHealthMetricsResponse) Reset() { *x = GetHealthMetricsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[21] + mi := &file_feast_spark_api_JobService_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1498,7 +1583,7 @@ func (x *GetHealthMetricsResponse) String() string { func (*GetHealthMetricsResponse) ProtoMessage() {} func (x *GetHealthMetricsResponse) ProtoReflect() protoreflect.Message { - mi := &file_feast_spark_api_JobService_proto_msgTypes[21] + mi := &file_feast_spark_api_JobService_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1511,7 +1596,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{21} + return file_feast_spark_api_JobService_proto_rawDescGZIP(), []int{23} } func (x *GetHealthMetricsResponse) GetPassed() []string { @@ -1539,7 +1624,7 @@ type Job_RetrievalJobMeta struct { func (x *Job_RetrievalJobMeta) Reset() { *x = Job_RetrievalJobMeta{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[22] + mi := &file_feast_spark_api_JobService_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1552,7 +1637,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[22] + mi := &file_feast_spark_api_JobService_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1586,7 +1671,7 @@ type Job_OfflineToOnlineMeta struct { func (x *Job_OfflineToOnlineMeta) Reset() { *x = Job_OfflineToOnlineMeta{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[23] + mi := &file_feast_spark_api_JobService_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1599,7 +1684,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[23] + mi := &file_feast_spark_api_JobService_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1633,7 +1718,7 @@ type Job_StreamToOnlineMeta struct { func (x *Job_StreamToOnlineMeta) Reset() { *x = Job_StreamToOnlineMeta{} if protoimpl.UnsafeEnabled { - mi := &file_feast_spark_api_JobService_proto_msgTypes[24] + mi := &file_feast_spark_api_JobService_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1646,7 +1731,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[24] + mi := &file_feast_spark_api_JobService_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1855,115 +1940,126 @@ var file_feast_spark_api_JobService_proto_rawDesc = []byte{ 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, 0xad, 0x09, - 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, + 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x0a, 0x14, 0x55, 0x6e, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 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, 0x17, 0x0a, 0x15, 0x55, 0x6e, 0x73, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 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, 0x8d, 0x0a, 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, 0x7c, + 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x67, + 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x12, 0x2f, 0x2e, 0x66, 0x65, 0x61, 0x73, + 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, + 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x66, 0x65, 0x61, + 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 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, 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, 0x7c, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, - 0x62, 0x12, 0x2f, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, - 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x66, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 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, 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, + 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, 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, 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, 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, + 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, 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, 0x6a, 0x0a, 0x11, 0x4c, 0x69, 0x73, - 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x29, + 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, 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, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x4a, 0x6f, - 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 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, 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, 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, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x6a, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x12, 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, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2a, 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, 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, 0x5e, 0x0a, 0x0d, 0x55, 0x6e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x4a, + 0x6f, 0x62, 0x12, 0x25, 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, 0x4a, + 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 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, 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, 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 ( @@ -1979,7 +2075,7 @@ 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, 25) +var file_feast_spark_api_JobService_proto_msgTypes = make([]protoimpl.MessageInfo, 27) var file_feast_spark_api_JobService_proto_goTypes = []interface{}{ (JobType)(0), // 0: feast_spark.api.JobType (JobStatus)(0), // 1: feast_spark.api.JobStatus @@ -2003,26 +2099,28 @@ var file_feast_spark_api_JobService_proto_goTypes = []interface{}{ (*GetJobResponse)(nil), // 19: feast_spark.api.GetJobResponse (*CancelJobRequest)(nil), // 20: feast_spark.api.CancelJobRequest (*CancelJobResponse)(nil), // 21: feast_spark.api.CancelJobResponse - (*GetHealthMetricsRequest)(nil), // 22: feast_spark.api.GetHealthMetricsRequest - (*GetHealthMetricsResponse)(nil), // 23: feast_spark.api.GetHealthMetricsResponse - (*Job_RetrievalJobMeta)(nil), // 24: feast_spark.api.Job.RetrievalJobMeta - (*Job_OfflineToOnlineMeta)(nil), // 25: feast_spark.api.Job.OfflineToOnlineMeta - (*Job_StreamToOnlineMeta)(nil), // 26: feast_spark.api.Job.StreamToOnlineMeta - (*timestamppb.Timestamp)(nil), // 27: google.protobuf.Timestamp - (*core.DataSource)(nil), // 28: feast.core.DataSource + (*UnscheduleJobRequest)(nil), // 22: feast_spark.api.UnscheduleJobRequest + (*UnscheduleJobResponse)(nil), // 23: feast_spark.api.UnscheduleJobResponse + (*GetHealthMetricsRequest)(nil), // 24: feast_spark.api.GetHealthMetricsRequest + (*GetHealthMetricsResponse)(nil), // 25: feast_spark.api.GetHealthMetricsResponse + (*Job_RetrievalJobMeta)(nil), // 26: feast_spark.api.Job.RetrievalJobMeta + (*Job_OfflineToOnlineMeta)(nil), // 27: feast_spark.api.Job.OfflineToOnlineMeta + (*Job_StreamToOnlineMeta)(nil), // 28: feast_spark.api.Job.StreamToOnlineMeta + (*timestamppb.Timestamp)(nil), // 29: google.protobuf.Timestamp + (*core.DataSource)(nil), // 30: 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 - 27, // 2: feast_spark.api.Job.start_time:type_name -> google.protobuf.Timestamp - 24, // 3: feast_spark.api.Job.retrieval:type_name -> feast_spark.api.Job.RetrievalJobMeta - 25, // 4: feast_spark.api.Job.batch_ingestion:type_name -> feast_spark.api.Job.OfflineToOnlineMeta - 26, // 5: feast_spark.api.Job.stream_ingestion:type_name -> feast_spark.api.Job.StreamToOnlineMeta - 27, // 6: feast_spark.api.StartOfflineToOnlineIngestionJobRequest.start_date:type_name -> google.protobuf.Timestamp - 27, // 7: feast_spark.api.StartOfflineToOnlineIngestionJobRequest.end_date:type_name -> google.protobuf.Timestamp - 27, // 8: feast_spark.api.StartOfflineToOnlineIngestionJobResponse.job_start_time:type_name -> google.protobuf.Timestamp - 28, // 9: feast_spark.api.GetHistoricalFeaturesRequest.entity_source:type_name -> feast.core.DataSource - 27, // 10: feast_spark.api.GetHistoricalFeaturesResponse.job_start_time:type_name -> google.protobuf.Timestamp + 29, // 2: feast_spark.api.Job.start_time:type_name -> google.protobuf.Timestamp + 26, // 3: feast_spark.api.Job.retrieval:type_name -> feast_spark.api.Job.RetrievalJobMeta + 27, // 4: feast_spark.api.Job.batch_ingestion:type_name -> feast_spark.api.Job.OfflineToOnlineMeta + 28, // 5: feast_spark.api.Job.stream_ingestion:type_name -> feast_spark.api.Job.StreamToOnlineMeta + 29, // 6: feast_spark.api.StartOfflineToOnlineIngestionJobRequest.start_date:type_name -> google.protobuf.Timestamp + 29, // 7: feast_spark.api.StartOfflineToOnlineIngestionJobRequest.end_date:type_name -> google.protobuf.Timestamp + 29, // 8: feast_spark.api.StartOfflineToOnlineIngestionJobResponse.job_start_time:type_name -> google.protobuf.Timestamp + 30, // 9: feast_spark.api.GetHistoricalFeaturesRequest.entity_source:type_name -> feast.core.DataSource + 29, // 10: feast_spark.api.GetHistoricalFeaturesResponse.job_start_time:type_name -> google.protobuf.Timestamp 0, // 11: feast_spark.api.ListJobsRequest.type:type_name -> feast_spark.api.JobType 3, // 12: feast_spark.api.ListJobsResponse.jobs:type_name -> feast_spark.api.Job 2, // 13: feast_spark.api.ListScheduledJobsResponse.jobs:type_name -> feast_spark.api.ScheduledJob @@ -2035,20 +2133,22 @@ var file_feast_spark_api_JobService_proto_depIdxs = []int32{ 14, // 20: feast_spark.api.JobService.ListJobs:input_type -> feast_spark.api.ListJobsRequest 15, // 21: feast_spark.api.JobService.ListScheduledJobs:input_type -> feast_spark.api.ListScheduledJobsRequest 20, // 22: feast_spark.api.JobService.CancelJob:input_type -> feast_spark.api.CancelJobRequest - 18, // 23: feast_spark.api.JobService.GetJob:input_type -> feast_spark.api.GetJobRequest - 22, // 24: feast_spark.api.JobService.GetHealthMetrics:input_type -> feast_spark.api.GetHealthMetricsRequest - 5, // 25: feast_spark.api.JobService.StartOfflineToOnlineIngestionJob:output_type -> feast_spark.api.StartOfflineToOnlineIngestionJobResponse - 7, // 26: feast_spark.api.JobService.StartStreamIngestionJob:output_type -> feast_spark.api.StartStreamIngestionJobResponse - 9, // 27: feast_spark.api.JobService.ScheduleOfflineToOnlineIngestionJob:output_type -> feast_spark.api.ScheduleOfflineToOnlineIngestionJobResponse - 11, // 28: feast_spark.api.JobService.UnscheduleOfflineToOnlineIngestionJob:output_type -> feast_spark.api.UnscheduleOfflineToOnlineIngestionJobResponse - 13, // 29: feast_spark.api.JobService.GetHistoricalFeatures:output_type -> feast_spark.api.GetHistoricalFeaturesResponse - 16, // 30: feast_spark.api.JobService.ListJobs:output_type -> feast_spark.api.ListJobsResponse - 17, // 31: feast_spark.api.JobService.ListScheduledJobs:output_type -> feast_spark.api.ListScheduledJobsResponse - 21, // 32: feast_spark.api.JobService.CancelJob:output_type -> feast_spark.api.CancelJobResponse - 19, // 33: feast_spark.api.JobService.GetJob:output_type -> feast_spark.api.GetJobResponse - 23, // 34: feast_spark.api.JobService.GetHealthMetrics:output_type -> feast_spark.api.GetHealthMetricsResponse - 25, // [25:35] is the sub-list for method output_type - 15, // [15:25] is the sub-list for method input_type + 22, // 23: feast_spark.api.JobService.UnscheduleJob:input_type -> feast_spark.api.UnscheduleJobRequest + 18, // 24: feast_spark.api.JobService.GetJob:input_type -> feast_spark.api.GetJobRequest + 24, // 25: feast_spark.api.JobService.GetHealthMetrics:input_type -> feast_spark.api.GetHealthMetricsRequest + 5, // 26: feast_spark.api.JobService.StartOfflineToOnlineIngestionJob:output_type -> feast_spark.api.StartOfflineToOnlineIngestionJobResponse + 7, // 27: feast_spark.api.JobService.StartStreamIngestionJob:output_type -> feast_spark.api.StartStreamIngestionJobResponse + 9, // 28: feast_spark.api.JobService.ScheduleOfflineToOnlineIngestionJob:output_type -> feast_spark.api.ScheduleOfflineToOnlineIngestionJobResponse + 11, // 29: feast_spark.api.JobService.UnscheduleOfflineToOnlineIngestionJob:output_type -> feast_spark.api.UnscheduleOfflineToOnlineIngestionJobResponse + 13, // 30: feast_spark.api.JobService.GetHistoricalFeatures:output_type -> feast_spark.api.GetHistoricalFeaturesResponse + 16, // 31: feast_spark.api.JobService.ListJobs:output_type -> feast_spark.api.ListJobsResponse + 17, // 32: feast_spark.api.JobService.ListScheduledJobs:output_type -> feast_spark.api.ListScheduledJobsResponse + 21, // 33: feast_spark.api.JobService.CancelJob:output_type -> feast_spark.api.CancelJobResponse + 23, // 34: feast_spark.api.JobService.UnscheduleJob:output_type -> feast_spark.api.UnscheduleJobResponse + 19, // 35: feast_spark.api.JobService.GetJob:output_type -> feast_spark.api.GetJobResponse + 25, // 36: feast_spark.api.JobService.GetHealthMetrics:output_type -> feast_spark.api.GetHealthMetricsResponse + 26, // [26:37] is the sub-list for method output_type + 15, // [15:26] is the sub-list for method input_type 15, // [15:15] is the sub-list for extension type_name 15, // [15:15] is the sub-list for extension extendee 0, // [0:15] is the sub-list for field type_name @@ -2301,7 +2401,7 @@ func file_feast_spark_api_JobService_proto_init() { } } file_feast_spark_api_JobService_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetHealthMetricsRequest); i { + switch v := v.(*UnscheduleJobRequest); i { case 0: return &v.state case 1: @@ -2313,7 +2413,7 @@ func file_feast_spark_api_JobService_proto_init() { } } file_feast_spark_api_JobService_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetHealthMetricsResponse); i { + switch v := v.(*UnscheduleJobResponse); i { case 0: return &v.state case 1: @@ -2325,7 +2425,7 @@ func file_feast_spark_api_JobService_proto_init() { } } file_feast_spark_api_JobService_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Job_RetrievalJobMeta); i { + switch v := v.(*GetHealthMetricsRequest); i { case 0: return &v.state case 1: @@ -2337,7 +2437,7 @@ func file_feast_spark_api_JobService_proto_init() { } } file_feast_spark_api_JobService_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Job_OfflineToOnlineMeta); i { + switch v := v.(*GetHealthMetricsResponse); i { case 0: return &v.state case 1: @@ -2349,6 +2449,30 @@ func file_feast_spark_api_JobService_proto_init() { } } file_feast_spark_api_JobService_proto_msgTypes[24].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[25].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[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Job_StreamToOnlineMeta); i { case 0: return &v.state @@ -2372,7 +2496,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: 25, + NumMessages: 27, 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 8393eb9..385ac0d 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 @@ -27,6 +27,7 @@ const ( JobService_ListJobs_FullMethodName = "/feast_spark.api.JobService/ListJobs" JobService_ListScheduledJobs_FullMethodName = "/feast_spark.api.JobService/ListScheduledJobs" JobService_CancelJob_FullMethodName = "/feast_spark.api.JobService/CancelJob" + JobService_UnscheduleJob_FullMethodName = "/feast_spark.api.JobService/UnscheduleJob" JobService_GetJob_FullMethodName = "/feast_spark.api.JobService/GetJob" JobService_GetHealthMetrics_FullMethodName = "/feast_spark.api.JobService/GetHealthMetrics" ) @@ -51,6 +52,8 @@ type JobServiceClient interface { ListScheduledJobs(ctx context.Context, in *ListScheduledJobsRequest, opts ...grpc.CallOption) (*ListScheduledJobsResponse, error) // Cancel a single job CancelJob(ctx context.Context, in *CancelJobRequest, opts ...grpc.CallOption) (*CancelJobResponse, error) + // Unschedule a job + UnscheduleJob(ctx context.Context, in *UnscheduleJobRequest, opts ...grpc.CallOption) (*UnscheduleJobResponse, error) // Get details of a single job GetJob(ctx context.Context, in *GetJobRequest, opts ...grpc.CallOption) (*GetJobResponse, error) // Get ingestion health metrics for a Feature Table @@ -137,6 +140,15 @@ func (c *jobServiceClient) CancelJob(ctx context.Context, in *CancelJobRequest, return out, nil } +func (c *jobServiceClient) UnscheduleJob(ctx context.Context, in *UnscheduleJobRequest, opts ...grpc.CallOption) (*UnscheduleJobResponse, error) { + out := new(UnscheduleJobResponse) + err := c.cc.Invoke(ctx, JobService_UnscheduleJob_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *jobServiceClient) GetJob(ctx context.Context, in *GetJobRequest, opts ...grpc.CallOption) (*GetJobResponse, error) { out := new(GetJobResponse) err := c.cc.Invoke(ctx, JobService_GetJob_FullMethodName, in, out, opts...) @@ -175,6 +187,8 @@ type JobServiceServer interface { ListScheduledJobs(context.Context, *ListScheduledJobsRequest) (*ListScheduledJobsResponse, error) // Cancel a single job CancelJob(context.Context, *CancelJobRequest) (*CancelJobResponse, error) + // Unschedule a job + UnscheduleJob(context.Context, *UnscheduleJobRequest) (*UnscheduleJobResponse, error) // Get details of a single job GetJob(context.Context, *GetJobRequest) (*GetJobResponse, error) // Get ingestion health metrics for a Feature Table @@ -209,6 +223,9 @@ func (UnimplementedJobServiceServer) ListScheduledJobs(context.Context, *ListSch func (UnimplementedJobServiceServer) CancelJob(context.Context, *CancelJobRequest) (*CancelJobResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CancelJob not implemented") } +func (UnimplementedJobServiceServer) UnscheduleJob(context.Context, *UnscheduleJobRequest) (*UnscheduleJobResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UnscheduleJob not implemented") +} func (UnimplementedJobServiceServer) GetJob(context.Context, *GetJobRequest) (*GetJobResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetJob not implemented") } @@ -371,6 +388,24 @@ func _JobService_CancelJob_Handler(srv interface{}, ctx context.Context, dec fun return interceptor(ctx, in, info, handler) } +func _JobService_UnscheduleJob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UnscheduleJobRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(JobServiceServer).UnscheduleJob(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: JobService_UnscheduleJob_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(JobServiceServer).UnscheduleJob(ctx, req.(*UnscheduleJobRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _JobService_GetJob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetJobRequest) if err := dec(in); err != nil { @@ -446,6 +481,10 @@ var JobService_ServiceDesc = grpc.ServiceDesc{ MethodName: "CancelJob", Handler: _JobService_CancelJob_Handler, }, + { + MethodName: "UnscheduleJob", + Handler: _JobService_UnscheduleJob_Handler, + }, { MethodName: "GetJob", Handler: _JobService_GetJob_Handler, diff --git a/caraml-store-sdk/python/feast/client.py b/caraml-store-sdk/python/feast/client.py index c1afaad..1b0ae84 100644 --- a/caraml-store-sdk/python/feast/client.py +++ b/caraml-store-sdk/python/feast/client.py @@ -32,6 +32,8 @@ GetHistoricalFeaturesResponse, GetJobRequest, ListJobsRequest, + CancelJobRequest, + UnscheduleJobRequest, Job, ScheduleOfflineToOnlineIngestionJobRequest, ScheduledJob, ListScheduledJobsRequest, StartStreamIngestionJobResponse, StartStreamIngestionJobRequest, JobType, INVALID_JOB, @@ -427,3 +429,21 @@ def delete_feature_table(self, feature_table: str, project: str): """ request = DeleteFeatureTableRequest(name=feature_table, project=project) self._core_service.DeleteFeatureTable(request) + + def cancel_job(self, job_id: str): + """ + Cancel job + Args: + job_id: spark job id + """ + request = CancelJobRequest(job_id=job_id) + self._job_service.CancelJob(request) + + def unschedule_job(self, job_id: str): + """ + Unschedule job + Args: + job_id: spark job id + """ + request = UnscheduleJobRequest(job_id=job_id) + self._job_service.UnscheduleJob(request) 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 8cae92e..5d1714a 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\"\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\"\xc0\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\x12\x18\n\x07project\x18\x0b \x01(\tR\x07project\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\"Y\n\x1eStartStreamIngestionJobRequest\x12\x18\n\x07project\x18\x01 \x01(\tR\x07project\x12\x1d\n\ntable_name\x18\x02 \x01(\tR\ttableName\"1\n\x1fStartStreamIngestionJobResponse\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\"\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\"\xa7\x01\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\x12,\n\x04type\x18\x04 \x01(\x0e\x32\x18.feast_spark.api.JobTypeR\x04type\"S\n\x18ListScheduledJobsRequest\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\"N\n\x19ListScheduledJobsResponse\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\xad\t\n\nJobService\x12\x97\x01\n StartOfflineToOnlineIngestionJob\x12\x38.feast_spark.api.StartOfflineToOnlineIngestionJobRequest\x1a\x39.feast_spark.api.StartOfflineToOnlineIngestionJobResponse\x12|\n\x17StartStreamIngestionJob\x12/.feast_spark.api.StartStreamIngestionJobRequest\x1a\x30.feast_spark.api.StartStreamIngestionJobResponse\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\x12j\n\x11ListScheduledJobs\x12).feast_spark.api.ListScheduledJobsRequest\x1a*.feast_spark.api.ListScheduledJobsResponse\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\"\xc0\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\x12\x18\n\x07project\x18\x0b \x01(\tR\x07project\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\"Y\n\x1eStartStreamIngestionJobRequest\x12\x18\n\x07project\x18\x01 \x01(\tR\x07project\x12\x1d\n\ntable_name\x18\x02 \x01(\tR\ttableName\"1\n\x1fStartStreamIngestionJobResponse\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\"\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\"\xa7\x01\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\x12,\n\x04type\x18\x04 \x01(\x0e\x32\x18.feast_spark.api.JobTypeR\x04type\"S\n\x18ListScheduledJobsRequest\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\"N\n\x19ListScheduledJobsResponse\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\"-\n\x14UnscheduleJobRequest\x12\x15\n\x06job_id\x18\x01 \x01(\tR\x05jobId\"\x17\n\x15UnscheduleJobResponse\"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\x8d\n\n\nJobService\x12\x97\x01\n StartOfflineToOnlineIngestionJob\x12\x38.feast_spark.api.StartOfflineToOnlineIngestionJobRequest\x1a\x39.feast_spark.api.StartOfflineToOnlineIngestionJobResponse\x12|\n\x17StartStreamIngestionJob\x12/.feast_spark.api.StartStreamIngestionJobRequest\x1a\x30.feast_spark.api.StartStreamIngestionJobResponse\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\x12j\n\x11ListScheduledJobs\x12).feast_spark.api.ListScheduledJobsRequest\x1a*.feast_spark.api.ListScheduledJobsResponse\x12R\n\tCancelJob\x12!.feast_spark.api.CancelJobRequest\x1a\".feast_spark.api.CancelJobResponse\x12^\n\rUnscheduleJob\x12%.feast_spark.api.UnscheduleJobRequest\x1a&.feast_spark.api.UnscheduleJobResponse\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,10 +23,10 @@ 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=3101 - _JOBTYPE._serialized_end=3197 - _JOBSTATUS._serialized_start=3199 - _JOBSTATUS._serialized_end=3325 + _JOBTYPE._serialized_start=3173 + _JOBTYPE._serialized_end=3269 + _JOBSTATUS._serialized_start=3271 + _JOBSTATUS._serialized_end=3397 _SCHEDULEDJOB._serialized_start=116 _SCHEDULEDJOB._serialized_end=287 _JOB._serialized_start=290 @@ -73,10 +73,14 @@ _CANCELJOBREQUEST._serialized_end=2916 _CANCELJOBRESPONSE._serialized_start=2918 _CANCELJOBRESPONSE._serialized_end=2937 - _GETHEALTHMETRICSREQUEST._serialized_start=2939 - _GETHEALTHMETRICSREQUEST._serialized_end=3023 - _GETHEALTHMETRICSRESPONSE._serialized_start=3025 - _GETHEALTHMETRICSRESPONSE._serialized_end=3099 - _JOBSERVICE._serialized_start=3328 - _JOBSERVICE._serialized_end=4525 + _UNSCHEDULEJOBREQUEST._serialized_start=2939 + _UNSCHEDULEJOBREQUEST._serialized_end=2984 + _UNSCHEDULEJOBRESPONSE._serialized_start=2986 + _UNSCHEDULEJOBRESPONSE._serialized_end=3009 + _GETHEALTHMETRICSREQUEST._serialized_start=3011 + _GETHEALTHMETRICSREQUEST._serialized_end=3095 + _GETHEALTHMETRICSRESPONSE._serialized_start=3097 + _GETHEALTHMETRICSRESPONSE._serialized_end=3171 + _JOBSERVICE._serialized_start=3400 + _JOBSERVICE._serialized_end=4693 # @@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 46595d9..25e9843 100644 --- a/caraml-store-sdk/python/feast_spark/api/JobService_pb2.pyi +++ b/caraml-store-sdk/python/feast_spark/api/JobService_pb2.pyi @@ -224,6 +224,16 @@ class StartStreamIngestionJobResponse(_message.Message): id: str def __init__(self, id: _Optional[str] = ...) -> None: ... +class UnscheduleJobRequest(_message.Message): + __slots__ = ["job_id"] + JOB_ID_FIELD_NUMBER: _ClassVar[int] + job_id: str + def __init__(self, job_id: _Optional[str] = ...) -> None: ... + +class UnscheduleJobResponse(_message.Message): + __slots__ = [] + def __init__(self) -> None: ... + class UnscheduleOfflineToOnlineIngestionJobRequest(_message.Message): __slots__ = ["project", "table_name"] PROJECT_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 7cb65dc..2fd3c02 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 @@ -54,6 +54,11 @@ def __init__(self, channel): request_serializer=feast__spark_dot_api_dot_JobService__pb2.CancelJobRequest.SerializeToString, response_deserializer=feast__spark_dot_api_dot_JobService__pb2.CancelJobResponse.FromString, ) + self.UnscheduleJob = channel.unary_unary( + '/feast_spark.api.JobService/UnscheduleJob', + request_serializer=feast__spark_dot_api_dot_JobService__pb2.UnscheduleJobRequest.SerializeToString, + response_deserializer=feast__spark_dot_api_dot_JobService__pb2.UnscheduleJobResponse.FromString, + ) self.GetJob = channel.unary_unary( '/feast_spark.api.JobService/GetJob', request_serializer=feast__spark_dot_api_dot_JobService__pb2.GetJobRequest.SerializeToString, @@ -125,6 +130,13 @@ def CancelJob(self, request, context): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') + def UnscheduleJob(self, request, context): + """Unschedule a job + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + def GetJob(self, request, context): """Get details of a single job """ @@ -182,6 +194,11 @@ def add_JobServiceServicer_to_server(servicer, server): request_deserializer=feast__spark_dot_api_dot_JobService__pb2.CancelJobRequest.FromString, response_serializer=feast__spark_dot_api_dot_JobService__pb2.CancelJobResponse.SerializeToString, ), + 'UnscheduleJob': grpc.unary_unary_rpc_method_handler( + servicer.UnscheduleJob, + request_deserializer=feast__spark_dot_api_dot_JobService__pb2.UnscheduleJobRequest.FromString, + response_serializer=feast__spark_dot_api_dot_JobService__pb2.UnscheduleJobResponse.SerializeToString, + ), 'GetJob': grpc.unary_unary_rpc_method_handler( servicer.GetJob, request_deserializer=feast__spark_dot_api_dot_JobService__pb2.GetJobRequest.FromString, @@ -338,6 +355,23 @@ def CancelJob(request, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + @staticmethod + def UnscheduleJob(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/UnscheduleJob', + feast__spark_dot_api_dot_JobService__pb2.UnscheduleJobRequest.SerializeToString, + feast__spark_dot_api_dot_JobService__pb2.UnscheduleJobResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + @staticmethod def GetJob(request, target,