tracdap-runtime 0.6.2__py3-none-any.whl → 0.6.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. tracdap/rt/_exec/actors.py +87 -10
  2. tracdap/rt/_exec/dev_mode.py +9 -17
  3. tracdap/rt/_exec/engine.py +79 -14
  4. tracdap/rt/_exec/runtime.py +83 -40
  5. tracdap/rt/_exec/server.py +306 -29
  6. tracdap/rt/_impl/config_parser.py +219 -49
  7. tracdap/rt/_impl/grpc/codec.py +60 -5
  8. tracdap/rt/_impl/grpc/tracdap/api/internal/runtime_pb2.py +19 -19
  9. tracdap/rt/_impl/grpc/tracdap/api/internal/runtime_pb2.pyi +11 -9
  10. tracdap/rt/_impl/grpc/tracdap/api/internal/runtime_pb2_grpc.py +25 -25
  11. tracdap/rt/_impl/grpc/tracdap/metadata/model_pb2.py +28 -16
  12. tracdap/rt/_impl/grpc/tracdap/metadata/model_pb2.pyi +33 -6
  13. tracdap/rt/_impl/grpc/tracdap/metadata/object_pb2.py +8 -3
  14. tracdap/rt/_impl/grpc/tracdap/metadata/object_pb2.pyi +13 -2
  15. tracdap/rt/_impl/guard_rails.py +21 -0
  16. tracdap/rt/_impl/models.py +25 -0
  17. tracdap/rt/_impl/static_api.py +23 -9
  18. tracdap/rt/_impl/type_system.py +17 -0
  19. tracdap/rt/_impl/validation.py +10 -0
  20. tracdap/rt/_plugins/config_local.py +49 -0
  21. tracdap/rt/_version.py +1 -1
  22. tracdap/rt/api/hook.py +6 -3
  23. tracdap/rt/api/static_api.py +71 -21
  24. tracdap/rt/config/__init__.py +4 -4
  25. tracdap/rt/config/common.py +10 -0
  26. tracdap/rt/config/platform.py +0 -10
  27. tracdap/rt/config/runtime.py +2 -0
  28. tracdap/rt/ext/config.py +34 -0
  29. tracdap/rt/ext/embed.py +1 -3
  30. tracdap/rt/ext/plugins.py +47 -6
  31. tracdap/rt/launch/cli.py +4 -0
  32. tracdap/rt/launch/launch.py +34 -9
  33. tracdap/rt/metadata/__init__.py +17 -17
  34. tracdap/rt/metadata/model.py +6 -0
  35. tracdap/rt/metadata/object.py +3 -0
  36. {tracdap_runtime-0.6.2.dist-info → tracdap_runtime-0.6.3.dist-info}/METADATA +4 -4
  37. {tracdap_runtime-0.6.2.dist-info → tracdap_runtime-0.6.3.dist-info}/RECORD +40 -49
  38. {tracdap_runtime-0.6.2.dist-info → tracdap_runtime-0.6.3.dist-info}/WHEEL +1 -1
  39. tracdap/rt/_impl/grpc/tracdap/config/common_pb2.py +0 -55
  40. tracdap/rt/_impl/grpc/tracdap/config/common_pb2.pyi +0 -103
  41. tracdap/rt/_impl/grpc/tracdap/config/job_pb2.py +0 -42
  42. tracdap/rt/_impl/grpc/tracdap/config/job_pb2.pyi +0 -44
  43. tracdap/rt/_impl/grpc/tracdap/config/platform_pb2.py +0 -71
  44. tracdap/rt/_impl/grpc/tracdap/config/platform_pb2.pyi +0 -197
  45. tracdap/rt/_impl/grpc/tracdap/config/result_pb2.py +0 -37
  46. tracdap/rt/_impl/grpc/tracdap/config/result_pb2.pyi +0 -35
  47. tracdap/rt/_impl/grpc/tracdap/config/runtime_pb2.py +0 -42
  48. tracdap/rt/_impl/grpc/tracdap/config/runtime_pb2.pyi +0 -46
  49. tracdap/rt/ext/_guard.py +0 -37
  50. {tracdap_runtime-0.6.2.dist-info → tracdap_runtime-0.6.3.dist-info}/LICENSE +0 -0
  51. {tracdap_runtime-0.6.2.dist-info → tracdap_runtime-0.6.3.dist-info}/top_level.txt +0 -0
@@ -15,6 +15,58 @@
15
15
  import enum
16
16
  import typing as tp
17
17
 
18
+ import tracdap.rt.exceptions as ex
19
+ import tracdap.rt.metadata as metadata
20
+
21
+ import tracdap.rt._impl.grpc.tracdap.metadata.type_pb2 as type_pb2
22
+ import tracdap.rt._impl.grpc.tracdap.metadata.object_id_pb2 as object_id_pb2
23
+ import tracdap.rt._impl.grpc.tracdap.metadata.object_pb2 as object_pb2
24
+ from tracdap.rt._impl.grpc.tracdap.metadata import model_pb2
25
+ import tracdap.rt._impl.grpc.tracdap.metadata.data_pb2 as data_pb2
26
+ import tracdap.rt._impl.grpc.tracdap.metadata.stoarge_pb2 as storage_pb2
27
+
28
+ from google.protobuf import message as _message
29
+
30
+
31
+ __METADATA_MAPPING = {
32
+ metadata.TypeDescriptor: type_pb2.TypeDescriptor,
33
+ metadata.Value: type_pb2.Value,
34
+ metadata.DecimalValue: type_pb2.DecimalValue,
35
+ metadata.DateValue: type_pb2.DateValue,
36
+ metadata.DatetimeValue: type_pb2.DatetimeValue,
37
+ metadata.ArrayValue: type_pb2.ArrayValue,
38
+ metadata.MapValue: type_pb2.MapValue,
39
+ metadata.TagHeader: object_id_pb2.TagHeader,
40
+ metadata.TagSelector: object_id_pb2.TagSelector,
41
+ metadata.ObjectDefinition: object_pb2.ObjectDefinition,
42
+ metadata.ModelDefinition: model_pb2.ModelDefinition,
43
+ metadata.ModelParameter: model_pb2.ModelParameter,
44
+ metadata.ModelInputSchema: model_pb2.ModelInputSchema,
45
+ metadata.ModelOutputSchema: model_pb2.ModelOutputSchema,
46
+ metadata.SchemaDefinition: data_pb2.SchemaDefinition,
47
+ metadata.TableSchema: data_pb2.TableSchema,
48
+ metadata.FieldSchema: data_pb2.FieldSchema,
49
+ metadata.PartKey: data_pb2.PartKey,
50
+ metadata.DataDefinition: data_pb2.DataDefinition,
51
+ metadata.DataDefinition.Part: data_pb2.DataDefinition.Part,
52
+ metadata.DataDefinition.Snap: data_pb2.DataDefinition.Snap,
53
+ metadata.DataDefinition.Delta: data_pb2.DataDefinition.Delta,
54
+ metadata.StorageDefinition: storage_pb2.StorageDefinition,
55
+ metadata.StorageIncarnation: storage_pb2.StorageIncarnation,
56
+ metadata.StorageCopy: storage_pb2.StorageCopy,
57
+ metadata.StorageItem: storage_pb2.StorageItem
58
+ }
59
+
60
+
61
+ _T_MSG = tp.TypeVar('_T_MSG', bound=_message.Message)
62
+
63
+
64
+ def encode_message(msg_class: _T_MSG.__class__, obj: tp.Any) -> _T_MSG:
65
+
66
+ attrs = dict((k, encode(v)) for k, v in obj.__dict__.items())
67
+
68
+ return msg_class(**attrs)
69
+
18
70
 
19
71
  def encode(obj: tp.Any) -> tp.Any:
20
72
 
@@ -35,10 +87,13 @@ def encode(obj: tp.Any) -> tp.Any:
35
87
  return list(map(encode, obj))
36
88
 
37
89
  if isinstance(obj, dict):
38
- return dict(map(lambda kv: (kv[0], encode(kv[1])), obj.items()))
90
+ return dict((k, encode(v)) for k, v in obj.items())
91
+
92
+ msg_class = __METADATA_MAPPING.get(type(obj))
93
+
94
+ if msg_class is None:
95
+ raise ex.ETracInternal(f"No gRPC metadata mapping is available for type {type(obj).__name__}")
39
96
 
40
- # Filter classes for TRAC domain objects (sanity check, not a watertight validation)
41
- if hasattr(obj, "__module__") and "tracdap" in obj.__module__:
42
- return dict(map(lambda kv: (kv[0], encode(kv[1])), obj.__dict__.items()))
97
+ attrs = dict((k, encode(v)) for k, v in obj.__dict__.items() if v is not None)
43
98
 
44
- raise RuntimeError(f"Cannot encode object of type [{type(obj).__name__}] for gRPC")
99
+ return msg_class(**attrs)
@@ -18,7 +18,7 @@ from tracdap.rt._impl.grpc.tracdap.metadata import object_pb2 as tracdap_dot_rt_
18
18
  from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
19
19
 
20
20
 
21
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n8tracdap/rt/_impl/grpc/tracdap/api/internal/runtime.proto\x12\x14tracdap.api.internal\x1a\x36tracdap/rt/_impl/grpc/tracdap/metadata/object_id.proto\x1a\x30tracdap/rt/_impl/grpc/tracdap/metadata/job.proto\x1a\x33tracdap/rt/_impl/grpc/tracdap/metadata/object.proto\x1a\x1cgoogle/api/annotations.proto\"/\n\x0fListJobsRequest\x12\x12\n\x05limit\x18\x01 \x01(\rH\x00\x88\x01\x01\x42\x08\n\x06_limit\"A\n\x10ListJobsResponse\x12-\n\x04jobs\x18\x01 \x03(\x0b\x32\x1f.tracdap.api.internal.JobStatus\"f\n\x15\x42\x61tchJobStatusRequest\x12\x34\n\x0bjobSelector\x18\x01 \x01(\x0b\x32\x1d.tracdap.metadata.TagSelectorH\x00\x12\x10\n\x06jobKey\x18\x02 \x01(\tH\x00\x42\x05\n\x03job\"\x83\x01\n\tJobStatus\x12*\n\x05jobId\x18\x01 \x01(\x0b\x32\x1b.tracdap.metadata.TagHeader\x12\x33\n\nstatusCode\x18\x02 \x01(\x0e\x32\x1f.tracdap.metadata.JobStatusCode\x12\x15\n\rstatusMessage\x18\x03 \x01(\t\"\xa0\x02\n\x0e\x42\x61tchJobResult\x12*\n\x05jobId\x18\x01 \x01(\x0b\x32\x1b.tracdap.metadata.TagHeader\x12\x33\n\nstatusCode\x18\x02 \x01(\x0e\x32\x1f.tracdap.metadata.JobStatusCode\x12\x15\n\rstatusMessage\x18\x03 \x01(\t\x12\x42\n\x07results\x18\x04 \x03(\x0b\x32\x31.tracdap.api.internal.BatchJobResult.ResultsEntry\x1aR\n\x0cResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x31\n\x05value\x18\x02 \x01(\x0b\x32\".tracdap.metadata.ObjectDefinition:\x02\x38\x01\x32\xff\x02\n\x0eTracRuntimeApi\x12m\n\x08listJobs\x12%.tracdap.api.internal.ListJobsRequest\x1a&.tracdap.api.internal.ListJobsResponse\"\x12\x82\xd3\xe4\x93\x02\x0c\x12\n/list-jobs\x12z\n\x0cgetJobStatus\x12+.tracdap.api.internal.BatchJobStatusRequest\x1a\x1f.tracdap.api.internal.JobStatus\"\x1c\x82\xd3\xe4\x93\x02\x16\x12\x14/job-status/{jobKey}\x12\x81\x01\n\rgetJobDetails\x12+.tracdap.api.internal.BatchJobStatusRequest\x1a$.tracdap.api.internal.BatchJobResult\"\x1d\x82\xd3\xe4\x93\x02\x17\x12\x15/job-details/{jobKey}B\"\n\x1eorg.finos.tracdap.api.internalP\x01\x62\x06proto3')
21
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n8tracdap/rt/_impl/grpc/tracdap/api/internal/runtime.proto\x12\x14tracdap.api.internal\x1a\x36tracdap/rt/_impl/grpc/tracdap/metadata/object_id.proto\x1a\x30tracdap/rt/_impl/grpc/tracdap/metadata/job.proto\x1a\x33tracdap/rt/_impl/grpc/tracdap/metadata/object.proto\x1a\x1cgoogle/api/annotations.proto\"6\n\x16RuntimeListJobsRequest\x12\x12\n\x05limit\x18\x01 \x01(\rH\x00\x88\x01\x01\x42\x08\n\x06_limit\"O\n\x17RuntimeListJobsResponse\x12\x34\n\x04jobs\x18\x01 \x03(\x0b\x32&.tracdap.api.internal.RuntimeJobStatus\"f\n\x15RuntimeJobInfoRequest\x12\x34\n\x0bjobSelector\x18\x01 \x01(\x0b\x32\x1d.tracdap.metadata.TagSelectorH\x00\x12\x10\n\x06jobKey\x18\x02 \x01(\tH\x00\x42\x05\n\x03job\"\x9f\x01\n\x10RuntimeJobStatus\x12*\n\x05jobId\x18\x01 \x01(\x0b\x32\x1b.tracdap.metadata.TagHeader\x12\x33\n\nstatusCode\x18\x02 \x01(\x0e\x32\x1f.tracdap.metadata.JobStatusCode\x12\x15\n\rstatusMessage\x18\x03 \x01(\t\x12\x13\n\x0b\x65rrorDetail\x18\x04 \x01(\t\"\xa4\x02\n\x10RuntimeJobResult\x12*\n\x05jobId\x18\x01 \x01(\x0b\x32\x1b.tracdap.metadata.TagHeader\x12\x33\n\nstatusCode\x18\x02 \x01(\x0e\x32\x1f.tracdap.metadata.JobStatusCode\x12\x15\n\rstatusMessage\x18\x03 \x01(\t\x12\x44\n\x07results\x18\x04 \x03(\x0b\x32\x33.tracdap.api.internal.RuntimeJobResult.ResultsEntry\x1aR\n\x0cResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x31\n\x05value\x18\x02 \x01(\x0b\x32\".tracdap.metadata.ObjectDefinition:\x02\x38\x01\x32\x95\x03\n\x0eTracRuntimeApi\x12{\n\x08listJobs\x12,.tracdap.api.internal.RuntimeListJobsRequest\x1a-.tracdap.api.internal.RuntimeListJobsResponse\"\x12\x82\xd3\xe4\x93\x02\x0c\x12\n/list-jobs\x12\x81\x01\n\x0cgetJobStatus\x12+.tracdap.api.internal.RuntimeJobInfoRequest\x1a&.tracdap.api.internal.RuntimeJobStatus\"\x1c\x82\xd3\xe4\x93\x02\x16\x12\x14/job-status/{jobKey}\x12\x81\x01\n\x0cgetJobResult\x12+.tracdap.api.internal.RuntimeJobInfoRequest\x1a&.tracdap.api.internal.RuntimeJobResult\"\x1c\x82\xd3\xe4\x93\x02\x16\x12\x14/job-result/{jobKey}B\"\n\x1eorg.finos.tracdap.api.internalP\x01\x62\x06proto3')
22
22
 
23
23
  _globals = globals()
24
24
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -26,26 +26,26 @@ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'tracdap.rt._impl.grpc.tracd
26
26
  if _descriptor._USE_C_DESCRIPTORS == False:
27
27
  _globals['DESCRIPTOR']._options = None
28
28
  _globals['DESCRIPTOR']._serialized_options = b'\n\036org.finos.tracdap.api.internalP\001'
29
- _globals['_BATCHJOBRESULT_RESULTSENTRY']._options = None
30
- _globals['_BATCHJOBRESULT_RESULTSENTRY']._serialized_options = b'8\001'
29
+ _globals['_RUNTIMEJOBRESULT_RESULTSENTRY']._options = None
30
+ _globals['_RUNTIMEJOBRESULT_RESULTSENTRY']._serialized_options = b'8\001'
31
31
  _globals['_TRACRUNTIMEAPI'].methods_by_name['listJobs']._options = None
32
32
  _globals['_TRACRUNTIMEAPI'].methods_by_name['listJobs']._serialized_options = b'\202\323\344\223\002\014\022\n/list-jobs'
33
33
  _globals['_TRACRUNTIMEAPI'].methods_by_name['getJobStatus']._options = None
34
34
  _globals['_TRACRUNTIMEAPI'].methods_by_name['getJobStatus']._serialized_options = b'\202\323\344\223\002\026\022\024/job-status/{jobKey}'
35
- _globals['_TRACRUNTIMEAPI'].methods_by_name['getJobDetails']._options = None
36
- _globals['_TRACRUNTIMEAPI'].methods_by_name['getJobDetails']._serialized_options = b'\202\323\344\223\002\027\022\025/job-details/{jobKey}'
37
- _globals['_LISTJOBSREQUEST']._serialized_start=271
38
- _globals['_LISTJOBSREQUEST']._serialized_end=318
39
- _globals['_LISTJOBSRESPONSE']._serialized_start=320
40
- _globals['_LISTJOBSRESPONSE']._serialized_end=385
41
- _globals['_BATCHJOBSTATUSREQUEST']._serialized_start=387
42
- _globals['_BATCHJOBSTATUSREQUEST']._serialized_end=489
43
- _globals['_JOBSTATUS']._serialized_start=492
44
- _globals['_JOBSTATUS']._serialized_end=623
45
- _globals['_BATCHJOBRESULT']._serialized_start=626
46
- _globals['_BATCHJOBRESULT']._serialized_end=914
47
- _globals['_BATCHJOBRESULT_RESULTSENTRY']._serialized_start=832
48
- _globals['_BATCHJOBRESULT_RESULTSENTRY']._serialized_end=914
49
- _globals['_TRACRUNTIMEAPI']._serialized_start=917
50
- _globals['_TRACRUNTIMEAPI']._serialized_end=1300
35
+ _globals['_TRACRUNTIMEAPI'].methods_by_name['getJobResult']._options = None
36
+ _globals['_TRACRUNTIMEAPI'].methods_by_name['getJobResult']._serialized_options = b'\202\323\344\223\002\026\022\024/job-result/{jobKey}'
37
+ _globals['_RUNTIMELISTJOBSREQUEST']._serialized_start=271
38
+ _globals['_RUNTIMELISTJOBSREQUEST']._serialized_end=325
39
+ _globals['_RUNTIMELISTJOBSRESPONSE']._serialized_start=327
40
+ _globals['_RUNTIMELISTJOBSRESPONSE']._serialized_end=406
41
+ _globals['_RUNTIMEJOBINFOREQUEST']._serialized_start=408
42
+ _globals['_RUNTIMEJOBINFOREQUEST']._serialized_end=510
43
+ _globals['_RUNTIMEJOBSTATUS']._serialized_start=513
44
+ _globals['_RUNTIMEJOBSTATUS']._serialized_end=672
45
+ _globals['_RUNTIMEJOBRESULT']._serialized_start=675
46
+ _globals['_RUNTIMEJOBRESULT']._serialized_end=967
47
+ _globals['_RUNTIMEJOBRESULT_RESULTSENTRY']._serialized_start=885
48
+ _globals['_RUNTIMEJOBRESULT_RESULTSENTRY']._serialized_end=967
49
+ _globals['_TRACRUNTIMEAPI']._serialized_start=970
50
+ _globals['_TRACRUNTIMEAPI']._serialized_end=1375
51
51
  # @@protoc_insertion_point(module_scope)
@@ -9,19 +9,19 @@ from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Map
9
9
 
10
10
  DESCRIPTOR: _descriptor.FileDescriptor
11
11
 
12
- class ListJobsRequest(_message.Message):
12
+ class RuntimeListJobsRequest(_message.Message):
13
13
  __slots__ = ("limit",)
14
14
  LIMIT_FIELD_NUMBER: _ClassVar[int]
15
15
  limit: int
16
16
  def __init__(self, limit: _Optional[int] = ...) -> None: ...
17
17
 
18
- class ListJobsResponse(_message.Message):
18
+ class RuntimeListJobsResponse(_message.Message):
19
19
  __slots__ = ("jobs",)
20
20
  JOBS_FIELD_NUMBER: _ClassVar[int]
21
- jobs: _containers.RepeatedCompositeFieldContainer[JobStatus]
22
- def __init__(self, jobs: _Optional[_Iterable[_Union[JobStatus, _Mapping]]] = ...) -> None: ...
21
+ jobs: _containers.RepeatedCompositeFieldContainer[RuntimeJobStatus]
22
+ def __init__(self, jobs: _Optional[_Iterable[_Union[RuntimeJobStatus, _Mapping]]] = ...) -> None: ...
23
23
 
24
- class BatchJobStatusRequest(_message.Message):
24
+ class RuntimeJobInfoRequest(_message.Message):
25
25
  __slots__ = ("jobSelector", "jobKey")
26
26
  JOBSELECTOR_FIELD_NUMBER: _ClassVar[int]
27
27
  JOBKEY_FIELD_NUMBER: _ClassVar[int]
@@ -29,17 +29,19 @@ class BatchJobStatusRequest(_message.Message):
29
29
  jobKey: str
30
30
  def __init__(self, jobSelector: _Optional[_Union[_object_id_pb2.TagSelector, _Mapping]] = ..., jobKey: _Optional[str] = ...) -> None: ...
31
31
 
32
- class JobStatus(_message.Message):
33
- __slots__ = ("jobId", "statusCode", "statusMessage")
32
+ class RuntimeJobStatus(_message.Message):
33
+ __slots__ = ("jobId", "statusCode", "statusMessage", "errorDetail")
34
34
  JOBID_FIELD_NUMBER: _ClassVar[int]
35
35
  STATUSCODE_FIELD_NUMBER: _ClassVar[int]
36
36
  STATUSMESSAGE_FIELD_NUMBER: _ClassVar[int]
37
+ ERRORDETAIL_FIELD_NUMBER: _ClassVar[int]
37
38
  jobId: _object_id_pb2.TagHeader
38
39
  statusCode: _job_pb2.JobStatusCode
39
40
  statusMessage: str
40
- def __init__(self, jobId: _Optional[_Union[_object_id_pb2.TagHeader, _Mapping]] = ..., statusCode: _Optional[_Union[_job_pb2.JobStatusCode, str]] = ..., statusMessage: _Optional[str] = ...) -> None: ...
41
+ errorDetail: str
42
+ def __init__(self, jobId: _Optional[_Union[_object_id_pb2.TagHeader, _Mapping]] = ..., statusCode: _Optional[_Union[_job_pb2.JobStatusCode, str]] = ..., statusMessage: _Optional[str] = ..., errorDetail: _Optional[str] = ...) -> None: ...
41
43
 
42
- class BatchJobResult(_message.Message):
44
+ class RuntimeJobResult(_message.Message):
43
45
  __slots__ = ("jobId", "statusCode", "statusMessage", "results")
44
46
  class ResultsEntry(_message.Message):
45
47
  __slots__ = ("key", "value")
@@ -36,18 +36,18 @@ class TracRuntimeApiStub(object):
36
36
  """
37
37
  self.listJobs = channel.unary_unary(
38
38
  '/tracdap.api.internal.TracRuntimeApi/listJobs',
39
- request_serializer=tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.ListJobsRequest.SerializeToString,
40
- response_deserializer=tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.ListJobsResponse.FromString,
39
+ request_serializer=tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.RuntimeListJobsRequest.SerializeToString,
40
+ response_deserializer=tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.RuntimeListJobsResponse.FromString,
41
41
  _registered_method=True)
42
42
  self.getJobStatus = channel.unary_unary(
43
43
  '/tracdap.api.internal.TracRuntimeApi/getJobStatus',
44
- request_serializer=tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.BatchJobStatusRequest.SerializeToString,
45
- response_deserializer=tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.JobStatus.FromString,
44
+ request_serializer=tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.RuntimeJobInfoRequest.SerializeToString,
45
+ response_deserializer=tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.RuntimeJobStatus.FromString,
46
46
  _registered_method=True)
47
- self.getJobDetails = channel.unary_unary(
48
- '/tracdap.api.internal.TracRuntimeApi/getJobDetails',
49
- request_serializer=tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.BatchJobStatusRequest.SerializeToString,
50
- response_deserializer=tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.BatchJobResult.FromString,
47
+ self.getJobResult = channel.unary_unary(
48
+ '/tracdap.api.internal.TracRuntimeApi/getJobResult',
49
+ request_serializer=tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.RuntimeJobInfoRequest.SerializeToString,
50
+ response_deserializer=tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.RuntimeJobResult.FromString,
51
51
  _registered_method=True)
52
52
 
53
53
 
@@ -66,7 +66,7 @@ class TracRuntimeApiServicer(object):
66
66
  context.set_details('Method not implemented!')
67
67
  raise NotImplementedError('Method not implemented!')
68
68
 
69
- def getJobDetails(self, request, context):
69
+ def getJobResult(self, request, context):
70
70
  """Missing associated documentation comment in .proto file."""
71
71
  context.set_code(grpc.StatusCode.UNIMPLEMENTED)
72
72
  context.set_details('Method not implemented!')
@@ -77,18 +77,18 @@ def add_TracRuntimeApiServicer_to_server(servicer, server):
77
77
  rpc_method_handlers = {
78
78
  'listJobs': grpc.unary_unary_rpc_method_handler(
79
79
  servicer.listJobs,
80
- request_deserializer=tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.ListJobsRequest.FromString,
81
- response_serializer=tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.ListJobsResponse.SerializeToString,
80
+ request_deserializer=tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.RuntimeListJobsRequest.FromString,
81
+ response_serializer=tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.RuntimeListJobsResponse.SerializeToString,
82
82
  ),
83
83
  'getJobStatus': grpc.unary_unary_rpc_method_handler(
84
84
  servicer.getJobStatus,
85
- request_deserializer=tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.BatchJobStatusRequest.FromString,
86
- response_serializer=tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.JobStatus.SerializeToString,
85
+ request_deserializer=tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.RuntimeJobInfoRequest.FromString,
86
+ response_serializer=tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.RuntimeJobStatus.SerializeToString,
87
87
  ),
88
- 'getJobDetails': grpc.unary_unary_rpc_method_handler(
89
- servicer.getJobDetails,
90
- request_deserializer=tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.BatchJobStatusRequest.FromString,
91
- response_serializer=tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.BatchJobResult.SerializeToString,
88
+ 'getJobResult': grpc.unary_unary_rpc_method_handler(
89
+ servicer.getJobResult,
90
+ request_deserializer=tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.RuntimeJobInfoRequest.FromString,
91
+ response_serializer=tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.RuntimeJobResult.SerializeToString,
92
92
  ),
93
93
  }
94
94
  generic_handler = grpc.method_handlers_generic_handler(
@@ -116,8 +116,8 @@ class TracRuntimeApi(object):
116
116
  request,
117
117
  target,
118
118
  '/tracdap.api.internal.TracRuntimeApi/listJobs',
119
- tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.ListJobsRequest.SerializeToString,
120
- tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.ListJobsResponse.FromString,
119
+ tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.RuntimeListJobsRequest.SerializeToString,
120
+ tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.RuntimeListJobsResponse.FromString,
121
121
  options,
122
122
  channel_credentials,
123
123
  insecure,
@@ -143,8 +143,8 @@ class TracRuntimeApi(object):
143
143
  request,
144
144
  target,
145
145
  '/tracdap.api.internal.TracRuntimeApi/getJobStatus',
146
- tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.BatchJobStatusRequest.SerializeToString,
147
- tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.JobStatus.FromString,
146
+ tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.RuntimeJobInfoRequest.SerializeToString,
147
+ tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.RuntimeJobStatus.FromString,
148
148
  options,
149
149
  channel_credentials,
150
150
  insecure,
@@ -156,7 +156,7 @@ class TracRuntimeApi(object):
156
156
  _registered_method=True)
157
157
 
158
158
  @staticmethod
159
- def getJobDetails(request,
159
+ def getJobResult(request,
160
160
  target,
161
161
  options=(),
162
162
  channel_credentials=None,
@@ -169,9 +169,9 @@ class TracRuntimeApi(object):
169
169
  return grpc.experimental.unary_unary(
170
170
  request,
171
171
  target,
172
- '/tracdap.api.internal.TracRuntimeApi/getJobDetails',
173
- tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.BatchJobStatusRequest.SerializeToString,
174
- tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.BatchJobResult.FromString,
172
+ '/tracdap.api.internal.TracRuntimeApi/getJobResult',
173
+ tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.RuntimeJobInfoRequest.SerializeToString,
174
+ tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_api_dot_internal_dot_runtime__pb2.RuntimeJobResult.FromString,
175
175
  options,
176
176
  channel_credentials,
177
177
  insecure,
@@ -16,7 +16,7 @@ from tracdap.rt._impl.grpc.tracdap.metadata import type_pb2 as tracdap_dot_rt_do
16
16
  from tracdap.rt._impl.grpc.tracdap.metadata import data_pb2 as tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_metadata_dot_data__pb2
17
17
 
18
18
 
19
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n2tracdap/rt/_impl/grpc/tracdap/metadata/model.proto\x12\x10tracdap.metadata\x1a\x31tracdap/rt/_impl/grpc/tracdap/metadata/type.proto\x1a\x31tracdap/rt/_impl/grpc/tracdap/metadata/data.proto\"\x99\x01\n\x0eModelParameter\x12\x33\n\tparamType\x18\x01 \x01(\x0b\x32 .tracdap.metadata.TypeDescriptor\x12\r\n\x05label\x18\x02 \x01(\t\x12\x32\n\x0c\x64\x65\x66\x61ultValue\x18\x03 \x01(\x0b\x32\x17.tracdap.metadata.ValueH\x00\x88\x01\x01\x42\x0f\n\r_defaultValue\"v\n\x10ModelInputSchema\x12\x32\n\x06schema\x18\x01 \x01(\x0b\x32\".tracdap.metadata.SchemaDefinition\x12\x12\n\x05label\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x10\n\x08optional\x18\x03 \x01(\x08\x42\x08\n\x06_label\"w\n\x11ModelOutputSchema\x12\x32\n\x06schema\x18\x01 \x01(\x0b\x32\".tracdap.metadata.SchemaDefinition\x12\x12\n\x05label\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x10\n\x08optional\x18\x03 \x01(\x08\x42\x08\n\x06_label\"\x9e\x06\n\x0fModelDefinition\x12\x10\n\x08language\x18\x01 \x01(\t\x12\x12\n\nrepository\x18\x02 \x01(\t\x12\x19\n\x0cpackageGroup\x18\n \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x07package\x18\x0b \x01(\t\x12\x0f\n\x07version\x18\x06 \x01(\t\x12\x12\n\nentryPoint\x18\x05 \x01(\t\x12\x11\n\x04path\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x45\n\nparameters\x18\x07 \x03(\x0b\x32\x31.tracdap.metadata.ModelDefinition.ParametersEntry\x12=\n\x06inputs\x18\x08 \x03(\x0b\x32-.tracdap.metadata.ModelDefinition.InputsEntry\x12?\n\x07outputs\x18\t \x03(\x0b\x32..tracdap.metadata.ModelDefinition.OutputsEntry\x12Q\n\x10staticAttributes\x18\x0c \x03(\x0b\x32\x37.tracdap.metadata.ModelDefinition.StaticAttributesEntry\x1aS\n\x0fParametersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .tracdap.metadata.ModelParameter:\x02\x38\x01\x1aQ\n\x0bInputsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x31\n\x05value\x18\x02 \x01(\x0b\x32\".tracdap.metadata.ModelInputSchema:\x02\x38\x01\x1aS\n\x0cOutputsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x32\n\x05value\x18\x02 \x01(\x0b\x32#.tracdap.metadata.ModelOutputSchema:\x02\x38\x01\x1aP\n\x15StaticAttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.tracdap.metadata.Value:\x02\x38\x01\x42\x0f\n\r_packageGroupB\x07\n\x05_pathB\x1e\n\x1aorg.finos.tracdap.metadataP\x01\x62\x06proto3')
19
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n2tracdap/rt/_impl/grpc/tracdap/metadata/model.proto\x12\x10tracdap.metadata\x1a\x31tracdap/rt/_impl/grpc/tracdap/metadata/type.proto\x1a\x31tracdap/rt/_impl/grpc/tracdap/metadata/data.proto\"\xab\x02\n\x0eModelParameter\x12\x33\n\tparamType\x18\x01 \x01(\x0b\x32 .tracdap.metadata.TypeDescriptor\x12\r\n\x05label\x18\x02 \x01(\t\x12\x32\n\x0c\x64\x65\x66\x61ultValue\x18\x03 \x01(\x0b\x32\x17.tracdap.metadata.ValueH\x00\x88\x01\x01\x12\x44\n\nparamProps\x18\x04 \x03(\x0b\x32\x30.tracdap.metadata.ModelParameter.ParamPropsEntry\x1aJ\n\x0fParamPropsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.tracdap.metadata.Value:\x02\x38\x01\x42\x0f\n\r_defaultValue\"\x8a\x02\n\x10ModelInputSchema\x12\x32\n\x06schema\x18\x01 \x01(\x0b\x32\".tracdap.metadata.SchemaDefinition\x12\x12\n\x05label\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x10\n\x08optional\x18\x03 \x01(\x08\x12\x46\n\ninputProps\x18\x04 \x03(\x0b\x32\x32.tracdap.metadata.ModelInputSchema.InputPropsEntry\x1aJ\n\x0fInputPropsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.tracdap.metadata.Value:\x02\x38\x01\x42\x08\n\x06_label\"\x8f\x02\n\x11ModelOutputSchema\x12\x32\n\x06schema\x18\x01 \x01(\x0b\x32\".tracdap.metadata.SchemaDefinition\x12\x12\n\x05label\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x10\n\x08optional\x18\x03 \x01(\x08\x12I\n\x0boutputProps\x18\x04 \x03(\x0b\x32\x34.tracdap.metadata.ModelOutputSchema.OutputPropsEntry\x1aK\n\x10OutputPropsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.tracdap.metadata.Value:\x02\x38\x01\x42\x08\n\x06_label\"\x9e\x06\n\x0fModelDefinition\x12\x10\n\x08language\x18\x01 \x01(\t\x12\x12\n\nrepository\x18\x02 \x01(\t\x12\x19\n\x0cpackageGroup\x18\n \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x07package\x18\x0b \x01(\t\x12\x0f\n\x07version\x18\x06 \x01(\t\x12\x12\n\nentryPoint\x18\x05 \x01(\t\x12\x11\n\x04path\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x45\n\nparameters\x18\x07 \x03(\x0b\x32\x31.tracdap.metadata.ModelDefinition.ParametersEntry\x12=\n\x06inputs\x18\x08 \x03(\x0b\x32-.tracdap.metadata.ModelDefinition.InputsEntry\x12?\n\x07outputs\x18\t \x03(\x0b\x32..tracdap.metadata.ModelDefinition.OutputsEntry\x12Q\n\x10staticAttributes\x18\x0c \x03(\x0b\x32\x37.tracdap.metadata.ModelDefinition.StaticAttributesEntry\x1aS\n\x0fParametersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .tracdap.metadata.ModelParameter:\x02\x38\x01\x1aQ\n\x0bInputsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x31\n\x05value\x18\x02 \x01(\x0b\x32\".tracdap.metadata.ModelInputSchema:\x02\x38\x01\x1aS\n\x0cOutputsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x32\n\x05value\x18\x02 \x01(\x0b\x32#.tracdap.metadata.ModelOutputSchema:\x02\x38\x01\x1aP\n\x15StaticAttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.tracdap.metadata.Value:\x02\x38\x01\x42\x0f\n\r_packageGroupB\x07\n\x05_pathB\x1e\n\x1aorg.finos.tracdap.metadataP\x01\x62\x06proto3')
20
20
 
21
21
  _globals = globals()
22
22
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -24,6 +24,12 @@ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'tracdap.rt._impl.grpc.tracd
24
24
  if _descriptor._USE_C_DESCRIPTORS == False:
25
25
  _globals['DESCRIPTOR']._options = None
26
26
  _globals['DESCRIPTOR']._serialized_options = b'\n\032org.finos.tracdap.metadataP\001'
27
+ _globals['_MODELPARAMETER_PARAMPROPSENTRY']._options = None
28
+ _globals['_MODELPARAMETER_PARAMPROPSENTRY']._serialized_options = b'8\001'
29
+ _globals['_MODELINPUTSCHEMA_INPUTPROPSENTRY']._options = None
30
+ _globals['_MODELINPUTSCHEMA_INPUTPROPSENTRY']._serialized_options = b'8\001'
31
+ _globals['_MODELOUTPUTSCHEMA_OUTPUTPROPSENTRY']._options = None
32
+ _globals['_MODELOUTPUTSCHEMA_OUTPUTPROPSENTRY']._serialized_options = b'8\001'
27
33
  _globals['_MODELDEFINITION_PARAMETERSENTRY']._options = None
28
34
  _globals['_MODELDEFINITION_PARAMETERSENTRY']._serialized_options = b'8\001'
29
35
  _globals['_MODELDEFINITION_INPUTSENTRY']._options = None
@@ -33,19 +39,25 @@ if _descriptor._USE_C_DESCRIPTORS == False:
33
39
  _globals['_MODELDEFINITION_STATICATTRIBUTESENTRY']._options = None
34
40
  _globals['_MODELDEFINITION_STATICATTRIBUTESENTRY']._serialized_options = b'8\001'
35
41
  _globals['_MODELPARAMETER']._serialized_start=175
36
- _globals['_MODELPARAMETER']._serialized_end=328
37
- _globals['_MODELINPUTSCHEMA']._serialized_start=330
38
- _globals['_MODELINPUTSCHEMA']._serialized_end=448
39
- _globals['_MODELOUTPUTSCHEMA']._serialized_start=450
40
- _globals['_MODELOUTPUTSCHEMA']._serialized_end=569
41
- _globals['_MODELDEFINITION']._serialized_start=572
42
- _globals['_MODELDEFINITION']._serialized_end=1370
43
- _globals['_MODELDEFINITION_PARAMETERSENTRY']._serialized_start=1011
44
- _globals['_MODELDEFINITION_PARAMETERSENTRY']._serialized_end=1094
45
- _globals['_MODELDEFINITION_INPUTSENTRY']._serialized_start=1096
46
- _globals['_MODELDEFINITION_INPUTSENTRY']._serialized_end=1177
47
- _globals['_MODELDEFINITION_OUTPUTSENTRY']._serialized_start=1179
48
- _globals['_MODELDEFINITION_OUTPUTSENTRY']._serialized_end=1262
49
- _globals['_MODELDEFINITION_STATICATTRIBUTESENTRY']._serialized_start=1264
50
- _globals['_MODELDEFINITION_STATICATTRIBUTESENTRY']._serialized_end=1344
42
+ _globals['_MODELPARAMETER']._serialized_end=474
43
+ _globals['_MODELPARAMETER_PARAMPROPSENTRY']._serialized_start=383
44
+ _globals['_MODELPARAMETER_PARAMPROPSENTRY']._serialized_end=457
45
+ _globals['_MODELINPUTSCHEMA']._serialized_start=477
46
+ _globals['_MODELINPUTSCHEMA']._serialized_end=743
47
+ _globals['_MODELINPUTSCHEMA_INPUTPROPSENTRY']._serialized_start=659
48
+ _globals['_MODELINPUTSCHEMA_INPUTPROPSENTRY']._serialized_end=733
49
+ _globals['_MODELOUTPUTSCHEMA']._serialized_start=746
50
+ _globals['_MODELOUTPUTSCHEMA']._serialized_end=1017
51
+ _globals['_MODELOUTPUTSCHEMA_OUTPUTPROPSENTRY']._serialized_start=932
52
+ _globals['_MODELOUTPUTSCHEMA_OUTPUTPROPSENTRY']._serialized_end=1007
53
+ _globals['_MODELDEFINITION']._serialized_start=1020
54
+ _globals['_MODELDEFINITION']._serialized_end=1818
55
+ _globals['_MODELDEFINITION_PARAMETERSENTRY']._serialized_start=1459
56
+ _globals['_MODELDEFINITION_PARAMETERSENTRY']._serialized_end=1542
57
+ _globals['_MODELDEFINITION_INPUTSENTRY']._serialized_start=1544
58
+ _globals['_MODELDEFINITION_INPUTSENTRY']._serialized_end=1625
59
+ _globals['_MODELDEFINITION_OUTPUTSENTRY']._serialized_start=1627
60
+ _globals['_MODELDEFINITION_OUTPUTSENTRY']._serialized_end=1710
61
+ _globals['_MODELDEFINITION_STATICATTRIBUTESENTRY']._serialized_start=1712
62
+ _globals['_MODELDEFINITION_STATICATTRIBUTESENTRY']._serialized_end=1792
51
63
  # @@protoc_insertion_point(module_scope)
@@ -8,34 +8,61 @@ from typing import ClassVar as _ClassVar, Mapping as _Mapping, Optional as _Opti
8
8
  DESCRIPTOR: _descriptor.FileDescriptor
9
9
 
10
10
  class ModelParameter(_message.Message):
11
- __slots__ = ("paramType", "label", "defaultValue")
11
+ __slots__ = ("paramType", "label", "defaultValue", "paramProps")
12
+ class ParamPropsEntry(_message.Message):
13
+ __slots__ = ("key", "value")
14
+ KEY_FIELD_NUMBER: _ClassVar[int]
15
+ VALUE_FIELD_NUMBER: _ClassVar[int]
16
+ key: str
17
+ value: _type_pb2.Value
18
+ def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[_type_pb2.Value, _Mapping]] = ...) -> None: ...
12
19
  PARAMTYPE_FIELD_NUMBER: _ClassVar[int]
13
20
  LABEL_FIELD_NUMBER: _ClassVar[int]
14
21
  DEFAULTVALUE_FIELD_NUMBER: _ClassVar[int]
22
+ PARAMPROPS_FIELD_NUMBER: _ClassVar[int]
15
23
  paramType: _type_pb2.TypeDescriptor
16
24
  label: str
17
25
  defaultValue: _type_pb2.Value
18
- def __init__(self, paramType: _Optional[_Union[_type_pb2.TypeDescriptor, _Mapping]] = ..., label: _Optional[str] = ..., defaultValue: _Optional[_Union[_type_pb2.Value, _Mapping]] = ...) -> None: ...
26
+ paramProps: _containers.MessageMap[str, _type_pb2.Value]
27
+ def __init__(self, paramType: _Optional[_Union[_type_pb2.TypeDescriptor, _Mapping]] = ..., label: _Optional[str] = ..., defaultValue: _Optional[_Union[_type_pb2.Value, _Mapping]] = ..., paramProps: _Optional[_Mapping[str, _type_pb2.Value]] = ...) -> None: ...
19
28
 
20
29
  class ModelInputSchema(_message.Message):
21
- __slots__ = ("schema", "label", "optional")
30
+ __slots__ = ("schema", "label", "optional", "inputProps")
31
+ class InputPropsEntry(_message.Message):
32
+ __slots__ = ("key", "value")
33
+ KEY_FIELD_NUMBER: _ClassVar[int]
34
+ VALUE_FIELD_NUMBER: _ClassVar[int]
35
+ key: str
36
+ value: _type_pb2.Value
37
+ def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[_type_pb2.Value, _Mapping]] = ...) -> None: ...
22
38
  SCHEMA_FIELD_NUMBER: _ClassVar[int]
23
39
  LABEL_FIELD_NUMBER: _ClassVar[int]
24
40
  OPTIONAL_FIELD_NUMBER: _ClassVar[int]
41
+ INPUTPROPS_FIELD_NUMBER: _ClassVar[int]
25
42
  schema: _data_pb2.SchemaDefinition
26
43
  label: str
27
44
  optional: bool
28
- def __init__(self, schema: _Optional[_Union[_data_pb2.SchemaDefinition, _Mapping]] = ..., label: _Optional[str] = ..., optional: bool = ...) -> None: ...
45
+ inputProps: _containers.MessageMap[str, _type_pb2.Value]
46
+ def __init__(self, schema: _Optional[_Union[_data_pb2.SchemaDefinition, _Mapping]] = ..., label: _Optional[str] = ..., optional: bool = ..., inputProps: _Optional[_Mapping[str, _type_pb2.Value]] = ...) -> None: ...
29
47
 
30
48
  class ModelOutputSchema(_message.Message):
31
- __slots__ = ("schema", "label", "optional")
49
+ __slots__ = ("schema", "label", "optional", "outputProps")
50
+ class OutputPropsEntry(_message.Message):
51
+ __slots__ = ("key", "value")
52
+ KEY_FIELD_NUMBER: _ClassVar[int]
53
+ VALUE_FIELD_NUMBER: _ClassVar[int]
54
+ key: str
55
+ value: _type_pb2.Value
56
+ def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[_type_pb2.Value, _Mapping]] = ...) -> None: ...
32
57
  SCHEMA_FIELD_NUMBER: _ClassVar[int]
33
58
  LABEL_FIELD_NUMBER: _ClassVar[int]
34
59
  OPTIONAL_FIELD_NUMBER: _ClassVar[int]
60
+ OUTPUTPROPS_FIELD_NUMBER: _ClassVar[int]
35
61
  schema: _data_pb2.SchemaDefinition
36
62
  label: str
37
63
  optional: bool
38
- def __init__(self, schema: _Optional[_Union[_data_pb2.SchemaDefinition, _Mapping]] = ..., label: _Optional[str] = ..., optional: bool = ...) -> None: ...
64
+ outputProps: _containers.MessageMap[str, _type_pb2.Value]
65
+ def __init__(self, schema: _Optional[_Union[_data_pb2.SchemaDefinition, _Mapping]] = ..., label: _Optional[str] = ..., optional: bool = ..., outputProps: _Optional[_Mapping[str, _type_pb2.Value]] = ...) -> None: ...
39
66
 
40
67
  class ModelDefinition(_message.Message):
41
68
  __slots__ = ("language", "repository", "packageGroup", "package", "version", "entryPoint", "path", "parameters", "inputs", "outputs", "staticAttributes")
@@ -13,6 +13,7 @@ _sym_db = _symbol_database.Default()
13
13
 
14
14
 
15
15
  from tracdap.rt._impl.grpc.tracdap.metadata import object_id_pb2 as tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_metadata_dot_object__id__pb2
16
+ from tracdap.rt._impl.grpc.tracdap.metadata import type_pb2 as tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_metadata_dot_type__pb2
16
17
  from tracdap.rt._impl.grpc.tracdap.metadata import data_pb2 as tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_metadata_dot_data__pb2
17
18
  from tracdap.rt._impl.grpc.tracdap.metadata import model_pb2 as tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_metadata_dot_model__pb2
18
19
  from tracdap.rt._impl.grpc.tracdap.metadata import flow_pb2 as tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_metadata_dot_flow__pb2
@@ -22,7 +23,7 @@ from tracdap.rt._impl.grpc.tracdap.metadata import custom_pb2 as tracdap_dot_rt_
22
23
  from tracdap.rt._impl.grpc.tracdap.metadata import stoarge_pb2 as tracdap_dot_rt_dot___impl_dot_grpc_dot_tracdap_dot_metadata_dot_stoarge__pb2
23
24
 
24
25
 
25
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n3tracdap/rt/_impl/grpc/tracdap/metadata/object.proto\x12\x10tracdap.metadata\x1a\x36tracdap/rt/_impl/grpc/tracdap/metadata/object_id.proto\x1a\x31tracdap/rt/_impl/grpc/tracdap/metadata/data.proto\x1a\x32tracdap/rt/_impl/grpc/tracdap/metadata/model.proto\x1a\x31tracdap/rt/_impl/grpc/tracdap/metadata/flow.proto\x1a\x30tracdap/rt/_impl/grpc/tracdap/metadata/job.proto\x1a\x31tracdap/rt/_impl/grpc/tracdap/metadata/file.proto\x1a\x33tracdap/rt/_impl/grpc/tracdap/metadata/custom.proto\x1a\x34tracdap/rt/_impl/grpc/tracdap/metadata/stoarge.proto\"\xf0\x03\n\x10ObjectDefinition\x12\x30\n\nobjectType\x18\x01 \x01(\x0e\x32\x1c.tracdap.metadata.ObjectType\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .tracdap.metadata.DataDefinitionH\x00\x12\x32\n\x05model\x18\x03 \x01(\x0b\x32!.tracdap.metadata.ModelDefinitionH\x00\x12\x30\n\x04\x66low\x18\x04 \x01(\x0b\x32 .tracdap.metadata.FlowDefinitionH\x00\x12.\n\x03job\x18\x05 \x01(\x0b\x32\x1f.tracdap.metadata.JobDefinitionH\x00\x12\x30\n\x04\x66ile\x18\x06 \x01(\x0b\x32 .tracdap.metadata.FileDefinitionH\x00\x12\x34\n\x06\x63ustom\x18\x07 \x01(\x0b\x32\".tracdap.metadata.CustomDefinitionH\x00\x12\x36\n\x07storage\x18\x08 \x01(\x0b\x32#.tracdap.metadata.StorageDefinitionH\x00\x12\x34\n\x06schema\x18\t \x01(\x0b\x32\".tracdap.metadata.SchemaDefinitionH\x00\x42\x0c\n\ndefinitionB2\n\x1aorg.finos.tracdap.metadataB\x12ObjectProtoWrapperP\x01\x62\x06proto3')
26
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n3tracdap/rt/_impl/grpc/tracdap/metadata/object.proto\x12\x10tracdap.metadata\x1a\x36tracdap/rt/_impl/grpc/tracdap/metadata/object_id.proto\x1a\x31tracdap/rt/_impl/grpc/tracdap/metadata/type.proto\x1a\x31tracdap/rt/_impl/grpc/tracdap/metadata/data.proto\x1a\x32tracdap/rt/_impl/grpc/tracdap/metadata/model.proto\x1a\x31tracdap/rt/_impl/grpc/tracdap/metadata/flow.proto\x1a\x30tracdap/rt/_impl/grpc/tracdap/metadata/job.proto\x1a\x31tracdap/rt/_impl/grpc/tracdap/metadata/file.proto\x1a\x33tracdap/rt/_impl/grpc/tracdap/metadata/custom.proto\x1a\x34tracdap/rt/_impl/grpc/tracdap/metadata/stoarge.proto\"\x87\x05\n\x10ObjectDefinition\x12\x30\n\nobjectType\x18\x01 \x01(\x0e\x32\x1c.tracdap.metadata.ObjectType\x12\x30\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32 .tracdap.metadata.DataDefinitionH\x00\x12\x32\n\x05model\x18\x03 \x01(\x0b\x32!.tracdap.metadata.ModelDefinitionH\x00\x12\x30\n\x04\x66low\x18\x04 \x01(\x0b\x32 .tracdap.metadata.FlowDefinitionH\x00\x12.\n\x03job\x18\x05 \x01(\x0b\x32\x1f.tracdap.metadata.JobDefinitionH\x00\x12\x30\n\x04\x66ile\x18\x06 \x01(\x0b\x32 .tracdap.metadata.FileDefinitionH\x00\x12\x34\n\x06\x63ustom\x18\x07 \x01(\x0b\x32\".tracdap.metadata.CustomDefinitionH\x00\x12\x36\n\x07storage\x18\x08 \x01(\x0b\x32#.tracdap.metadata.StorageDefinitionH\x00\x12\x34\n\x06schema\x18\t \x01(\x0b\x32\".tracdap.metadata.SchemaDefinitionH\x00\x12H\n\x0bobjectProps\x18\x64 \x03(\x0b\x32\x33.tracdap.metadata.ObjectDefinition.ObjectPropsEntry\x1aK\n\x10ObjectPropsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.tracdap.metadata.Value:\x02\x38\x01\x42\x0c\n\ndefinitionB2\n\x1aorg.finos.tracdap.metadataB\x12ObjectProtoWrapperP\x01\x62\x06proto3')
26
27
 
27
28
  _globals = globals()
28
29
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -30,6 +31,10 @@ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'tracdap.rt._impl.grpc.tracd
30
31
  if _descriptor._USE_C_DESCRIPTORS == False:
31
32
  _globals['DESCRIPTOR']._options = None
32
33
  _globals['DESCRIPTOR']._serialized_options = b'\n\032org.finos.tracdap.metadataB\022ObjectProtoWrapperP\001'
33
- _globals['_OBJECTDEFINITION']._serialized_start=492
34
- _globals['_OBJECTDEFINITION']._serialized_end=988
34
+ _globals['_OBJECTDEFINITION_OBJECTPROPSENTRY']._options = None
35
+ _globals['_OBJECTDEFINITION_OBJECTPROPSENTRY']._serialized_options = b'8\001'
36
+ _globals['_OBJECTDEFINITION']._serialized_start=543
37
+ _globals['_OBJECTDEFINITION']._serialized_end=1190
38
+ _globals['_OBJECTDEFINITION_OBJECTPROPSENTRY']._serialized_start=1101
39
+ _globals['_OBJECTDEFINITION_OBJECTPROPSENTRY']._serialized_end=1176
35
40
  # @@protoc_insertion_point(module_scope)
@@ -1,4 +1,5 @@
1
1
  from tracdap.rt._impl.grpc.tracdap.metadata import object_id_pb2 as _object_id_pb2
2
+ from tracdap.rt._impl.grpc.tracdap.metadata import type_pb2 as _type_pb2
2
3
  from tracdap.rt._impl.grpc.tracdap.metadata import data_pb2 as _data_pb2
3
4
  from tracdap.rt._impl.grpc.tracdap.metadata import model_pb2 as _model_pb2
4
5
  from tracdap.rt._impl.grpc.tracdap.metadata import flow_pb2 as _flow_pb2
@@ -6,6 +7,7 @@ from tracdap.rt._impl.grpc.tracdap.metadata import job_pb2 as _job_pb2
6
7
  from tracdap.rt._impl.grpc.tracdap.metadata import file_pb2 as _file_pb2
7
8
  from tracdap.rt._impl.grpc.tracdap.metadata import custom_pb2 as _custom_pb2
8
9
  from tracdap.rt._impl.grpc.tracdap.metadata import stoarge_pb2 as _stoarge_pb2
10
+ from google.protobuf.internal import containers as _containers
9
11
  from google.protobuf import descriptor as _descriptor
10
12
  from google.protobuf import message as _message
11
13
  from typing import ClassVar as _ClassVar, Mapping as _Mapping, Optional as _Optional, Union as _Union
@@ -13,7 +15,14 @@ from typing import ClassVar as _ClassVar, Mapping as _Mapping, Optional as _Opti
13
15
  DESCRIPTOR: _descriptor.FileDescriptor
14
16
 
15
17
  class ObjectDefinition(_message.Message):
16
- __slots__ = ("objectType", "data", "model", "flow", "job", "file", "custom", "storage", "schema")
18
+ __slots__ = ("objectType", "data", "model", "flow", "job", "file", "custom", "storage", "schema", "objectProps")
19
+ class ObjectPropsEntry(_message.Message):
20
+ __slots__ = ("key", "value")
21
+ KEY_FIELD_NUMBER: _ClassVar[int]
22
+ VALUE_FIELD_NUMBER: _ClassVar[int]
23
+ key: str
24
+ value: _type_pb2.Value
25
+ def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[_type_pb2.Value, _Mapping]] = ...) -> None: ...
17
26
  OBJECTTYPE_FIELD_NUMBER: _ClassVar[int]
18
27
  DATA_FIELD_NUMBER: _ClassVar[int]
19
28
  MODEL_FIELD_NUMBER: _ClassVar[int]
@@ -23,6 +32,7 @@ class ObjectDefinition(_message.Message):
23
32
  CUSTOM_FIELD_NUMBER: _ClassVar[int]
24
33
  STORAGE_FIELD_NUMBER: _ClassVar[int]
25
34
  SCHEMA_FIELD_NUMBER: _ClassVar[int]
35
+ OBJECTPROPS_FIELD_NUMBER: _ClassVar[int]
26
36
  objectType: _object_id_pb2.ObjectType
27
37
  data: _data_pb2.DataDefinition
28
38
  model: _model_pb2.ModelDefinition
@@ -32,4 +42,5 @@ class ObjectDefinition(_message.Message):
32
42
  custom: _custom_pb2.CustomDefinition
33
43
  storage: _stoarge_pb2.StorageDefinition
34
44
  schema: _data_pb2.SchemaDefinition
35
- def __init__(self, objectType: _Optional[_Union[_object_id_pb2.ObjectType, str]] = ..., data: _Optional[_Union[_data_pb2.DataDefinition, _Mapping]] = ..., model: _Optional[_Union[_model_pb2.ModelDefinition, _Mapping]] = ..., flow: _Optional[_Union[_flow_pb2.FlowDefinition, _Mapping]] = ..., job: _Optional[_Union[_job_pb2.JobDefinition, _Mapping]] = ..., file: _Optional[_Union[_file_pb2.FileDefinition, _Mapping]] = ..., custom: _Optional[_Union[_custom_pb2.CustomDefinition, _Mapping]] = ..., storage: _Optional[_Union[_stoarge_pb2.StorageDefinition, _Mapping]] = ..., schema: _Optional[_Union[_data_pb2.SchemaDefinition, _Mapping]] = ...) -> None: ...
45
+ objectProps: _containers.MessageMap[str, _type_pb2.Value]
46
+ def __init__(self, objectType: _Optional[_Union[_object_id_pb2.ObjectType, str]] = ..., data: _Optional[_Union[_data_pb2.DataDefinition, _Mapping]] = ..., model: _Optional[_Union[_model_pb2.ModelDefinition, _Mapping]] = ..., flow: _Optional[_Union[_flow_pb2.FlowDefinition, _Mapping]] = ..., job: _Optional[_Union[_job_pb2.JobDefinition, _Mapping]] = ..., file: _Optional[_Union[_file_pb2.FileDefinition, _Mapping]] = ..., custom: _Optional[_Union[_custom_pb2.CustomDefinition, _Mapping]] = ..., storage: _Optional[_Union[_stoarge_pb2.StorageDefinition, _Mapping]] = ..., schema: _Optional[_Union[_data_pb2.SchemaDefinition, _Mapping]] = ..., objectProps: _Optional[_Mapping[str, _type_pb2.Value]] = ...) -> None: ...
@@ -46,6 +46,27 @@ def _get_package_path(module_name):
46
46
  return module_path.parents[depth]
47
47
 
48
48
 
49
+ def run_model_guard(operation: str = None):
50
+
51
+ # A simple guard method to block model code from accessing parts of the TRAC runtime framework
52
+ # To blocks calls to the Python stdlib or 3rd party libs, use PythonGuardRails instead
53
+
54
+ stack = inspect.stack()
55
+ frame = stack[-1]
56
+
57
+ if operation is None:
58
+ operation = f"Calling {frame.function}()"
59
+
60
+ for frame_index in range(len(stack) - 2, 0, -1):
61
+
62
+ parent_frame = frame
63
+ frame = stack[frame_index]
64
+
65
+ if frame.function == "run_model" and parent_frame.function == "_execute":
66
+ err = f"{operation} is not allowed inside run_model()"
67
+ raise ex.ERuntimeValidation(err)
68
+
69
+
49
70
  class PythonGuardRails:
50
71
 
51
72
  DANGEROUS_BUILTIN_FUNCTIONS = ["exec", "eval", "compile", "open", "input", "memoryview"]
@@ -215,12 +215,15 @@ class ModelLoader:
215
215
 
216
216
  for name, param in model_def.parameters.items():
217
217
  self.__log.info(f"Parameter [{name}] - {param.paramType.basicType.name}")
218
+ param.paramProps = self._encoded_props(param.paramProps, "parameter", name)
218
219
 
219
220
  for name, schema in model_def.inputs.items():
220
221
  self.__log.info(f"Input [{name}] - {schema.schema.schemaType.name}")
222
+ schema.inputProps = self._encoded_props(schema.inputProps, "input", name)
221
223
 
222
224
  for name, schema in model_def.outputs.items():
223
225
  self.__log.info(f"Output [{name}] - {schema.schema.schemaType.name}")
226
+ schema.outputProps = self._encoded_props(schema.outputProps, "input", name)
224
227
 
225
228
  return model_def
226
229
 
@@ -231,3 +234,25 @@ class ModelLoader:
231
234
 
232
235
  self.__log.error(msg, exc_info=True)
233
236
  raise _ex.EModelValidation(msg) from e
237
+
238
+ @staticmethod
239
+ def _encoded_props(
240
+ raw_props: tp.Dict[str, tp.Any],
241
+ item_type: str, item_name: str) \
242
+ -> tp.Dict[str, _meta.Value]:
243
+
244
+ if raw_props is None:
245
+ return dict()
246
+
247
+ encoded_props = dict()
248
+
249
+ for key, raw_value in raw_props.items():
250
+
251
+ if raw_value is None:
252
+ raise _ex.EModelValidation(f"Invalid null property [{key}] for {item_type} [{item_name}]")
253
+ elif isinstance(raw_value, _meta.Value):
254
+ encoded_props[key] = raw_value
255
+ else:
256
+ encoded_props[key] = _types.MetadataCodec.encode_value(raw_value)
257
+
258
+ return encoded_props