Skip to content

Commit 3a5630b

Browse files
SK-1889: Handled partial error cases when continue on error is true
1 parent 0f74320 commit 3a5630b

5 files changed

Lines changed: 23 additions & 15 deletions

File tree

skyflow/generated/rest/api/tokens_api.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ def record_service_detokenize_with_http_info(
174174

175175
_response_types_map: Dict[str, Optional[str]] = {
176176
'200': "V1DetokenizeResponse",
177+
'207': "V1DetokenizeResponse",
177178
'404': "object",
178179
}
179180
response_data = self.api_client.call_api(

skyflow/utils/_utils.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from urllib.parse import quote
1313
from skyflow.error import SkyflowError
1414
from skyflow.generated.rest import V1UpdateRecordResponse, V1BulkDeleteRecordResponse, \
15-
V1DetokenizeResponse, V1TokenizeResponse, V1GetQueryResponse, V1BulkGetRecordResponse
15+
V1DetokenizeResponse, V1TokenizeResponse, V1GetQueryResponse, V1BulkGetRecordResponse, ApiResponse
1616
from skyflow.utils.logger import log_error, log_error_log
1717
from . import SkyflowMessages, SDK_VERSION
1818
from .enums import Env, ContentType, EnvUrls
@@ -194,8 +194,9 @@ def parse_insert_response(api_response, continue_on_error):
194194
inserted_fields = []
195195
errors = []
196196
insert_response = InsertResponse()
197+
response_data = json.loads(api_response.raw_data.decode('utf-8'))
197198
if continue_on_error:
198-
for idx, response in enumerate(api_response.responses):
199+
for idx, response in enumerate(response_data.get('responses', [])):
199200
if response['Status'] == 200:
200201
body = response['Body']
201202
if 'records' in body:
@@ -210,6 +211,7 @@ def parse_insert_response(api_response, continue_on_error):
210211
inserted_fields.append(inserted_field)
211212
elif response['Status'] == 400:
212213
error = {
214+
'request_id': api_response.headers.get('x-request-id'),
213215
'request_index': idx,
214216
'error': response['Body']['error']
215217
}
@@ -219,7 +221,7 @@ def parse_insert_response(api_response, continue_on_error):
219221
insert_response.errors = errors
220222

221223
else:
222-
for record in api_response.records:
224+
for record in response_data.get('records', []):
223225
field_data = {
224226
'skyflow_id': record.skyflow_id
225227
}
@@ -264,13 +266,14 @@ def parse_get_response(api_response: V1BulkGetRecordResponse):
264266

265267
return get_response
266268

267-
def parse_detokenize_response(api_response: V1DetokenizeResponse):
269+
def parse_detokenize_response(api_response: ApiResponse[V1DetokenizeResponse]):
268270
detokenized_fields = []
269271
errors = []
270272

271-
for record in api_response.records:
273+
for record in api_response.data.records:
272274
if record.error:
273275
errors.append({
276+
"request_id": api_response.headers.get('x-request-id'),
274277
"token": record.token,
275278
"error": record.error
276279
})

skyflow/utils/enums/env.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
from enum import Enum
22

33
class Env(Enum):
4-
DEV = 'DEV',
5-
SANDBOX = 'SANDBOX',
4+
DEV = 'DEV'
5+
SANDBOX = 'SANDBOX'
66
PROD = 'PROD'
77
STAGE = 'STAGE'
88

99
class EnvUrls(Enum):
10-
PROD = "vault.skyflowapis.com",
11-
SANDBOX = "vault.skyflowapis-preview.com",
10+
PROD = "vault.skyflowapis.com"
11+
SANDBOX = "vault.skyflowapis-preview.com"
1212
DEV = "vault.skyflowapis.dev"
1313
STAGE = "vault.skyflowapis.tech"

skyflow/utils/validations/_validations.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -514,15 +514,15 @@ def validate_detokenize_request(logger, request):
514514
raise SkyflowError(SkyflowMessages.Error.EMPTY_TOKENS_LIST_VALUE.value, invalid_input_error_code)
515515

516516
for item in request.data:
517-
if 'token' not in item or 'redaction' not in item:
517+
if 'token' not in item:
518518
raise SkyflowError(SkyflowMessages.Error.INVALID_TOKENS_LIST_VALUE.value(type(request.data)), invalid_input_error_code)
519519
token = item.get('token')
520-
redaction = item.get('redaction')
520+
redaction = item.get('redaction', RedactionType.PLAIN_TEXT)
521521

522522
if not isinstance(token, str) or not token:
523523
raise SkyflowError(SkyflowMessages.Error.INVALID_TOKEN_TYPE.value.format("DETOKENIZE"), invalid_input_error_code)
524524

525-
if not isinstance(redaction, RedactionType) or not redaction:
525+
if redaction is not None and not isinstance(redaction, RedactionType):
526526
raise SkyflowError(SkyflowMessages.Error.INVALID_REDACTION_TYPE.value.format(type(redaction)), invalid_input_error_code)
527527

528528
def validate_tokenize_request(logger, request):

skyflow/vault/controller/_vault.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from skyflow.utils import SkyflowMessages, parse_insert_response, \
77
handle_exception, parse_update_record_response, parse_delete_response, parse_detokenize_response, \
88
parse_tokenize_response, parse_query_response, parse_get_response, encode_column_values
9+
from skyflow.utils.enums import RedactionType
910
from skyflow.utils.logger import log_info, log_error_log
1011
from skyflow.utils.validations import validate_insert_request, validate_delete_request, validate_query_request, \
1112
validate_get_request, validate_update_request, validate_detokenize_request, validate_tokenize_request
@@ -89,7 +90,7 @@ def insert(self, request: InsertRequest):
8990
log_info(SkyflowMessages.Info.INSERT_TRIGGERED.value, self.__vault_client.get_logger())
9091

9192
if request.continue_on_error:
92-
api_response = records_api.record_service_batch_operation(self.__vault_client.get_vault_id(),
93+
api_response = records_api.record_service_batch_operation_with_http_info(self.__vault_client.get_vault_id(),
9394
insert_body)
9495

9596
else:
@@ -230,14 +231,17 @@ def detokenize(self, request: DetokenizeRequest):
230231
log_info(SkyflowMessages.Info.DETOKENIZE_REQUEST_RESOLVED.value, self.__vault_client.get_logger())
231232
self.__initialize()
232233
tokens_list = [
233-
V1DetokenizeRecordRequest(token=item.get('token'), redaction=item.get('redaction').value)
234+
V1DetokenizeRecordRequest(
235+
token=item.get('token'),
236+
redaction=item.get('redaction').value if item.get('redaction') else RedactionType.PLAIN_TEXT.value
237+
)
234238
for item in request.data
235239
]
236240
payload = V1DetokenizePayload(detokenization_parameters=tokens_list, continue_on_error=request.continue_on_error)
237241
tokens_api = self.__vault_client.get_tokens_api()
238242
try:
239243
log_info(SkyflowMessages.Info.DETOKENIZE_TRIGGERED.value, self.__vault_client.get_logger())
240-
api_response = tokens_api.record_service_detokenize(
244+
api_response = tokens_api.record_service_detokenize_with_http_info(
241245
self.__vault_client.get_vault_id(),
242246
detokenize_payload=payload
243247
)

0 commit comments

Comments
 (0)