qwak-core 0.4.420__py3-none-any.whl → 0.5.0__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.
@@ -14,7 +14,7 @@ _sym_db = _symbol_database.Default()
14
14
  from _qwak_proto.qwak.user_application.common.v0 import resources_pb2 as qwak_dot_user__application_dot_common_dot_v0_dot_resources__pb2
15
15
 
16
16
 
17
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1eqwak/builds/build_values.proto\x12\x15qwak.build.management\x1a/qwak/user_application/common/v0/resources.proto\"\xc3\x03\n\x10ModelBuildValues\x12\x34\n\nbuild_info\x18\x01 \x01(\x0b\x32 .qwak.build.management.BuildInfo\x12<\n\x0emodel_metadata\x18\x02 \x01(\x0b\x32$.qwak.build.management.ModelMetadata\x12\x45\n\x13model_code_location\x18\x03 \x01(\x0b\x32(.qwak.build.management.ModelCodeLocation\x12G\n\x14\x62uild_execution_spec\x18\x04 \x01(\x0b\x32).qwak.build.management.BuildExecutionSpec\x12\x30\n\x08sdk_spec\x18\x05 \x01(\x0b\x32\x1e.qwak.build.management.SdkSpec\x12G\n\x14jfrog_ecosystem_spec\x18\x06 \x01(\x0b\x32).qwak.build.management.JfrogEcosystemSpec\x12\x30\n\x08job_spec\x18\x07 \x01(\x0b\x32\x1e.qwak.build.management.JobSpec\"\xa3\x01\n\tBuildInfo\x12\x10\n\x08\x62uild_id\x18\x01 \x01(\t\x12\x13\n\x0b\x62ranch_name\x18\x02 \x01(\t\x12\x12\n\nbuild_tags\x18\x03 \x03(\t\x12\x14\n\x0c\x62uild_config\x18\x04 \x01(\t\x12\x45\n\x13\x62uild_properties_v1\x18\x05 \x01(\x0b\x32(.qwak.build.management.BuildPropertiesV1\"]\n\x11\x42uildPropertiesV1\x12\x18\n\x10\x62uild_config_url\x18\x01 \x01(\t\x12\x15\n\rsdk_wheel_url\x18\x02 \x01(\t\x12\x17\n\x0fsdk_version_url\x18\x03 \x01(\t\"\x8e\x01\n\rModelMetadata\x12\x10\n\x08model_id\x18\x01 \x01(\t\x12\x12\n\naccount_id\x18\x02 \x01(\t\x12\x0f\n\x07user_id\x18\x03 \x01(\t\x12\x46\n\x13\x61rtifactory_details\x18\x04 \x01(\x0b\x32).qwak.build.management.ArtifactoryDetails\")\n\x12\x41rtifactoryDetails\x12\x13\n\x0bproject_key\x18\x01 \x01(\t\"\xa0\x01\n\x11ModelCodeLocation\x12\x1c\n\x14main_model_directory\x18\x01 \x01(\t\x12\x34\n\tlocal_uri\x18\x02 \x01(\x0b\x32\x1f.qwak.build.management.LocalUriH\x00\x12\x30\n\x07git_uri\x18\x03 \x01(\x0b\x32\x1d.qwak.build.management.GitUriH\x00\x42\x05\n\x03uri\"\x18\n\x08LocalUri\x12\x0c\n\x04path\x18\x01 \x01(\t\"M\n\x06GitUri\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x36\n\x0bgit_details\x18\x02 \x01(\x0b\x32!.qwak.build.management.GitDetails\"|\n\nGitDetails\x12\x0e\n\x06\x62ranch\x18\x01 \x01(\t\x12\x11\n\tcommit_id\x18\x02 \x01(\t\x12\x15\n\x0b\x63redentials\x18\x03 \x01(\tH\x00\x12!\n\x17\x63redentials_secret_name\x18\x04 \x01(\tH\x00\x42\x11\n\x0fgit_credentials\"\xd0\x02\n\x12\x42uildExecutionSpec\x12\x1f\n\x17\x62uild_image_destination\x18\x01 \x01(\t\x12\"\n\x1ashould_build_without_cache\x18\x02 \x01(\x08\x12G\n\x14logs_verbosity_level\x18\x03 \x01(\x0e\x32).qwak.build.management.LogsVerbosityLevel\x12\x12\n\nbase_image\x18\x04 \x01(\t\x12\x1b\n\x13\x63ustom_iam_role_arn\x18\x05 \x01(\t\x12\x10\n\x08\x65nv_vars\x18\x06 \x03(\t\x12\'\n\x1fremote_builder_auth_secret_name\x18\x07 \x01(\t\x12@\n\x10\x63ontainer_engine\x18\x08 \x01(\x0b\x32&.qwak.build.management.ContainerEngine\"a\n\x07SdkSpec\x12\x13\n\x0bsdk_version\x18\x01 \x01(\t\x12\x1b\n\x13sdk_extra_index_url\x18\x02 \x01(\t\x12$\n\x1csdk_runtime_version_override\x18\x03 \x01(\t\"k\n\x12JfrogEcosystemSpec\x12\x0f\n\x07\x62\x61seUrl\x18\x01 \x01(\t\x12\x1d\n\x15\x61\x63\x63\x65ssTokenSecretName\x18\x02 \x01(\t\x12%\n\x1d\x61rtifactorySettingsSecretName\x18\x03 \x01(\t\"\x9d\x03\n\x07JobSpec\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\"\n\x1aprovision_instance_timeout\x18\x02 \x01(\x05\x12>\n\x0fpurchase_option\x18\x03 \x01(\x0e\x32%.qwak.build.management.PurchaseOption\x12$\n\x1cis_node_optimization_enabled\x18\x04 \x01(\x08\x12\"\n\x1ashould_use_build_isolation\x18\x05 \x01(\x08\x12#\n\x1bis_multi_tenant_environment\x18\x06 \x01(\x08\x12\x1a\n\x12is_self_hosted_jpd\x18\n \x01(\x08\x12 \n\x18\x62uild_executor_image_url\x18\x07 \x01(\t\x12<\n\x0e\x63loud_provider\x18\x08 \x01(\x0e\x32$.qwak.build.management.CloudProvider\x12\x30\n\x08job_size\x18\t \x01(\x0b\x32\x1e.qwak.build.management.JobSize\"\x9e\x02\n\x07JobSize\x12\x0f\n\x03\x63pu\x18\x01 \x01(\x02\x42\x02\x18\x01\x12\x19\n\rmemory_amount\x18\x02 \x01(\x05\x42\x02\x18\x01\x12;\n\x0cmemory_units\x18\x03 \x01(\x0e\x32!.qwak.build.management.MemoryUnitB\x02\x18\x01\x12H\n\rgpu_resources\x18\x04 \x01(\x0b\x32-.qwak.user_application.common.v0.GpuResourcesB\x02\x18\x01\x12`\n\x1c\x63lient_pod_compute_resources\x18\x05 \x01(\x0b\x32:.qwak.user_application.common.v0.ClientPodComputeResources\"\x9d\x01\n\x0f\x43ontainerEngine\x12>\n\x06\x64ocker\x18\x01 \x01(\x0b\x32,.qwak.build.management.DockerContainerEngineH\x00\x12\x42\n\x06podman\x18\x02 \x01(\x0b\x32,.qwak.build.management.PodmanContainerEngineB\x02\x18\x01H\x00\x42\x06\n\x04type\"\x17\n\x15\x44ockerContainerEngine\"\x17\n\x15PodmanContainerEngine*e\n\x0ePurchaseOption\x12\x1b\n\x17INVALID_PURCHASE_OPTION\x10\x00\x12\x18\n\x14SPOT_PURCHASE_OPTION\x10\x01\x12\x1c\n\x18ONDEMAND_PURCHASE_OPTION\x10\x02*H\n\rCloudProvider\x12\x1a\n\x16INVALID_CLOUD_PROVIDER\x10\x00\x12\x07\n\x03\x41WS\x10\x01\x12\x07\n\x03GCP\x10\x02\x12\t\n\x05\x41ZURE\x10\x03*7\n\nMemoryUnit\x12\x17\n\x13INVALID_MEMORY_UNIT\x10\x00\x12\x07\n\x03MIB\x10\x01\x12\x07\n\x03GIB\x10\x02*S\n\x12LogsVerbosityLevel\x12\x1a\n\x16INVALID_LOGS_VERBOSITY\x10\x00\x12\t\n\x05\x44\x45\x42UG\x10\n\x12\x08\n\x04INFO\x10\x14\x12\x0c\n\x08\x43RITICAL\x10\x32\x42\x36\n com.qwak.ai.management.build.apiP\x01Z\x10qwak/build;buildb\x06proto3')
17
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1eqwak/builds/build_values.proto\x12\x15qwak.build.management\x1a/qwak/user_application/common/v0/resources.proto\"\xc3\x03\n\x10ModelBuildValues\x12\x34\n\nbuild_info\x18\x01 \x01(\x0b\x32 .qwak.build.management.BuildInfo\x12<\n\x0emodel_metadata\x18\x02 \x01(\x0b\x32$.qwak.build.management.ModelMetadata\x12\x45\n\x13model_code_location\x18\x03 \x01(\x0b\x32(.qwak.build.management.ModelCodeLocation\x12G\n\x14\x62uild_execution_spec\x18\x04 \x01(\x0b\x32).qwak.build.management.BuildExecutionSpec\x12\x30\n\x08sdk_spec\x18\x05 \x01(\x0b\x32\x1e.qwak.build.management.SdkSpec\x12G\n\x14jfrog_ecosystem_spec\x18\x06 \x01(\x0b\x32).qwak.build.management.JfrogEcosystemSpec\x12\x30\n\x08job_spec\x18\x07 \x01(\x0b\x32\x1e.qwak.build.management.JobSpec\"\xa3\x01\n\tBuildInfo\x12\x10\n\x08\x62uild_id\x18\x01 \x01(\t\x12\x13\n\x0b\x62ranch_name\x18\x02 \x01(\t\x12\x12\n\nbuild_tags\x18\x03 \x03(\t\x12\x14\n\x0c\x62uild_config\x18\x04 \x01(\t\x12\x45\n\x13\x62uild_properties_v1\x18\x05 \x01(\x0b\x32(.qwak.build.management.BuildPropertiesV1\"]\n\x11\x42uildPropertiesV1\x12\x18\n\x10\x62uild_config_url\x18\x01 \x01(\t\x12\x15\n\rsdk_wheel_url\x18\x02 \x01(\t\x12\x17\n\x0fsdk_version_url\x18\x03 \x01(\t\"\x8e\x01\n\rModelMetadata\x12\x10\n\x08model_id\x18\x01 \x01(\t\x12\x12\n\naccount_id\x18\x02 \x01(\t\x12\x0f\n\x07user_id\x18\x03 \x01(\t\x12\x46\n\x13\x61rtifactory_details\x18\x04 \x01(\x0b\x32).qwak.build.management.ArtifactoryDetails\")\n\x12\x41rtifactoryDetails\x12\x13\n\x0bproject_key\x18\x01 \x01(\t\"\xa0\x01\n\x11ModelCodeLocation\x12\x1c\n\x14main_model_directory\x18\x01 \x01(\t\x12\x34\n\tlocal_uri\x18\x02 \x01(\x0b\x32\x1f.qwak.build.management.LocalUriH\x00\x12\x30\n\x07git_uri\x18\x03 \x01(\x0b\x32\x1d.qwak.build.management.GitUriH\x00\x42\x05\n\x03uri\"\x18\n\x08LocalUri\x12\x0c\n\x04path\x18\x01 \x01(\t\"M\n\x06GitUri\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x36\n\x0bgit_details\x18\x02 \x01(\x0b\x32!.qwak.build.management.GitDetails\"|\n\nGitDetails\x12\x0e\n\x06\x62ranch\x18\x01 \x01(\t\x12\x11\n\tcommit_id\x18\x02 \x01(\t\x12\x15\n\x0b\x63redentials\x18\x03 \x01(\tH\x00\x12!\n\x17\x63redentials_secret_name\x18\x04 \x01(\tH\x00\x42\x11\n\x0fgit_credentials\"\xd0\x02\n\x12\x42uildExecutionSpec\x12\x1f\n\x17\x62uild_image_destination\x18\x01 \x01(\t\x12\"\n\x1ashould_build_without_cache\x18\x02 \x01(\x08\x12G\n\x14logs_verbosity_level\x18\x03 \x01(\x0e\x32).qwak.build.management.LogsVerbosityLevel\x12\x12\n\nbase_image\x18\x04 \x01(\t\x12\x1b\n\x13\x63ustom_iam_role_arn\x18\x05 \x01(\t\x12\x10\n\x08\x65nv_vars\x18\x06 \x03(\t\x12\'\n\x1fremote_builder_auth_secret_name\x18\x07 \x01(\t\x12@\n\x10\x63ontainer_engine\x18\x08 \x01(\x0b\x32&.qwak.build.management.ContainerEngine\"a\n\x07SdkSpec\x12\x13\n\x0bsdk_version\x18\x01 \x01(\t\x12\x1b\n\x13sdk_extra_index_url\x18\x02 \x01(\t\x12$\n\x1csdk_runtime_version_override\x18\x03 \x01(\t\"k\n\x12JfrogEcosystemSpec\x12\x0f\n\x07\x62\x61seUrl\x18\x01 \x01(\t\x12\x1d\n\x15\x61\x63\x63\x65ssTokenSecretName\x18\x02 \x01(\t\x12%\n\x1d\x61rtifactorySettingsSecretName\x18\x03 \x01(\t\"\xb5\x04\n\x07JobSpec\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\"\n\x1aprovision_instance_timeout\x18\x02 \x01(\x05\x12>\n\x0fpurchase_option\x18\x03 \x01(\x0e\x32%.qwak.build.management.PurchaseOption\x12$\n\x1cis_node_optimization_enabled\x18\x04 \x01(\x08\x12\"\n\x1ashould_use_build_isolation\x18\x05 \x01(\x08\x12#\n\x1bis_multi_tenant_environment\x18\x06 \x01(\x08\x12\x1a\n\x12is_self_hosted_jpd\x18\n \x01(\x08\x12 \n\x18\x62uild_executor_image_url\x18\x07 \x01(\t\x12<\n\x0e\x63loud_provider\x18\x08 \x01(\x0e\x32$.qwak.build.management.CloudProvider\x12\x30\n\x08job_size\x18\t \x01(\x0b\x32\x1e.qwak.build.management.JobSize\x12Y\n\x17\x62uild_executor_env_vars\x18\x0b \x03(\x0b\x32\x38.qwak.build.management.JobSpec.BuildExecutorEnvVarsEntry\x1a;\n\x19\x42uildExecutorEnvVarsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x9e\x02\n\x07JobSize\x12\x0f\n\x03\x63pu\x18\x01 \x01(\x02\x42\x02\x18\x01\x12\x19\n\rmemory_amount\x18\x02 \x01(\x05\x42\x02\x18\x01\x12;\n\x0cmemory_units\x18\x03 \x01(\x0e\x32!.qwak.build.management.MemoryUnitB\x02\x18\x01\x12H\n\rgpu_resources\x18\x04 \x01(\x0b\x32-.qwak.user_application.common.v0.GpuResourcesB\x02\x18\x01\x12`\n\x1c\x63lient_pod_compute_resources\x18\x05 \x01(\x0b\x32:.qwak.user_application.common.v0.ClientPodComputeResources\"\x9d\x01\n\x0f\x43ontainerEngine\x12>\n\x06\x64ocker\x18\x01 \x01(\x0b\x32,.qwak.build.management.DockerContainerEngineH\x00\x12\x42\n\x06podman\x18\x02 \x01(\x0b\x32,.qwak.build.management.PodmanContainerEngineB\x02\x18\x01H\x00\x42\x06\n\x04type\"\x17\n\x15\x44ockerContainerEngine\"\x17\n\x15PodmanContainerEngine*e\n\x0ePurchaseOption\x12\x1b\n\x17INVALID_PURCHASE_OPTION\x10\x00\x12\x18\n\x14SPOT_PURCHASE_OPTION\x10\x01\x12\x1c\n\x18ONDEMAND_PURCHASE_OPTION\x10\x02*H\n\rCloudProvider\x12\x1a\n\x16INVALID_CLOUD_PROVIDER\x10\x00\x12\x07\n\x03\x41WS\x10\x01\x12\x07\n\x03GCP\x10\x02\x12\t\n\x05\x41ZURE\x10\x03*7\n\nMemoryUnit\x12\x17\n\x13INVALID_MEMORY_UNIT\x10\x00\x12\x07\n\x03MIB\x10\x01\x12\x07\n\x03GIB\x10\x02*S\n\x12LogsVerbosityLevel\x12\x1a\n\x16INVALID_LOGS_VERBOSITY\x10\x00\x12\t\n\x05\x44\x45\x42UG\x10\n\x12\x08\n\x04INFO\x10\x14\x12\x0c\n\x08\x43RITICAL\x10\x32\x42\x36\n com.qwak.ai.management.build.apiP\x01Z\x10qwak/build;buildb\x06proto3')
18
18
 
19
19
  _globals = globals()
20
20
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -23,6 +23,8 @@ if _descriptor._USE_C_DESCRIPTORS == False:
23
23
 
24
24
  DESCRIPTOR._options = None
25
25
  DESCRIPTOR._serialized_options = b'\n com.qwak.ai.management.build.apiP\001Z\020qwak/build;build'
26
+ _JOBSPEC_BUILDEXECUTORENVVARSENTRY._options = None
27
+ _JOBSPEC_BUILDEXECUTORENVVARSENTRY._serialized_options = b'8\001'
26
28
  _JOBSIZE.fields_by_name['cpu']._options = None
27
29
  _JOBSIZE.fields_by_name['cpu']._serialized_options = b'\030\001'
28
30
  _JOBSIZE.fields_by_name['memory_amount']._options = None
@@ -33,14 +35,14 @@ if _descriptor._USE_C_DESCRIPTORS == False:
33
35
  _JOBSIZE.fields_by_name['gpu_resources']._serialized_options = b'\030\001'
34
36
  _CONTAINERENGINE.fields_by_name['podman']._options = None
35
37
  _CONTAINERENGINE.fields_by_name['podman']._serialized_options = b'\030\001'
36
- _globals['_PURCHASEOPTION']._serialized_start=2865
37
- _globals['_PURCHASEOPTION']._serialized_end=2966
38
- _globals['_CLOUDPROVIDER']._serialized_start=2968
39
- _globals['_CLOUDPROVIDER']._serialized_end=3040
40
- _globals['_MEMORYUNIT']._serialized_start=3042
41
- _globals['_MEMORYUNIT']._serialized_end=3097
42
- _globals['_LOGSVERBOSITYLEVEL']._serialized_start=3099
43
- _globals['_LOGSVERBOSITYLEVEL']._serialized_end=3182
38
+ _globals['_PURCHASEOPTION']._serialized_start=3017
39
+ _globals['_PURCHASEOPTION']._serialized_end=3118
40
+ _globals['_CLOUDPROVIDER']._serialized_start=3120
41
+ _globals['_CLOUDPROVIDER']._serialized_end=3192
42
+ _globals['_MEMORYUNIT']._serialized_start=3194
43
+ _globals['_MEMORYUNIT']._serialized_end=3249
44
+ _globals['_LOGSVERBOSITYLEVEL']._serialized_start=3251
45
+ _globals['_LOGSVERBOSITYLEVEL']._serialized_end=3334
44
46
  _globals['_MODELBUILDVALUES']._serialized_start=107
45
47
  _globals['_MODELBUILDVALUES']._serialized_end=558
46
48
  _globals['_BUILDINFO']._serialized_start=561
@@ -66,13 +68,15 @@ if _descriptor._USE_C_DESCRIPTORS == False:
66
68
  _globals['_JFROGECOSYSTEMSPEC']._serialized_start=1841
67
69
  _globals['_JFROGECOSYSTEMSPEC']._serialized_end=1948
68
70
  _globals['_JOBSPEC']._serialized_start=1951
69
- _globals['_JOBSPEC']._serialized_end=2364
70
- _globals['_JOBSIZE']._serialized_start=2367
71
- _globals['_JOBSIZE']._serialized_end=2653
72
- _globals['_CONTAINERENGINE']._serialized_start=2656
73
- _globals['_CONTAINERENGINE']._serialized_end=2813
74
- _globals['_DOCKERCONTAINERENGINE']._serialized_start=2815
75
- _globals['_DOCKERCONTAINERENGINE']._serialized_end=2838
76
- _globals['_PODMANCONTAINERENGINE']._serialized_start=2840
77
- _globals['_PODMANCONTAINERENGINE']._serialized_end=2863
71
+ _globals['_JOBSPEC']._serialized_end=2516
72
+ _globals['_JOBSPEC_BUILDEXECUTORENVVARSENTRY']._serialized_start=2457
73
+ _globals['_JOBSPEC_BUILDEXECUTORENVVARSENTRY']._serialized_end=2516
74
+ _globals['_JOBSIZE']._serialized_start=2519
75
+ _globals['_JOBSIZE']._serialized_end=2805
76
+ _globals['_CONTAINERENGINE']._serialized_start=2808
77
+ _globals['_CONTAINERENGINE']._serialized_end=2965
78
+ _globals['_DOCKERCONTAINERENGINE']._serialized_start=2967
79
+ _globals['_DOCKERCONTAINERENGINE']._serialized_end=2990
80
+ _globals['_PODMANCONTAINERENGINE']._serialized_start=2992
81
+ _globals['_PODMANCONTAINERENGINE']._serialized_end=3015
78
82
  # @@protoc_insertion_point(module_scope)
@@ -420,6 +420,21 @@ class JobSpec(google.protobuf.message.Message):
420
420
 
421
421
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
422
422
 
423
+ class BuildExecutorEnvVarsEntry(google.protobuf.message.Message):
424
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
425
+
426
+ KEY_FIELD_NUMBER: builtins.int
427
+ VALUE_FIELD_NUMBER: builtins.int
428
+ key: builtins.str
429
+ value: builtins.str
430
+ def __init__(
431
+ self,
432
+ *,
433
+ key: builtins.str = ...,
434
+ value: builtins.str = ...,
435
+ ) -> None: ...
436
+ def ClearField(self, field_name: typing_extensions.Literal["key", b"key", "value", b"value"]) -> None: ...
437
+
423
438
  NAMESPACE_FIELD_NUMBER: builtins.int
424
439
  PROVISION_INSTANCE_TIMEOUT_FIELD_NUMBER: builtins.int
425
440
  PURCHASE_OPTION_FIELD_NUMBER: builtins.int
@@ -430,6 +445,7 @@ class JobSpec(google.protobuf.message.Message):
430
445
  BUILD_EXECUTOR_IMAGE_URL_FIELD_NUMBER: builtins.int
431
446
  CLOUD_PROVIDER_FIELD_NUMBER: builtins.int
432
447
  JOB_SIZE_FIELD_NUMBER: builtins.int
448
+ BUILD_EXECUTOR_ENV_VARS_FIELD_NUMBER: builtins.int
433
449
  namespace: builtins.str
434
450
  """Kubernetes namespace in which to run the build job."""
435
451
  provision_instance_timeout: builtins.int
@@ -443,6 +459,9 @@ class JobSpec(google.protobuf.message.Message):
443
459
  cloud_provider: global___CloudProvider.ValueType
444
460
  @property
445
461
  def job_size(self) -> global___JobSize: ...
462
+ @property
463
+ def build_executor_env_vars(self) -> google.protobuf.internal.containers.ScalarMap[builtins.str, builtins.str]:
464
+ """Environment variables to set on the build executor container."""
446
465
  def __init__(
447
466
  self,
448
467
  *,
@@ -456,9 +475,10 @@ class JobSpec(google.protobuf.message.Message):
456
475
  build_executor_image_url: builtins.str = ...,
457
476
  cloud_provider: global___CloudProvider.ValueType = ...,
458
477
  job_size: global___JobSize | None = ...,
478
+ build_executor_env_vars: collections.abc.Mapping[builtins.str, builtins.str] | None = ...,
459
479
  ) -> None: ...
460
480
  def HasField(self, field_name: typing_extensions.Literal["job_size", b"job_size"]) -> builtins.bool: ...
461
- def ClearField(self, field_name: typing_extensions.Literal["build_executor_image_url", b"build_executor_image_url", "cloud_provider", b"cloud_provider", "is_multi_tenant_environment", b"is_multi_tenant_environment", "is_node_optimization_enabled", b"is_node_optimization_enabled", "is_self_hosted_jpd", b"is_self_hosted_jpd", "job_size", b"job_size", "namespace", b"namespace", "provision_instance_timeout", b"provision_instance_timeout", "purchase_option", b"purchase_option", "should_use_build_isolation", b"should_use_build_isolation"]) -> None: ...
481
+ def ClearField(self, field_name: typing_extensions.Literal["build_executor_env_vars", b"build_executor_env_vars", "build_executor_image_url", b"build_executor_image_url", "cloud_provider", b"cloud_provider", "is_multi_tenant_environment", b"is_multi_tenant_environment", "is_node_optimization_enabled", b"is_node_optimization_enabled", "is_self_hosted_jpd", b"is_self_hosted_jpd", "job_size", b"job_size", "namespace", b"namespace", "provision_instance_timeout", b"provision_instance_timeout", "purchase_option", b"purchase_option", "should_use_build_isolation", b"should_use_build_isolation"]) -> None: ...
462
482
 
463
483
  global___JobSpec = JobSpec
464
484
 
qwak/__init__.py CHANGED
@@ -1,7 +1,7 @@
1
1
  """Top-level package for qwak-core."""
2
2
 
3
3
  __author__ = "Qwak.ai"
4
- __version__ = "0.4.420"
4
+ __version__ = "0.5.0"
5
5
 
6
6
  from qwak.inner.di_configuration import wire_dependencies
7
7
  from qwak.model.experiment_tracking import log_metric, log_param
@@ -1,6 +1,7 @@
1
1
  from .quiet_error import QuietError
2
2
  from .qwak_exception import QwakException
3
3
  from .qwak_general_build_exception import QwakGeneralBuildException
4
+ from .qwak_grpc_address_exception import QwakGrpcAddressException
4
5
  from .qwak_http_exception import QwakHTTPException
5
6
  from .qwak_inference_exception import QwakInferenceException
6
7
  from .qwak_load_configuration_exception import LoadConfigurationException
@@ -0,0 +1,9 @@
1
+ from typing import Union
2
+ from urllib.parse import ParseResult
3
+
4
+ from qwak.exceptions import QwakException
5
+
6
+
7
+ class QwakGrpcAddressException(QwakException):
8
+ def __init__(self, details: str, grpc_address: Union[str, ParseResult]):
9
+ self.message = f"Not a valid gRPC address: '{grpc_address}'. Details: {details}"
qwak/inner/const.py CHANGED
@@ -33,10 +33,6 @@ class QwakConstants:
33
33
 
34
34
  TOKEN_AUDIENCE: str = "https://auth-token.qwak.ai/" # nosec B105
35
35
 
36
- QWAK_AUTHENTICATION_URL = "https://grpc.qwak.ai/api/v1/authentication/qwak-api-key"
37
-
38
- QWAK_AUTHENTICATED_USER_ENDPOINT: str = (
39
- "https://grpc.qwak.ai/api/v0/runtime/get-authenticated-user-context"
40
- )
41
-
42
36
  QWAK_APP_URL: str = "https://app.qwak.ai"
37
+
38
+ CONTROL_PLANE_GRPC_ADDRESS_ENVAR_NAME: str = "CONTROL_PLANE_GRPC_ADDRESS"
@@ -1,69 +1,3 @@
1
- import os
2
-
3
1
  from .account import UserAccountConfiguration
4
2
  from .containers import QwakContainer
5
-
6
-
7
- def wire_dependencies():
8
- container = QwakContainer()
9
-
10
- default_config_file = os.path.join(os.path.dirname(__file__), "config.yml")
11
- container.config.from_yaml(default_config_file)
12
-
13
- from qwak.clients import (
14
- administration,
15
- alert_management,
16
- alerts_registry,
17
- analytics,
18
- audience,
19
- automation_management,
20
- autoscaling,
21
- batch_job_management,
22
- build_orchestrator,
23
- data_versioning,
24
- deployment,
25
- feature_store,
26
- file_versioning,
27
- instance_template,
28
- integration_management,
29
- kube_deployment_captain,
30
- logging_client,
31
- model_management,
32
- project,
33
- prompt_manager,
34
- system_secret,
35
- user_application_instance,
36
- vector_store,
37
- workspace_manager,
38
- )
39
-
40
- container.wire(
41
- packages=[
42
- administration,
43
- alert_management,
44
- audience,
45
- automation_management,
46
- autoscaling,
47
- analytics,
48
- batch_job_management,
49
- build_orchestrator,
50
- data_versioning,
51
- deployment,
52
- file_versioning,
53
- instance_template,
54
- kube_deployment_captain,
55
- logging_client,
56
- model_management,
57
- project,
58
- feature_store,
59
- user_application_instance,
60
- alerts_registry,
61
- workspace_manager,
62
- vector_store,
63
- integration_management,
64
- system_secret,
65
- prompt_manager,
66
- ]
67
- )
68
-
69
- return container
3
+ from .dependency_wiring import wire_dependencies
@@ -0,0 +1,98 @@
1
+ import os
2
+ from pathlib import Path
3
+ from typing import Optional
4
+
5
+ from qwak.inner.const import QwakConstants
6
+ from qwak.inner.di_configuration import QwakContainer
7
+ from qwak.inner.tool.grpc.grpc_tools import validate_grpc_address
8
+ from qwak.tools.logger import get_qwak_logger
9
+
10
+
11
+ logger = get_qwak_logger()
12
+
13
+ __DEFAULT_CONFIG_FILE_PATH: Path = Path(__file__).parent / "config.yml"
14
+
15
+
16
+ def wire_dependencies():
17
+ container = QwakContainer()
18
+
19
+ container.config.from_yaml(__DEFAULT_CONFIG_FILE_PATH)
20
+ control_plane_grpc_address_override: Optional[str] = os.getenv(
21
+ QwakConstants.CONTROL_PLANE_GRPC_ADDRESS_ENVAR_NAME
22
+ )
23
+
24
+ if control_plane_grpc_address_override:
25
+ validate_grpc_address(control_plane_grpc_address_override)
26
+ __override_control_plane_grpc_address(
27
+ container, control_plane_grpc_address_override
28
+ )
29
+
30
+ from qwak.clients import (
31
+ administration,
32
+ alert_management,
33
+ alerts_registry,
34
+ analytics,
35
+ audience,
36
+ automation_management,
37
+ autoscaling,
38
+ batch_job_management,
39
+ build_orchestrator,
40
+ data_versioning,
41
+ deployment,
42
+ feature_store,
43
+ file_versioning,
44
+ instance_template,
45
+ integration_management,
46
+ kube_deployment_captain,
47
+ logging_client,
48
+ model_management,
49
+ project,
50
+ prompt_manager,
51
+ system_secret,
52
+ user_application_instance,
53
+ vector_store,
54
+ workspace_manager,
55
+ )
56
+
57
+ container.wire(
58
+ packages=[
59
+ administration,
60
+ alert_management,
61
+ audience,
62
+ automation_management,
63
+ autoscaling,
64
+ analytics,
65
+ batch_job_management,
66
+ build_orchestrator,
67
+ data_versioning,
68
+ deployment,
69
+ file_versioning,
70
+ instance_template,
71
+ kube_deployment_captain,
72
+ logging_client,
73
+ model_management,
74
+ project,
75
+ feature_store,
76
+ user_application_instance,
77
+ alerts_registry,
78
+ workspace_manager,
79
+ vector_store,
80
+ integration_management,
81
+ system_secret,
82
+ prompt_manager,
83
+ ]
84
+ )
85
+
86
+ return container
87
+
88
+
89
+ def __override_control_plane_grpc_address(
90
+ container: "QwakContainer", control_plane_grpc_address_override: str
91
+ ):
92
+ logger.debug(
93
+ "Overriding control plane gRPC address from environment variable to %s.",
94
+ control_plane_grpc_address_override,
95
+ )
96
+ container.config.grpc.core.address.from_value(
97
+ control_plane_grpc_address_override.strip()
98
+ )
@@ -1,15 +1,18 @@
1
1
  import logging
2
+ import re
2
3
  import time
3
4
  from abc import ABC, abstractmethod
4
5
  from random import randint
5
6
  from typing import Callable, Optional, Tuple
7
+ from urllib.parse import urlparse, ParseResult
6
8
 
7
9
  import grpc
8
- from qwak.exceptions import QwakException
9
10
 
11
+ from qwak.exceptions import QwakException, QwakGrpcAddressException
10
12
  from .grpc_auth import Auth0Client
11
13
 
12
14
  logger = logging.getLogger()
15
+ HOSTNAME_REGEX: str = r"^(?!-)(?:[A-Za-z0-9-]{1,63}\.)*[A-Za-z0-9-]{1,63}(?<!-)$"
13
16
 
14
17
 
15
18
  def create_grpc_channel(
@@ -19,7 +22,7 @@ def create_grpc_channel(
19
22
  auth_metadata_plugin: grpc.AuthMetadataPlugin = None,
20
23
  timeout: int = 100,
21
24
  options=None,
22
- backoff_options={},
25
+ backoff_options=None,
23
26
  max_attempts=4,
24
27
  status_for_retry=(grpc.StatusCode.UNAVAILABLE,),
25
28
  attempt=0,
@@ -40,6 +43,9 @@ def create_grpc_channel(
40
43
  status_for_retry: grpc statuses to retry upon
41
44
  Returns: Returns a grpc.Channel
42
45
  """
46
+ if backoff_options is None:
47
+ backoff_options = {}
48
+
43
49
  if not url:
44
50
  raise QwakException("Unable to create gRPC channel. URL has not been defined.")
45
51
 
@@ -101,11 +107,14 @@ def create_grpc_channel_or_none(
101
107
  auth_metadata_plugin: grpc.AuthMetadataPlugin = None,
102
108
  timeout: int = 30,
103
109
  options=None,
104
- backoff_options={},
110
+ backoff_options=None,
105
111
  max_attempts=2,
106
112
  status_for_retry=(grpc.StatusCode.UNAVAILABLE,),
107
113
  attempt=0,
108
114
  ) -> Callable[[Optional[str], Optional[bool]], Optional[grpc.Channel]]:
115
+ if backoff_options is None:
116
+ backoff_options = {}
117
+
109
118
  def deferred_channel(
110
119
  url_overwrite: Optional[str] = None, ssl_overwrite: Optional[bool] = None
111
120
  ):
@@ -129,6 +138,117 @@ def create_grpc_channel_or_none(
129
138
  return deferred_channel
130
139
 
131
140
 
141
+ def validate_grpc_address(
142
+ grpc_address: str,
143
+ is_port_specification_allowed: bool = False,
144
+ is_url_scheme_allowed: bool = False,
145
+ ):
146
+ """
147
+ Validate gRPC address format
148
+ Args:
149
+ grpc_address (str): gRPC address to validate
150
+ is_port_specification_allowed (bool): Whether to allow port specification in the address
151
+ is_url_scheme_allowed (bool): Whether to allow URL scheme in the address
152
+ Raises:
153
+ QwakGrpcAddressException: If the gRPC address is invalid
154
+ """
155
+ parsed_grpc_address: ParseResult = parse_address(grpc_address)
156
+ hostname: str = get_hostname_from_address(parsed_grpc_address)
157
+ validate_paths_are_not_included_in_address(parsed_grpc_address)
158
+
159
+ if not is_url_scheme_allowed:
160
+ __validate_url_scheme_not_included_in_address(parsed_grpc_address)
161
+
162
+ if not is_port_specification_allowed:
163
+ __validate_port_not_included_in_address(parsed_grpc_address)
164
+
165
+ if not is_valid_hostname(hostname):
166
+ raise QwakGrpcAddressException(
167
+ "gRPC address must be a simple hostname or fully qualified domain name.",
168
+ parsed_grpc_address,
169
+ )
170
+
171
+
172
+ def validate_paths_are_not_included_in_address(
173
+ parsed_grpc_address: ParseResult,
174
+ ) -> None:
175
+ has_invalid_path: bool = (
176
+ parsed_grpc_address.path not in {"", "/"}
177
+ or parsed_grpc_address.query
178
+ or parsed_grpc_address.fragment
179
+ )
180
+
181
+ if has_invalid_path:
182
+ raise QwakGrpcAddressException(
183
+ "gRPC address must not contain paths, queries, or fragments.",
184
+ parsed_grpc_address,
185
+ )
186
+
187
+
188
+ def get_hostname_from_address(parsed_grpc_address: ParseResult) -> str:
189
+ hostname: Optional[str] = parsed_grpc_address.hostname
190
+ if not hostname:
191
+ raise QwakGrpcAddressException(
192
+ "gRPC address must contain a valid hostname.", parsed_grpc_address
193
+ )
194
+
195
+ return hostname
196
+
197
+
198
+ def __validate_url_scheme_not_included_in_address(
199
+ parsed_grpc_address: ParseResult,
200
+ ) -> None:
201
+ if parsed_grpc_address.scheme:
202
+ raise QwakGrpcAddressException(
203
+ "URL scheme is not allowed in the gRPC address.", parsed_grpc_address
204
+ )
205
+
206
+
207
+ def __validate_port_not_included_in_address(parsed_grpc_address: ParseResult):
208
+ try:
209
+ port: Optional[int] = parsed_grpc_address.port
210
+ except ValueError as exc:
211
+ raise QwakGrpcAddressException(
212
+ "Invalid port specification in the gRPC address.", parsed_grpc_address
213
+ ) from exc
214
+
215
+ if port:
216
+ raise QwakGrpcAddressException(
217
+ "Port specification is not allowed in the gRPC address.",
218
+ parsed_grpc_address,
219
+ )
220
+
221
+
222
+ def parse_address(grpc_address: str) -> ParseResult:
223
+ if not grpc_address or not grpc_address.strip():
224
+ raise QwakGrpcAddressException(
225
+ "gRPC address must not be empty or whitespace.", grpc_address
226
+ )
227
+
228
+ trimmed_address: str = grpc_address.strip()
229
+ parsed_address: ParseResult = urlparse(
230
+ trimmed_address if "://" in trimmed_address else f"//{trimmed_address}"
231
+ )
232
+
233
+ return parsed_address
234
+
235
+
236
+ def is_valid_hostname(hostname: str) -> bool:
237
+ """
238
+ Validate that the supplied hostname conforms to RFC-style label rules:
239
+ anchored pattern enforces full-string validation, negative lookahead/lookbehind block
240
+ leading or trailing hyphens per label, and each dot-separated label must be 1-63
241
+ alphanumeric/hyphen characters.
242
+
243
+ Args:
244
+ hostname (str): The hostname to validate.
245
+ Returns:
246
+ bool: True if the hostname is valid, False otherwise.
247
+ """
248
+ hostname_pattern: re.Pattern = re.compile(HOSTNAME_REGEX)
249
+ return bool(hostname_pattern.fullmatch(hostname))
250
+
251
+
132
252
  class SleepingPolicy(ABC):
133
253
  @abstractmethod
134
254
  def sleep(self, try_i: int):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: qwak-core
3
- Version: 0.4.420
3
+ Version: 0.5.0
4
4
  Summary: Qwak Core contains the necessary objects and communication tools for using the Qwak Platform
5
5
  License: Apache-2.0
6
6
  Keywords: mlops,ml,deployment,serving,model
@@ -13,8 +13,6 @@ Classifier: Programming Language :: Python :: 3
13
13
  Classifier: Programming Language :: Python :: 3.9
14
14
  Classifier: Programming Language :: Python :: 3.10
15
15
  Classifier: Programming Language :: Python :: 3.11
16
- Classifier: Programming Language :: Python :: 3.7
17
- Classifier: Programming Language :: Python :: 3.8
18
16
  Classifier: Programming Language :: Python :: Implementation :: CPython
19
17
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
20
18
  Provides-Extra: feature-store
@@ -202,8 +202,8 @@ _qwak_proto/qwak/builds/build_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD
202
202
  _qwak_proto/qwak/builds/build_url_pb2.py,sha256=G7EUD7nYmhEVsStEYPnmqiESsV6sKaWjmcuyvahI0nk,4611
203
203
  _qwak_proto/qwak/builds/build_url_pb2.pyi,sha256=qaYyuLRHN2hOqYXlN9mKJo9gpggUnPmTVZIu-zNA0dI,11372
204
204
  _qwak_proto/qwak/builds/build_url_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
205
- _qwak_proto/qwak/builds/build_values_pb2.py,sha256=VTJA6J2_A73ePw5zDQPY7iA89f8xd1yay0nhxt6u9SA,9014
206
- _qwak_proto/qwak/builds/build_values_pb2.pyi,sha256=T-WvC45AaYIuQbYbs2QysVVHVaOqsaG1HyTz8NxQaek,24158
205
+ _qwak_proto/qwak/builds/build_values_pb2.py,sha256=emkDIRrYkp2tHYkRXOVSmyOp0wDrLXxFroKmx0LCNcY,9514
206
+ _qwak_proto/qwak/builds/build_values_pb2.pyi,sha256=ZDT29YdzTwjxkyy7nDTaN6H_W3WeF7gPMss-AQPXf3c,25106
207
207
  _qwak_proto/qwak/builds/build_values_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
208
208
  _qwak_proto/qwak/builds/builds_orchestrator_service_pb2.py,sha256=nvh6ANn8rNVjWByiB0xu-8Kt45FKh-C8YJaw5_I_N9M,14575
209
209
  _qwak_proto/qwak/builds/builds_orchestrator_service_pb2.pyi,sha256=Vl8UmQpIEslUhln3_xizdaHAWfBMBuaL8-aNAbdNBQs,24711
@@ -622,7 +622,7 @@ _qwak_proto/qwak/workspace/workspace_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXH
622
622
  _qwak_proto/qwak/workspace/workspace_service_pb2.py,sha256=93uNm83VVrkLG_XVsuBOBTPs4UJF91YD1xJTOEbRyig,9239
623
623
  _qwak_proto/qwak/workspace/workspace_service_pb2.pyi,sha256=nKKCHwnovZhsy8TSVmdz-Vtl0nviOOoX56HD-41Xo08,13726
624
624
  _qwak_proto/qwak/workspace/workspace_service_pb2_grpc.py,sha256=yKGuexxTBza99Ihe0DSTniV2ZSd_AG47inHenqfi890,27193
625
- qwak/__init__.py,sha256=NwxqokbTZKEi_-JJ1sGcTpPyduo7WxqxJUnATJTRpmI,587
625
+ qwak/__init__.py,sha256=aaBONhY9W5XmAkfG2JMCYVo8o_97_6ZbIYUBvacmB7E,585
626
626
  qwak/automations/__init__.py,sha256=qFZRvCxUUn8gcxkJR0v19ulHW2oJ0x6-Rif7HiheDP4,1522
627
627
  qwak/automations/automation_executions.py,sha256=5MeH_epYYWb8NKXgAozwT_jPyyUDednBHG7izloi7RY,3228
628
628
  qwak/automations/automations.py,sha256=2Wyrgj2mW5VmJzTKAXj3vQM_svYCuq_Bsu3_Vu9SdR4,12732
@@ -711,12 +711,13 @@ qwak/clients/vector_store/management_client.py,sha256=EiO6B-zO0ETgL0VonWJZnigqpF
711
711
  qwak/clients/vector_store/serving_client.py,sha256=hl9B5Rr3fvCN12gCI6amlNoUll7sxT8rUE0a_JqhEHs,5293
712
712
  qwak/clients/workspace_manager/__init__.py,sha256=sJ_tnt-CqjXVVNlcywmyQ5L3n5Dk0uMDNjSVvEwHziA,43
713
713
  qwak/clients/workspace_manager/client.py,sha256=KXoipmYmzKTS1-auStjbZ7JKzXdCyHHqk22Q7KnrgV4,8136
714
- qwak/exceptions/__init__.py,sha256=GsyscKOIg1nwYCJz5MhpF5iKPyNyAR1NI2VtQf2OEus,790
714
+ qwak/exceptions/__init__.py,sha256=RgGCJgUvVbNm9Z_Kxnu3YUiI877LcqdMv7mJVtDxqYg,856
715
715
  qwak/exceptions/quiet_error.py,sha256=ePdCGP6ta8afjzprMiGoJFY-gxf8albRwuY0t1WF2lY,559
716
716
  qwak/exceptions/qwak_decode_exception.py,sha256=-Fgh3sc7iFEmhXTYJ1X5GFDvA32yRqTR2owgiYyDHbc,149
717
717
  qwak/exceptions/qwak_exception.py,sha256=w4kmvUVy3VLroDzFxYE112s6Vd4oJuchStemhw4qMCg,192
718
718
  qwak/exceptions/qwak_external_exception.py,sha256=i1-9D7uVHinkUhdKEBWEHi287dmVF5PgJaFq23ZGSI8,251
719
719
  qwak/exceptions/qwak_general_build_exception.py,sha256=dKJo9t0OGSOrZNBsLOibkTAmV3mGzXf-C3wRQaDphqc,424
720
+ qwak/exceptions/qwak_grpc_address_exception.py,sha256=MUSn3eP8z81KKDhb5Fe_888vGz8b1RndS79ulHuHI5o,320
720
721
  qwak/exceptions/qwak_http_exception.py,sha256=U1tlEFBp6BD5eICtATI8iCl4UJhVVFN2AWhWK-xbvoc,579
721
722
  qwak/exceptions/qwak_inference_exception.py,sha256=wvVQDf_saQt0FucWyVPI-lsz90OCbT-WqcB77_DzhU0,100
722
723
  qwak/exceptions/qwak_load_configuration_exception.py,sha256=rTs4lkgZbLYysgVBYt1Xi2i0GGSOFunen0oMpULYfdU,54
@@ -863,11 +864,12 @@ qwak/inner/build_logic/tools/files.py,sha256=druKkTp640Zy3x1MLjuTuXY56r5blEnH8dS
863
864
  qwak/inner/build_logic/tools/ignore_files.py,sha256=E65s3m46pmSX4q4hX2-R5HYHDO4VCQHjip8Xn_yOBRg,750
864
865
  qwak/inner/build_logic/tools/text.py,sha256=tH-v19Mt8l90sMVxku5XRtrderT0qdRqJ-jLijqannA,188
865
866
  qwak/inner/build_logic/trigger_build_context.py,sha256=n5s7MRk41h8cxPI3IVuqMQUVuCc-D8A7Hhq35YuuAps,200
866
- qwak/inner/const.py,sha256=x4QzsCKr80c7CfYI2TkgIVdvX7vKrTq3mmHp7GFVF34,1131
867
- qwak/inner/di_configuration/__init__.py,sha256=_QzRdBIKha032PIx5qqJ2bI6K1Z7ceAqVUXmBJtXvJ8,1709
867
+ qwak/inner/const.py,sha256=H441szDAQsTBxCVWtk9HuawgZdPZkLFJRW6pxn1j5WM,991
868
+ qwak/inner/di_configuration/__init__.py,sha256=RxGaowPAmq-entRtvlp2Ln6uc08wD0TTFwnTr7cr5zI,133
868
869
  qwak/inner/di_configuration/account.py,sha256=V5NOVOsxhe11-oD4i4UFskWMhq0EOyJ0rDbNSAv7GfA,5338
869
870
  qwak/inner/di_configuration/config.yml,sha256=GUvaZMWIDIR_d7hFcPVG_kHdCwpERKH1AFDakG3vqI4,242
870
871
  qwak/inner/di_configuration/containers.py,sha256=dK-cfd8ajT6yujlEhPhcRYB-avdYDcreQz_2kTIVDRQ,1252
872
+ qwak/inner/di_configuration/dependency_wiring.py,sha256=5T9kJ26MBnzuJxUYlj3Q9JKUptevQeHSuxuwdq6UNBE,2659
871
873
  qwak/inner/di_configuration/session.py,sha256=Pwqapcu-0dsbb5dDn7ZGewVk4bYRN9sWk6ity72IDqY,452
872
874
  qwak/inner/instance_template/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
873
875
  qwak/inner/instance_template/verify_template_id.py,sha256=-c0Fh89XAfphKCpkurYaD-YyX3M3NkkpSLH4QsNPyko,1916
@@ -880,7 +882,7 @@ qwak/inner/tool/__init__.py,sha256=DDoMZk7LIZNfu63Ft0mLE5wflwlQoghAJ1ZmMAcAeVE,7
880
882
  qwak/inner/tool/auth.py,sha256=_78ufvtkNQ3ogcFwkotVySZgdS1yMTuIDMLOBsICkSU,4483
881
883
  qwak/inner/tool/grpc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
882
884
  qwak/inner/tool/grpc/grpc_auth.py,sha256=_DvwaRruUu12l4K6ACvmzsTbIDlKl1kuKjm-ustQ5ns,1139
883
- qwak/inner/tool/grpc/grpc_tools.py,sha256=lY7SkXnnE0MrZOCFmg2KZZ5iZ7YJu_Z5F-R-6ezm4cU,6897
885
+ qwak/inner/tool/grpc/grpc_tools.py,sha256=XReEerN5bVh1JlDwxFx6Ea-gBecGnkesQnuYlzpyGGQ,10880
884
886
  qwak/inner/tool/grpc/grpc_try_wrapping.py,sha256=4RScvo2jiCr5XwZvaH516OJWqbMSxC8MWIarrD-5HnA,5654
885
887
  qwak/inner/tool/protobuf_factory.py,sha256=ar_oY38w_x0sxgVF7EBs5h7gchNsDntvtKK5sSYxb24,1686
886
888
  qwak/inner/tool/retry_utils.py,sha256=KcSFJuj02RKF-H9INpCmdiTNXlywEMJ2ClBa00N9aNM,435
@@ -1095,6 +1097,6 @@ qwak_services_mock/mocks/workspace_manager_service_mock.py,sha256=O9ZSwln4T4kHVk
1095
1097
  qwak_services_mock/services_mock.py,sha256=0BWwS2re9ryO3JrJJgSNyEQ0lDOjyrpV36oa8t7Pd7A,19163
1096
1098
  qwak_services_mock/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1097
1099
  qwak_services_mock/utils/service_utils.py,sha256=ZlB0CnB1J6oBn6_m7fQO2U8tKoboHdUa6ljjkRMYNXU,265
1098
- qwak_core-0.4.420.dist-info/METADATA,sha256=Tcdg4IafaB25J4k8bPYSXHUBubP905lbO7pA06R6CWY,2088
1099
- qwak_core-0.4.420.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
1100
- qwak_core-0.4.420.dist-info/RECORD,,
1100
+ qwak_core-0.5.0.dist-info/METADATA,sha256=pzzzeva96l3XgdUddzV2thBc-STh7nQAEdeIIK5klb0,1986
1101
+ qwak_core-0.5.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
1102
+ qwak_core-0.5.0.dist-info/RECORD,,