From e0c800f6555b56d72662b21b3fe473dfa80aabcc Mon Sep 17 00:00:00 2001 From: Helena McGough Date: Sat, 20 Apr 2019 17:59:48 +0000 Subject: [PATCH] Update unit tests - Updated existing unit tests - Add additional unit tests Change-Id: I7a109ee890988eeb706559b4c7740d66444d3d96 Signed-off-by: Helena McGough --- .../tests/virt/rsd/test_driver.py | 196 ++++++++++++++++++ .../tests/virt/rsd/test_flavor_management.py | 19 +- 2 files changed, 212 insertions(+), 3 deletions(-) diff --git a/rsd_virt_for_nova/tests/virt/rsd/test_driver.py b/rsd_virt_for_nova/tests/virt/rsd/test_driver.py index 9ec561f..d82193d 100644 --- a/rsd_virt_for_nova/tests/virt/rsd/test_driver.py +++ b/rsd_virt_for_nova/tests/virt/rsd/test_driver.py @@ -17,6 +17,8 @@ import json import mock +import requests + from nova import context from nova import exception @@ -33,6 +35,7 @@ from nova.virt import hardware from rsd_virt_for_nova.virt import rsd from rsd_virt_for_nova.virt.rsd import driver +from rsd_virt_for_nova.virt.rsd import flavor_management from oslo_utils import versionutils @@ -50,6 +53,19 @@ from rsd_lib.resources.v2_3 import node as v2_3_node from sushy import connector +class FakeResponse(object): + """A class to fake out the response from a request.""" + + def __init__(self, text, status_code): + """Initialize the variables for the fake response.""" + self.text = text + self.status_code = status_code + + def __getitem__(self, key): + """Method to retrieve fake instance variables.""" + return getattr(self, key) + + class FakeInstance(object): """A class to fake out nova instances.""" @@ -756,3 +772,183 @@ class TestRSDDriver(base.BaseTestCase): '/redfish/v1/Systems/System2', '/redfish/v1/Systems/System3', '/redfish/v1/Systems/System4']) + + @mock.patch.object(flavor_management.FlavorManager, '_create_request_url') + @mock.patch.object(driver, 'requests') + @mock.patch.object(fields.ResourceClass, 'normalize_name') + @mock.patch.object(driver.RSDDriver, 'check_chassis_systems') + def test_create_flavors(self, check_chas, norm_name, reqs, create_url): + """Test successfully creating a new flavor.""" + sys_col = self.RSD.driver.PODM.get_system_collection.return_value + sys_col.get_member.return_value = self.system_inst + chas_col = self.RSD.driver.PODM.get_chassis_collection.return_value + chas_col.members_identities = ['/redfish/v1/Chassis/Chassis1'] + chas_col.get_member.return_value = self.chassis_inst + check_chas.return_value = ['/redfish/v1/Systems/System1'] + self.RSD._url_base = "mock_url_base" + self.RSD.headers = "headers" + + mem = self.RSD.conv_GiB_to_MiB( + self.system_inst.memory_summary.total_system_memory_gib) - 512 + proc = self.system_inst.json['ProcessorSummary']['Count'] + flav_id = str(mem) + 'MB-' + str(proc) + 'vcpus' + spec = str('resources:' + norm_name.return_value) + mock_specs = { + 'extra_specs': { + spec: '1'}} + + # Run Test + self.RSD._create_flavors() + + self.RSD.driver.PODM.get_system_collection.assert_called_once() + self.RSD.driver.PODM.get_chassis_collection.assert_called_once() + chas_col.get_member.assert_called_with(self.chassis_inst.path) + check_chas.assert_called_with(self.chassis_inst) + sys_col.get_member.assert_called_with(self.system_inst.path) + norm_name.assert_called_once_with(flav_id) + create_url.assert_called_once_with(flav_id, 'update') + reqs.post.assert_called_with(create_url.return_value, + data=json.dumps(mock_specs), headers="headers") + self.assertEquals(self.RSD.chas_systems, + {str(self.chassis_inst.path): + [str(self.system_inst.path)]}) + self.assertEquals(self.RSD.rsd_flavors, + {flav_id: { + 'rsd_systems': self.RSD.chas_systems}}) + + @mock.patch.object(requests, 'post') + @mock.patch.object(fields.ResourceClass, 'normalize_name') + @mock.patch.object(driver.RSDDriver, 'check_chassis_systems') + def test_create_flavors_exists(self, check_chas, norm_name, post_req): + """Test existing failure to create a new flavor.""" + sys_col = self.RSD.driver.PODM.get_system_collection.return_value + sys_col.get_member.return_value = self.system_inst + chas_col = self.RSD.driver.PODM.get_chassis_collection.return_value + chas_col.members_identities = ['/redfish/v1/Chassis/Chassis1'] + chas_col.get_member.return_value = self.chassis_inst + check_chas.return_value = ['/redfish/v1/Systems/System1'] + + # Run Test + self.RSD._create_flavors() + + self.RSD.driver.PODM.get_system_collection.assert_called_once() + self.RSD.driver.PODM.get_chassis_collection.assert_called_once() + chas_col.get_member.assert_called_with(self.chassis_inst.path) + check_chas.assert_called_with(self.chassis_inst) + sys_col.get_member.assert_called_with(self.system_inst.path) + post_req.assert_not_called() + + @mock.patch.object(flavor_management.FlavorManager, '_create_request_url') + @mock.patch.object(driver.requests, 'get') + @mock.patch.object(flavor_management.FlavorManager, 'get_headers') + @mock.patch.object(flavor_management.FlavorManager, '_get_base_url') + @mock.patch.object(flavor_management.FlavorManager, 'keystone_req') + @mock.patch.object(driver.RSDDriver, 'conv_GiB_to_MiB') + def test_check_flavors_success_exists(self, conv_mem, key_req, get_url, + get_head, get_req, create_url): + """Test successfully checking all valid flavors.""" + response = {"flavors": [ + {"id": "1", + "links": [ + {"href": "http://openstack.example.com/v2/6f70656e/flavors/1", + "rel": "self" + }, + {"href": "http://openstack.example.com/6f70656e/flavors/1", + "rel": "bookmark" + }], + "name": "m1.tiny" + }, + {"id": "2", + "links": [ + {"href": "http://openstack.example.com/v2/6f70656e/flavors/2", + "rel": "self" + }, + {"href": "http://openstack.example.com/6f70656e/flavors/2", + "rel": "bookmark" + }], + "name": "m1.small" + }] + } + resp = FakeResponse(response, 201) + get_req.return_value.text = json.dumps(resp.text) + + # Run test + self.RSD.check_flavors( + self.system_col, self.system_col.members_identities) + + conv_mem.assert_called_with( + self.system_inst.memory_summary.total_system_memory_gib) + key_req.assert_called_once() + self.assertEqual(self.RSD._auth_token, key_req.return_value.auth_token) + get_url.assert_called_once() + get_head.assert_called_with(self.RSD._auth_token) + get_req.assert_called_with( + get_url.return_value, headers=self.RSD.headers) + create_url.assert_not_called() + + @mock.patch.object(driver.requests, 'delete') + @mock.patch.object(flavor_management.FlavorManager, '_create_request_url') + @mock.patch.object(driver.requests, 'get') + @mock.patch.object(flavor_management.FlavorManager, 'get_headers') + @mock.patch.object(flavor_management.FlavorManager, '_get_base_url') + @mock.patch.object(flavor_management.FlavorManager, 'keystone_req') + @mock.patch.object(driver.RSDDriver, 'conv_GiB_to_MiB') + def test_check_flavors_success_update(self, conv_mem, key_req, get_url, + get_head, get_req, create_url, del_req): + """Test successfully checking all valid flavors, delete flavor.""" + gb = self.system_inst.memory_summary.total_system_memory_gib + mem = self.RSD.conv_GiB_to_MiB(gb) + proc = self.system_inst.json['ProcessorSummary']['Count'] + flavID = str(mem) + 'MB-' + str(proc) + 'vcpus' + response = {"flavors": [ + {"id": "1", + "links": [ + {"href": "http://openstack.example.com/v2/6e/flavors/1", + "rel": "self" + }, + {"href": "http://openstack.example.com/6e/flavors/1", + "rel": "bookmark" + }], + "name": "m1.tiny" + }, + {"id": "2", + "links": [ + {"href": "http://openstack.example.com/v2/6e/flavors/2", + "rel": "self" + }, + {"href": "http://openstack.example.com/6e/flavors/2", + "rel": "bookmark" + }], + "name": "m1.small" + }, + {"id": flavID, + "links": [ + {"href": "http://openstack.example.com/v2/6e/flavors/%s" + flavID, + "rel": "self" + }, + {"href": "http://openstack.example.com/6e/flavors/%s" + flavID, + "rel": "bookmark" + } + ], + "name": str('RSD.' + flavID) + } + ] + } + resp = FakeResponse(response, 201) + get_req.return_value.text = json.dumps(resp.text) + + # Run test + self.RSD.check_flavors( + self.system_col, self.system_col.members_identities) + + conv_mem.assert_called_with( + self.system_inst.memory_summary.total_system_memory_gib) + key_req.assert_called_once() + self.assertEqual(self.RSD._auth_token, key_req.return_value.auth_token) + get_url.assert_called_once() + get_head.assert_called_with(self.RSD._auth_token) + get_req.assert_called_with( + get_url.return_value, headers=self.RSD.headers) + create_url.assert_called_with(flavID, 'delete') + del_req.assert_called_once_with( + create_url.return_value, headers=self.RSD.headers) diff --git a/rsd_virt_for_nova/tests/virt/rsd/test_flavor_management.py b/rsd_virt_for_nova/tests/virt/rsd/test_flavor_management.py index fcef519..f69cdb1 100644 --- a/rsd_virt_for_nova/tests/virt/rsd/test_flavor_management.py +++ b/rsd_virt_for_nova/tests/virt/rsd/test_flavor_management.py @@ -41,9 +41,22 @@ class TestFlavorManager(base.BaseTestCase): self.assertEqual(self.flav_man._auth_token, None) self.assertEqual(self.flav_man.headers, None) - def test_keystone_req(self): - """Test a successful keystone request.""" - # TODO(helenam100): write successful and failed versions of test + @mock.patch.object(flavor_management, 'ClientV3') + def test_keystone_req(self, cV3): + """Test a keystone request.""" + keystoneREQ = self.flav_man.keystone_req() + + keystone_url = CONF.rsd.auth_url + '/v' + str( + CONF.rsd.identity_version) + cV3.assert_called_once_with( + auth_url=str(keystone_url), + username=CONF.rsd.username, + password=CONF.rsd.auth_password, + tenant_name=CONF.rsd.tenant_name) + + self.assertEqual( + self.flav_man._auth_token, cV3.return_value.auth_token) + self.assertEqual(keystoneREQ, cV3.return_value) @mock.patch.object(flavor_management.FlavorManager, "_get_endpoint") def test_get_base_url(self, get_endpoint):