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
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
from common.errors import SkyflowError
|
|
2
|
+
from common.utils import SkyflowMessages as CommonMessages
|
|
3
|
+
from common.utils.validations import (
|
|
4
|
+
validate_keys,
|
|
5
|
+
validate_credentials,
|
|
6
|
+
validate_non_empty_string_list,
|
|
7
|
+
)
|
|
8
|
+
from common.utils.validations import validate_vault_config as _common_validate_vault_config
|
|
9
|
+
from common.utils.validations import validate_update_vault_config as _common_validate_update_vault_config
|
|
10
|
+
from skyflow.utils import SkyflowMessages
|
|
11
|
+
from skyflow.utils.enums import UpsertType
|
|
12
|
+
from skyflow.utils._http_config import (
|
|
13
|
+
POSITIVE_SECOND_KEYS,
|
|
14
|
+
NON_NEGATIVE_INT_KEYS,
|
|
15
|
+
VAULT_URL_KEY,
|
|
16
|
+
VAULT_CONFIG_KEYS,
|
|
17
|
+
)
|
|
18
|
+
from skyflow.vault.data import GetRequestRecord, InsertRequestRecord, UpdateRequestRecord, UpsertOptions, TokenGroupRedactions
|
|
19
|
+
|
|
20
|
+
VALID_UPDATE_RECORD_KEYS = ["skyflow_id", "data", "tokens", "table_name"]
|
|
21
|
+
|
|
22
|
+
invalid_input_error_code = CommonMessages.ErrorCodes.INVALID_INPUT.value
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _is_number(value):
|
|
26
|
+
return isinstance(value, (int, float)) and not isinstance(value, bool)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def validate_http_config_value(key, value):
|
|
30
|
+
if key in POSITIVE_SECOND_KEYS:
|
|
31
|
+
if not _is_number(value) or value <= 0:
|
|
32
|
+
raise SkyflowError(SkyflowMessages.Error.INVALID_TIMEOUT.value.format(key), invalid_input_error_code)
|
|
33
|
+
elif key in NON_NEGATIVE_INT_KEYS:
|
|
34
|
+
if isinstance(value, bool) or not isinstance(value, int) or value < 0:
|
|
35
|
+
raise SkyflowError(SkyflowMessages.Error.INVALID_RETRY_SETTING.value.format(key), invalid_input_error_code)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _validate_http_config(logger, config):
|
|
39
|
+
for key in (*POSITIVE_SECOND_KEYS, *NON_NEGATIVE_INT_KEYS):
|
|
40
|
+
if key in config:
|
|
41
|
+
validate_http_config_value(key, config[key])
|
|
42
|
+
if VAULT_URL_KEY in config:
|
|
43
|
+
vault_url = config[VAULT_URL_KEY]
|
|
44
|
+
if not isinstance(vault_url, str) or not vault_url:
|
|
45
|
+
raise SkyflowError(SkyflowMessages.Error.INVALID_VAULT_URL.value, invalid_input_error_code)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def validate_vault_config(logger, config):
|
|
49
|
+
_validate_http_config(logger, config)
|
|
50
|
+
return _common_validate_vault_config(logger, config, messages=CommonMessages, allowed_keys=VAULT_CONFIG_KEYS)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def validate_update_vault_config(logger, config):
|
|
54
|
+
_validate_http_config(logger, config)
|
|
55
|
+
return _common_validate_update_vault_config(logger, config, messages=CommonMessages, allowed_keys=VAULT_CONFIG_KEYS)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def _validate_upsert(logger, upsert):
|
|
59
|
+
if upsert is None:
|
|
60
|
+
return
|
|
61
|
+
if not isinstance(upsert, UpsertOptions):
|
|
62
|
+
raise SkyflowError(SkyflowMessages.Error.INVALID_UPSERT_TYPE_IN_INSERT.value, invalid_input_error_code)
|
|
63
|
+
unique_columns = upsert.unique_columns
|
|
64
|
+
if (not isinstance(unique_columns, list) or not unique_columns
|
|
65
|
+
or not all(isinstance(c, str) for c in unique_columns)):
|
|
66
|
+
raise SkyflowError(SkyflowMessages.Error.INVALID_UPSERT_UNIQUE_COLUMNS_IN_INSERT.value, invalid_input_error_code)
|
|
67
|
+
if upsert.update_type is not None and not isinstance(upsert.update_type, UpsertType):
|
|
68
|
+
raise SkyflowError(SkyflowMessages.Error.INVALID_UPSERT_UPDATE_TYPE_IN_INSERT.value, invalid_input_error_code)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def validate_insert_request(logger, request):
|
|
72
|
+
if not isinstance(request.records, list) or not all(isinstance(r, InsertRequestRecord) for r in request.records):
|
|
73
|
+
raise SkyflowError(SkyflowMessages.Error.INVALID_RECORDS_TYPE_IN_INSERT.value, invalid_input_error_code)
|
|
74
|
+
|
|
75
|
+
if not request.records:
|
|
76
|
+
raise SkyflowError(SkyflowMessages.Error.EMPTY_RECORDS_IN_INSERT.value, invalid_input_error_code)
|
|
77
|
+
|
|
78
|
+
_validate_upsert(logger, request.upsert)
|
|
79
|
+
for record in request.records:
|
|
80
|
+
_validate_upsert(logger, record.upsert)
|
|
81
|
+
|
|
82
|
+
table_at_request_level = request.table_name is not None
|
|
83
|
+
|
|
84
|
+
if table_at_request_level:
|
|
85
|
+
for record in request.records:
|
|
86
|
+
if record.table_name is not None:
|
|
87
|
+
raise SkyflowError(SkyflowMessages.Error.TABLE_NAME_IN_BOTH_PLACES_IN_INSERT.value, invalid_input_error_code)
|
|
88
|
+
else:
|
|
89
|
+
for record in request.records:
|
|
90
|
+
if record.table_name is None:
|
|
91
|
+
raise SkyflowError(SkyflowMessages.Error.TABLE_NAME_MISSING_IN_INSERT.value, invalid_input_error_code)
|
|
92
|
+
|
|
93
|
+
if table_at_request_level:
|
|
94
|
+
for record in request.records:
|
|
95
|
+
if record.upsert is not None:
|
|
96
|
+
raise SkyflowError(SkyflowMessages.Error.RECORD_LEVEL_UPSERT_NOT_ALLOWED_IN_INSERT.value, invalid_input_error_code)
|
|
97
|
+
elif request.upsert is not None:
|
|
98
|
+
raise SkyflowError(SkyflowMessages.Error.REQUEST_LEVEL_UPSERT_NOT_ALLOWED_IN_INSERT.value, invalid_input_error_code)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def validate_get_request(logger, request):
|
|
102
|
+
if request.records is not None:
|
|
103
|
+
single_table_fields_set = (
|
|
104
|
+
request.table_name or request.skyflow_ids or request.unique_values or request.columns
|
|
105
|
+
or request.column_redactions or request.limit is not None or request.offset is not None
|
|
106
|
+
)
|
|
107
|
+
if single_table_fields_set:
|
|
108
|
+
raise SkyflowError(SkyflowMessages.Error.GET_MODE_CONFLICT.value, invalid_input_error_code)
|
|
109
|
+
if (not isinstance(request.records, list) or not request.records
|
|
110
|
+
or not all(isinstance(r, GetRequestRecord) for r in request.records)):
|
|
111
|
+
raise SkyflowError(SkyflowMessages.Error.INVALID_RECORDS_TYPE_IN_GET.value, invalid_input_error_code)
|
|
112
|
+
for record in request.records:
|
|
113
|
+
if not record.table_name:
|
|
114
|
+
raise SkyflowError(SkyflowMessages.Error.MISSING_TABLE_NAME_IN_GET.value, invalid_input_error_code)
|
|
115
|
+
if not record.skyflow_ids and not record.unique_values:
|
|
116
|
+
raise SkyflowError(SkyflowMessages.Error.MISSING_IDS_OR_UNIQUE_VALUES_IN_GET.value, invalid_input_error_code)
|
|
117
|
+
if record.skyflow_ids is not None:
|
|
118
|
+
validate_non_empty_string_list(logger, record.skyflow_ids, SkyflowMessages.Error.INVALID_IDS_IN_GET.value)
|
|
119
|
+
return
|
|
120
|
+
|
|
121
|
+
if not request.table_name:
|
|
122
|
+
raise SkyflowError(SkyflowMessages.Error.MISSING_TABLE_NAME_IN_GET.value, invalid_input_error_code)
|
|
123
|
+
|
|
124
|
+
if not request.skyflow_ids and not request.unique_values:
|
|
125
|
+
raise SkyflowError(SkyflowMessages.Error.MISSING_IDS_OR_UNIQUE_VALUES_IN_GET.value, invalid_input_error_code)
|
|
126
|
+
|
|
127
|
+
if request.skyflow_ids is not None:
|
|
128
|
+
validate_non_empty_string_list(logger, request.skyflow_ids, SkyflowMessages.Error.INVALID_IDS_IN_GET.value)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def validate_update_request(logger, request):
|
|
132
|
+
if not isinstance(request.records, list) or not all(isinstance(r, UpdateRequestRecord) for r in request.records):
|
|
133
|
+
raise SkyflowError(SkyflowMessages.Error.INVALID_RECORDS_TYPE_IN_UPDATE.value, invalid_input_error_code)
|
|
134
|
+
|
|
135
|
+
if not request.records:
|
|
136
|
+
raise SkyflowError(SkyflowMessages.Error.EMPTY_RECORDS_IN_UPDATE.value, invalid_input_error_code)
|
|
137
|
+
|
|
138
|
+
if request.update_type is not None and not isinstance(request.update_type, UpsertType):
|
|
139
|
+
raise SkyflowError(SkyflowMessages.Error.INVALID_UPDATE_TYPE_IN_UPDATE.value, invalid_input_error_code)
|
|
140
|
+
|
|
141
|
+
for record in request.records:
|
|
142
|
+
skyflow_id = record.skyflow_id
|
|
143
|
+
if not isinstance(skyflow_id, str) or not skyflow_id.strip():
|
|
144
|
+
raise SkyflowError(SkyflowMessages.Error.MISSING_SKYFLOW_ID_IN_UPDATE.value, invalid_input_error_code)
|
|
145
|
+
data = record.data
|
|
146
|
+
if data is None:
|
|
147
|
+
raise SkyflowError(SkyflowMessages.Error.MISSING_DATA_IN_UPDATE.value, invalid_input_error_code)
|
|
148
|
+
if not isinstance(data, dict):
|
|
149
|
+
raise SkyflowError(SkyflowMessages.Error.INVALID_DATA_TYPE_IN_UPDATE.value, invalid_input_error_code)
|
|
150
|
+
if not data:
|
|
151
|
+
raise SkyflowError(SkyflowMessages.Error.MISSING_DATA_IN_UPDATE.value, invalid_input_error_code)
|
|
152
|
+
|
|
153
|
+
table_at_request_level = request.table_name is not None
|
|
154
|
+
|
|
155
|
+
if table_at_request_level:
|
|
156
|
+
for record in request.records:
|
|
157
|
+
if record.table_name is not None:
|
|
158
|
+
raise SkyflowError(SkyflowMessages.Error.TABLE_NAME_IN_BOTH_PLACES_IN_UPDATE.value, invalid_input_error_code)
|
|
159
|
+
else:
|
|
160
|
+
for record in request.records:
|
|
161
|
+
if record.table_name is None:
|
|
162
|
+
raise SkyflowError(SkyflowMessages.Error.TABLE_NAME_MISSING_IN_UPDATE.value, invalid_input_error_code)
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def validate_delete_request(logger, request):
|
|
166
|
+
if not request.table_name:
|
|
167
|
+
raise SkyflowError(SkyflowMessages.Error.MISSING_TABLE_NAME_IN_DELETE.value, invalid_input_error_code)
|
|
168
|
+
|
|
169
|
+
if not request.ids and not request.unique_values:
|
|
170
|
+
raise SkyflowError(SkyflowMessages.Error.MISSING_IDS_OR_UNIQUE_VALUES_IN_DELETE.value, invalid_input_error_code)
|
|
171
|
+
|
|
172
|
+
if request.ids is not None:
|
|
173
|
+
validate_non_empty_string_list(logger, request.ids, SkyflowMessages.Error.INVALID_IDS_IN_DELETE.value)
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def validate_detokenize_request(logger, request):
|
|
177
|
+
if (
|
|
178
|
+
not isinstance(request.tokens, list) or not all(isinstance(t, str) and t.strip() for t in request.tokens)
|
|
179
|
+
):
|
|
180
|
+
raise SkyflowError(SkyflowMessages.Error.INVALID_TOKENS_TYPE_IN_DETOKENIZE.value, invalid_input_error_code)
|
|
181
|
+
|
|
182
|
+
if not request.tokens:
|
|
183
|
+
raise SkyflowError(SkyflowMessages.Error.EMPTY_TOKENS_IN_DETOKENIZE.value, invalid_input_error_code)
|
|
184
|
+
|
|
185
|
+
if request.token_group_redactions is not None:
|
|
186
|
+
valid = (
|
|
187
|
+
isinstance(request.token_group_redactions, list)
|
|
188
|
+
and all(
|
|
189
|
+
isinstance(entry, TokenGroupRedactions)
|
|
190
|
+
and isinstance(entry.token_group_name, str) and entry.token_group_name.strip()
|
|
191
|
+
for entry in request.token_group_redactions
|
|
192
|
+
)
|
|
193
|
+
)
|
|
194
|
+
if not valid:
|
|
195
|
+
raise SkyflowError(SkyflowMessages.Error.INVALID_TOKEN_GROUP_REDACTIONS_IN_DETOKENIZE.value, invalid_input_error_code)
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import httpx
|
|
2
|
+
|
|
3
|
+
from common.vault.base_vault_client import BaseVaultClient
|
|
4
|
+
from skyflow.generated.rest.client import SkyflowAuth
|
|
5
|
+
from skyflow.utils import get_vault_url
|
|
6
|
+
from skyflow.utils._http_config import (
|
|
7
|
+
TIMEOUT_KEY,
|
|
8
|
+
CONNECT_TIMEOUT_KEY,
|
|
9
|
+
READ_TIMEOUT_KEY,
|
|
10
|
+
WRITE_TIMEOUT_KEY,
|
|
11
|
+
MAX_RETRIES_KEY,
|
|
12
|
+
INITIAL_RETRY_DELAY_MILLIS_KEY,
|
|
13
|
+
MAX_RETRY_DELAY_MILLIS_KEY,
|
|
14
|
+
VAULT_URL_KEY,
|
|
15
|
+
DEFAULT_TIMEOUT,
|
|
16
|
+
DEFAULT_CONNECT_TIMEOUT,
|
|
17
|
+
DEFAULT_READ_TIMEOUT,
|
|
18
|
+
DEFAULT_WRITE_TIMEOUT,
|
|
19
|
+
DEFAULT_MAX_RETRIES,
|
|
20
|
+
DEFAULT_INITIAL_RETRY_DELAY_MILLIS,
|
|
21
|
+
DEFAULT_MAX_RETRY_DELAY_MILLIS,
|
|
22
|
+
DEFAULT_MAX_CONNECTIONS,
|
|
23
|
+
DEFAULT_MAX_KEEPALIVE_CONNECTIONS,
|
|
24
|
+
DEFAULT_KEEPALIVE_EXPIRY,
|
|
25
|
+
resolve_setting,
|
|
26
|
+
)
|
|
27
|
+
from skyflow.utils._retry import RetryTransport
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class VaultClient(BaseVaultClient):
|
|
31
|
+
def __init__(self, config):
|
|
32
|
+
super().__init__(config)
|
|
33
|
+
self._common_http_config = {}
|
|
34
|
+
self._sync_httpx_client = None
|
|
35
|
+
|
|
36
|
+
def set_common_http_config(self, common_http_config):
|
|
37
|
+
self._common_http_config = common_http_config or {}
|
|
38
|
+
|
|
39
|
+
def _resolve(self, key, default):
|
|
40
|
+
return resolve_setting(self._config, self._common_http_config, key, default)
|
|
41
|
+
|
|
42
|
+
def resolve_vault_url(self, cluster_id, env, vault_id, logger=None):
|
|
43
|
+
override = self._config.get(VAULT_URL_KEY)
|
|
44
|
+
if override:
|
|
45
|
+
return override
|
|
46
|
+
return get_vault_url(cluster_id, env, vault_id, logger=logger)
|
|
47
|
+
|
|
48
|
+
def _build_timeout(self):
|
|
49
|
+
read = self._resolve(READ_TIMEOUT_KEY, DEFAULT_READ_TIMEOUT)
|
|
50
|
+
return httpx.Timeout(
|
|
51
|
+
connect=self._resolve(CONNECT_TIMEOUT_KEY, DEFAULT_CONNECT_TIMEOUT),
|
|
52
|
+
read=read,
|
|
53
|
+
write=self._resolve(WRITE_TIMEOUT_KEY, DEFAULT_WRITE_TIMEOUT),
|
|
54
|
+
pool=read,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
def _retry_params(self):
|
|
58
|
+
return (
|
|
59
|
+
self._resolve(MAX_RETRIES_KEY, DEFAULT_MAX_RETRIES),
|
|
60
|
+
self._resolve(INITIAL_RETRY_DELAY_MILLIS_KEY, DEFAULT_INITIAL_RETRY_DELAY_MILLIS),
|
|
61
|
+
self._resolve(MAX_RETRY_DELAY_MILLIS_KEY, DEFAULT_MAX_RETRY_DELAY_MILLIS),
|
|
62
|
+
self._resolve(TIMEOUT_KEY, DEFAULT_TIMEOUT),
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
def _build_limits(self):
|
|
66
|
+
return httpx.Limits(
|
|
67
|
+
max_connections=DEFAULT_MAX_CONNECTIONS,
|
|
68
|
+
max_keepalive_connections=DEFAULT_MAX_KEEPALIVE_CONNECTIONS,
|
|
69
|
+
keepalive_expiry=DEFAULT_KEEPALIVE_EXPIRY,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
def initialize_api_client(self, vault_url, bearer_token):
|
|
73
|
+
self.__close_httpx_clients()
|
|
74
|
+
timeout = self._build_timeout()
|
|
75
|
+
limits = self._build_limits()
|
|
76
|
+
max_retries, initial_millis, max_millis, call_timeout = self._retry_params()
|
|
77
|
+
sync_client = httpx.Client(
|
|
78
|
+
timeout=timeout,
|
|
79
|
+
follow_redirects=True,
|
|
80
|
+
transport=RetryTransport(httpx.HTTPTransport(limits=limits), max_retries, initial_millis, max_millis, call_timeout),
|
|
81
|
+
)
|
|
82
|
+
self._sync_httpx_client = sync_client
|
|
83
|
+
self._api_client = SkyflowAuth(base_url=vault_url, token=bearer_token or "", httpx_client=sync_client)
|
|
84
|
+
|
|
85
|
+
def close(self):
|
|
86
|
+
self.__close_httpx_clients()
|
|
87
|
+
self._api_client = None
|
|
88
|
+
|
|
89
|
+
def __close_httpx_clients(self):
|
|
90
|
+
sync_client = self._sync_httpx_client
|
|
91
|
+
if sync_client is not None:
|
|
92
|
+
try:
|
|
93
|
+
sync_client.close()
|
|
94
|
+
except Exception:
|
|
95
|
+
pass
|
|
96
|
+
self._sync_httpx_client = None
|
|
97
|
+
|
|
98
|
+
def get_records_api(self):
|
|
99
|
+
return self._api_client.records
|
|
100
|
+
|
|
101
|
+
def get_tokens_api(self):
|
|
102
|
+
return self._api_client.tokens
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from ._vault import VaultController
|