Skip to content

Commit 09f68db

Browse files
authored
Merge pull request #20 from RachelTucker/4-0-ids-request-payload
SA-196: Added request payloads to clear blob and mark blob commands
2 parents 984f7b6 + c9a437a commit 09f68db

File tree

2 files changed

+144
-10
lines changed

2 files changed

+144
-10
lines changed

ds3/ds3.py

Lines changed: 96 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,22 @@ def to_xml(self):
137137
return xml_part_list
138138

139139

140+
class IdsList(object):
141+
def __init__(self, id_list):
142+
for cur_id in id_list:
143+
if not isinstance(cur_id, str):
144+
raise TypeError("Ids should only contain strings")
145+
self.id_list = id_list
146+
147+
def to_xml(self):
148+
xml_id_list = xmldom.Element('Ids')
149+
for cur_id in self.id_list:
150+
xml_cur_id = xmldom.Element('Id')
151+
xml_cur_id.text = cur_id
152+
xml_id_list.append(xml_cur_id)
153+
return xml_id_list
154+
155+
140156
# Type Descriptors
141157

142158

@@ -3461,8 +3477,15 @@ def __init__(self, s3_data_replication_rule, initial_data_placement=None, max_bl
34613477

34623478
class ClearSuspectBlobAzureTargetsSpectraS3Request(AbstractRequest):
34633479

3464-
def __init__(self, force=None):
3480+
def __init__(self, id_list, force=None):
34653481
super(ClearSuspectBlobAzureTargetsSpectraS3Request, self).__init__()
3482+
if id_list is not None:
3483+
if not (isinstance(cur_id, str) for cur_id in id_list):
3484+
raise TypeError(
3485+
'ClearSuspectBlobAzureTargetsSpectraS3Request should have request payload of type: list of strings')
3486+
xml_id_list = IdsList(id_list)
3487+
self.body = xmldom.tostring(xml_id_list.to_xml())
3488+
34663489
if force is not None:
34673490
self.query_params['force'] = force
34683491
self.path = '/_rest_/suspect_blob_azure_target'
@@ -3471,8 +3494,15 @@ def __init__(self, force=None):
34713494

34723495
class ClearSuspectBlobDs3TargetsSpectraS3Request(AbstractRequest):
34733496

3474-
def __init__(self, force=None):
3497+
def __init__(self, id_list, force=None):
34753498
super(ClearSuspectBlobDs3TargetsSpectraS3Request, self).__init__()
3499+
if id_list is not None:
3500+
if not (isinstance(cur_id, str) for cur_id in id_list):
3501+
raise TypeError(
3502+
'ClearSuspectBlobDs3TargetsSpectraS3Request should have request payload of type: list of strings')
3503+
xml_id_list = IdsList(id_list)
3504+
self.body = xmldom.tostring(xml_id_list.to_xml())
3505+
34763506
if force is not None:
34773507
self.query_params['force'] = force
34783508
self.path = '/_rest_/suspect_blob_ds3_target'
@@ -3481,8 +3511,15 @@ def __init__(self, force=None):
34813511

34823512
class ClearSuspectBlobPoolsSpectraS3Request(AbstractRequest):
34833513

3484-
def __init__(self, force=None):
3514+
def __init__(self, id_list, force=None):
34853515
super(ClearSuspectBlobPoolsSpectraS3Request, self).__init__()
3516+
if id_list is not None:
3517+
if not (isinstance(cur_id, str) for cur_id in id_list):
3518+
raise TypeError(
3519+
'ClearSuspectBlobPoolsSpectraS3Request should have request payload of type: list of strings')
3520+
xml_id_list = IdsList(id_list)
3521+
self.body = xmldom.tostring(xml_id_list.to_xml())
3522+
34863523
if force is not None:
34873524
self.query_params['force'] = force
34883525
self.path = '/_rest_/suspect_blob_pool'
@@ -3491,8 +3528,15 @@ def __init__(self, force=None):
34913528

34923529
class ClearSuspectBlobS3TargetsSpectraS3Request(AbstractRequest):
34933530

3494-
def __init__(self, force=None):
3531+
def __init__(self, id_list, force=None):
34953532
super(ClearSuspectBlobS3TargetsSpectraS3Request, self).__init__()
3533+
if id_list is not None:
3534+
if not (isinstance(cur_id, str) for cur_id in id_list):
3535+
raise TypeError(
3536+
'ClearSuspectBlobS3TargetsSpectraS3Request should have request payload of type: list of strings')
3537+
xml_id_list = IdsList(id_list)
3538+
self.body = xmldom.tostring(xml_id_list.to_xml())
3539+
34963540
if force is not None:
34973541
self.query_params['force'] = force
34983542
self.path = '/_rest_/suspect_blob_s3_target'
@@ -3501,8 +3545,15 @@ def __init__(self, force=None):
35013545

35023546
class ClearSuspectBlobTapesSpectraS3Request(AbstractRequest):
35033547

3504-
def __init__(self, force=None):
3548+
def __init__(self, id_list, force=None):
35053549
super(ClearSuspectBlobTapesSpectraS3Request, self).__init__()
3550+
if id_list is not None:
3551+
if not (isinstance(cur_id, str) for cur_id in id_list):
3552+
raise TypeError(
3553+
'ClearSuspectBlobTapesSpectraS3Request should have request payload of type: list of strings')
3554+
xml_id_list = IdsList(id_list)
3555+
self.body = xmldom.tostring(xml_id_list.to_xml())
3556+
35063557
if force is not None:
35073558
self.query_params['force'] = force
35083559
self.path = '/_rest_/suspect_blob_tape'
@@ -3808,8 +3859,15 @@ def __init__(self, bucket_id=None, storage_domain_id=None):
38083859

38093860
class MarkSuspectBlobAzureTargetsAsDegradedSpectraS3Request(AbstractRequest):
38103861

3811-
def __init__(self, force=None):
3862+
def __init__(self, id_list, force=None):
38123863
super(MarkSuspectBlobAzureTargetsAsDegradedSpectraS3Request, self).__init__()
3864+
if id_list is not None:
3865+
if not (isinstance(cur_id, str) for cur_id in id_list):
3866+
raise TypeError(
3867+
'MarkSuspectBlobAzureTargetsAsDegradedSpectraS3Request should have request payload of type: list of strings')
3868+
xml_id_list = IdsList(id_list)
3869+
self.body = xmldom.tostring(xml_id_list.to_xml())
3870+
38133871
if force is not None:
38143872
self.query_params['force'] = force
38153873
self.path = '/_rest_/suspect_blob_azure_target'
@@ -3818,8 +3876,15 @@ def __init__(self, force=None):
38183876

38193877
class MarkSuspectBlobDs3TargetsAsDegradedSpectraS3Request(AbstractRequest):
38203878

3821-
def __init__(self, force=None):
3879+
def __init__(self, id_list, force=None):
38223880
super(MarkSuspectBlobDs3TargetsAsDegradedSpectraS3Request, self).__init__()
3881+
if id_list is not None:
3882+
if not (isinstance(cur_id, str) for cur_id in id_list):
3883+
raise TypeError(
3884+
'MarkSuspectBlobDs3TargetsAsDegradedSpectraS3Request should have request payload of type: list of strings')
3885+
xml_id_list = IdsList(id_list)
3886+
self.body = xmldom.tostring(xml_id_list.to_xml())
3887+
38233888
if force is not None:
38243889
self.query_params['force'] = force
38253890
self.path = '/_rest_/suspect_blob_ds3_target'
@@ -3828,8 +3893,15 @@ def __init__(self, force=None):
38283893

38293894
class MarkSuspectBlobPoolsAsDegradedSpectraS3Request(AbstractRequest):
38303895

3831-
def __init__(self, force=None):
3896+
def __init__(self, id_list, force=None):
38323897
super(MarkSuspectBlobPoolsAsDegradedSpectraS3Request, self).__init__()
3898+
if id_list is not None:
3899+
if not (isinstance(cur_id, str) for cur_id in id_list):
3900+
raise TypeError(
3901+
'MarkSuspectBlobPoolsAsDegradedSpectraS3Request should have request payload of type: list of strings')
3902+
xml_id_list = IdsList(id_list)
3903+
self.body = xmldom.tostring(xml_id_list.to_xml())
3904+
38333905
if force is not None:
38343906
self.query_params['force'] = force
38353907
self.path = '/_rest_/suspect_blob_pool'
@@ -3838,8 +3910,15 @@ def __init__(self, force=None):
38383910

38393911
class MarkSuspectBlobS3TargetsAsDegradedSpectraS3Request(AbstractRequest):
38403912

3841-
def __init__(self, force=None):
3913+
def __init__(self, id_list, force=None):
38423914
super(MarkSuspectBlobS3TargetsAsDegradedSpectraS3Request, self).__init__()
3915+
if id_list is not None:
3916+
if not (isinstance(cur_id, str) for cur_id in id_list):
3917+
raise TypeError(
3918+
'MarkSuspectBlobS3TargetsAsDegradedSpectraS3Request should have request payload of type: list of strings')
3919+
xml_id_list = IdsList(id_list)
3920+
self.body = xmldom.tostring(xml_id_list.to_xml())
3921+
38433922
if force is not None:
38443923
self.query_params['force'] = force
38453924
self.path = '/_rest_/suspect_blob_s3_target'
@@ -3848,8 +3927,15 @@ def __init__(self, force=None):
38483927

38493928
class MarkSuspectBlobTapesAsDegradedSpectraS3Request(AbstractRequest):
38503929

3851-
def __init__(self, force=None):
3930+
def __init__(self, id_list, force=None):
38523931
super(MarkSuspectBlobTapesAsDegradedSpectraS3Request, self).__init__()
3932+
if id_list is not None:
3933+
if not (isinstance(cur_id, str) for cur_id in id_list):
3934+
raise TypeError(
3935+
'MarkSuspectBlobTapesAsDegradedSpectraS3Request should have request payload of type: list of strings')
3936+
xml_id_list = IdsList(id_list)
3937+
self.body = xmldom.tostring(xml_id_list.to_xml())
3938+
38533939
if force is not None:
38543940
self.query_params['force'] = force
38553941
self.path = '/_rest_/suspect_blob_tape'

tests/clientTests.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1384,6 +1384,14 @@ def read(self):
13841384

13851385

13861386
class ResponseParsingTestCase(unittest.TestCase):
1387+
@staticmethod
1388+
def __get_test_ids():
1389+
return ['obj1', 'obj2', 'obj3']
1390+
1391+
@staticmethod
1392+
def __get_marshaled_ids():
1393+
return b'<Ids><Id>obj1</Id><Id>obj2</Id><Id>obj3</Id></Ids>'
1394+
13871395
def testGetJobToReplicate(self):
13881396
content = "some content to test response parsing"
13891397

@@ -1411,3 +1419,43 @@ def testVerifyPhysicalPlacementRequestPayload(self):
14111419

14121420
request = VerifyPhysicalPlacementForObjectsSpectraS3Request(bucket_name="bucketName", object_list=l)
14131421
self.assertEqual(request.body.decode(), '<Objects><Object Name="obj1" /><Object Name="obj2" /></Objects>')
1422+
1423+
def testClearSuspectBlobAzureTargetsRequestPayload(self):
1424+
request = ClearSuspectBlobAzureTargetsSpectraS3Request(id_list=self.__get_test_ids())
1425+
self.assertEqual(request.body, self.__get_marshaled_ids())
1426+
1427+
def testClearSuspectBlobDs3TargetsRequestPayload(self):
1428+
request = ClearSuspectBlobDs3TargetsSpectraS3Request(id_list=self.__get_test_ids())
1429+
self.assertEqual(request.body, self.__get_marshaled_ids())
1430+
1431+
def testClearSuspectBlobPoolsRequestPayload(self):
1432+
request = ClearSuspectBlobPoolsSpectraS3Request(id_list=self.__get_test_ids())
1433+
self.assertEqual(request.body, self.__get_marshaled_ids())
1434+
1435+
def testClearSuspectBlobS3TargetsRequestPayload(self):
1436+
request = ClearSuspectBlobS3TargetsSpectraS3Request(id_list=self.__get_test_ids())
1437+
self.assertEqual(request.body, self.__get_marshaled_ids())
1438+
1439+
def testClearSuspectBlobTapesRequestPayload(self):
1440+
request = ClearSuspectBlobTapesSpectraS3Request(id_list=self.__get_test_ids())
1441+
self.assertEqual(request.body, self.__get_marshaled_ids())
1442+
1443+
def testMarkSuspectBlobAzureTargetsAsDegradedRequestPayload(self):
1444+
request = MarkSuspectBlobAzureTargetsAsDegradedSpectraS3Request(id_list=self.__get_test_ids())
1445+
self.assertEqual(request.body, self.__get_marshaled_ids())
1446+
1447+
def testMarkSuspectBlobPoolsAsDegradedRequestPayload(self):
1448+
request = MarkSuspectBlobPoolsAsDegradedSpectraS3Request(id_list=self.__get_test_ids())
1449+
self.assertEqual(request.body, self.__get_marshaled_ids())
1450+
1451+
def testMarkSuspectBlobDs3TargetsAsDegradedRequestPayload(self):
1452+
request = MarkSuspectBlobDs3TargetsAsDegradedSpectraS3Request(id_list=self.__get_test_ids())
1453+
self.assertEqual(request.body, self.__get_marshaled_ids())
1454+
1455+
def testMarkSuspectBlobS3TargetsAsDegradedRequestPayload(self):
1456+
request = MarkSuspectBlobS3TargetsAsDegradedSpectraS3Request(id_list=self.__get_test_ids())
1457+
self.assertEqual(request.body, self.__get_marshaled_ids())
1458+
1459+
def testMarkSuspectBlobTapesAsDegradedRequestPayload(self):
1460+
request = MarkSuspectBlobTapesAsDegradedSpectraS3Request(id_list=self.__get_test_ids())
1461+
self.assertEqual(request.body, self.__get_marshaled_ids())

0 commit comments

Comments
 (0)