skyflow-flowvault-python 1.0.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.
Files changed (202) hide show
  1. common/.coveragerc +4 -0
  2. common/__init__.py +3 -0
  3. common/client/__init__.py +0 -0
  4. common/client/base_skyflow.py +345 -0
  5. common/client/utils/__init__.py +1 -0
  6. common/client/utils/_utils.py +127 -0
  7. common/errors/__init__.py +1 -0
  8. common/errors/_skyflow_error.py +17 -0
  9. common/generated/__init__.py +0 -0
  10. common/generated/rest/__init__.py +24 -0
  11. common/generated/rest/authentication/__init__.py +4 -0
  12. common/generated/rest/authentication/client.py +181 -0
  13. common/generated/rest/authentication/raw_client.py +241 -0
  14. common/generated/rest/client.py +153 -0
  15. common/generated/rest/core/__init__.py +52 -0
  16. common/generated/rest/core/api_error.py +23 -0
  17. common/generated/rest/core/client_wrapper.py +86 -0
  18. common/generated/rest/core/datetime_utils.py +28 -0
  19. common/generated/rest/core/file.py +67 -0
  20. common/generated/rest/core/force_multipart.py +16 -0
  21. common/generated/rest/core/http_client.py +543 -0
  22. common/generated/rest/core/http_response.py +55 -0
  23. common/generated/rest/core/jsonable_encoder.py +100 -0
  24. common/generated/rest/core/pydantic_utilities.py +255 -0
  25. common/generated/rest/core/query_encoder.py +58 -0
  26. common/generated/rest/core/remove_none_from_dict.py +11 -0
  27. common/generated/rest/core/request_options.py +35 -0
  28. common/generated/rest/core/serialization.py +276 -0
  29. common/generated/rest/environment.py +8 -0
  30. common/generated/rest/errors/__init__.py +9 -0
  31. common/generated/rest/errors/bad_request_error.py +14 -0
  32. common/generated/rest/errors/not_found_error.py +14 -0
  33. common/generated/rest/errors/unauthorized_error.py +14 -0
  34. common/generated/rest/py.typed +0 -0
  35. common/generated/rest/types/__init__.py +9 -0
  36. common/generated/rest/types/googlerpc_status.py +22 -0
  37. common/generated/rest/types/protobuf_any.py +21 -0
  38. common/generated/rest/types/v_1_get_auth_token_response.py +33 -0
  39. common/generated/rest/version.py +6 -0
  40. common/service_account/__init__.py +1 -0
  41. common/service_account/_utils.py +248 -0
  42. common/service_account/client/__init__.py +0 -0
  43. common/service_account/client/auth_client.py +13 -0
  44. common/utils/__init__.py +4 -0
  45. common/utils/_helpers.py +18 -0
  46. common/utils/_skyflow_messages.py +445 -0
  47. common/utils/_utils.py +50 -0
  48. common/utils/constants.py +291 -0
  49. common/utils/enums/__init__.py +12 -0
  50. common/utils/enums/content_types.py +9 -0
  51. common/utils/enums/detect_entities.py +73 -0
  52. common/utils/enums/detect_output_transcriptions.py +8 -0
  53. common/utils/enums/env.py +13 -0
  54. common/utils/enums/log_level.py +8 -0
  55. common/utils/enums/masking_method.py +5 -0
  56. common/utils/enums/redaction_type.py +7 -0
  57. common/utils/enums/request_method.py +8 -0
  58. common/utils/enums/token_mode.py +6 -0
  59. common/utils/enums/token_type.py +6 -0
  60. common/utils/logger/__init__.py +2 -0
  61. common/utils/logger/_log_helpers.py +47 -0
  62. common/utils/logger/_logger.py +50 -0
  63. common/utils/validations/__init__.py +11 -0
  64. common/utils/validations/_validations.py +267 -0
  65. common/vault/base_vault_client.py +122 -0
  66. common/vault/base_vault_controller.py +58 -0
  67. common/vault/data/__init__.py +2 -0
  68. common/vault/data/_base_insert_request.py +7 -0
  69. common/vault/data/_base_insert_response.py +11 -0
  70. skyflow/__init__.py +2 -0
  71. skyflow/client/__init__.py +1 -0
  72. skyflow/client/_http_config_builder.py +45 -0
  73. skyflow/client/skyflow.py +15 -0
  74. skyflow/error/__init__.py +3 -0
  75. skyflow/generated/__init__.py +0 -0
  76. skyflow/generated/rest/__init__.py +164 -0
  77. skyflow/generated/rest/_default_clients.py +32 -0
  78. skyflow/generated/rest/client.py +385 -0
  79. skyflow/generated/rest/core/__init__.py +127 -0
  80. skyflow/generated/rest/core/api_error.py +23 -0
  81. skyflow/generated/rest/core/client_wrapper.py +148 -0
  82. skyflow/generated/rest/core/datetime_utils.py +70 -0
  83. skyflow/generated/rest/core/file.py +67 -0
  84. skyflow/generated/rest/core/force_multipart.py +18 -0
  85. skyflow/generated/rest/core/http_client.py +940 -0
  86. skyflow/generated/rest/core/http_response.py +63 -0
  87. skyflow/generated/rest/core/http_sse/__init__.py +42 -0
  88. skyflow/generated/rest/core/http_sse/_api.py +455 -0
  89. skyflow/generated/rest/core/http_sse/_decoders.py +74 -0
  90. skyflow/generated/rest/core/http_sse/_exceptions.py +7 -0
  91. skyflow/generated/rest/core/http_sse/_models.py +17 -0
  92. skyflow/generated/rest/core/jsonable_encoder.py +133 -0
  93. skyflow/generated/rest/core/logging.py +107 -0
  94. skyflow/generated/rest/core/parse_error.py +36 -0
  95. skyflow/generated/rest/core/pydantic_utilities.py +486 -0
  96. skyflow/generated/rest/core/query_encoder.py +58 -0
  97. skyflow/generated/rest/core/remove_none_from_dict.py +11 -0
  98. skyflow/generated/rest/core/request_options.py +40 -0
  99. skyflow/generated/rest/core/serialization.py +347 -0
  100. skyflow/generated/rest/environment.py +8 -0
  101. skyflow/generated/rest/errors/__init__.py +53 -0
  102. skyflow/generated/rest/errors/bad_request_error.py +11 -0
  103. skyflow/generated/rest/errors/forbidden_error.py +11 -0
  104. skyflow/generated/rest/errors/internal_server_error.py +11 -0
  105. skyflow/generated/rest/errors/not_found_error.py +11 -0
  106. skyflow/generated/rest/errors/too_many_requests_error.py +11 -0
  107. skyflow/generated/rest/errors/unauthorized_error.py +11 -0
  108. skyflow/generated/rest/py.typed +0 -0
  109. skyflow/generated/rest/query/__init__.py +4 -0
  110. skyflow/generated/rest/query/client.py +139 -0
  111. skyflow/generated/rest/query/raw_client.py +239 -0
  112. skyflow/generated/rest/raw_client.py +86 -0
  113. skyflow/generated/rest/records/__init__.py +34 -0
  114. skyflow/generated/rest/records/client.py +685 -0
  115. skyflow/generated/rest/records/raw_client.py +988 -0
  116. skyflow/generated/rest/records/types/__init__.py +34 -0
  117. skyflow/generated/rest/records/types/update_request_update_type.py +5 -0
  118. skyflow/generated/rest/tokens/__init__.py +4 -0
  119. skyflow/generated/rest/tokens/client.py +246 -0
  120. skyflow/generated/rest/tokens/raw_client.py +507 -0
  121. skyflow/generated/rest/types/__init__.py +116 -0
  122. skyflow/generated/rest/types/column_redactions.py +33 -0
  123. skyflow/generated/rest/types/delete_response.py +23 -0
  124. skyflow/generated/rest/types/delete_response_object.py +42 -0
  125. skyflow/generated/rest/types/detokenize_response.py +23 -0
  126. skyflow/generated/rest/types/detokenize_response_object.py +54 -0
  127. skyflow/generated/rest/types/error_response.py +20 -0
  128. skyflow/generated/rest/types/error_response_error.py +28 -0
  129. skyflow/generated/rest/types/execute_query_record_response.py +22 -0
  130. skyflow/generated/rest/types/execute_query_response.py +26 -0
  131. skyflow/generated/rest/types/execute_query_response_metadata.py +26 -0
  132. skyflow/generated/rest/types/get_request_data.py +60 -0
  133. skyflow/generated/rest/types/get_response.py +23 -0
  134. skyflow/generated/rest/types/get_tokens_from_values_request_object.py +30 -0
  135. skyflow/generated/rest/types/get_tokens_from_values_response.py +23 -0
  136. skyflow/generated/rest/types/google_protobuf_value.py +8 -0
  137. skyflow/generated/rest/types/http_code.py +6 -0
  138. skyflow/generated/rest/types/insert_record_data.py +36 -0
  139. skyflow/generated/rest/types/insert_response.py +23 -0
  140. skyflow/generated/rest/types/record_response_object.py +70 -0
  141. skyflow/generated/rest/types/token_group_redactions.py +33 -0
  142. skyflow/generated/rest/types/tokenize_response_object.py +49 -0
  143. skyflow/generated/rest/types/unique_value.py +22 -0
  144. skyflow/generated/rest/types/update_record_data.py +52 -0
  145. skyflow/generated/rest/types/update_record_data_update_type.py +5 -0
  146. skyflow/generated/rest/types/update_response.py +23 -0
  147. skyflow/generated/rest/types/upsert.py +45 -0
  148. skyflow/generated/rest/types/upsert_update_type.py +5 -0
  149. skyflow/generated/rest/version.py +6 -0
  150. skyflow/service_account/__init__.py +15 -0
  151. skyflow/utils/__init__.py +9 -0
  152. skyflow/utils/_http_config.py +36 -0
  153. skyflow/utils/_response_parsing.py +66 -0
  154. skyflow/utils/_retry.py +97 -0
  155. skyflow/utils/_skyflow_messages.py +114 -0
  156. skyflow/utils/_utils.py +54 -0
  157. skyflow/utils/_version.py +1 -0
  158. skyflow/utils/enums/__init__.py +3 -0
  159. skyflow/utils/enums/_custom_header_key.py +10 -0
  160. skyflow/utils/enums/_env_urls.py +9 -0
  161. skyflow/utils/enums/_upsert_type.py +7 -0
  162. skyflow/utils/validations/__init__.py +9 -0
  163. skyflow/utils/validations/_validations.py +195 -0
  164. skyflow/vault/__init__.py +0 -0
  165. skyflow/vault/client/__init__.py +0 -0
  166. skyflow/vault/client/client.py +102 -0
  167. skyflow/vault/controller/__init__.py +1 -0
  168. skyflow/vault/controller/_vault.py +475 -0
  169. skyflow/vault/data/__init__.py +30 -0
  170. skyflow/vault/data/_column_redactions.py +4 -0
  171. skyflow/vault/data/_delete_options.py +8 -0
  172. skyflow/vault/data/_delete_request.py +5 -0
  173. skyflow/vault/data/_delete_response.py +9 -0
  174. skyflow/vault/data/_delete_response_record.py +9 -0
  175. skyflow/vault/data/_detokenize_options.py +8 -0
  176. skyflow/vault/data/_detokenize_request.py +9 -0
  177. skyflow/vault/data/_detokenize_response.py +9 -0
  178. skyflow/vault/data/_detokenize_response_record.py +16 -0
  179. skyflow/vault/data/_detokenize_response_record_metadata.py +10 -0
  180. skyflow/vault/data/_get_options.py +8 -0
  181. skyflow/vault/data/_get_request.py +17 -0
  182. skyflow/vault/data/_get_request_record.py +13 -0
  183. skyflow/vault/data/_get_response.py +9 -0
  184. skyflow/vault/data/_get_response_record.py +17 -0
  185. skyflow/vault/data/_insert_options.py +8 -0
  186. skyflow/vault/data/_insert_request.py +11 -0
  187. skyflow/vault/data/_insert_request_record.py +9 -0
  188. skyflow/vault/data/_insert_response.py +9 -0
  189. skyflow/vault/data/_insert_response_record.py +17 -0
  190. skyflow/vault/data/_request_context.py +16 -0
  191. skyflow/vault/data/_token.py +8 -0
  192. skyflow/vault/data/_token_group_redactions.py +4 -0
  193. skyflow/vault/data/_update_options.py +8 -0
  194. skyflow/vault/data/_update_request.py +11 -0
  195. skyflow/vault/data/_update_request_record.py +6 -0
  196. skyflow/vault/data/_update_response.py +9 -0
  197. skyflow/vault/data/_update_response_record.py +17 -0
  198. skyflow/vault/data/_upsert_options.py +7 -0
  199. skyflow_flowvault_python-1.0.0.dist-info/METADATA +896 -0
  200. skyflow_flowvault_python-1.0.0.dist-info/RECORD +202 -0
  201. skyflow_flowvault_python-1.0.0.dist-info/WHEEL +5 -0
  202. skyflow_flowvault_python-1.0.0.dist-info/top_level.txt +1 -0
common/.coveragerc ADDED
@@ -0,0 +1,4 @@
1
+ [run]
2
+ omit =
3
+ */generated/*
4
+ generated/*
common/__init__.py ADDED
@@ -0,0 +1,3 @@
1
+ # common.utils and common.errors mutually depend on each other -- forcing utils to load first
2
+ # here avoids the circular import (mirrors skyflow/__init__.py's own first line).
3
+ from . import utils # noqa: F401
File without changes
@@ -0,0 +1,345 @@
1
+ from abc import ABC, abstractmethod
2
+ from collections import OrderedDict
3
+ from common.errors import SkyflowError
4
+ from common.utils import SkyflowMessages
5
+ from common.utils.logger import log_info, log_warn
6
+ from common.utils.constants import OptionField
7
+
8
+ _BUILDER_TEMPLATE_ERROR = (
9
+ "BaseSkyflowImpl.Builder is an interface template -- build a concrete Skyflow "
10
+ "class via make_skyflow_class() instead of using it directly. Missing: {missing}"
11
+ )
12
+ _CONNECTIONS_NOT_SUPPORTED_ERROR = "Connections are not supported by this Skyflow SDK variant"
13
+ _DETECT_NOT_SUPPORTED_ERROR = "Detect is not supported by this Skyflow SDK variant"
14
+
15
+
16
+ class BaseSkyflow(ABC):
17
+ @classmethod
18
+ @abstractmethod
19
+ def builder(cls):
20
+ raise NotImplementedError
21
+
22
+ @abstractmethod
23
+ def add_vault_config(self, config):
24
+ raise NotImplementedError
25
+
26
+ @abstractmethod
27
+ def remove_vault_config(self, vault_id):
28
+ raise NotImplementedError
29
+
30
+ @abstractmethod
31
+ def update_vault_config(self, config):
32
+ raise NotImplementedError
33
+
34
+ @abstractmethod
35
+ def get_vault_config(self, vault_id):
36
+ raise NotImplementedError
37
+
38
+ @abstractmethod
39
+ def add_skyflow_credentials(self, credentials):
40
+ raise NotImplementedError
41
+
42
+ @abstractmethod
43
+ def update_skyflow_credentials(self, credentials):
44
+ raise NotImplementedError
45
+
46
+ @abstractmethod
47
+ def set_log_level(self, log_level):
48
+ raise NotImplementedError
49
+
50
+ @abstractmethod
51
+ def update_log_level(self, log_level):
52
+ raise NotImplementedError
53
+
54
+ @abstractmethod
55
+ def get_log_level(self):
56
+ raise NotImplementedError
57
+
58
+ @abstractmethod
59
+ def vault(self, vault_id=None):
60
+ raise NotImplementedError
61
+
62
+
63
+ class BaseSkyflowImpl(BaseSkyflow):
64
+
65
+ def __init__(self, builder):
66
+ if type(self) is BaseSkyflowImpl:
67
+ raise SkyflowError(
68
+ SkyflowMessages.Error.BASE_SKYFLOW_INSTANTIATION_NOT_ALLOWED.value,
69
+ SkyflowMessages.ErrorCodes.INVALID_INPUT.value,
70
+ )
71
+ self.__builder = builder
72
+ log_info(self.__builder._skyflow_messages.Info.CLIENT_INITIALIZED.value, self.__builder.get_logger())
73
+
74
+ @classmethod
75
+ def builder(cls):
76
+ return cls.Builder()
77
+
78
+ def add_vault_config(self, config):
79
+ self.__builder._add_vault_config(config)
80
+ return self
81
+
82
+ def remove_vault_config(self, vault_id):
83
+ self.__builder.remove_vault_config(vault_id)
84
+
85
+ def update_vault_config(self, config):
86
+ self.__builder.update_vault_config(config)
87
+
88
+ def get_vault_config(self, vault_id):
89
+ return self.__builder.get_vault_config(vault_id).get(OptionField.VAULT_CLIENT).get_config()
90
+
91
+ def add_skyflow_credentials(self, credentials):
92
+ self.__builder._add_skyflow_credentials(credentials)
93
+ return self
94
+
95
+ def update_skyflow_credentials(self, credentials):
96
+ self.__builder._add_skyflow_credentials(credentials)
97
+
98
+ def set_log_level(self, log_level):
99
+ self.__builder._set_log_level(log_level)
100
+ return self
101
+
102
+ def update_log_level(self, log_level):
103
+ """.. deprecated:: Use set_log_level() instead. Will be removed in a future release."""
104
+ log_warn(self.__builder._skyflow_messages.Warning.UPDATE_LOG_LEVEL_DEPRECATED.value)
105
+ return self.set_log_level(log_level)
106
+
107
+ def get_log_level(self):
108
+ return self.__builder.get_log_level()
109
+
110
+ def vault(self, vault_id=None):
111
+ vault_config = self.__builder.get_vault_config(vault_id)
112
+ return vault_config.get(OptionField.VAULT_CONTROLLER)
113
+
114
+ def _get_builder(self):
115
+ return self.__builder
116
+
117
+ class Builder(ABC):
118
+ _vault_client_cls = None
119
+ _vault_controller_cls = None
120
+ _connection_cls = None
121
+ _detect_cls = None
122
+ _logger_cls = None
123
+ _default_log_level = None
124
+ _skyflow_messages = None
125
+ _skyflow_cls = None
126
+ _validate_vault_config = None
127
+ _validate_update_vault_config = None
128
+ _validate_connection_config = None
129
+ _validate_update_connection_config = None
130
+ _validate_log_level = None
131
+ _validate_credentials = None
132
+ _set_active_log_level = None
133
+
134
+ _REQUIRED_HOOKS = (
135
+ '_vault_client_cls', '_vault_controller_cls', '_logger_cls', '_default_log_level',
136
+ '_skyflow_messages', '_skyflow_cls', '_validate_vault_config',
137
+ '_validate_update_vault_config', '_validate_log_level', '_validate_credentials',
138
+ )
139
+
140
+ def __init__(self):
141
+ missing = [hook for hook in self._REQUIRED_HOOKS if getattr(self, hook) is None]
142
+ if missing:
143
+ raise NotImplementedError(_BUILDER_TEMPLATE_ERROR.format(missing=', '.join(missing)))
144
+ self.__vault_configs = OrderedDict()
145
+ self.__vault_list = list()
146
+ self.__connection_configs = OrderedDict()
147
+ self.__connection_list = list()
148
+ self.__skyflow_credentials = None
149
+ self.__log_level = self._default_log_level
150
+ self.__logger = self._logger_cls(self._default_log_level)
151
+
152
+ def _on_vault_client_created(self, vault_client):
153
+ pass
154
+
155
+ def _require_connections(self):
156
+ if self._connection_cls is None:
157
+ raise NotImplementedError(_CONNECTIONS_NOT_SUPPORTED_ERROR)
158
+
159
+ def _require_detect(self):
160
+ if self._detect_cls is None:
161
+ raise NotImplementedError(_DETECT_NOT_SUPPORTED_ERROR)
162
+
163
+ def add_vault_config(self, config):
164
+ vault_id = config.get(OptionField.VAULT_ID)
165
+ if not isinstance(vault_id, str) or not vault_id:
166
+ raise SkyflowError(
167
+ self._skyflow_messages.Error.INVALID_VAULT_ID.value,
168
+ self._skyflow_messages.ErrorCodes.INVALID_INPUT.value
169
+ )
170
+ if vault_id in [vault.get(OptionField.VAULT_ID) for vault in self.__vault_list]:
171
+ log_info(self._skyflow_messages.Info.VAULT_CONFIG_EXISTS.value.format(vault_id), self.__logger)
172
+ raise SkyflowError(
173
+ self._skyflow_messages.Error.VAULT_ID_ALREADY_EXISTS.value.format(vault_id),
174
+ self._skyflow_messages.ErrorCodes.INVALID_INPUT.value
175
+ )
176
+ self.__vault_list.append(config)
177
+ return self
178
+
179
+ def remove_vault_config(self, vault_id):
180
+ if vault_id in self.__vault_configs.keys():
181
+ self.__vault_configs.pop(vault_id)
182
+ else:
183
+ raise SkyflowError(self._skyflow_messages.Error.INVALID_VAULT_ID.value,
184
+ self._skyflow_messages.ErrorCodes.INVALID_INPUT.value)
185
+
186
+ def update_vault_config(self, config):
187
+ self._validate_update_vault_config(self.__logger, config)
188
+ vault_id = config.get(OptionField.VAULT_ID)
189
+ if vault_id not in self.__vault_configs:
190
+ raise SkyflowError(self._skyflow_messages.Error.VAULT_ID_NOT_IN_CONFIG_LIST.value.format(vault_id), self._skyflow_messages.ErrorCodes.INVALID_INPUT.value)
191
+ vault_config = self.__vault_configs[vault_id]
192
+ vault_config.get(OptionField.VAULT_CLIENT).update_config(config)
193
+
194
+ def get_vault_config(self, vault_id):
195
+ if vault_id is None:
196
+ if self.__vault_configs:
197
+ return next(iter(self.__vault_configs.values()))
198
+ raise SkyflowError(self._skyflow_messages.Error.EMPTY_VAULT_CONFIGS.value, self._skyflow_messages.ErrorCodes.INVALID_INPUT.value)
199
+
200
+ if vault_id in self.__vault_configs:
201
+ return self.__vault_configs.get(vault_id)
202
+ log_info(self._skyflow_messages.Info.VAULT_CONFIG_DOES_NOT_EXIST.value.format(vault_id), self.__logger)
203
+ raise SkyflowError(self._skyflow_messages.Error.VAULT_ID_NOT_IN_CONFIG_LIST.value.format(vault_id), self._skyflow_messages.ErrorCodes.INVALID_INPUT.value)
204
+
205
+ def add_connection_config(self, config):
206
+ self._require_connections()
207
+ connection_id = config.get(OptionField.CONNECTION_ID)
208
+ if not isinstance(connection_id, str) or not connection_id:
209
+ raise SkyflowError(
210
+ self._skyflow_messages.Error.INVALID_CONNECTION_ID.value,
211
+ self._skyflow_messages.ErrorCodes.INVALID_INPUT.value
212
+ )
213
+ if connection_id in [connection.get(OptionField.CONNECTION_ID) for connection in self.__connection_list]:
214
+ log_info(self._skyflow_messages.Info.CONNECTION_CONFIG_EXISTS.value.format(connection_id), self.__logger)
215
+ raise SkyflowError(
216
+ self._skyflow_messages.Error.CONNECTION_ID_ALREADY_EXISTS.value.format(connection_id),
217
+ self._skyflow_messages.ErrorCodes.INVALID_INPUT.value
218
+ )
219
+ self.__connection_list.append(config)
220
+ return self
221
+
222
+ def remove_connection_config(self, connection_id):
223
+ self._require_connections()
224
+ if connection_id in self.__connection_configs.keys():
225
+ self.__connection_configs.pop(connection_id)
226
+ else:
227
+ raise SkyflowError(self._skyflow_messages.Error.INVALID_CONNECTION_ID.value,
228
+ self._skyflow_messages.ErrorCodes.INVALID_INPUT.value)
229
+
230
+ def update_connection_config(self, config):
231
+ self._require_connections()
232
+ self._validate_update_connection_config(self.__logger, config)
233
+ connection_id = config.get(OptionField.CONNECTION_ID)
234
+ if connection_id not in self.__connection_configs:
235
+ raise SkyflowError(self._skyflow_messages.Error.CONNECTION_ID_NOT_IN_CONFIG_LIST.value.format(connection_id), self._skyflow_messages.ErrorCodes.INVALID_INPUT.value)
236
+ connection_config = self.__connection_configs[connection_id]
237
+ connection_config.get(OptionField.VAULT_CLIENT).update_config(config)
238
+
239
+ def get_connection_config(self, connection_id):
240
+ self._require_connections()
241
+ if connection_id is None:
242
+ if self.__connection_configs:
243
+ return next(iter(self.__connection_configs.values()))
244
+
245
+ raise SkyflowError(self._skyflow_messages.Error.EMPTY_CONNECTION_CONFIGS.value, self._skyflow_messages.ErrorCodes.INVALID_INPUT.value)
246
+
247
+ if connection_id in self.__connection_configs:
248
+ return self.__connection_configs.get(connection_id)
249
+ log_info(self._skyflow_messages.Info.CONNECTION_CONFIG_DOES_NOT_EXIST.value.format(connection_id), self.__logger)
250
+ raise SkyflowError(self._skyflow_messages.Error.CONNECTION_ID_NOT_IN_CONFIG_LIST.value.format(connection_id), self._skyflow_messages.ErrorCodes.INVALID_INPUT.value)
251
+
252
+ def add_skyflow_credentials(self, credentials):
253
+ self.__skyflow_credentials = credentials
254
+ return self
255
+
256
+ def set_log_level(self, log_level):
257
+ self.__log_level = log_level
258
+ return self
259
+
260
+ def get_logger(self):
261
+ return self.__logger
262
+
263
+ def get_log_level(self):
264
+ return self.__log_level
265
+
266
+ def _add_vault_config(self, config):
267
+ self._validate_vault_config(self.__logger, config)
268
+ vault_id = config.get(OptionField.VAULT_ID)
269
+ if vault_id in self.__vault_configs:
270
+ raise SkyflowError(
271
+ self._skyflow_messages.Error.VAULT_ID_ALREADY_EXISTS.value.format(vault_id),
272
+ self._skyflow_messages.ErrorCodes.INVALID_INPUT.value
273
+ )
274
+ vault_client = self._vault_client_cls(config)
275
+ self._on_vault_client_created(vault_client)
276
+ vault_config = {
277
+ OptionField.VAULT_CLIENT: vault_client,
278
+ OptionField.VAULT_CONTROLLER: self._vault_controller_cls(vault_client),
279
+ }
280
+ if self._detect_cls is not None:
281
+ vault_config[OptionField.DETECT_CONTROLLER] = self._detect_cls(vault_client)
282
+ self.__vault_configs[vault_id] = vault_config
283
+ log_info(self._skyflow_messages.Info.VAULT_CONTROLLER_INITIALIZED.value.format(vault_id), self.__logger)
284
+ if self._detect_cls is not None:
285
+ log_info(self._skyflow_messages.Info.DETECT_CONTROLLER_INITIALIZED.value.format(vault_id), self.__logger)
286
+
287
+ def _add_connection_config(self, config):
288
+ self._validate_connection_config(self.__logger, config)
289
+ connection_id = config.get(OptionField.CONNECTION_ID)
290
+ if connection_id in self.__connection_configs:
291
+ raise SkyflowError(
292
+ self._skyflow_messages.Error.CONNECTION_ID_ALREADY_EXISTS.value.format(connection_id),
293
+ self._skyflow_messages.ErrorCodes.INVALID_INPUT.value
294
+ )
295
+ vault_client = self._vault_client_cls(config)
296
+ self.__connection_configs[connection_id] = {
297
+ OptionField.VAULT_CLIENT: vault_client,
298
+ OptionField.CONTROLLER: self._connection_cls(vault_client)
299
+ }
300
+ log_info(self._skyflow_messages.Info.CONNECTION_CONTROLLER_INITIALIZED.value.format(connection_id), self.__logger)
301
+
302
+ def _update_vault_client_logger(self, log_level, logger):
303
+ for vault_id, vault_config in self.__vault_configs.items():
304
+ vault_config.get(OptionField.VAULT_CLIENT).set_logger(log_level, logger)
305
+
306
+ for connection_id, connection_config in self.__connection_configs.items():
307
+ connection_config.get(OptionField.VAULT_CLIENT).set_logger(log_level, logger)
308
+
309
+ def _set_log_level(self, log_level):
310
+ self._validate_log_level(self.__logger, log_level)
311
+ self.__log_level = log_level
312
+ self.__logger.set_log_level(log_level)
313
+ if self._set_active_log_level is not None:
314
+ self._set_active_log_level(log_level)
315
+ self._update_vault_client_logger(log_level, self.__logger)
316
+ log_info(self._skyflow_messages.Info.LOGGER_SETUP_DONE.value, self.__logger)
317
+ log_info(self._skyflow_messages.Info.CURRENT_LOG_LEVEL.value.format(self.__log_level), self.__logger)
318
+
319
+ def _add_skyflow_credentials(self, credentials):
320
+ if credentials is not None:
321
+ self.__skyflow_credentials = credentials
322
+ self._validate_credentials(self.__logger, credentials)
323
+ for vault_id, vault_config in self.__vault_configs.items():
324
+ vault_config.get(OptionField.VAULT_CLIENT).set_common_skyflow_credentials(credentials)
325
+
326
+ for connection_id, connection_config in self.__connection_configs.items():
327
+ connection_config.get(OptionField.VAULT_CLIENT).set_common_skyflow_credentials(self.__skyflow_credentials)
328
+
329
+ def build(self):
330
+ self._validate_log_level(self.__logger, self.__log_level)
331
+ self.__logger.set_log_level(self.__log_level)
332
+ if self._set_active_log_level is not None:
333
+ self._set_active_log_level(self.__log_level)
334
+
335
+ for config in self.__vault_list:
336
+ self._add_vault_config(config)
337
+
338
+ for config in self.__connection_list:
339
+ self._add_connection_config(config)
340
+
341
+ self._update_vault_client_logger(self.__log_level, self.__logger)
342
+
343
+ self._add_skyflow_credentials(self.__skyflow_credentials)
344
+
345
+ return self._skyflow_cls(self)
@@ -0,0 +1 @@
1
+ from common.client.utils._utils import ConnectionCapable, DetectCapable, ConnectionMixin, DetectMixin, make_skyflow_class
@@ -0,0 +1,127 @@
1
+ from abc import ABC, abstractmethod
2
+ from functools import partial
3
+
4
+ from common.utils.constants import OptionField
5
+ from common.utils.enums import LogLevel as _CommonLogLevel
6
+ from common.utils.logger import Logger as _CommonLogger
7
+ from common.utils.validations import (
8
+ validate_vault_config as _common_validate_vault_config,
9
+ validate_update_vault_config as _common_validate_update_vault_config,
10
+ validate_log_level as _common_validate_log_level,
11
+ validate_credentials as _common_validate_credentials,
12
+ )
13
+ from common.client.base_skyflow import BaseSkyflowImpl
14
+
15
+
16
+ class ConnectionCapable(ABC):
17
+ @abstractmethod
18
+ def add_connection_config(self, config):
19
+ raise NotImplementedError
20
+
21
+ @abstractmethod
22
+ def remove_connection_config(self, connection_id):
23
+ raise NotImplementedError
24
+
25
+ @abstractmethod
26
+ def update_connection_config(self, config):
27
+ raise NotImplementedError
28
+
29
+ @abstractmethod
30
+ def get_connection_config(self, connection_id):
31
+ raise NotImplementedError
32
+
33
+ @abstractmethod
34
+ def connection(self, connection_id=None):
35
+ raise NotImplementedError
36
+
37
+
38
+ class DetectCapable(ABC):
39
+ @abstractmethod
40
+ def detect(self, vault_id=None):
41
+ raise NotImplementedError
42
+
43
+
44
+ class ConnectionMixin(ConnectionCapable):
45
+
46
+ def add_connection_config(self, config):
47
+ builder = self._get_builder()
48
+ builder._require_connections()
49
+ builder._add_connection_config(config)
50
+ return self
51
+
52
+ def remove_connection_config(self, connection_id):
53
+ builder = self._get_builder()
54
+ builder._require_connections()
55
+ builder.remove_connection_config(connection_id)
56
+ return self
57
+
58
+ def update_connection_config(self, config):
59
+ builder = self._get_builder()
60
+ builder._require_connections()
61
+ builder.update_connection_config(config)
62
+ return self
63
+
64
+ def get_connection_config(self, connection_id):
65
+ builder = self._get_builder()
66
+ builder._require_connections()
67
+ return builder.get_connection_config(connection_id).get(OptionField.VAULT_CLIENT).get_config()
68
+
69
+ def connection(self, connection_id=None):
70
+ builder = self._get_builder()
71
+ builder._require_connections()
72
+ connection_config = builder.get_connection_config(connection_id)
73
+ return connection_config.get(OptionField.CONTROLLER)
74
+
75
+
76
+ class DetectMixin(DetectCapable):
77
+
78
+ def detect(self, vault_id=None):
79
+ builder = self._get_builder()
80
+ builder._require_detect()
81
+ vault_config = builder.get_vault_config(vault_id)
82
+ return vault_config.get(OptionField.DETECT_CONTROLLER)
83
+
84
+
85
+ def make_skyflow_class(*, vault_client_cls, vault_controller_cls, skyflow_messages,
86
+ validate_vault_config=None, validate_update_vault_config=None,
87
+ validate_log_level=None, validate_credentials=None,
88
+ logger_cls=_CommonLogger, default_log_level=_CommonLogLevel.ERROR,
89
+ connection_cls=None, detect_cls=None,
90
+ validate_connection_config=None, validate_update_connection_config=None,
91
+ set_active_log_level=None, builder_mixins=()):
92
+
93
+ if connection_cls is not None and (validate_connection_config is None or validate_update_connection_config is None):
94
+ raise ValueError("connection_cls requires validate_connection_config and validate_update_connection_config")
95
+
96
+ validate_vault_config = validate_vault_config or partial(_common_validate_vault_config, messages=skyflow_messages)
97
+ validate_update_vault_config = validate_update_vault_config or partial(_common_validate_update_vault_config, messages=skyflow_messages)
98
+ validate_log_level = validate_log_level or partial(_common_validate_log_level, messages=skyflow_messages)
99
+ validate_credentials = validate_credentials or partial(_common_validate_credentials, messages=skyflow_messages)
100
+
101
+ builder_attrs = {
102
+ '_vault_client_cls': vault_client_cls,
103
+ '_vault_controller_cls': vault_controller_cls,
104
+ '_connection_cls': connection_cls,
105
+ '_detect_cls': detect_cls,
106
+ '_logger_cls': logger_cls,
107
+ '_default_log_level': default_log_level,
108
+ '_skyflow_messages': skyflow_messages,
109
+ '_validate_vault_config': staticmethod(validate_vault_config),
110
+ '_validate_update_vault_config': staticmethod(validate_update_vault_config),
111
+ '_validate_connection_config': staticmethod(validate_connection_config) if validate_connection_config else None,
112
+ '_validate_update_connection_config': staticmethod(validate_update_connection_config) if validate_update_connection_config else None,
113
+ '_validate_log_level': staticmethod(validate_log_level),
114
+ '_validate_credentials': staticmethod(validate_credentials),
115
+ '_set_active_log_level': staticmethod(set_active_log_level) if set_active_log_level else None,
116
+ }
117
+ variant_builder = type('Builder', (*builder_mixins, BaseSkyflowImpl.Builder), builder_attrs)
118
+
119
+ bases = [BaseSkyflowImpl]
120
+ if connection_cls is not None:
121
+ bases.append(ConnectionMixin)
122
+ if detect_cls is not None:
123
+ bases.append(DetectMixin)
124
+
125
+ variant_skyflow = type('Skyflow', tuple(bases), {'Builder': variant_builder})
126
+ variant_builder._skyflow_cls = variant_skyflow
127
+ return variant_skyflow
@@ -0,0 +1 @@
1
+ from ._skyflow_error import SkyflowError
@@ -0,0 +1,17 @@
1
+ from common.utils import SkyflowMessages
2
+
3
+ class SkyflowError(Exception):
4
+ def __init__(self,
5
+ message,
6
+ http_code,
7
+ request_id = None,
8
+ grpc_code = None,
9
+ http_status = None,
10
+ details = None):
11
+ self.message = message
12
+ self.http_code = http_code
13
+ self.grpc_code = grpc_code
14
+ self.http_status = http_status if http_status else SkyflowMessages.HttpStatus.BAD_REQUEST.value
15
+ self.details = details if details else []
16
+ self.request_id = request_id
17
+ super().__init__(message)
File without changes
@@ -0,0 +1,24 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ # isort: skip_file
4
+
5
+ from .types import GooglerpcStatus, ProtobufAny, V1GetAuthTokenResponse
6
+ from .errors import BadRequestError, NotFoundError, UnauthorizedError
7
+ from . import authentication
8
+ from .client import AsyncSkyflowAuth, SkyflowAuth
9
+ from .environment import SkyflowAuthEnvironment
10
+ from .version import __version__
11
+
12
+ __all__ = [
13
+ "AsyncSkyflowAuth",
14
+ "BadRequestError",
15
+ "GooglerpcStatus",
16
+ "NotFoundError",
17
+ "ProtobufAny",
18
+ "SkyflowAuth",
19
+ "SkyflowAuthEnvironment",
20
+ "UnauthorizedError",
21
+ "V1GetAuthTokenResponse",
22
+ "__version__",
23
+ "authentication",
24
+ ]
@@ -0,0 +1,4 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ # isort: skip_file
4
+