Updating unittests to reflect changes in blockstorage version sync

Change-Id: I947f9a5e774bc65235127da7a4307db75e87a0b9
This commit is contained in:
Jose Idar 2014-03-28 13:01:50 -05:00
parent f5c083394a
commit 0462512f63
4 changed files with 355 additions and 398 deletions

View File

@ -13,121 +13,80 @@ 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
from mock import MagicMock, Mock
from requests import Response
from cloudcafe.blockstorage.volumes_api.common.behaviors import \
VolumesAPIBehaviorException
from cloudcafe.blockstorage.volumes_api.v1.behaviors import \
VolumesAPI_Behaviors, VolumesAPIBehaviorException
VolumesAPI_Behaviors
from cloudcafe.blockstorage.volumes_api.v1.models.responses import\
VolumeResponse, VolumeSnapshotResponse
from cloudcafe.blockstorage.volumes_api.v1.client import VolumesClient
from cloudcafe.blockstorage.volumes_api.v1.config import VolumesAPIConfig
from cloudcafe.blockstorage.volumes_api.common.config import VolumesAPIConfig
class wait_for_snapshot_status(unittest.TestCase):
class defaults:
snapshot_name = 'mock_snapshot'
snapshot_id = '111111'
snapshot_name = 'mock_snapshot'
expected_status = 'available'
timeout = 10
poll_rate = 2
def test_wait_for_snapshot_status_good_response_code(self):
def get_mocks(self):
client = Mock(spec=VolumesClient)
config = Mock(spec=VolumesAPIConfig)
config.snapshot_status_poll_frequency = 1
snapshot_model = Mock(spec=VolumeSnapshotResponse)
snapshot_model.status = self.defaults.expected_status
response = Mock(spec=Response)
response.ok = True
response.entity = snapshot_model
client.get_snapshot_info = MagicMock(
return_value=response)
config.snapshot_status_poll_frequency = 1
response.ok = True
snapshot_model.status = self.defaults.expected_status
response.entity = snapshot_model
client.get_snapshot_info = MagicMock(return_value=response)
return (client, config, snapshot_model, response)
def test_good_response_code_manual_poll_rate(self):
client, config, snapshot_model, response = self.get_mocks()
behavior = VolumesAPI_Behaviors(client, config)
resp = behavior.wait_for_snapshot_status(
self.defaults.snapshot_id, self.defaults.expected_status,
self.defaults.timeout, poll_rate=self.defaults.poll_rate)
self.assertIsNone(resp)
def test_wait_for_snapshot_status_good_response_code_config_wait_period(
self):
client = Mock(spec=VolumesClient)
config = Mock(spec=VolumesAPIConfig)
config.snapshot_status_poll_frequency = 1
snapshot_model = Mock(spec=VolumeSnapshotResponse)
snapshot_model.status = self.defaults.expected_status
response = Mock(spec=Response)
response.ok = True
response.entity = snapshot_model
client.get_snapshot_info = MagicMock(
return_value=response)
def test_good_response_code_config_wait_period(self):
client, config, snapshot_model, response = self.get_mocks()
behavior = VolumesAPI_Behaviors(client, config)
resp = behavior.wait_for_snapshot_status(
self.defaults.snapshot_name, self.defaults.expected_status,
self.defaults.timeout)
self.assertIsNone(resp)
def test_wait_for_snapshot_status_good_response_code_bad_status(self):
client = Mock(spec=VolumesClient)
config = Mock(spec=VolumesAPIConfig)
config.snapshot_status_poll_frequency = 1
snapshot_model = Mock(spec=VolumeSnapshotResponse)
snapshot_model.status = self.defaults.expected_status
response = Mock(spec=Response)
response.ok = True
response.entity = snapshot_model
client.get_snapshot_info = MagicMock(
return_value=response)
def test_good_response_code_bad_status(self):
client, config, snapshot_model, response = self.get_mocks()
behavior = VolumesAPI_Behaviors(client, config)
resp = behavior.wait_for_snapshot_status(
self.defaults.snapshot_name, self.defaults.expected_status,
self.defaults.timeout, poll_rate=self.defaults.poll_rate)
self.assertIsNone(resp)
def test_wait_for_snapshot_status_bad_response_code(self):
def test_bad_response_code(self):
client, config, snapshot_model, response = self.get_mocks()
client = Mock(spec=VolumesClient)
config = Mock(spec=VolumesAPIConfig)
config.snapshot_status_poll_frequency = 1
snapshot_model = Mock(spec=VolumeSnapshotResponse)
snapshot_model.status = self.defaults.expected_status
response = Mock(spec=Response)
response.ok = False
response.entity = snapshot_model
response.status_code = '401'
client.get_snapshot_info = MagicMock(
return_value=response)
client.get_snapshot_info = MagicMock(return_value=response)
behavior = VolumesAPI_Behaviors(client, config)
with self.assertRaises(VolumesAPIBehaviorException):
@ -135,24 +94,12 @@ class wait_for_snapshot_status(unittest.TestCase):
self.defaults.snapshot_name, self.defaults.expected_status,
self.defaults.timeout, poll_rate=self.defaults.poll_rate)
def test_wait_for_snapshot_status_good_response_code_empty_entity(self):
def test_good_response_code_empty_entity(self):
client, config, snapshot_model, response = self.get_mocks()
client = Mock(spec=VolumesClient)
config = Mock(spec=VolumesAPIConfig)
config.snapshot_status_poll_frequency = 1
snapshot_model = Mock(spec=VolumeSnapshotResponse)
snapshot_model.status = self.defaults.expected_status
response = Mock(spec=Response)
response.ok = True
response.entity = None
response.status_code = '200'
client.get_snapshot_info = MagicMock(
return_value=response)
client.get_snapshot_info = MagicMock(return_value=response)
behavior = VolumesAPI_Behaviors(client, config)
with self.assertRaises(VolumesAPIBehaviorException):
@ -160,31 +107,20 @@ class wait_for_snapshot_status(unittest.TestCase):
self.defaults.snapshot_name, self.defaults.expected_status,
self.defaults.timeout, poll_rate=self.defaults.poll_rate)
def test_wait_for_snapshot_status_good_response_and_entity_bad_status(
self):
def test_good_response_good_entity_bad_status(self):
client, config, snapshot_model, response = self.get_mocks()
recieved_status = 'error'
client = Mock(spec=VolumesClient)
config = Mock(spec=VolumesAPIConfig)
config.snapshot_status_poll_frequency = 1
snapshot_model = Mock(spec=VolumeSnapshotResponse)
poll_rate = 1
snapshot_model.status = recieved_status
response = Mock(spec=Response)
response.ok = True
response.entity = snapshot_model
client.get_snapshot_info = MagicMock(
return_value=response)
client.get_snapshot_info = MagicMock(return_value=response)
behavior = VolumesAPI_Behaviors(client, config)
with self.assertRaises(VolumesAPIBehaviorException):
behavior.wait_for_snapshot_status(
self.defaults.snapshot_name, self.defaults.expected_status,
self.defaults.timeout, poll_rate=self.defaults.poll_rate)
self.defaults.timeout, poll_rate=poll_rate)
class wait_for_volume_status(unittest.TestCase):
@ -195,24 +131,31 @@ class wait_for_volume_status(unittest.TestCase):
expected_status = 'available'
timeout = 10
poll_rate = 2
timeout = 10
def test_wait_for_volume_status_good_response_code(self):
def get_mocks(self):
client = Mock(spec=VolumesClient)
config = Mock(spec=VolumesAPIConfig)
config.volume_status_poll_frequency = 1
volume_model = Mock(spec=VolumeResponse)
volume_model.status = self.defaults.expected_status
response = Mock(spec=Response)
config.volume_status_poll_frequency = 1
volume_model.status = self.defaults.expected_status
response.ok = True
response.entity = volume_model
client.get_volume_info = MagicMock(return_value=response)
client.get_volume_info = MagicMock(
return_value=response)
return (client, config, volume_model, response)
def test_get_volume_status(self):
client, config, volume_model, response = self.get_mocks()
behavior = VolumesAPI_Behaviors(client, config)
status = behavior.get_volume_status(self.defaults.volume_id)
self.assertEqual(status, self.defaults.expected_status)
def test_good_response_code(self):
client, config, volume_model, response = self.get_mocks()
behavior = VolumesAPI_Behaviors(client, config)
@ -222,134 +165,69 @@ class wait_for_volume_status(unittest.TestCase):
self.assertIsNone(resp)
def test_wait_for_volume_status_good_response_code_configured_poll_rate(
self):
client = Mock(spec=VolumesClient)
config = Mock(spec=VolumesAPIConfig)
config.volume_status_poll_frequency = 1
volume_model = Mock(spec=VolumeResponse)
volume_model.status = self.defaults.expected_status
response = Mock(spec=Response)
response.ok = True
response.entity = volume_model
client.get_volume_info = MagicMock(
return_value=response)
def test_good_response_code_configured_poll_period(self):
client, config, volume_model, response = self.get_mocks()
behavior = VolumesAPI_Behaviors(client, config)
resp = behavior.wait_for_volume_status(
self.defaults.volume_name, self.defaults.expected_status,
self.defaults.timeout)
self.assertIsNone(resp)
def test_wait_for_volume_status_good_response_code_bad_status(self):
volume_name = 'mock_volume'
expected_status = 'available'
timeout = 10
poll_rate = 2
client = Mock(spec=VolumesClient)
config = Mock(spec=VolumesAPIConfig)
config.volume_status_poll_frequency = 1
volume_model = Mock(spec=VolumeResponse)
volume_model.status = expected_status
response = Mock(spec=Response)
response.ok = True
response.entity = volume_model
client.get_volume_info = MagicMock(
return_value=response)
def test_good_response_code_bad_status(self):
client, config, volume_model, response = self.get_mocks()
behavior = VolumesAPI_Behaviors(client, config)
resp = behavior.wait_for_volume_status(
volume_name, expected_status, timeout, poll_rate=poll_rate)
self.defaults.volume_name, self.defaults.expected_status,
self.defaults.timeout, poll_rate=self.defaults.poll_rate)
self.assertIsNone(resp)
def test_wait_for_volume_status_bad_response_code(self):
def test_bad_response_code(self):
client, config, volume_model, response = self.get_mocks()
client = Mock(spec=VolumesClient)
config = Mock(spec=VolumesAPIConfig)
config.volume_status_poll_frequency = 1
volume_model = Mock(spec=VolumeResponse)
volume_model.status = self.defaults.expected_status
response = Mock(spec=Response)
response.ok = False
response.entity = volume_model
response.status_code = '401'
client.get_volume_info = MagicMock(
return_value=response)
client.get_volume_info = MagicMock(return_value=response)
behavior = VolumesAPI_Behaviors(client, config)
with self.assertRaises(VolumesAPIBehaviorException):
behavior.wait_for_volume_status(
self.defaults.volume_name, self.defaults.expected_status,
self.defaults.timeout, poll_rate=self.defaults.poll_rate)
def test_wait_for_volume_status_good_response_code_empty_entity(self):
def test_good_response_code_empty_entity(self):
client, config, volume_model, response = self.get_mocks()
client = Mock(spec=VolumesClient)
config = Mock(spec=VolumesAPIConfig)
config.volume_status_poll_frequency = 1
volume_model = Mock(spec=VolumeResponse)
volume_model.status = self.defaults.expected_status
response = Mock(spec=Response)
response.ok = True
response.entity = None
response.status_code = '200'
client.get_volume_info = MagicMock(
return_value=response)
client.get_volume_info = MagicMock(return_value=response)
behavior = VolumesAPI_Behaviors(client, config)
with self.assertRaises(VolumesAPIBehaviorException):
behavior.wait_for_volume_status(
self.defaults.volume_name, self.defaults.expected_status,
self.defaults.timeout, poll_rate=self.defaults.poll_rate)
def test_wait_for_volume_status_good_response_and_entity_bad_status(self):
def test_good_response_and_entity_bad_status(self):
client, config, volume_model, response = self.get_mocks()
recieved_status = 'error'
timeout = 2
poll_rate = 1
client = Mock(spec=VolumesClient)
config = Mock(spec=VolumesAPIConfig)
config.volume_status_poll_frequency = 1
volume_model = Mock(spec=VolumeResponse)
volume_model.status = recieved_status
response = Mock(spec=Response)
response.ok = True
response.entity = volume_model
client.get_volume_info = MagicMock(
return_value=response)
client.get_volume_info = MagicMock(return_value=response)
behavior = VolumesAPI_Behaviors(client, config)
with self.assertRaises(VolumesAPIBehaviorException):
behavior.wait_for_volume_status(
self.defaults.volume_name, self.defaults.expected_status,
self.defaults.timeout, poll_rate=self.defaults.poll_rate)
timeout, poll_rate=poll_rate)
class create_available_volume(unittest.TestCase):
@ -359,81 +237,48 @@ class create_available_volume(unittest.TestCase):
volume_type = "mock_type"
size = 1
def test_create_availabe_volume_happy_path(self):
def get_mocks(self):
client = Mock(spec=VolumesClient)
volume_model = Mock(spec=VolumeResponse)
volume_model.id_ = "mock"
volume_create_response = Mock(spec=Response)
volume_model.id_ = "mock"
volume_create_response.entity = volume_model
volume_create_response.ok = True
client = Mock(spec=VolumesClient)
client.create_volume = MagicMock(return_value=volume_create_response)
config = Mock(spec=VolumesAPIConfig)
config.volume_create_timeout = 5
config.serialize_format = "json"
config.deserialize_format = "json"
config.max_volume_size = 1024
config.min_volume_size = 1
config.volume_status_poll_frequency = 5
config.volume_create_min_timeout = 1
config.volume_create_max_timeout = 10
config.volume_create_wait_per_gigabyte = 1
config.volume_create_base_timeout = 0
return (client, config, volume_model, volume_create_response)
def test_happy_path(self):
client, config, volume_model, volume_create_response = self.get_mocks()
behavior = VolumesAPI_Behaviors(client, config)
behavior.wait_for_volume_status = MagicMock(return_value=None)
behavior.get_volume_status = MagicMock(return_value='available')
volume_entity = behavior.create_available_volume(
self.defaults.display_name, self.defaults.size,
self.defaults.volume_type)
self.assertIsInstance(volume_entity, VolumeResponse)
def test_create_available_volume_failure_response_no_model(self):
def test_timeout_failure(self):
client, config, volume_model, volume_create_response = self.get_mocks()
volume_model = Mock(spec=VolumeResponse)
volume_model.id_ = "mock"
volume_create_response = Mock(spec=Response)
volume_create_response.entity = None
volume_create_response.ok = False
volume_create_response.status_code = 500
client = Mock(spec=VolumesClient)
client.create_volume = MagicMock(return_value=volume_create_response)
config = Mock(spec=VolumesAPIConfig)
config.volume_create_timeout = 5
behavior = VolumesAPI_Behaviors(client, config)
behavior.wait_for_volume_status = MagicMock(return_value=None)
with self.assertRaises(VolumesAPIBehaviorException):
behavior.create_available_volume(
self.defaults.display_name, self.defaults.size,
self.defaults.volume_type)
def test_create_available_volume_failure_response_with_model(self):
volume_model = Mock(spec=VolumeResponse)
volume_model.id_ = "mock"
volume_create_response = Mock(spec=Response)
volume_create_response.entity = None
volume_create_response.ok = True
volume_create_response.status_code = 200
client = Mock(spec=VolumesClient)
client.create_volume = MagicMock(return_value=volume_create_response)
config = Mock(spec=VolumesAPIConfig)
config.volume_create_timeout = 5
behavior = VolumesAPI_Behaviors(client, config)
behavior.wait_for_volume_status = MagicMock(return_value=None)
with self.assertRaises(VolumesAPIBehaviorException):
behavior.create_available_volume(
self.defaults.display_name, self.defaults.size,
self.defaults.volume_type)
def test_create_available_volume_timeout_failure(self):
volume_model = Mock(spec=VolumeResponse)
volume_model.id_ = "mock"
volume_create_response = Mock(spec=Response)
volume_create_response.entity = None
volume_create_response.ok = True
volume_create_response.status_code = 200
client = Mock(spec=VolumesClient)
client.create_volume = MagicMock(return_value=volume_create_response)
config = Mock(spec=VolumesAPIConfig)
config.volume_create_timeout = 5
behavior = VolumesAPI_Behaviors(client, config)
behavior.wait_for_volume_status = MagicMock(
side_effect=VolumesAPIBehaviorException)

View File

@ -19,6 +19,7 @@ from cloudcafe.blockstorage.volumes_api.v1.models import responses
class BaseTest(object):
@classmethod
def setUpClass(cls):
cls.model = cls.model_type.deserialize(
@ -35,13 +36,13 @@ class VolumeTypeResponseModelBaseTest(BaseTest):
extra_specs_value = "ExtraSpecsValue"
def test_id(self):
self.assertEqual(self.model.id_, self.defaults.id_)
self.assertEquals(self.model.id_, self.defaults.id_)
def test_name(self):
self.assertEqual(self.model.name, self.defaults.name)
self.assertEquals(self.model.name, self.defaults.name)
def test_extra_specs(self):
self.assertEqual(
self.assertEquals(
self.model.extra_specs,
{self.defaults.extra_specs_key: self.defaults.extra_specs_value})
@ -66,7 +67,7 @@ class VolumeTypeResponseModelTest_XML(
deserialize_type = 'xml'
input_template = \
"""{xml_header}<volume_type
xmlns="http://docs.openstack.org/fake"
xmlns="http://docs.openstack.org/fakeVolRespModelxmlns"
id="{id_}" name="{name}">
<extra_specs>
<extra_spec key="{spec_key}">{spec_value}</extra_spec>
@ -74,7 +75,76 @@ class VolumeTypeResponseModelTest_XML(
</volume_type>"""
serialized_input = input_template.format(
xml_header=xml_header, id_=defaults.id_, name=defaults.name,
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.assertEquals(len(self.model), 2)
def test_first_item_id(self):
self.assertEquals(self.model[0].id_, self.defaults.id_)
def test_second_item_id(self):
self.assertEquals(self.model[1].id_, self.defaults.id_)
def test_first_item_name(self):
self.assertEquals(self.model[0].name, self.defaults.name1)
def test_second_item_name(self):
self.assertEquals(self.model[1].name, self.defaults.name2)
def test_first_item_extra_specs(self):
self.assertEquals(self.model[0].extra_specs, {
self.defaults.extra_specs_key:
self.defaults.extra_specs_value})
def test_second_item_extra_specs(self):
self.assertEquals(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)
@ -92,40 +162,52 @@ class VolumeSnapshotResponseModelBaseTest(BaseTest):
size = 1
id_ = "2305iu32f9j3298f4jh32498fj"
display_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_)
self.assertEquals(self.model.id_, self.defaults.id_)
def test_volume_id(self):
self.assertEqual(self.model.volume_id, self.defaults.volume_id)
self.assertEquals(self.model.volume_id, self.defaults.volume_id)
def test_display_name(self):
self.assertEqual(self.model.display_name, self.defaults.display_name)
self.assertEquals(self.model.display_name, self.defaults.display_name)
def test_display_description(self):
self.assertEqual(
self.assertEquals(
self.model.display_description, self.defaults.display_description)
def test_status(self):
self.assertEqual(self.model.status, self.defaults.status)
self.assertEquals(self.model.status, self.defaults.status)
def test_size_int_equivalent(self):
self.assertEqual(int(self.model.size), self.defaults.size)
self.assertEquals(int(self.model.size), self.defaults.size)
def test_size_str_compare(self):
self.assertEqual(str(self.model.size), str(self.defaults.size))
self.assertEquals(str(self.model.size), str(self.defaults.size))
def test_size_int_compare(self):
self.assertEqual(int(self.model.size), int(self.defaults.size))
self.assertEquals(int(self.model.size), int(self.defaults.size))
def test_created_at(self):
self.assertEqual(self.model.created_at, self.defaults.created_at)
self.assertEquals(self.model.created_at, self.defaults.created_at)
def test_metadata(self):
self.assertEqual(
self.assertEquals(
self.model.metadata,
{self.defaults.metadata_key: self.defaults.metadata_value})
def test_os_extended_snapshot_attributes_project_id(self):
self.assertEquals(
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.assertEquals(
self.model.os_extended_snapshot_attributes_progress,
self.defaults.os_extended_snapshot_attributes_progress)
class VolumeSnapshotResponseModelTests_JSON(
VolumeSnapshotResponseModelBaseTest, unittest.TestCase):
@ -141,7 +223,11 @@ class VolumeSnapshotResponseModelTests_JSON(
"volume_id": defaults.volume_id,
"size": defaults.size,
"id": defaults.id_,
"display_name": defaults.display_name}}
"display_name": defaults.display_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)
@ -153,6 +239,9 @@ class VolumeSnapshotResponseModelTests_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}"
display_description="{display_description}"
created_at="{created_at}"
@ -165,11 +254,17 @@ class VolumeSnapshotResponseModelTests_XML(
</metadata>
</snapshot>"""
serialized_input = input_template.format(
xml_header=xml_header, status=defaults.status,
project_id=defaults.os_extended_snapshot_attributes_project_id,
progress=defaults.os_extended_snapshot_attributes_progress,
xml_header=xml_header,
status=defaults.status,
display_description=defaults.display_description,
created_at=defaults.created_at, volume_id=defaults.volume_id,
size=defaults.size, id_=defaults.id_,
display_name=defaults.display_name, metadata_key=defaults.metadata_key,
created_at=defaults.created_at,
volume_id=defaults.volume_id,
size=defaults.size,
id_=defaults.id_,
display_name=defaults.display_name,
metadata_key=defaults.metadata_key,
metadata_value=defaults.metadata_value)
@ -198,84 +293,115 @@ class VolumeResponseModelBaseTests(BaseTest):
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_)
self.assertEquals(self.model.id_, self.defaults.id_)
def test_size_int_equivalent(self):
self.assertEqual(int(self.model.size), self.defaults.size)
self.assertEquals(int(self.model.size), self.defaults.size)
def test_size_str_compare(self):
self.assertEqual(str(self.model.size), str(self.defaults.size))
self.assertEquals(str(self.model.size), str(self.defaults.size))
def test_size_int_compare(self):
self.assertEqual(int(self.model.size), int(self.defaults.size))
self.assertEquals(int(self.model.size), int(self.defaults.size))
def test_display_name(self):
self.assertEqual(self.model.display_name, self.defaults.display_name)
self.assertEquals(self.model.display_name, self.defaults.display_name)
def test_volume_type(self):
self.assertEqual(
self.assertEquals(
self.model.volume_type, self.defaults.volume_type)
def test_display_description(self):
self.assertEqual(
self.assertEquals(
self.model.display_description, self.defaults.display_description)
def test_availability_zone(self):
self.assertEqual(
self.assertEquals(
self.model.availability_zone,
self.defaults.availability_zone)
def test_metadata(self):
self.assertEqual(
self.assertEquals(
self.model.metadata,
{self.defaults.metadata_key: self.defaults.metadata_value})
def test_snapshot_id(self):
self.assertEqual(
self.assertEquals(
self.model.snapshot_id, self.defaults.snapshot_id)
def test_bootable(self):
self.assertEquals(
self.model.bootable, self.defaults.bootable)
def test_attachments_device(self):
self.assertEqual(
self.assertEquals(
self.model.attachments[0].device,
self.defaults.attachment_device)
def test_attachments_server_id(self):
self.assertEqual(
self.assertEquals(
self.model.attachments[0].server_id,
self.defaults.attachment_server_id)
def test_attachments_id(self):
self.assertEqual(
self.assertEquals(
self.model.attachments[0].id_,
self.defaults.attachment_id)
def test_attachments_volume_id(self):
self.assertEqual(
self.assertEquals(
self.model.attachments[0].volume_id,
self.defaults.attachment_volume_id)
def test_created_at(self):
self.assertEqual(
self.assertEquals(
self.model.created_at,
self.defaults.created_at)
def test_status(self):
self.assertEqual(
self.assertEquals(
self.model.status,
self.defaults.status)
def test_links_href(self):
self.assertEqual(
self.assertEquals(
self.model.links[0].href,
self.defaults.link_href)
def test_links_rel(self):
self.assertEqual(
self.assertEquals(
self.model.links[0].rel,
self.defaults.link_rel)
def test_source_volid(self):
self.assertEquals(
self.model.source_volid,
self.defaults.source_volid)
def test_os_vol_host_attr_host(self):
self.assertEquals(
self.model.os_vol_host_attr_host,
self.defaults.os_vol_host_attr_host)
def test_os_vol_tenant_attr_tenant_id(self):
self.assertEquals(
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.assertEquals(
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.assertEquals(
self.model.os_vol_mig_status_attr_name_id,
self.defaults.os_vol_mig_status_attr_name_id)
class VolumeResponseModelTests_JSON(
VolumeResponseModelBaseTests, unittest.TestCase):
@ -294,13 +420,22 @@ class VolumeResponseModelTests_JSON(
"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_,
"display_description": defaults.display_description,
"bootable": defaults.bootable,
"display_name": defaults.display_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)
@ -315,19 +450,19 @@ class VolumeResponseModelTests_JSON(
def test_empty_attachments_response(self):
model = self.get_modified_volume_model('attachments', list())
self.assertEqual(model.attachments, list())
self.assertEquals(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.assertEquals(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())
self.assertEquals(model.metadata, dict())
class VolumeDetailResponseModelTests_XML(
@ -338,16 +473,26 @@ class VolumeDetailResponseModelTests_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}"
display_name="{display_name}"
bootable="{bootable}"
availability_zone="{availability_zone}"
created_at="{created_at}"
display_description="{display_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}"
@ -362,13 +507,22 @@ class VolumeDetailResponseModelTests_XML(
</volume>"""
serialized_input = input_template.format(
xml_header=xml_header, status=defaults.status,
xml_header=xml_header,
status=defaults.status,
display_name=defaults.display_name,
bootable=defaults.bootable,
availability_zone=defaults.availability_zone,
created_at=defaults.created_at,
display_description=defaults.display_description,
volume_type=defaults.volume_type, snapshot_id=defaults.snapshot_id,
id_=defaults.id_, size=defaults.size,
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,
@ -383,72 +537,3 @@ class VolumeDetailResponseModelTests_XML(
@unittest.skip("There are no XML examples of links in XML responses")
def test_links_rel(self):
super(VolumeDetailResponseModelTests_XML, self).test_links_href()
@unittest.skip("There are no XML examples of links in XML responses")
def test_empty_links_response(self):
pass
def test_empty_attachments_response(self):
serialized_input = """{xml_header}<volume
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns="http://docs.openstack.org/volume/api/v1"
status="{status}"
display_name="{display_name}"
availability_zone="{availability_zone}"
created_at="{created_at}"
display_description="{display_description}"
volume_type="{volume_type}"
snapshot_id="{snapshot_id}"
id="{id_}"
size="{size}">
<metadata>
<meta key="{metadata_key}">{metadata_value}</meta>
</metadata>
</volume>""".format(
xml_header=self.xml_header,
status=self.defaults.status,
display_name=self.defaults.display_name,
availability_zone=self.defaults.availability_zone,
created_at=self.defaults.created_at,
display_description=self.defaults.display_description,
volume_type=self.defaults.volume_type,
snapshot_id=self.defaults.snapshot_id,
id_=self.defaults.id_,
size=self.defaults.size,
metadata_key=self.defaults.metadata_key,
metadata_value=self.defaults.metadata_value)
self.model = self.model_type.deserialize(
serialized_input, self.deserialize_type)
self.assertEqual(self.model.attachments, [])
self.assertIsInstance(
self.model.attachments, responses._VolumeAttachmentsList)
def test_empty_metadata_response(self):
serialized_input = """{xml_header}<volume
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns="http://docs.openstack.org/volume/api/v1"
status="{status}"
display_name="{display_name}"
availability_zone="{availability_zone}"
created_at="{created_at}"
display_description="{display_description}"
volume_type="{volume_type}"
snapshot_id="{snapshot_id}"
id="{id_}"
size="{size}">
</volume>""".format(
xml_header=self.xml_header,
status=self.defaults.status,
display_name=self.defaults.display_name,
availability_zone=self.defaults.availability_zone,
created_at=self.defaults.created_at,
display_description=self.defaults.display_description,
volume_type=self.defaults.volume_type,
snapshot_id=self.defaults.snapshot_id,
id_=self.defaults.id_,
size=self.defaults.size)
self.model = self.model_type.deserialize(
serialized_input, self.deserialize_type)
self.assertEqual(self.model.metadata, {})

View File

@ -18,8 +18,10 @@ import unittest
from mock import MagicMock, Mock
from requests import Response
from cloudcafe.blockstorage.volumes_api.common.behaviors import \
VolumesAPIBehaviorException
from cloudcafe.blockstorage.volumes_api.v2.behaviors import \
VolumesAPI_Behaviors, VolumesAPIBehaviorException
VolumesAPI_Behaviors
from cloudcafe.blockstorage.volumes_api.v2.models.responses import\
VolumeResponse, VolumeSnapshotResponse
from cloudcafe.blockstorage.volumes_api.v2.client import VolumesClient
@ -144,6 +146,14 @@ class wait_for_volume_status(unittest.TestCase):
return (client, config, volume_model, response)
def test_get_volume_status(self):
client, config, volume_model, response = self.get_mocks()
behavior = VolumesAPI_Behaviors(client, config)
status = behavior.get_volume_status(self.defaults.volume_id)
self.assertEqual(status, self.defaults.expected_status)
def test_good_response_code(self):
client, config, volume_model, response = self.get_mocks()
@ -229,23 +239,31 @@ class create_available_volume(unittest.TestCase):
def get_mocks(self):
client = Mock(spec=VolumesClient)
config = Mock(spec=VolumesAPIConfig)
volume_model = Mock(spec=VolumeResponse)
volume_create_response = Mock(spec=Response)
config.volume_create_timeout = 5
volume_model.id_ = "mock"
volume_create_response.entity = volume_model
volume_create_response.ok = True
client.create_volume = MagicMock(return_value=volume_create_response)
config = Mock(spec=VolumesAPIConfig)
config.serialize_format = "json"
config.deserialize_format = "json"
config.max_volume_size = 1024
config.min_volume_size = 1
config.volume_status_poll_frequency = 5
config.volume_create_min_timeout = 1
config.volume_create_max_timeout = 10
config.volume_create_wait_per_gigabyte = 1
config.volume_create_base_timeout = 0
return (client, config, volume_model, volume_create_response)
def test_happy_path(self):
client, config, volume_model, volume_create_response = self.get_mocks()
behavior = VolumesAPI_Behaviors(client, config)
behavior.wait_for_volume_status = MagicMock(return_value=None)
behavior.get_volume_status = MagicMock(return_value='available')
volume_entity = behavior.create_available_volume(
self.defaults.display_name, self.defaults.size,
@ -253,39 +271,6 @@ class create_available_volume(unittest.TestCase):
self.assertIsInstance(volume_entity, VolumeResponse)
def test_failure_response_no_model(self):
client, config, volume_model, volume_create_response = self.get_mocks()
volume_create_response.entity = None
volume_create_response.ok = False
volume_create_response.status_code = 500
client.create_volume = MagicMock(return_value=volume_create_response)
behavior = VolumesAPI_Behaviors(client, config)
behavior.wait_for_volume_status = MagicMock(return_value=None)
with self.assertRaises(VolumesAPIBehaviorException):
behavior.create_available_volume(
self.defaults.display_name, self.defaults.size,
self.defaults.volume_type)
def test_failure_response_with_model(self):
client, config, volume_model, volume_create_response = self.get_mocks()
volume_create_response.entity = None
volume_create_response.status_code = 200
client.create_volume = MagicMock(return_value=volume_create_response)
behavior = VolumesAPI_Behaviors(client, config)
behavior.wait_for_volume_status = MagicMock(return_value=None)
with self.assertRaises(VolumesAPIBehaviorException):
behavior.create_available_volume(
self.defaults.display_name, self.defaults.size,
self.defaults.volume_type)
def test_timeout_failure(self):
client, config, volume_model, volume_create_response = self.get_mocks()

View File

@ -162,6 +162,8 @@ class VolumeSnapshotResponseModelBaseTest(BaseTest):
size = 1
id_ = "2305iu32f9j3298f4jh32498fj"
name = "FakeSnapshotName"
os_extended_snapshot_attributes_project_id = '1111111'
os_extended_snapshot_attributes_progress = '100%'
def test_id(self):
self.assertEquals(self.model.id_, self.defaults.id_)
@ -195,6 +197,16 @@ class VolumeSnapshotResponseModelBaseTest(BaseTest):
self.model.metadata,
{self.defaults.metadata_key: self.defaults.metadata_value})
def test_os_extended_snapshot_attributes_project_id(self):
self.assertEquals(
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.assertEquals(
self.model.os_extended_snapshot_attributes_progress,
self.defaults.os_extended_snapshot_attributes_progress)
class VolumeSnapshotResponseModelTests_JSON(
VolumeSnapshotResponseModelBaseTest, unittest.TestCase):
@ -210,7 +222,11 @@ class VolumeSnapshotResponseModelTests_JSON(
"volume_id": defaults.volume_id,
"size": defaults.size,
"id": defaults.id_,
"name": defaults.name}}
"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)
@ -222,6 +238,9 @@ class VolumeSnapshotResponseModelTests_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}"
@ -234,6 +253,8 @@ class VolumeSnapshotResponseModelTests_XML(
</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,
@ -271,6 +292,8 @@ class VolumeResponseModelBaseTests(BaseTest):
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.assertEquals(self.model.id_, self.defaults.id_)
@ -368,6 +391,16 @@ class VolumeResponseModelBaseTests(BaseTest):
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.assertEquals(
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.assertEquals(
self.model.os_vol_mig_status_attr_name_id,
self.defaults.os_vol_mig_status_attr_name_id)
class VolumeResponseModelTests_JSON(
VolumeResponseModelBaseTests, unittest.TestCase):
@ -398,6 +431,10 @@ class VolumeResponseModelTests_JSON(
"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)
@ -438,6 +475,7 @@ class VolumeDetailResponseModelTests_XML(
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}"
@ -452,6 +490,8 @@ class VolumeDetailResponseModelTests_XML(
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}"
@ -480,6 +520,8 @@ class VolumeDetailResponseModelTests_XML(
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,