diff options
author | Victor Stinner <vstinner@redhat.com> | 2015-05-20 12:28:28 -0700 |
---|---|---|
committer | Victor Stinner <vstinner@redhat.com> | 2015-06-18 13:22:11 +0200 |
commit | 815166f6e9e2b2da69094eb46c428d87c4d8afdb (patch) | |
tree | e9a954ad0378e1675370e421f4ac8c80cfcc566d | |
parent | 0ae8f4102e7aeebb75fe5f65c02ed9bfa76cebb5 (diff) | |
download | glance_store-815166f6e9e2b2da69094eb46c428d87c4d8afdb.tar.gz |
Port vmware driver to Python 3
* Use bytes to handle image content
* Replace StringIO.String with six.BytesIO
Change-Id: I9304126f94579b1281d70ae2446927269de10641
-rw-r--r-- | glance_store/_drivers/vmware_datastore.py | 15 | ||||
-rw-r--r-- | glance_store/tests/unit/test_vmware_store.py | 75 |
2 files changed, 51 insertions, 39 deletions
diff --git a/glance_store/_drivers/vmware_datastore.py b/glance_store/_drivers/vmware_datastore.py index b7e8756..c6ec393 100644 --- a/glance_store/_drivers/vmware_datastore.py +++ b/glance_store/_drivers/vmware_datastore.py @@ -155,18 +155,18 @@ class _ChunkReader(_Reader): def __init__(self, data, blocksize=8192): self.blocksize = blocksize - self.current_chunk = "" + self.current_chunk = b"" self.closed = False super(_ChunkReader, self).__init__(data) def read(self, size=None): - ret = "" + ret = b"" while size is None or size >= len(self.current_chunk): ret += self.current_chunk if size is not None: size -= len(self.current_chunk) if self.closed: - self.current_chunk = "" + self.current_chunk = b"" break self._get_chunk() else: @@ -181,9 +181,14 @@ class _ChunkReader(_Reader): self._size += chunk_len self.checksum.update(chunk) if chunk: - self.current_chunk = '%x\r\n%s\r\n' % (chunk_len, chunk) + if six.PY3: + size_header = ('%x\r\n' % chunk_len).encode('ascii') + self.current_chunk = b''.join((size_header, chunk, + b'\r\n')) + else: + self.current_chunk = b'%x\r\n%s\r\n' % (chunk_len, chunk) else: - self.current_chunk = '0\r\n\r\n' + self.current_chunk = b'0\r\n\r\n' self.closed = True diff --git a/glance_store/tests/unit/test_vmware_store.py b/glance_store/tests/unit/test_vmware_store.py index dcd93ad..5c23203 100644 --- a/glance_store/tests/unit/test_vmware_store.py +++ b/glance_store/tests/unit/test_vmware_store.py @@ -158,7 +158,7 @@ class TestStore(base.StoreBaseTest, fake_select_datastore.return_value = self.store.datastores[0][0] expected_image_id = str(uuid.uuid4()) expected_size = FIVE_KB - expected_contents = "*" * expected_size + expected_contents = b"*" * expected_size hash_code = hashlib.md5(expected_contents) expected_checksum = hash_code.hexdigest() fake_size.__get__ = mock.Mock(return_value=expected_size) @@ -170,7 +170,7 @@ class TestStore(base.StoreBaseTest, expected_image_id, VMWARE_DS['vmware_datacenter_path'], VMWARE_DS['vmware_datastore_name']) - image = six.StringIO(expected_contents) + image = six.BytesIO(expected_contents) with self._mock_http_connection() as HttpConn: HttpConn.return_value = FakeHTTPConnection() location, size, checksum, _ = self.store.add(expected_image_id, @@ -193,7 +193,7 @@ class TestStore(base.StoreBaseTest, fake_select_datastore.return_value = self.store.datastores[0][0] expected_image_id = str(uuid.uuid4()) expected_size = FIVE_KB - expected_contents = "*" * expected_size + expected_contents = b"*" * expected_size hash_code = hashlib.md5(expected_contents) expected_checksum = hash_code.hexdigest() fake_size.__get__ = mock.Mock(return_value=expected_size) @@ -205,7 +205,7 @@ class TestStore(base.StoreBaseTest, expected_image_id, VMWARE_DS['vmware_datacenter_path'], VMWARE_DS['vmware_datastore_name']) - image = six.StringIO(expected_contents) + image = six.BytesIO(expected_contents) with self._mock_http_connection() as HttpConn: HttpConn.return_value = FakeHTTPConnection() location, size, checksum, _ = self.store.add(expected_image_id, @@ -269,8 +269,8 @@ class TestStore(base.StoreBaseTest, self.assertRaises(exceptions.NotFound, self.store.get_size, loc) def test_reader_full(self): - content = 'XXX' - image = six.StringIO(content) + content = b'XXX' + image = six.BytesIO(content) expected_checksum = hashlib.md5(content).hexdigest() reader = vm_store._Reader(image) ret = reader.read() @@ -279,12 +279,12 @@ class TestStore(base.StoreBaseTest, self.assertEqual(len(content), reader.size) def test_reader_partial(self): - content = 'XXX' - image = six.StringIO(content) - expected_checksum = hashlib.md5('X').hexdigest() + content = b'XXX' + image = six.BytesIO(content) + expected_checksum = hashlib.md5(b'X').hexdigest() reader = vm_store._Reader(image) ret = reader.read(1) - self.assertEqual('X', ret) + self.assertEqual(b'X', ret) self.assertEqual(expected_checksum, reader.checksum.hexdigest()) self.assertEqual(1, reader.size) @@ -293,54 +293,61 @@ class TestStore(base.StoreBaseTest, Test that the image file reader returns the expected chunk of data when the block size is larger than the image. """ - content = 'XXX' - image = six.StringIO(content) + content = b'XXX' + image = six.BytesIO(content) expected_checksum = hashlib.md5(content).hexdigest() reader = vm_store._ChunkReader(image) ret = reader.read() - expected_chunk = '%x\r\n%s\r\n' % (len(content), content) - last_chunk = '0\r\n\r\n' - self.assertEqual('%s%s' % (expected_chunk, last_chunk), ret) - self.assertEqual(image.len, reader.size) + if six.PY3: + expected_chunk = ('%x\r\n%s\r\n' + % (len(content), content.decode('ascii'))) + expected_chunk = expected_chunk.encode('ascii') + else: + expected_chunk = b'%x\r\n%s\r\n' % (len(content), content) + last_chunk = b'0\r\n\r\n' + self.assertEqual(expected_chunk + last_chunk, ret) + self.assertEqual(len(content), reader.size) self.assertEqual(expected_checksum, reader.checksum.hexdigest()) self.assertTrue(reader.closed) ret = reader.read() - self.assertEqual(image.len, reader.size) + self.assertEqual(len(content), reader.size) self.assertEqual(expected_checksum, reader.checksum.hexdigest()) self.assertTrue(reader.closed) - self.assertEqual('', ret) + self.assertEqual(b'', ret) def test_chunkreader_image_larger_blocksize(self): """ Test that the image file reader returns the expected chunks when the block size specified is smaller than the image. """ - content = 'XXX' - image = six.StringIO(content) + content = b'XXX' + image = six.BytesIO(content) expected_checksum = hashlib.md5(content).hexdigest() - last_chunk = '0\r\n\r\n' + last_chunk = b'0\r\n\r\n' reader = vm_store._ChunkReader(image, blocksize=1) ret = reader.read() - expected_chunk = '1\r\nX\r\n' - self.assertEqual('%s%s%s%s' % (expected_chunk, expected_chunk, - expected_chunk, last_chunk), ret) + expected_chunk = b'1\r\nX\r\n' + expected = (expected_chunk + expected_chunk + expected_chunk + + last_chunk) + self.assertEqual(expected, + ret) self.assertEqual(expected_checksum, reader.checksum.hexdigest()) - self.assertEqual(image.len, reader.size) + self.assertEqual(len(content), reader.size) self.assertTrue(reader.closed) def test_chunkreader_size(self): """Test that the image reader takes into account the specified size.""" - content = 'XXX' - image = six.StringIO(content) + content = b'XXX' + image = six.BytesIO(content) expected_checksum = hashlib.md5(content).hexdigest() reader = vm_store._ChunkReader(image, blocksize=1) ret = reader.read(size=3) - self.assertEqual('1\r\n', ret) + self.assertEqual(b'1\r\n', ret) ret = reader.read(size=1) - self.assertEqual('X', ret) + self.assertEqual(b'X', ret) ret = reader.read() self.assertEqual(expected_checksum, reader.checksum.hexdigest()) - self.assertEqual(image.len, reader.size) + self.assertEqual(len(content), reader.size) self.assertTrue(reader.closed) def test_sanity_check_api_retry_count(self): @@ -431,8 +438,8 @@ class TestStore(base.StoreBaseTest, def test_unexpected_status(self, mock_api_session, mock_select_datastore): expected_image_id = str(uuid.uuid4()) expected_size = FIVE_KB - expected_contents = "*" * expected_size - image = six.StringIO(expected_contents) + expected_contents = b"*" * expected_size + image = six.BytesIO(expected_contents) self.session = mock.Mock() with self._mock_http_connection() as HttpConn: HttpConn.return_value = FakeHTTPConnection(status=401) @@ -472,8 +479,8 @@ class TestStore(base.StoreBaseTest, mock_select_datastore.return_value = self.store.datastores[0][0] expected_image_id = str(uuid.uuid4()) expected_size = FIVE_KB - expected_contents = "*" * expected_size - image = six.StringIO(expected_contents) + expected_contents = b"*" * expected_size + image = six.BytesIO(expected_contents) self.session = mock.Mock() with self._mock_http_connection() as HttpConn: HttpConn.request.side_effect = IOError |