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.
- common/.coveragerc +4 -0
- common/__init__.py +3 -0
- common/client/__init__.py +0 -0
- common/client/base_skyflow.py +345 -0
- common/client/utils/__init__.py +1 -0
- common/client/utils/_utils.py +127 -0
- common/errors/__init__.py +1 -0
- common/errors/_skyflow_error.py +17 -0
- common/generated/__init__.py +0 -0
- common/generated/rest/__init__.py +24 -0
- common/generated/rest/authentication/__init__.py +4 -0
- common/generated/rest/authentication/client.py +181 -0
- common/generated/rest/authentication/raw_client.py +241 -0
- common/generated/rest/client.py +153 -0
- common/generated/rest/core/__init__.py +52 -0
- common/generated/rest/core/api_error.py +23 -0
- common/generated/rest/core/client_wrapper.py +86 -0
- common/generated/rest/core/datetime_utils.py +28 -0
- common/generated/rest/core/file.py +67 -0
- common/generated/rest/core/force_multipart.py +16 -0
- common/generated/rest/core/http_client.py +543 -0
- common/generated/rest/core/http_response.py +55 -0
- common/generated/rest/core/jsonable_encoder.py +100 -0
- common/generated/rest/core/pydantic_utilities.py +255 -0
- common/generated/rest/core/query_encoder.py +58 -0
- common/generated/rest/core/remove_none_from_dict.py +11 -0
- common/generated/rest/core/request_options.py +35 -0
- common/generated/rest/core/serialization.py +276 -0
- common/generated/rest/environment.py +8 -0
- common/generated/rest/errors/__init__.py +9 -0
- common/generated/rest/errors/bad_request_error.py +14 -0
- common/generated/rest/errors/not_found_error.py +14 -0
- common/generated/rest/errors/unauthorized_error.py +14 -0
- common/generated/rest/py.typed +0 -0
- common/generated/rest/types/__init__.py +9 -0
- common/generated/rest/types/googlerpc_status.py +22 -0
- common/generated/rest/types/protobuf_any.py +21 -0
- common/generated/rest/types/v_1_get_auth_token_response.py +33 -0
- common/generated/rest/version.py +6 -0
- common/service_account/__init__.py +1 -0
- common/service_account/_utils.py +248 -0
- common/service_account/client/__init__.py +0 -0
- common/service_account/client/auth_client.py +13 -0
- common/utils/__init__.py +4 -0
- common/utils/_helpers.py +18 -0
- common/utils/_skyflow_messages.py +445 -0
- common/utils/_utils.py +50 -0
- common/utils/constants.py +291 -0
- common/utils/enums/__init__.py +12 -0
- common/utils/enums/content_types.py +9 -0
- common/utils/enums/detect_entities.py +73 -0
- common/utils/enums/detect_output_transcriptions.py +8 -0
- common/utils/enums/env.py +13 -0
- common/utils/enums/log_level.py +8 -0
- common/utils/enums/masking_method.py +5 -0
- common/utils/enums/redaction_type.py +7 -0
- common/utils/enums/request_method.py +8 -0
- common/utils/enums/token_mode.py +6 -0
- common/utils/enums/token_type.py +6 -0
- common/utils/logger/__init__.py +2 -0
- common/utils/logger/_log_helpers.py +47 -0
- common/utils/logger/_logger.py +50 -0
- common/utils/validations/__init__.py +11 -0
- common/utils/validations/_validations.py +267 -0
- common/vault/base_vault_client.py +122 -0
- common/vault/base_vault_controller.py +58 -0
- common/vault/data/__init__.py +2 -0
- common/vault/data/_base_insert_request.py +7 -0
- common/vault/data/_base_insert_response.py +11 -0
- skyflow/__init__.py +2 -0
- skyflow/client/__init__.py +1 -0
- skyflow/client/_http_config_builder.py +45 -0
- skyflow/client/skyflow.py +15 -0
- skyflow/error/__init__.py +3 -0
- skyflow/generated/__init__.py +0 -0
- skyflow/generated/rest/__init__.py +164 -0
- skyflow/generated/rest/_default_clients.py +32 -0
- skyflow/generated/rest/client.py +385 -0
- skyflow/generated/rest/core/__init__.py +127 -0
- skyflow/generated/rest/core/api_error.py +23 -0
- skyflow/generated/rest/core/client_wrapper.py +148 -0
- skyflow/generated/rest/core/datetime_utils.py +70 -0
- skyflow/generated/rest/core/file.py +67 -0
- skyflow/generated/rest/core/force_multipart.py +18 -0
- skyflow/generated/rest/core/http_client.py +940 -0
- skyflow/generated/rest/core/http_response.py +63 -0
- skyflow/generated/rest/core/http_sse/__init__.py +42 -0
- skyflow/generated/rest/core/http_sse/_api.py +455 -0
- skyflow/generated/rest/core/http_sse/_decoders.py +74 -0
- skyflow/generated/rest/core/http_sse/_exceptions.py +7 -0
- skyflow/generated/rest/core/http_sse/_models.py +17 -0
- skyflow/generated/rest/core/jsonable_encoder.py +133 -0
- skyflow/generated/rest/core/logging.py +107 -0
- skyflow/generated/rest/core/parse_error.py +36 -0
- skyflow/generated/rest/core/pydantic_utilities.py +486 -0
- skyflow/generated/rest/core/query_encoder.py +58 -0
- skyflow/generated/rest/core/remove_none_from_dict.py +11 -0
- skyflow/generated/rest/core/request_options.py +40 -0
- skyflow/generated/rest/core/serialization.py +347 -0
- skyflow/generated/rest/environment.py +8 -0
- skyflow/generated/rest/errors/__init__.py +53 -0
- skyflow/generated/rest/errors/bad_request_error.py +11 -0
- skyflow/generated/rest/errors/forbidden_error.py +11 -0
- skyflow/generated/rest/errors/internal_server_error.py +11 -0
- skyflow/generated/rest/errors/not_found_error.py +11 -0
- skyflow/generated/rest/errors/too_many_requests_error.py +11 -0
- skyflow/generated/rest/errors/unauthorized_error.py +11 -0
- skyflow/generated/rest/py.typed +0 -0
- skyflow/generated/rest/query/__init__.py +4 -0
- skyflow/generated/rest/query/client.py +139 -0
- skyflow/generated/rest/query/raw_client.py +239 -0
- skyflow/generated/rest/raw_client.py +86 -0
- skyflow/generated/rest/records/__init__.py +34 -0
- skyflow/generated/rest/records/client.py +685 -0
- skyflow/generated/rest/records/raw_client.py +988 -0
- skyflow/generated/rest/records/types/__init__.py +34 -0
- skyflow/generated/rest/records/types/update_request_update_type.py +5 -0
- skyflow/generated/rest/tokens/__init__.py +4 -0
- skyflow/generated/rest/tokens/client.py +246 -0
- skyflow/generated/rest/tokens/raw_client.py +507 -0
- skyflow/generated/rest/types/__init__.py +116 -0
- skyflow/generated/rest/types/column_redactions.py +33 -0
- skyflow/generated/rest/types/delete_response.py +23 -0
- skyflow/generated/rest/types/delete_response_object.py +42 -0
- skyflow/generated/rest/types/detokenize_response.py +23 -0
- skyflow/generated/rest/types/detokenize_response_object.py +54 -0
- skyflow/generated/rest/types/error_response.py +20 -0
- skyflow/generated/rest/types/error_response_error.py +28 -0
- skyflow/generated/rest/types/execute_query_record_response.py +22 -0
- skyflow/generated/rest/types/execute_query_response.py +26 -0
- skyflow/generated/rest/types/execute_query_response_metadata.py +26 -0
- skyflow/generated/rest/types/get_request_data.py +60 -0
- skyflow/generated/rest/types/get_response.py +23 -0
- skyflow/generated/rest/types/get_tokens_from_values_request_object.py +30 -0
- skyflow/generated/rest/types/get_tokens_from_values_response.py +23 -0
- skyflow/generated/rest/types/google_protobuf_value.py +8 -0
- skyflow/generated/rest/types/http_code.py +6 -0
- skyflow/generated/rest/types/insert_record_data.py +36 -0
- skyflow/generated/rest/types/insert_response.py +23 -0
- skyflow/generated/rest/types/record_response_object.py +70 -0
- skyflow/generated/rest/types/token_group_redactions.py +33 -0
- skyflow/generated/rest/types/tokenize_response_object.py +49 -0
- skyflow/generated/rest/types/unique_value.py +22 -0
- skyflow/generated/rest/types/update_record_data.py +52 -0
- skyflow/generated/rest/types/update_record_data_update_type.py +5 -0
- skyflow/generated/rest/types/update_response.py +23 -0
- skyflow/generated/rest/types/upsert.py +45 -0
- skyflow/generated/rest/types/upsert_update_type.py +5 -0
- skyflow/generated/rest/version.py +6 -0
- skyflow/service_account/__init__.py +15 -0
- skyflow/utils/__init__.py +9 -0
- skyflow/utils/_http_config.py +36 -0
- skyflow/utils/_response_parsing.py +66 -0
- skyflow/utils/_retry.py +97 -0
- skyflow/utils/_skyflow_messages.py +114 -0
- skyflow/utils/_utils.py +54 -0
- skyflow/utils/_version.py +1 -0
- skyflow/utils/enums/__init__.py +3 -0
- skyflow/utils/enums/_custom_header_key.py +10 -0
- skyflow/utils/enums/_env_urls.py +9 -0
- skyflow/utils/enums/_upsert_type.py +7 -0
- skyflow/utils/validations/__init__.py +9 -0
- skyflow/utils/validations/_validations.py +195 -0
- skyflow/vault/__init__.py +0 -0
- skyflow/vault/client/__init__.py +0 -0
- skyflow/vault/client/client.py +102 -0
- skyflow/vault/controller/__init__.py +1 -0
- skyflow/vault/controller/_vault.py +475 -0
- skyflow/vault/data/__init__.py +30 -0
- skyflow/vault/data/_column_redactions.py +4 -0
- skyflow/vault/data/_delete_options.py +8 -0
- skyflow/vault/data/_delete_request.py +5 -0
- skyflow/vault/data/_delete_response.py +9 -0
- skyflow/vault/data/_delete_response_record.py +9 -0
- skyflow/vault/data/_detokenize_options.py +8 -0
- skyflow/vault/data/_detokenize_request.py +9 -0
- skyflow/vault/data/_detokenize_response.py +9 -0
- skyflow/vault/data/_detokenize_response_record.py +16 -0
- skyflow/vault/data/_detokenize_response_record_metadata.py +10 -0
- skyflow/vault/data/_get_options.py +8 -0
- skyflow/vault/data/_get_request.py +17 -0
- skyflow/vault/data/_get_request_record.py +13 -0
- skyflow/vault/data/_get_response.py +9 -0
- skyflow/vault/data/_get_response_record.py +17 -0
- skyflow/vault/data/_insert_options.py +8 -0
- skyflow/vault/data/_insert_request.py +11 -0
- skyflow/vault/data/_insert_request_record.py +9 -0
- skyflow/vault/data/_insert_response.py +9 -0
- skyflow/vault/data/_insert_response_record.py +17 -0
- skyflow/vault/data/_request_context.py +16 -0
- skyflow/vault/data/_token.py +8 -0
- skyflow/vault/data/_token_group_redactions.py +4 -0
- skyflow/vault/data/_update_options.py +8 -0
- skyflow/vault/data/_update_request.py +11 -0
- skyflow/vault/data/_update_request_record.py +6 -0
- skyflow/vault/data/_update_response.py +9 -0
- skyflow/vault/data/_update_response_record.py +17 -0
- skyflow/vault/data/_upsert_options.py +7 -0
- skyflow_flowvault_python-1.0.0.dist-info/METADATA +896 -0
- skyflow_flowvault_python-1.0.0.dist-info/RECORD +202 -0
- skyflow_flowvault_python-1.0.0.dist-info/WHEEL +5 -0
- skyflow_flowvault_python-1.0.0.dist-info/top_level.txt +1 -0
common/.coveragerc
ADDED
common/__init__.py
ADDED
|
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
|
+
]
|