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
@@ -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