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