frogml-core 0.0.86__py3-none-any.whl → 0.0.88__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.
frogml_core/__init__.py CHANGED
@@ -1,7 +1,7 @@
1
1
  """Top-level package for frogml."""
2
2
 
3
3
  __author__ = "jfrog"
4
- __version__ = "0.0.86"
4
+ __version__ = "0.0.88"
5
5
 
6
6
  from frogml_core.inner.di_configuration import wire_dependencies
7
7
  from frogml_core.model.model_version_tracking import ( # noqa: F401,E501
@@ -2,8 +2,15 @@ from typing import cast
2
2
 
3
3
  from dependency_injector.wiring import Provide, inject
4
4
 
5
- from frogml_core.exceptions import FrogmlException
6
5
  from frogml_core.inner.di_configuration import FrogmlContainer
6
+ from frogml_core.inner.tool.grpc.grpc_try_wrapping import grpc_try_catch_wrapper
7
+ from frogml_proto.qwak.ecosystem.jfrog.v0.jfrog_tenant_info_service_pb2 import (
8
+ GetJFrogTenantInfoResponse,
9
+ GetJFrogTenantInfoRequest,
10
+ )
11
+ from frogml_proto.qwak.ecosystem.jfrog.v0.jfrog_tenant_info_service_pb2_grpc import (
12
+ JFrogTenantInfoServiceStub,
13
+ )
7
14
  from frogml_proto.qwak.jfrog.gateway.v0.repository_service_pb2 import (
8
15
  GetRepositoryConfigurationResponse,
9
16
  GetRepositoryConfigurationRequest,
@@ -21,7 +28,9 @@ class JfrogGatewayClient:
21
28
  @inject
22
29
  def __init__(self, grpc_channel=Provide[FrogmlContainer.core_grpc_channel]):
23
30
  self.__repository_service = RepositoryServiceStub(grpc_channel)
31
+ self.__jfrog_tenant_info_service = JFrogTenantInfoServiceStub(grpc_channel)
24
32
 
33
+ @grpc_try_catch_wrapper("Failed to get repository configuration")
25
34
  def get_repository_configuration(
26
35
  self, repository_key: str
27
36
  ) -> GetRepositoryConfigurationResponse:
@@ -32,10 +41,20 @@ class JfrogGatewayClient:
32
41
  """
33
42
  request = GetRepositoryConfigurationRequest(repository_key=repository_key)
34
43
 
35
- try:
36
- return cast(
37
- GetRepositoryConfigurationResponse,
38
- self.__repository_service.GetRepositoryConfiguration(request),
39
- )
40
- except Exception as e:
41
- raise FrogmlException(f"Failed to get repository configuration: {e}") from e
44
+ return cast(
45
+ GetRepositoryConfigurationResponse,
46
+ self.__repository_service.GetRepositoryConfiguration(request),
47
+ )
48
+
49
+ @grpc_try_catch_wrapper("Failed to get JFrog tenant info")
50
+ def get_jfrog_tenant_info(self) -> GetJFrogTenantInfoResponse:
51
+ """
52
+ Get the customer's JFrog tenant info
53
+ :return: The JFrog tenant info response
54
+ """
55
+ return cast(
56
+ GetJFrogTenantInfoResponse,
57
+ self.__jfrog_tenant_info_service.GetJFrogTenantInfo(
58
+ GetJFrogTenantInfoRequest()
59
+ ),
60
+ )
@@ -1,15 +1,39 @@
1
+ import logging
2
+ from typing import Callable
3
+
1
4
  import grpc
2
5
 
3
6
  from frogml_core.exceptions import FrogmlException
4
7
 
5
8
 
6
- def grpc_try_catch_wrapper(exception_message):
7
- def decorator(function):
9
+ logger = logging.getLogger(__name__)
10
+ logger.setLevel(logging.INFO)
11
+
12
+
13
+ def grpc_try_catch_wrapper(exception_message: str):
14
+ def decorator(function: Callable):
8
15
  def _inner_wrapper(*args, **kwargs):
9
16
  try:
17
+ logger.debug(
18
+ "About to call gRPC function: %s where *args = %s and **kwargs = %s",
19
+ function.__name__,
20
+ args,
21
+ kwargs,
22
+ )
10
23
  return function(*args, **kwargs)
11
- except grpc.RpcError as e:
12
- raise FrogmlException(exception_message + f". Error is: {e.details()}.")
24
+ except Exception as e:
25
+ logger.exception(
26
+ "An exception occurred in gRPC function %s. Exception: %s",
27
+ function.__name__,
28
+ e,
29
+ )
30
+ if isinstance(e, grpc.RpcError):
31
+ # noinspection PyUnresolvedReferences
32
+ raise FrogmlException(
33
+ exception_message + f". Error is: {e.details()}."
34
+ ) from e
35
+
36
+ raise e
13
37
 
14
38
  return _inner_wrapper
15
39
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: frogml-core
3
- Version: 0.0.86
3
+ Version: 0.0.88
4
4
  Summary: frogml Core contains the necessary objects and communication tools for using the Jfrog ml Platform
5
5
  License: Apache-2.0
6
6
  Keywords: mlops,ml,deployment,serving,model
@@ -31,7 +31,7 @@ Requires-Dist: protobuf (>=4.21.6) ; python_version >= "3.10"
31
31
  Requires-Dist: pyarrow (>=6.0.0) ; extra == "feature-store"
32
32
  Requires-Dist: pyathena (>=2.2.0,!=2.18.0) ; extra == "feature-store"
33
33
  Requires-Dist: pyspark (==3.4.2) ; extra == "feature-store"
34
- Requires-Dist: python-jose
34
+ Requires-Dist: python-jose[cryptography] (>=3.4.0)
35
35
  Requires-Dist: python-json-logger (>=2.0.2)
36
36
  Requires-Dist: requests
37
37
  Requires-Dist: retrying (==1.3.4)
@@ -1,4 +1,4 @@
1
- frogml_core/__init__.py,sha256=Ed-B3bIfukVJ22Ht4IpZ_A6-BAXGXgCI-XF79-6UH1M,777
1
+ frogml_core/__init__.py,sha256=twgBbCi-3DxE4i01CUscvYdGwQFPLUrynAGv-9irXi0,777
2
2
  frogml_core/automations/__init__.py,sha256=j2gD15MN-xVWhI5rAFsDwhL0CIyICLNT0scXsKvNBkU,1547
3
3
  frogml_core/automations/automation_executions.py,sha256=xpOb9Dq8gPPGNQDJTvBBZbNz4woZDRZY0HqnLSu7pwU,3230
4
4
  frogml_core/automations/automations.py,sha256=GKEQyQMi8sxX5oZn62PaxPi0zD8IaJRjBkhczRJxHNs,13070
@@ -65,7 +65,7 @@ frogml_core/clients/integration_management/integration_utils.py,sha256=j5gomMtYi
65
65
  frogml_core/clients/integration_management/openai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
66
  frogml_core/clients/integration_management/openai/openai_system_secret.py,sha256=eP3blUextKicLnjpDcyElpShKCwsSnq7_OIt5pf3kLc,2145
67
67
  frogml_core/clients/jfrog_gateway/__init__.py,sha256=E_BrYKBESU3wGNiR_RQncbAhLWyvJ-Ub2Akt_6FpfgM,39
68
- frogml_core/clients/jfrog_gateway/client.py,sha256=H4hF3MNi0QBYwGgD9c9A-4-VQlBB7zlQgH3ImpX8aBQ,1357
68
+ frogml_core/clients/jfrog_gateway/client.py,sha256=-7eN9nq7BUVDCC_rBBHlOd7Ngu6sL1Lwn4G-pLKA51g,2101
69
69
  frogml_core/clients/kube_deployment_captain/__init__.py,sha256=rJUEEy3zNH0aTFyuO_UBexzaUKdjvwU9P2vV1MDj684,41
70
70
  frogml_core/clients/kube_deployment_captain/client.py,sha256=oz7VF37TSO0S07MqXOYu2Xmx_rl9IVrfHOz_8MWnBZ8,9340
71
71
  frogml_core/clients/location_discovery/__init__.py,sha256=sqGQ75YHFE6nvOcir38fykUUmAa6cFEIze8PJYgYWRc,44
@@ -285,7 +285,7 @@ frogml_core/inner/tool/auth.py,sha256=H0tQTc8JgEGLxv79IS_28jahi8cq8NNoP3lpxlQshP
285
285
  frogml_core/inner/tool/grpc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
286
286
  frogml_core/inner/tool/grpc/grpc_auth.py,sha256=WPFWn7CfGp-pSqlnUTplHB6lfuJdzpS6jeidmpyondo,1421
287
287
  frogml_core/inner/tool/grpc/grpc_tools.py,sha256=8sXDWBd_kVRuwmUSdpQNobylT6u8H_83Q8WlZJYOi0c,7247
288
- frogml_core/inner/tool/grpc/grpc_try_wrapping.py,sha256=zSk7netTKMLoBf8WW3uf5Bw5bqlhGVDtx83Q3wQ8JkU,434
288
+ frogml_core/inner/tool/grpc/grpc_try_wrapping.py,sha256=nMNzmHQcgROBfd_QOTTUCZy-bIcpxPGPiUwsseqIrLg,1172
289
289
  frogml_core/inner/tool/protobuf_factory.py,sha256=QBk7ySxHRkxvrC8ICZR7sYizDHIZKQHOcGfo6qXnrDA,1699
290
290
  frogml_core/inner/tool/retry_utils.py,sha256=KcSFJuj02RKF-H9INpCmdiTNXlywEMJ2ClBa00N9aNM,435
291
291
  frogml_core/inner/tool/run_config/__init__.py,sha256=krOWmfbiUyMxa4Z7FHZk3gGZBbMiJINxLxD7XwyUefE,277
@@ -666,6 +666,12 @@ frogml_proto/qwak/deployment/deployment_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8
666
666
  frogml_proto/qwak/deployment/deployment_service_pb2.py,sha256=nElkI-aRZBXTRbWTn6yZ9-m_sSMG7S_KKSEn2qPH_jg,46324
667
667
  frogml_proto/qwak/deployment/deployment_service_pb2.pyi,sha256=U43wEm09zS8pyjl_bHqym9b778pgodxPl-LrsP8gTrc,40993
668
668
  frogml_proto/qwak/deployment/deployment_service_pb2_grpc.py,sha256=JTfQWEXtDmSa7E_wlCPFGuWe4mWF3BhbU5kphAJmEUk,27757
669
+ frogml_proto/qwak/ecosystem/jfrog/v0/jfrog_tenant_info_service_pb2.py,sha256=IYnu38-bjQHONTmtb57FrcqR6MOIIfxOvIXIb_wpN2w,4798
670
+ frogml_proto/qwak/ecosystem/jfrog/v0/jfrog_tenant_info_service_pb2.pyi,sha256=hnVo03rTflR9nBvNIYqHf-RB5PfrxJhn3hnKgnTQ5ac,2448
671
+ frogml_proto/qwak/ecosystem/jfrog/v0/jfrog_tenant_info_service_pb2_grpc.py,sha256=yrYrxN01Ty295xL0HDECbKVudyw98UKxAP_qsYx1gTQ,5294
672
+ frogml_proto/qwak/ecosystem/jfrog/v0/jfrog_tenant_pb2.py,sha256=GLErGwAdocN1Cn_06ye-NFdCGEzBfYkAutYf6Eoh4FU,2459
673
+ frogml_proto/qwak/ecosystem/jfrog/v0/jfrog_tenant_pb2.pyi,sha256=685WP-kcl5wFSPW9H8wPRES9XSrRdFnIAOknpfMsrbc,1639
674
+ frogml_proto/qwak/ecosystem/jfrog/v0/jfrog_tenant_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
669
675
  frogml_proto/qwak/ecosystem/jfrog/v0/token_pb2.py,sha256=8hJ7R8WfDA3c8ey_kgKFcPsi4_V-Vw0tNwsN9aEhxDQ,13287
670
676
  frogml_proto/qwak/ecosystem/jfrog/v0/token_pb2.pyi,sha256=eZhdgcdWYETdyH8uKi8qHfqx97_i_JTzlI2SY_Pppoc,17104
671
677
  frogml_proto/qwak/ecosystem/jfrog/v0/token_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
@@ -1070,11 +1076,12 @@ frogml_services_mock/mocks/features_operator_v3_service.py,sha256=_RcUeL9LRFbxL7
1070
1076
  frogml_services_mock/mocks/features_set_state_service_api.py,sha256=jLtDYRBQUXP9x2DaywRPNFTtAGewP1JF1wv28ZTRbL4,2290
1071
1077
  frogml_services_mock/mocks/feedback_service.py,sha256=NH8IskHnwbHGfDJCunSWMWQd9UfVBL7rPzVrFWrCZC4,1140
1072
1078
  frogml_services_mock/mocks/file_versioning_service.py,sha256=MtxGcWoB_hkJUMBRSso9-G_6_WBbHkrgzG6Rf_37Ysk,2606
1073
- frogml_services_mock/mocks/frogml_mocks.py,sha256=bR8pW3pdz5ogHBiHTA_RrQNf85x1CDSnUnwMvOpt4p0,6546
1079
+ frogml_services_mock/mocks/frogml_mocks.py,sha256=zJx_jIOkXtO0ngdZ1iHNykku1KcaHsmdRSdxGdyotGc,6701
1074
1080
  frogml_services_mock/mocks/fs_offline_serving_service.py,sha256=O4hd4kQ-sXm9zMPVJYHXO4ARPuc3UN0E9rcOtDkSJRk,2093
1075
1081
  frogml_services_mock/mocks/instance_template_management_service.py,sha256=8J8NlD667kWfjhSXsyH31jjr7qKIaF77K1Fc7FgxtHY,4762
1076
1082
  frogml_services_mock/mocks/integration_management_service.py,sha256=XvWyif8pGuqJsrjTs6m29cneVuYdjVptPpRndwIdqq4,2771
1077
1083
  frogml_services_mock/mocks/internal_build_orchestrator_service.py,sha256=saWQOWbJC5uoAcr053rmd0Jj2TI4TH3Kyr2D5lsL87w,1059
1084
+ frogml_services_mock/mocks/jfrog_tenant_info_service_mock.py,sha256=wvRJS5Jn1y_7nRR5PXmoJwBrA3qDB8fu8tOXXlHxkfA,1510
1078
1085
  frogml_services_mock/mocks/job_registry_service_api.py,sha256=Zd5lVM6h4jFfKHxnQAux1FiBEw2tXFA284OJ33a_IH4,2711
1079
1086
  frogml_services_mock/mocks/kube_captain_service_api.py,sha256=WVCaoOHY-kFdS73bd7kuOssr1RAK1F6MUlJ-NO0eLfY,1596
1080
1087
  frogml_services_mock/mocks/location_discovery_service_api.py,sha256=TUdku1zdmIZXZYbkGurK-OhScPfMeGUzRVa7FgxZnrQ,3682
@@ -1093,9 +1100,9 @@ frogml_services_mock/mocks/utils/exception_handlers.py,sha256=k_8mez3cwjNjKE9yGQ
1093
1100
  frogml_services_mock/mocks/vector_serving_api.py,sha256=ZljLOw9_ee-nlvEMU0HNzmK2tcsmBY6VzuVzLmInYj4,5838
1094
1101
  frogml_services_mock/mocks/vectors_management_api.py,sha256=-GtKow3JmBj6LRZw625WdD8pt9VKtGZUs2VXTbtEPg0,3602
1095
1102
  frogml_services_mock/mocks/workspace_manager_service_mock.py,sha256=WbOiWgOyr-xTicwJO7jdY-gN_5hF_s9GOU-ZO5P_2_M,7745
1096
- frogml_services_mock/services_mock.py,sha256=xfbYvl05gFUq2oT82cT-6K2CEJ6d9kFX_tk77QZHTFI,20787
1103
+ frogml_services_mock/services_mock.py,sha256=sgKgwhu2W0YOHtzil8x7f1znK_sZr_i27XSeiF4xqVE,21200
1097
1104
  frogml_services_mock/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1098
1105
  frogml_services_mock/utils/service_utils.py,sha256=ZlB0CnB1J6oBn6_m7fQO2U8tKoboHdUa6ljjkRMYNXU,265
1099
- frogml_core-0.0.86.dist-info/METADATA,sha256=zvWjQmk9m28_k_0lcWSrXF1_XPWb8hYbD9S_21jWo58,2004
1100
- frogml_core-0.0.86.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
1101
- frogml_core-0.0.86.dist-info/RECORD,,
1106
+ frogml_core-0.0.88.dist-info/METADATA,sha256=d-_5vh5OvKAIllVEA8nyZrJWJ1zdLFT4gBDIRKxeEvc,2028
1107
+ frogml_core-0.0.88.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
1108
+ frogml_core-0.0.88.dist-info/RECORD,,
@@ -0,0 +1,69 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: frogml_proto.qwak.ecosystem/jfrog/v0/jfrog_tenant_info_service.proto
4
+ """Generated protocol buffer code."""
5
+ from google.protobuf import descriptor as _descriptor
6
+ from google.protobuf import descriptor_pool as _descriptor_pool
7
+ from google.protobuf import message as _message
8
+ from google.protobuf import reflection as _reflection
9
+ from google.protobuf import symbol_database as _symbol_database
10
+ # @@protoc_insertion_point(imports)
11
+
12
+ _sym_db = _symbol_database.Default()
13
+
14
+
15
+ from frogml_proto.qwak.ecosystem.jfrog.v0 import jfrog_tenant_pb2 as qwak_dot_ecosystem_dot_jfrog_dot_v0_dot_jfrog__tenant__pb2
16
+
17
+
18
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n7qwak/ecosystem/jfrog/v0/jfrog_tenant_info_service.proto\x12)qwak.ecosystem.jfrog.jfrog_tenant_info.v0\x1a*qwak/ecosystem/jfrog/v0/jfrog_tenant.proto\"\x1b\n\x19GetJFrogTenantInfoRequest\"m\n\x1aGetJFrogTenantInfoResponse\x12O\n\x0btenant_info\x18\x01 \x01(\x0b\x32:.qwak.ecosystem.jfrog.jfrog_tenant_info.v0.JFrogTenantInfo\"\x1a\n\x18ListJFrogProjectsRequest\"f\n\x19ListJFrogProjectsResponse\x12I\n\x08projects\x18\x01 \x03(\x0b\x32\x37.qwak.ecosystem.jfrog.jfrog_tenant_info.v0.JFrogProject2\xdd\x02\n\x16JFrogTenantInfoService\x12\xa1\x01\n\x12GetJFrogTenantInfo\x12\x44.qwak.ecosystem.jfrog.jfrog_tenant_info.v0.GetJFrogTenantInfoRequest\x1a\x45.qwak.ecosystem.jfrog.jfrog_tenant_info.v0.GetJFrogTenantInfoResponse\x12\x9e\x01\n\x11ListJFrogProjects\x12\x43.qwak.ecosystem.jfrog.jfrog_tenant_info.v0.ListJFrogProjectsRequest\x1a\x44.qwak.ecosystem.jfrog.jfrog_tenant_info.v0.ListJFrogProjectsResponseB\xbd\x01\n com.qwak.ai.jfrog.tenant.info.v0P\x01Z\x96\x01github.com/qwak-ai/qwak-platform/services/shared/java/libs/qwak-common/qwak-common-api/qwak-platform-ecosystem-api/pb/qwak/ecosystem/jfrog/v0;jfrog_v0b\x06proto3')
19
+
20
+
21
+
22
+ _GETJFROGTENANTINFOREQUEST = DESCRIPTOR.message_types_by_name['GetJFrogTenantInfoRequest']
23
+ _GETJFROGTENANTINFORESPONSE = DESCRIPTOR.message_types_by_name['GetJFrogTenantInfoResponse']
24
+ _LISTJFROGPROJECTSREQUEST = DESCRIPTOR.message_types_by_name['ListJFrogProjectsRequest']
25
+ _LISTJFROGPROJECTSRESPONSE = DESCRIPTOR.message_types_by_name['ListJFrogProjectsResponse']
26
+ GetJFrogTenantInfoRequest = _reflection.GeneratedProtocolMessageType('GetJFrogTenantInfoRequest', (_message.Message,), {
27
+ 'DESCRIPTOR' : _GETJFROGTENANTINFOREQUEST,
28
+ '__module__' : 'qwak.ecosystem.jfrog.v0.jfrog_tenant_info_service_pb2'
29
+ # @@protoc_insertion_point(class_scope:qwak.ecosystem.jfrog.jfrog_tenant_info.v0.GetJFrogTenantInfoRequest)
30
+ })
31
+ _sym_db.RegisterMessage(GetJFrogTenantInfoRequest)
32
+
33
+ GetJFrogTenantInfoResponse = _reflection.GeneratedProtocolMessageType('GetJFrogTenantInfoResponse', (_message.Message,), {
34
+ 'DESCRIPTOR' : _GETJFROGTENANTINFORESPONSE,
35
+ '__module__' : 'qwak.ecosystem.jfrog.v0.jfrog_tenant_info_service_pb2'
36
+ # @@protoc_insertion_point(class_scope:qwak.ecosystem.jfrog.jfrog_tenant_info.v0.GetJFrogTenantInfoResponse)
37
+ })
38
+ _sym_db.RegisterMessage(GetJFrogTenantInfoResponse)
39
+
40
+ ListJFrogProjectsRequest = _reflection.GeneratedProtocolMessageType('ListJFrogProjectsRequest', (_message.Message,), {
41
+ 'DESCRIPTOR' : _LISTJFROGPROJECTSREQUEST,
42
+ '__module__' : 'qwak.ecosystem.jfrog.v0.jfrog_tenant_info_service_pb2'
43
+ # @@protoc_insertion_point(class_scope:qwak.ecosystem.jfrog.jfrog_tenant_info.v0.ListJFrogProjectsRequest)
44
+ })
45
+ _sym_db.RegisterMessage(ListJFrogProjectsRequest)
46
+
47
+ ListJFrogProjectsResponse = _reflection.GeneratedProtocolMessageType('ListJFrogProjectsResponse', (_message.Message,), {
48
+ 'DESCRIPTOR' : _LISTJFROGPROJECTSRESPONSE,
49
+ '__module__' : 'qwak.ecosystem.jfrog.v0.jfrog_tenant_info_service_pb2'
50
+ # @@protoc_insertion_point(class_scope:qwak.ecosystem.jfrog.jfrog_tenant_info.v0.ListJFrogProjectsResponse)
51
+ })
52
+ _sym_db.RegisterMessage(ListJFrogProjectsResponse)
53
+
54
+ _JFROGTENANTINFOSERVICE = DESCRIPTOR.services_by_name['JFrogTenantInfoService']
55
+ if _descriptor._USE_C_DESCRIPTORS == False:
56
+
57
+ DESCRIPTOR._options = None
58
+ DESCRIPTOR._serialized_options = b'\n com.qwak.ai.jfrog.tenant.info.v0P\001Z\226\001github.com/qwak-ai/qwak-platform/services/shared/java/libs/qwak-common/qwak-common-api/qwak-platform-ecosystem-api/pb/qwak/ecosystem/jfrog/v0;jfrog_v0'
59
+ _GETJFROGTENANTINFOREQUEST._serialized_start=146
60
+ _GETJFROGTENANTINFOREQUEST._serialized_end=173
61
+ _GETJFROGTENANTINFORESPONSE._serialized_start=175
62
+ _GETJFROGTENANTINFORESPONSE._serialized_end=284
63
+ _LISTJFROGPROJECTSREQUEST._serialized_start=286
64
+ _LISTJFROGPROJECTSREQUEST._serialized_end=312
65
+ _LISTJFROGPROJECTSRESPONSE._serialized_start=314
66
+ _LISTJFROGPROJECTSRESPONSE._serialized_end=416
67
+ _JFROGTENANTINFOSERVICE._serialized_start=419
68
+ _JFROGTENANTINFOSERVICE._serialized_end=768
69
+ # @@protoc_insertion_point(module_scope)
@@ -0,0 +1,69 @@
1
+ """
2
+ @generated by mypy-protobuf. Do not edit manually!
3
+ isort:skip_file
4
+ """
5
+ import builtins
6
+ import collections.abc
7
+ import google.protobuf.descriptor
8
+ import google.protobuf.internal.containers
9
+ import google.protobuf.message
10
+ import frogml_proto.qwak.ecosystem.jfrog.v0.jfrog_tenant_pb2
11
+ import sys
12
+
13
+ if sys.version_info >= (3, 8):
14
+ import typing as typing_extensions
15
+ else:
16
+ import typing_extensions
17
+
18
+ DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
19
+
20
+ class GetJFrogTenantInfoRequest(google.protobuf.message.Message):
21
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
22
+
23
+ def __init__(
24
+ self,
25
+ ) -> None: ...
26
+
27
+ global___GetJFrogTenantInfoRequest = GetJFrogTenantInfoRequest
28
+
29
+ class GetJFrogTenantInfoResponse(google.protobuf.message.Message):
30
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
31
+
32
+ TENANT_INFO_FIELD_NUMBER: builtins.int
33
+ @property
34
+ def tenant_info(self) -> frogml_proto.qwak.ecosystem.jfrog.v0.jfrog_tenant_pb2.JFrogTenantInfo:
35
+ """ Information about the tenant"""
36
+ def __init__(
37
+ self,
38
+ *,
39
+ tenant_info: frogml_proto.qwak.ecosystem.jfrog.v0.jfrog_tenant_pb2.JFrogTenantInfo | None = ...,
40
+ ) -> None: ...
41
+ def HasField(self, field_name: typing_extensions.Literal["tenant_info", b"tenant_info"]) -> builtins.bool: ...
42
+ def ClearField(self, field_name: typing_extensions.Literal["tenant_info", b"tenant_info"]) -> None: ...
43
+
44
+ global___GetJFrogTenantInfoResponse = GetJFrogTenantInfoResponse
45
+
46
+ class ListJFrogProjectsRequest(google.protobuf.message.Message):
47
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
48
+
49
+ def __init__(
50
+ self,
51
+ ) -> None: ...
52
+
53
+ global___ListJFrogProjectsRequest = ListJFrogProjectsRequest
54
+
55
+ class ListJFrogProjectsResponse(google.protobuf.message.Message):
56
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
57
+
58
+ PROJECTS_FIELD_NUMBER: builtins.int
59
+ @property
60
+ def projects(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[qwak.ecosystem.jfrog.v0.jfrog_tenant_pb2.JFrogProject]:
61
+ """A list of projects for which the requesting user is an admin"""
62
+ def __init__(
63
+ self,
64
+ *,
65
+ projects: collections.abc.Iterable[qwak.ecosystem.jfrog.v0.jfrog_tenant_pb2.JFrogProject] | None = ...,
66
+ ) -> None: ...
67
+ def ClearField(self, field_name: typing_extensions.Literal["projects", b"projects"]) -> None: ...
68
+
69
+ global___ListJFrogProjectsResponse = ListJFrogProjectsResponse
@@ -0,0 +1,102 @@
1
+ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
2
+ """Client and server classes corresponding to protobuf-defined services."""
3
+ import grpc
4
+
5
+ from frogml_proto.qwak.ecosystem.jfrog.v0 import jfrog_tenant_info_service_pb2 as qwak_dot_ecosystem_dot_jfrog_dot_v0_dot_jfrog__tenant__info__service__pb2
6
+
7
+
8
+ class JFrogTenantInfoServiceStub(object):
9
+ """Missing associated documentation comment in .proto file."""
10
+
11
+ def __init__(self, channel):
12
+ """Constructor.
13
+
14
+ Args:
15
+ channel: A grpc.Channel.
16
+ """
17
+ self.GetJFrogTenantInfo = channel.unary_unary(
18
+ '/qwak.ecosystem.jfrog.jfrog_tenant_info.v0.JFrogTenantInfoService/GetJFrogTenantInfo',
19
+ request_serializer=qwak_dot_ecosystem_dot_jfrog_dot_v0_dot_jfrog__tenant__info__service__pb2.GetJFrogTenantInfoRequest.SerializeToString,
20
+ response_deserializer=qwak_dot_ecosystem_dot_jfrog_dot_v0_dot_jfrog__tenant__info__service__pb2.GetJFrogTenantInfoResponse.FromString,
21
+ )
22
+ self.ListJFrogProjects = channel.unary_unary(
23
+ '/qwak.ecosystem.jfrog.jfrog_tenant_info.v0.JFrogTenantInfoService/ListJFrogProjects',
24
+ request_serializer=qwak_dot_ecosystem_dot_jfrog_dot_v0_dot_jfrog__tenant__info__service__pb2.ListJFrogProjectsRequest.SerializeToString,
25
+ response_deserializer=qwak_dot_ecosystem_dot_jfrog_dot_v0_dot_jfrog__tenant__info__service__pb2.ListJFrogProjectsResponse.FromString,
26
+ )
27
+
28
+
29
+ class JFrogTenantInfoServiceServicer(object):
30
+ """Missing associated documentation comment in .proto file."""
31
+
32
+ def GetJFrogTenantInfo(self, request, context):
33
+ """Get Tenant Info
34
+ """
35
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
36
+ context.set_details('Method not implemented!')
37
+ raise NotImplementedError('Method not implemented!')
38
+
39
+ def ListJFrogProjects(self, request, context):
40
+ """List Tenant Projects
41
+ Returns all projects for which the requesting user is an admin
42
+ """
43
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
44
+ context.set_details('Method not implemented!')
45
+ raise NotImplementedError('Method not implemented!')
46
+
47
+
48
+ def add_JFrogTenantInfoServiceServicer_to_server(servicer, server):
49
+ rpc_method_handlers = {
50
+ 'GetJFrogTenantInfo': grpc.unary_unary_rpc_method_handler(
51
+ servicer.GetJFrogTenantInfo,
52
+ request_deserializer=qwak_dot_ecosystem_dot_jfrog_dot_v0_dot_jfrog__tenant__info__service__pb2.GetJFrogTenantInfoRequest.FromString,
53
+ response_serializer=qwak_dot_ecosystem_dot_jfrog_dot_v0_dot_jfrog__tenant__info__service__pb2.GetJFrogTenantInfoResponse.SerializeToString,
54
+ ),
55
+ 'ListJFrogProjects': grpc.unary_unary_rpc_method_handler(
56
+ servicer.ListJFrogProjects,
57
+ request_deserializer=qwak_dot_ecosystem_dot_jfrog_dot_v0_dot_jfrog__tenant__info__service__pb2.ListJFrogProjectsRequest.FromString,
58
+ response_serializer=qwak_dot_ecosystem_dot_jfrog_dot_v0_dot_jfrog__tenant__info__service__pb2.ListJFrogProjectsResponse.SerializeToString,
59
+ ),
60
+ }
61
+ generic_handler = grpc.method_handlers_generic_handler(
62
+ 'qwak.ecosystem.jfrog.jfrog_tenant_info.v0.JFrogTenantInfoService', rpc_method_handlers)
63
+ server.add_generic_rpc_handlers((generic_handler,))
64
+
65
+
66
+ # This class is part of an EXPERIMENTAL API.
67
+ class JFrogTenantInfoService(object):
68
+ """Missing associated documentation comment in .proto file."""
69
+
70
+ @staticmethod
71
+ def GetJFrogTenantInfo(request,
72
+ target,
73
+ options=(),
74
+ channel_credentials=None,
75
+ call_credentials=None,
76
+ insecure=False,
77
+ compression=None,
78
+ wait_for_ready=None,
79
+ timeout=None,
80
+ metadata=None):
81
+ return grpc.experimental.unary_unary(request, target, '/qwak.ecosystem.jfrog.jfrog_tenant_info.v0.JFrogTenantInfoService/GetJFrogTenantInfo',
82
+ qwak_dot_ecosystem_dot_jfrog_dot_v0_dot_jfrog__tenant__info__service__pb2.GetJFrogTenantInfoRequest.SerializeToString,
83
+ qwak_dot_ecosystem_dot_jfrog_dot_v0_dot_jfrog__tenant__info__service__pb2.GetJFrogTenantInfoResponse.FromString,
84
+ options, channel_credentials,
85
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
86
+
87
+ @staticmethod
88
+ def ListJFrogProjects(request,
89
+ target,
90
+ options=(),
91
+ channel_credentials=None,
92
+ call_credentials=None,
93
+ insecure=False,
94
+ compression=None,
95
+ wait_for_ready=None,
96
+ timeout=None,
97
+ metadata=None):
98
+ return grpc.experimental.unary_unary(request, target, '/qwak.ecosystem.jfrog.jfrog_tenant_info.v0.JFrogTenantInfoService/ListJFrogProjects',
99
+ qwak_dot_ecosystem_dot_jfrog_dot_v0_dot_jfrog__tenant__info__service__pb2.ListJFrogProjectsRequest.SerializeToString,
100
+ qwak_dot_ecosystem_dot_jfrog_dot_v0_dot_jfrog__tenant__info__service__pb2.ListJFrogProjectsResponse.FromString,
101
+ options, channel_credentials,
102
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@@ -0,0 +1,45 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: frogml_proto.qwak.ecosystem/jfrog/v0/jfrog_tenant.proto
4
+ """Generated protocol buffer code."""
5
+ from google.protobuf import descriptor as _descriptor
6
+ from google.protobuf import descriptor_pool as _descriptor_pool
7
+ from google.protobuf import message as _message
8
+ from google.protobuf import reflection as _reflection
9
+ from google.protobuf import symbol_database as _symbol_database
10
+ # @@protoc_insertion_point(imports)
11
+
12
+ _sym_db = _symbol_database.Default()
13
+
14
+
15
+
16
+
17
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n*qwak/ecosystem/jfrog/v0/jfrog_tenant.proto\x12)qwak.ecosystem.jfrog.jfrog_tenant_info.v0\"\'\n\x0fJFrogTenantInfo\x12\x14\n\x0cplatform_url\x18\x01 \x01(\t\"N\n\x0cJFrogProject\x12\x13\n\x0bproject_key\x18\x01 \x01(\t\x12\x14\n\x0c\x64isplay_name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\tB\xbd\x01\n com.qwak.ai.jfrog.tenant.info.v0P\x01Z\x96\x01github.com/qwak-ai/qwak-platform/services/shared/java/libs/qwak-common/qwak-common-api/qwak-platform-ecosystem-api/pb/qwak/ecosystem/jfrog/v0;jfrog_v0b\x06proto3')
18
+
19
+
20
+
21
+ _JFROGTENANTINFO = DESCRIPTOR.message_types_by_name['JFrogTenantInfo']
22
+ _JFROGPROJECT = DESCRIPTOR.message_types_by_name['JFrogProject']
23
+ JFrogTenantInfo = _reflection.GeneratedProtocolMessageType('JFrogTenantInfo', (_message.Message,), {
24
+ 'DESCRIPTOR' : _JFROGTENANTINFO,
25
+ '__module__' : 'qwak.ecosystem.jfrog.v0.jfrog_tenant_pb2'
26
+ # @@protoc_insertion_point(class_scope:qwak.ecosystem.jfrog.jfrog_tenant_info.v0.JFrogTenantInfo)
27
+ })
28
+ _sym_db.RegisterMessage(JFrogTenantInfo)
29
+
30
+ JFrogProject = _reflection.GeneratedProtocolMessageType('JFrogProject', (_message.Message,), {
31
+ 'DESCRIPTOR' : _JFROGPROJECT,
32
+ '__module__' : 'qwak.ecosystem.jfrog.v0.jfrog_tenant_pb2'
33
+ # @@protoc_insertion_point(class_scope:qwak.ecosystem.jfrog.jfrog_tenant_info.v0.JFrogProject)
34
+ })
35
+ _sym_db.RegisterMessage(JFrogProject)
36
+
37
+ if _descriptor._USE_C_DESCRIPTORS == False:
38
+
39
+ DESCRIPTOR._options = None
40
+ DESCRIPTOR._serialized_options = b'\n com.qwak.ai.jfrog.tenant.info.v0P\001Z\226\001github.com/qwak-ai/qwak-platform/services/shared/java/libs/qwak-common/qwak-common-api/qwak-platform-ecosystem-api/pb/qwak/ecosystem/jfrog/v0;jfrog_v0'
41
+ _JFROGTENANTINFO._serialized_start=89
42
+ _JFROGTENANTINFO._serialized_end=128
43
+ _JFROGPROJECT._serialized_start=130
44
+ _JFROGPROJECT._serialized_end=208
45
+ # @@protoc_insertion_point(module_scope)
@@ -0,0 +1,53 @@
1
+ """
2
+ @generated by mypy-protobuf. Do not edit manually!
3
+ isort:skip_file
4
+ """
5
+ import builtins
6
+ import google.protobuf.descriptor
7
+ import google.protobuf.message
8
+ import sys
9
+
10
+ if sys.version_info >= (3, 8):
11
+ import typing as typing_extensions
12
+ else:
13
+ import typing_extensions
14
+
15
+ DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
16
+
17
+ class JFrogTenantInfo(google.protobuf.message.Message):
18
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
19
+
20
+ PLATFORM_URL_FIELD_NUMBER: builtins.int
21
+ platform_url: builtins.str
22
+ """The JFrog platform base url"""
23
+ def __init__(
24
+ self,
25
+ *,
26
+ platform_url: builtins.str = ...,
27
+ ) -> None: ...
28
+ def ClearField(self, field_name: typing_extensions.Literal["platform_url", b"platform_url"]) -> None: ...
29
+
30
+ global___JFrogTenantInfo = JFrogTenantInfo
31
+
32
+ class JFrogProject(google.protobuf.message.Message):
33
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
34
+
35
+ PROJECT_KEY_FIELD_NUMBER: builtins.int
36
+ DISPLAY_NAME_FIELD_NUMBER: builtins.int
37
+ DESCRIPTION_FIELD_NUMBER: builtins.int
38
+ project_key: builtins.str
39
+ """The project's key"""
40
+ display_name: builtins.str
41
+ """The project's display name"""
42
+ description: builtins.str
43
+ """The project's description"""
44
+ def __init__(
45
+ self,
46
+ *,
47
+ project_key: builtins.str = ...,
48
+ display_name: builtins.str = ...,
49
+ description: builtins.str = ...,
50
+ ) -> None: ...
51
+ def ClearField(self, field_name: typing_extensions.Literal["description", b"description", "display_name", b"display_name", "project_key", b"project_key"]) -> None: ...
52
+
53
+ global___JFrogProject = JFrogProject
@@ -0,0 +1,4 @@
1
+ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
2
+ """Client and server classes corresponding to protobuf-defined services."""
3
+ import grpc
4
+
@@ -58,6 +58,7 @@ from frogml_services_mock.mocks.integration_management_service import (
58
58
  from frogml_services_mock.mocks.internal_build_orchestrator_service import (
59
59
  InternalBuildOrchestratorServiceMock,
60
60
  )
61
+ from frogml_services_mock.mocks.jfrog_tenant_info_service_mock import JFrogTenantInfoServiceMock
61
62
  from frogml_services_mock.mocks.job_registry_service_api import (
62
63
  JobRegistryServiceApiMock,
63
64
  )
@@ -135,3 +136,4 @@ class FrogmlMocks:
135
136
  model_version_manager_service: ModelVersionManagerServiceMock
136
137
  repository_service: RepositoryServiceMock
137
138
  location_discovery_service: LocationDiscoveryServiceApiMock
139
+ jfrog_tenant_info_service: JFrogTenantInfoServiceMock
@@ -0,0 +1,42 @@
1
+ from datetime import datetime
2
+ from typing import Dict
3
+
4
+ from google.protobuf.timestamp_pb2 import Timestamp
5
+
6
+ from frogml_core.exceptions import FrogmlNotFoundException
7
+ from frogml_proto.qwak.ecosystem.jfrog.v0.jfrog_tenant_info_service_pb2 import (
8
+ GetJFrogTenantInfoRequest,
9
+ GetJFrogTenantInfoResponse,
10
+ )
11
+ from frogml_proto.qwak.ecosystem.jfrog.v0.jfrog_tenant_info_service_pb2_grpc import (
12
+ JFrogTenantInfoServiceServicer,
13
+ )
14
+ from frogml_proto.qwak.ecosystem.jfrog.v0.jfrog_tenant_pb2 import JFrogTenantInfo
15
+ from frogml_proto.qwak.jfrog.gateway.v0.repository_pb2 import RepositorySpec
16
+ from frogml_services_mock.mocks.utils.exception_handlers import (
17
+ raise_not_found_grpc_error,
18
+ )
19
+
20
+ timestamp = Timestamp()
21
+ timestamp.FromDatetime(datetime.now())
22
+
23
+
24
+ class JFrogTenantInfoServiceMock(JFrogTenantInfoServiceServicer):
25
+ def __init__(self):
26
+ super(JFrogTenantInfoServiceMock, self).__init__()
27
+ self.repositories: Dict[str, RepositorySpec] = {}
28
+ self.should_raise_exception: bool = False
29
+ self.platform_url: str = "mock.jfrog.io"
30
+
31
+ def GetJFrogTenantInfo(
32
+ self, request: GetJFrogTenantInfoRequest, context
33
+ ) -> GetJFrogTenantInfoResponse:
34
+ if self.should_raise_exception:
35
+ raise_not_found_grpc_error(
36
+ context,
37
+ FrogmlNotFoundException(f"JFrog tenant info not found"),
38
+ )
39
+
40
+ return GetJFrogTenantInfoResponse(
41
+ tenant_info=JFrogTenantInfo(platform_url=self.platform_url)
42
+ )
@@ -3,6 +3,7 @@ from typing import Any, Generator, List, Tuple
3
3
 
4
4
  import grpc
5
5
  import pytest
6
+
6
7
  from frogml_core.inner.di_configuration import FrogmlContainer
7
8
  from frogml_proto.jfml.model_version.v1.model_version_manager_service_pb2_grpc import (
8
9
  add_ModelVersionManagerServiceServicer_to_server,
@@ -53,6 +54,8 @@ from frogml_proto.qwak.deployment.alert_service_pb2_grpc import (
53
54
  from frogml_proto.qwak.deployment.deployment_service_pb2_grpc import (
54
55
  add_DeploymentManagementServiceServicer_to_server,
55
56
  )
57
+ from frogml_proto.qwak.ecosystem.jfrog.v0.jfrog_tenant_info_service_pb2_grpc import \
58
+ add_JFrogTenantInfoServiceServicer_to_server
56
59
  from frogml_proto.qwak.ecosystem.v0.ecosystem_runtime_service_pb2_grpc import (
57
60
  add_QwakEcosystemRuntimeServicer_to_server,
58
61
  )
@@ -183,6 +186,7 @@ from frogml_services_mock.mocks.integration_management_service import (
183
186
  from frogml_services_mock.mocks.internal_build_orchestrator_service import (
184
187
  InternalBuildOrchestratorServiceMock,
185
188
  )
189
+ from frogml_services_mock.mocks.jfrog_tenant_info_service_mock import JFrogTenantInfoServiceMock
186
190
  from frogml_services_mock.mocks.job_registry_service_api import (
187
191
  JobRegistryServiceApiMock,
188
192
  )
@@ -539,6 +543,11 @@ def attach_servicers(free_port, server):
539
543
  LocationDiscoveryServiceApiMock,
540
544
  add_LocationDiscoveryServiceServicer_to_server,
541
545
  ),
546
+ (
547
+ "jfrog_tenant_info_service",
548
+ JFrogTenantInfoServiceMock,
549
+ add_JFrogTenantInfoServiceServicer_to_server,
550
+ ),
542
551
  ("port", free_port, None),
543
552
  ],
544
553
  )