18d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoiimport json 28d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoiimport copy 38d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoiimport tempfile 48d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 58d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoifrom tests.unit import AWSMockServiceTestCase 68d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoifrom boto.glacier.layer1 import Layer1 78d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 88d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 98d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoiclass GlacierLayer1ConnectionBase(AWSMockServiceTestCase): 108d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi connection_class = Layer1 118d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 128d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def setUp(self): 138d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi super(GlacierLayer1ConnectionBase, self).setUp() 148d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.json_header = [('Content-Type', 'application/json')] 158d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.vault_name = u'examplevault' 168d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.vault_arn = 'arn:aws:glacier:us-east-1:012345678901:vaults/' + \ 178d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.vault_name 188d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.vault_info = {u'CreationDate': u'2012-03-16T22:22:47.214Z', 198d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi u'LastInventoryDate': u'2012-03-21T22:06:51.218Z', 208d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi u'NumberOfArchives': 2, 218d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi u'SizeInBytes': 12334, 228d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi u'VaultARN': self.vault_arn, 238d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi u'VaultName': self.vault_name} 248d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 258d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 268d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoiclass GlacierVaultsOperations(GlacierLayer1ConnectionBase): 278d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 288d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def test_create_vault_parameters(self): 298d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.set_http_response(status_code=201) 308d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.service_connection.create_vault(self.vault_name) 318d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 328d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def test_list_vaults(self): 338d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi content = {u'Marker': None, 348d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi u'RequestId': None, 358d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi u'VaultList': [self.vault_info]} 368d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.set_http_response(status_code=200, header=self.json_header, 378d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi body=json.dumps(content).encode('utf-8')) 388d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi api_response = self.service_connection.list_vaults() 398d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertDictEqual(content, api_response) 408d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 418d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def test_describe_vaults(self): 428d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi content = copy.copy(self.vault_info) 438d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi content[u'RequestId'] = None 448d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.set_http_response(status_code=200, header=self.json_header, 458d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi body=json.dumps(content).encode('utf-8')) 468d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi api_response = self.service_connection.describe_vault(self.vault_name) 478d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertDictEqual(content, api_response) 488d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 498d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def test_delete_vault(self): 508d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.set_http_response(status_code=204) 518d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.service_connection.delete_vault(self.vault_name) 528d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 538d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 548d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoiclass GlacierJobOperations(GlacierLayer1ConnectionBase): 558d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 568d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def setUp(self): 578d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi super(GlacierJobOperations, self).setUp() 588d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.job_content = 'abc' * 1024 598d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 608d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def test_initiate_archive_job(self): 618d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi content = {u'Type': u'archive-retrieval', 628d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi u'ArchiveId': u'AAABZpJrTyioDC_HsOmHae8EZp_uBSJr6cnGOLKp_XJCl-Q', 638d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi u'Description': u'Test Archive', 648d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi u'SNSTopic': u'Topic', 658d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi u'JobId': None, 668d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi u'Location': None, 678d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi u'RequestId': None} 688d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.set_http_response(status_code=202, header=self.json_header, 698d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi body=json.dumps(content).encode('utf-8')) 708d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi api_response = self.service_connection.initiate_job(self.vault_name, 718d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.job_content) 728d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertDictEqual(content, api_response) 738d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 748d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def test_get_archive_output(self): 758d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi header = [('Content-Type', 'application/octet-stream')] 768d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.set_http_response(status_code=200, header=header, 778d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi body=self.job_content) 788d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi response = self.service_connection.get_job_output(self.vault_name, 798d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'example-job-id') 808d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEqual(self.job_content, response.read()) 818d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 828d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 838d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoiclass GlacierUploadArchiveResets(GlacierLayer1ConnectionBase): 848d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def test_upload_archive(self): 858d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi fake_data = tempfile.NamedTemporaryFile() 868d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi fake_data.write(b'foobarbaz') 878d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi # First seek to a non zero offset. 888d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi fake_data.seek(2) 898d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.set_http_response(status_code=201) 908d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi # Simulate reading the request body when we send the request. 918d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.service_connection.connection.request.side_effect = \ 928d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi lambda *args: fake_data.read() 938d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.service_connection.upload_archive('vault_name', fake_data, 'linear_hash', 948d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'tree_hash') 958d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi # Verify that we seek back to the original offset after making 968d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi # a request. This ensures that if we need to resend the request we're 978d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi # back at the correct location within the file. 988d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEqual(fake_data.tell(), 2) 99