cloudcafe/metatests/cloudcafe/blockstorage/volumes_api/v2/models/response_tests.py

539 lines
19 KiB
Python

"""
Copyright 2013 Rackspace
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
"""
import unittest
import json
from cloudcafe.blockstorage.volumes_api.v2.models import responses
class BaseTest(object):
@classmethod
def setUpClass(cls):
cls.model = cls.model_type.deserialize(
cls.serialized_input, cls.deserialize_type)
class VolumeTypeResponseModelBaseTest(BaseTest):
model_type = responses.VolumeTypeResponse
class defaults:
id_ = "32948732984798324"
name = "fake name"
extra_specs_key = "ExtraSpecsKey"
extra_specs_value = "ExtraSpecsValue"
def test_id(self):
self.assertEqual(self.model.id_, self.defaults.id_)
def test_name(self):
self.assertEqual(self.model.name, self.defaults.name)
def test_extra_specs(self):
self.assertEqual(
self.model.extra_specs,
{self.defaults.extra_specs_key: self.defaults.extra_specs_value})
class VolumeTypeResponseModelTest_JSON(
VolumeTypeResponseModelBaseTest, unittest.TestCase):
defaults = VolumeTypeResponseModelBaseTest.defaults
deserialize_type = 'json'
data = {
"volume_type": {
"id": defaults.id_,
"name": defaults.name,
"extra_specs": {
defaults.extra_specs_key: defaults.extra_specs_value}}}
serialized_input = json.dumps(data)
class VolumeTypeResponseModelTest_XML(
VolumeTypeResponseModelBaseTest, unittest.TestCase):
defaults = VolumeTypeResponseModelBaseTest.defaults
xml_header = """<?xml version="1.0" encoding="UTF-8"?>"""
deserialize_type = 'xml'
input_template = \
"""{xml_header}<volume_type
xmlns="http://docs.openstack.org/fakeVolRespModelxmlns"
id="{id_}" name="{name}">
<extra_specs>
<extra_spec key="{spec_key}">{spec_value}</extra_spec>
</extra_specs>
</volume_type>"""
serialized_input = input_template.format(
xml_header=xml_header,
id_=defaults.id_, name=defaults.name,
spec_key=defaults.extra_specs_key,
spec_value=defaults.extra_specs_value)
class VolumeTypeListResponseModelBaseTest(BaseTest):
model_type = responses.VolumeTypeListResponse
class defaults:
id_ = "32948732984798324"
name1 = "fake name 1"
name2 = "fake name 2"
extra_specs_key = "ExtraSpecsKey"
extra_specs_value = "ExtraSpecsValue"
def test_list_contains_two_items(self):
self.assertEqual(len(self.model), 2)
def test_first_item_id(self):
self.assertEqual(self.model[0].id_, self.defaults.id_)
def test_second_item_id(self):
self.assertEqual(self.model[1].id_, self.defaults.id_)
def test_first_item_name(self):
self.assertEqual(self.model[0].name, self.defaults.name1)
def test_second_item_name(self):
self.assertEqual(self.model[1].name, self.defaults.name2)
def test_first_item_extra_specs(self):
self.assertEqual(self.model[0].extra_specs, {
self.defaults.extra_specs_key:
self.defaults.extra_specs_value})
def test_second_item_extra_specs(self):
self.assertEqual(self.model[1].extra_specs, {
self.defaults.extra_specs_key:
self.defaults.extra_specs_value})
class VolumeTypeListResponseModelTest_XML(
VolumeTypeListResponseModelBaseTest, unittest.TestCase):
defaults = VolumeTypeListResponseModelBaseTest.defaults
xml_header = """<?xml version="1.0" encoding="UTF-8"?>"""
deserialize_type = 'xml'
input_template = \
"""{xml_header}<volume_types>
<volume_type
id="{id_}"
name="{name1}">
<extra_specs>
<extra_spec key="{spec_key}">{spec_value}</extra_spec>
</extra_specs>
</volume_type>
<volume_type
id="{id_}"
name="{name2}">
<extra_specs>
<extra_spec key="{spec_key}">{spec_value}</extra_spec>
</extra_specs>
</volume_type>
</volume_types>
"""
serialized_input = input_template.format(
xml_header=xml_header,
id_=defaults.id_,
name1=defaults.name1,
name2=defaults.name2,
spec_key=defaults.extra_specs_key,
spec_value=defaults.extra_specs_value)
class VolumeSnapshotResponseModelBaseTest(BaseTest):
model_type = responses.VolumeSnapshotResponse
class defaults:
status = 'creating'
description = 'fake snapshot description'
created_at = "2013-02-25T03:56:53.081642"
metadata_key = "MetaKey"
metadata_value = "MetaValue"
volume_id = "3242343242342342f32f324f3f"
size = 1
id_ = "2305iu32f9j3298f4jh32498fj"
name = "FakeSnapshotName"
os_extended_snapshot_attributes_project_id = '1111111'
os_extended_snapshot_attributes_progress = '100%'
def test_id(self):
self.assertEqual(self.model.id_, self.defaults.id_)
def test_volume_id(self):
self.assertEqual(self.model.volume_id, self.defaults.volume_id)
def test_name(self):
self.assertEqual(self.model.name, self.defaults.name)
def test_description(self):
self.assertEqual(self.model.description, self.defaults.description)
def test_status(self):
self.assertEqual(self.model.status, self.defaults.status)
def test_size_int_equivalent(self):
self.assertEqual(int(self.model.size), self.defaults.size)
def test_size_str_compare(self):
self.assertEqual(str(self.model.size), str(self.defaults.size))
def test_size_int_compare(self):
self.assertEqual(int(self.model.size), int(self.defaults.size))
def test_created_at(self):
self.assertEqual(self.model.created_at, self.defaults.created_at)
def test_metadata(self):
self.assertEqual(
self.model.metadata,
{self.defaults.metadata_key: self.defaults.metadata_value})
def test_os_extended_snapshot_attributes_project_id(self):
self.assertEqual(
self.model.os_extended_snapshot_attributes_project_id,
self.defaults.os_extended_snapshot_attributes_project_id)
def test_os_extended_snapshot_attributes_progress(self):
self.assertEqual(
self.model.os_extended_snapshot_attributes_progress,
self.defaults.os_extended_snapshot_attributes_progress)
class VolumeSnapshotResponseModelTests_JSON(
VolumeSnapshotResponseModelBaseTest, unittest.TestCase):
defaults = VolumeSnapshotResponseModelBaseTest.defaults
deserialize_type = 'json'
data = {
"snapshot": {
"status": defaults.status,
"description": defaults.description,
"created_at": defaults.created_at,
"metadata": {defaults.metadata_key: defaults.metadata_value},
"volume_id": defaults.volume_id,
"size": defaults.size,
"id": defaults.id_,
"name": defaults.name,
"os-extended-snapshot-attributes:project_id": defaults.
os_extended_snapshot_attributes_project_id,
"os-extended-snapshot-attributes:progress": defaults.
os_extended_snapshot_attributes_progress}}
serialized_input = json.dumps(data)
class VolumeSnapshotResponseModelTests_XML(
VolumeSnapshotResponseModelBaseTest, unittest.TestCase):
defaults = VolumeSnapshotResponseModelBaseTest.defaults
deserialize_type = 'xml'
xml_header = """<?xml version="1.0" encoding="UTF-8"?>"""
input_template = \
"""{xml_header}<snapshot
xmlns:os-extended-snapshot-attributes="FAKE"
os-extended-snapshot-attributes:project_id="{project_id}"
os-extended-snapshot-attributes:progress="{progress}"
status="{status}"
description="{description}"
created_at="{created_at}"
volume_id="{volume_id}"
size="{size}"
id="{id_}"
name="{name}">
<metadata>
<meta key="{metadata_key}">{metadata_value}</meta>
</metadata>
</snapshot>"""
serialized_input = input_template.format(
project_id=defaults.os_extended_snapshot_attributes_project_id,
progress=defaults.os_extended_snapshot_attributes_progress,
xml_header=xml_header,
status=defaults.status,
description=defaults.description,
created_at=defaults.created_at,
volume_id=defaults.volume_id,
size=defaults.size,
id_=defaults.id_,
name=defaults.name,
metadata_key=defaults.metadata_key,
metadata_value=defaults.metadata_value)
class VolumeResponseModelBaseTests(BaseTest):
model_type = responses.VolumeResponse
class defaults:
status = 'available'
attachment_device = '/dev/xvdg'
attachment_server_id = u'e335bfc4-5ba0-49b0-9f2b-7bc202583047'
attachment_id = u'7d4fdc77-8db7-4ba8-9786-c2a265c8b157'
attachment_volume_id = u'7d4fdc77-8db7-4ba8-9786-c2a265c8b157'
link_href = "http://localhost:8776/v2/0c2ebfde/volumes/5aa119a8-d35"
link_rel = 'self'
availability_zone = "nova"
source_volid = "1234234234324234"
snapshot_id = "34545645645646456"
id_ = "5aa119a8-d25b-45a7-8d1b-88e127885635"
description = "Super volume."
bootable = "true"
name = "vol-002"
created_at = "2013-02-25T02:40:21.000000"
volume_type = "None"
os_vol_tenant_attr_tenant_id = "0c2eba2c5af04d3f9e9d0d410b371fde"
os_vol_host_attr_host = "ip-10-168-107-25"
size = 1
metadata_key = "MetaKey"
metadata_value = "MetaValue"
os_vol_mig_status_attr_migstat = '100%'
os_vol_mig_status_attr_name_id = '1111111'
def test_id(self):
self.assertEqual(self.model.id_, self.defaults.id_)
def test_size_int_equivalent(self):
self.assertEqual(int(self.model.size), self.defaults.size)
def test_size_str_compare(self):
self.assertEqual(str(self.model.size), str(self.defaults.size))
def test_size_int_compare(self):
self.assertEqual(int(self.model.size), int(self.defaults.size))
def test_name(self):
self.assertEqual(self.model.name, self.defaults.name)
def test_volume_type(self):
self.assertEqual(
self.model.volume_type, self.defaults.volume_type)
def test_description(self):
self.assertEqual(
self.model.description, self.defaults.description)
def test_availability_zone(self):
self.assertEqual(
self.model.availability_zone,
self.defaults.availability_zone)
def test_metadata(self):
self.assertEqual(
self.model.metadata,
{self.defaults.metadata_key: self.defaults.metadata_value})
def test_snapshot_id(self):
self.assertEqual(
self.model.snapshot_id, self.defaults.snapshot_id)
def test_bootable(self):
self.assertEqual(
self.model.bootable, self.defaults.bootable)
def test_attachments_device(self):
self.assertEqual(
self.model.attachments[0].device,
self.defaults.attachment_device)
def test_attachments_server_id(self):
self.assertEqual(
self.model.attachments[0].server_id,
self.defaults.attachment_server_id)
def test_attachments_id(self):
self.assertEqual(
self.model.attachments[0].id_,
self.defaults.attachment_id)
def test_attachments_volume_id(self):
self.assertEqual(
self.model.attachments[0].volume_id,
self.defaults.attachment_volume_id)
def test_created_at(self):
self.assertEqual(
self.model.created_at,
self.defaults.created_at)
def test_status(self):
self.assertEqual(
self.model.status,
self.defaults.status)
def test_links_href(self):
self.assertEqual(
self.model.links[0].href,
self.defaults.link_href)
def test_links_rel(self):
self.assertEqual(
self.model.links[0].rel,
self.defaults.link_rel)
def test_source_volid(self):
self.assertEqual(
self.model.source_volid,
self.defaults.source_volid)
def test_os_vol_host_attr_host(self):
self.assertEqual(
self.model.os_vol_host_attr_host,
self.defaults.os_vol_host_attr_host)
def test_os_vol_tenant_attr_tenant_id(self):
self.assertEqual(
self.model.os_vol_tenant_attr_tenant_id,
self.defaults.os_vol_tenant_attr_tenant_id)
def test_os_vol_mig_status_attr_migstat(self):
self.assertEqual(
self.model.os_vol_mig_status_attr_migstat,
self.defaults.os_vol_mig_status_attr_migstat)
def test_os_vol_mig_status_attr_name_id(self):
self.assertEqual(
self.model.os_vol_mig_status_attr_name_id,
self.defaults.os_vol_mig_status_attr_name_id)
class VolumeResponseModelTests_JSON(
VolumeResponseModelBaseTests, unittest.TestCase):
defaults = VolumeResponseModelBaseTests.defaults
deserialize_type = 'json'
data = {
"volume": {
"status": defaults.status,
"attachments": [
{u'device': defaults.attachment_device,
u'server_id': defaults.attachment_server_id,
u'id': defaults.attachment_id,
u'volume_id': defaults.attachment_volume_id}],
"links": [{
"href": defaults.link_href,
"rel": defaults.link_rel}],
"availability_zone": defaults.availability_zone,
"os-vol-host-attr:host": defaults.os_vol_host_attr_host,
"source_volid": defaults.source_volid,
"snapshot_id": defaults.snapshot_id,
"id": defaults.id_,
"description": defaults.description,
"bootable": defaults.bootable,
"name": defaults.name,
"created_at": defaults.created_at,
"volume_type": defaults.volume_type,
"os-vol-tenant-attr:tenant_id":
defaults.os_vol_tenant_attr_tenant_id,
"size": defaults.size,
"os-vol-mig-status-attr:migstat":
defaults.os_vol_mig_status_attr_migstat,
"os-vol-mig-status-attr:name_id":
defaults.os_vol_mig_status_attr_name_id,
"metadata": {defaults.metadata_key: defaults.metadata_value}}}
serialized_input = json.dumps(data)
def get_modified_volume_model(self, sub_attr_name, new_object):
modified_data = dict()
modified_data['volume'] = self.data['volume']
modified_data['volume'][sub_attr_name] = new_object
serialized_input = json.dumps(modified_data)
model = self.model_type.deserialize(
serialized_input, self.deserialize_type)
return model
def test_empty_attachments_response(self):
model = self.get_modified_volume_model('attachments', list())
self.assertEqual(model.attachments, list())
self.assertIsInstance(
model.attachments, responses._VolumeAttachmentsList)
def test_empty_links_response(self):
model = self.get_modified_volume_model('links', list())
self.assertEqual(model.links, list())
self.assertIsInstance(
model.attachments, responses._VolumeAttachmentsList)
def test_empty_metadata_response(self):
model = self.get_modified_volume_model('metadata', dict())
self.assertEqual(model.metadata, dict())
class VolumeDetailResponseModelTests_XML(
VolumeResponseModelBaseTests, unittest.TestCase):
defaults = VolumeResponseModelBaseTests.defaults
deserialize_type = 'xml'
xml_header = """<?xml version="1.0" encoding="UTF-8"?>"""
input_template = \
"""{xml_header}<volume
xmlns:os-vol-image-meta="http://fake/api/v1"
xmlns:os-vol-tenant-attr="FAKE"
xmlns:os-vol-host-attr="FAKE"
xmlns:os-vol-mig-status-attr="FAKE"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns="http://docs.openstack.org/volume/api/v1"
status="{status}"
name="{name}"
bootable="{bootable}"
availability_zone="{availability_zone}"
created_at="{created_at}"
description="{description}"
volume_type="{volume_type}"
snapshot_id="{snapshot_id}"
source_volid="{source_volid}"
id="{id_}"
os-vol-tenant-attr:tenant_id="{os_vol_tenant_attr_tenant_id}"
os-vol-host-attr:host="{os_vol_host_attr_host}"
os-vol-mig-status-attr:migstat="{migstat}"
os-vol-mig-status-attr:name_id="{name_id}"
size="{size}">
<attachments>
<attachment device="{attachment_device}"
server_id="{attachment_server_id}"
id="{attachment_id}"
volume_id="{attachment_volume_id}"
/>
</attachments>
<metadata>
<meta key="{metadata_key}">{metadata_value}</meta>
</metadata>
</volume>"""
serialized_input = input_template.format(
xml_header=xml_header,
status=defaults.status,
name=defaults.name,
bootable=defaults.bootable,
availability_zone=defaults.availability_zone,
created_at=defaults.created_at,
description=defaults.description,
volume_type=defaults.volume_type,
snapshot_id=defaults.snapshot_id,
source_volid=defaults.source_volid,
id_=defaults.id_,
size=defaults.size,
os_vol_tenant_attr_tenant_id=defaults.os_vol_tenant_attr_tenant_id,
os_vol_host_attr_host=defaults.os_vol_host_attr_host,
migstat=defaults.os_vol_mig_status_attr_migstat,
name_id=defaults.os_vol_mig_status_attr_name_id,
attachment_device=defaults.attachment_device,
attachment_server_id=defaults.attachment_server_id,
attachment_id=defaults.attachment_id,
attachment_volume_id=defaults.attachment_volume_id,
metadata_key=defaults.metadata_key,
metadata_value=defaults.metadata_value)
@unittest.skip("There are no XML examples of links in XML responses")
def test_links_href(self):
super(VolumeDetailResponseModelTests_XML, self).test_links_href()
@unittest.skip("There are no XML examples of links in XML responses")
def test_links_rel(self):
super(VolumeDetailResponseModelTests_XML, self).test_links_href()