Rearrange emulator unit tests

Refactored Redfish emulator unit tests along the following lines:

* test_main.py tests just REST API, mocks virtualization driver
* test_nova.py tests just the driver, mocks openstacksdk
* test_libvirt.py tests just the driver, mocks libvirt

This is a follow-up of change ID:

     If8a479ae793c1616ef8b30e76bd8cdfdfc08dbe0

Story: 1751134
Task: 12046
Change-Id: Ieb010ef298aa8b7f1b6c18ada8e3cf33035019fa
This commit is contained in:
Ilya Etingof 2018-07-30 14:07:50 +02:00
parent 4f0cc187ee
commit 50d3c1dd17
3 changed files with 426 additions and 298 deletions

View File

@ -15,179 +15,194 @@ from oslotest import base
from six.moves import mock
from sushy_tools.emulator.drivers.libvirtdriver import LibvirtDriver
from sushy_tools.emulator import main
from sushy_tools.error import FishyError
@mock.patch.object(main, 'driver', None) # This enables libvirt driver
class EmulatorTestCase(base.BaseTestCase):
class LibvirtDriverTestCase(base.BaseTestCase):
def setUp(self):
self.app = main.app.test_client()
self.test_driver = LibvirtDriver()
super(EmulatorTestCase, self).setUp()
def test_root_resource(self):
response = self.app.get('/redfish/v1/')
self.assertEqual(200, response.status_code)
self.assertTrue(response.json)
super(LibvirtDriverTestCase, self).setUp()
@mock.patch('libvirt.openReadOnly', autospec=True)
def test_collection_resource(self, libvirt_mock):
def test_uuid(self, libvirt_mock):
conn_mock = libvirt_mock.return_value
domain_mock = conn_mock.lookupByName.return_value
domain_mock.UUIDString.return_value = 'zzzz-yyyy-xxxx'
uuid = self.test_driver.uuid('name')
self.assertEqual('zzzz-yyyy-xxxx', uuid)
@mock.patch('libvirt.openReadOnly', autospec=True)
def test_systems(self, libvirt_mock):
conn_mock = libvirt_mock.return_value
conn_mock.listDefinedDomains.return_value = ['host0', 'host1']
response = self.app.get('/redfish/v1/Systems')
self.assertEqual(200, response.status_code)
self.assertEqual({'@odata.id': '/redfish/v1/Systems/host0'},
response.json['Members'][0])
self.assertEqual({'@odata.id': '/redfish/v1/Systems/host1'},
response.json['Members'][1])
systems = self.test_driver.systems
self.assertEqual(['host0', 'host1'], systems)
@mock.patch('libvirt.openReadOnly', autospec=True)
def test_system_resource_get(self, libvirt_mock):
with open('sushy_tools/tests/unit/emulator/domain.xml', 'r') as f:
data = f.read()
domain_mock = mock.Mock()
domain_mock.XMLDesc.return_value = data
domain_mock.isActive.return_value = True
domain_mock.maxMemory.return_value = 1024 * 1024
domain_mock.UUIDString.return_value = 'zzzz-yyyy-xxxx'
domain_mock.maxVcpus.return_value = 2
def test_get_power_state_on(self, libvirt_mock):
conn_mock = libvirt_mock.return_value
conn_mock.lookupByName.return_value = domain_mock
response = self.app.get('/redfish/v1/Systems/xxxx-yyyy-zzzz')
self.assertEqual(200, response.status_code)
self.assertEqual('xxxx-yyyy-zzzz', response.json['Id'])
self.assertEqual('zzzz-yyyy-xxxx', response.json['UUID'])
self.assertEqual('On', response.json['PowerState'])
self.assertEqual(
1, response.json['MemorySummary']['TotalSystemMemoryGiB'])
self.assertEqual(2, response.json['ProcessorSummary']['Count'])
self.assertEqual(
'Cd', response.json['Boot']['BootSourceOverrideTarget'])
self.assertEqual(
'Legacy', response.json['Boot']['BootSourceOverrideMode'])
@mock.patch('libvirt.open', autospec=True)
def test_system_resource_patch(self, libvirt_mock):
with open('sushy_tools/tests/unit/emulator/domain.xml', 'r') as f:
data = f.read()
domain_mock = mock.Mock()
domain_mock.XMLDesc.return_value = data
conn_mock = libvirt_mock.return_value
conn_mock.lookupByName.return_value = domain_mock
conn_mock.defineXML = mock.Mock()
data = {'Boot': {'BootSourceOverrideTarget': 'Cd'}}
response = self.app.patch('/redfish/v1/Systems/xxxx-yyyy-zzzz',
json=data)
self.assertEqual(204, response.status_code)
@mock.patch('libvirt.open', autospec=True)
def test_system_reset_action_on(self, libvirt_mock):
domain_mock = mock.Mock()
domain_mock = conn_mock.lookupByName.return_value
domain_mock.isActive.return_value = True
conn_mock = libvirt_mock.return_value
conn_mock.lookupByName.return_value = domain_mock
power_state = self.test_driver.get_power_state('zzzz-yyyy-xxxx')
data = {'ResetType': 'On'}
response = self.app.post(
'/redfish/v1/Systems/xxxx-yyyy-zzzz/Actions/ComputerSystem.Reset',
json=data)
self.assertEqual(204, response.status_code)
domain_mock.create.assert_not_called()
self.assertEqual('On', power_state)
@mock.patch('libvirt.openReadOnly', autospec=True)
def test_get_power_state_off(self, libvirt_mock):
conn_mock = libvirt_mock.return_value
domain_mock = conn_mock.lookupByName.return_value
domain_mock.isActive.return_value = False
power_state = self.test_driver.get_power_state('zzzz-yyyy-xxxx')
self.assertEqual('Off', power_state)
@mock.patch('libvirt.open', autospec=True)
def test_system_reset_action_forceon(self, libvirt_mock):
domain_mock = mock.Mock()
domain_mock.isActive.return_value = True
def test_set_power_state_on(self, libvirt_mock):
conn_mock = libvirt_mock.return_value
conn_mock.lookupByName.return_value = domain_mock
data = {'ResetType': 'ForceOn'}
response = self.app.post(
'/redfish/v1/Systems/xxxx-yyyy-zzzz/Actions/ComputerSystem.Reset',
json=data)
self.assertEqual(204, response.status_code)
domain_mock.create.assert_not_called()
domain_mock = conn_mock.lookupByName.return_value
domain_mock.isActive.return_value = False
self.test_driver.set_power_state('zzzz-yyyy-xxxx', 'On')
domain_mock.create.assert_called_once_with()
@mock.patch('libvirt.open', autospec=True)
def test_system_reset_action_forceoff(self, libvirt_mock):
domain_mock = mock.Mock()
def test_set_power_state_forceon(self, libvirt_mock):
conn_mock = libvirt_mock.return_value
domain_mock = conn_mock.lookupByName.return_value
domain_mock.isActive.return_value = False
self.test_driver.set_power_state('zzzz-yyyy-xxxx', 'ForceOn')
domain_mock.create.assert_called_once_with()
@mock.patch('libvirt.open', autospec=True)
def test_set_power_state_forceoff(self, libvirt_mock):
conn_mock = libvirt_mock.return_value
domain_mock = conn_mock.lookupByName.return_value
domain_mock.isActive.return_value = True
conn_mock = libvirt_mock.return_value
conn_mock.lookupByName.return_value = domain_mock
data = {'ResetType': 'ForceOff'}
response = self.app.post(
'/redfish/v1/Systems/xxxx-yyyy-zzzz/Actions/ComputerSystem.Reset',
json=data)
self.assertEqual(204, response.status_code)
self.test_driver.set_power_state('zzzz-yyyy-xxxx', 'ForceOff')
domain_mock.destroy.assert_called_once_with()
@mock.patch('libvirt.open', autospec=True)
def test_system_reset_action_shutdown(self, libvirt_mock):
domain_mock = mock.Mock()
def test_set_power_state_gracefulshutdown(self, libvirt_mock):
conn_mock = libvirt_mock.return_value
domain_mock = conn_mock.lookupByName.return_value
domain_mock.isActive.return_value = True
conn_mock = libvirt_mock.return_value
conn_mock.lookupByName.return_value = domain_mock
data = {'ResetType': 'GracefulShutdown'}
response = self.app.post(
'/redfish/v1/Systems/xxxx-yyyy-zzzz/Actions/ComputerSystem.Reset',
json=data)
self.assertEqual(204, response.status_code)
self.test_driver.set_power_state('zzzz-yyyy-xxxx', 'GracefulShutdown')
domain_mock.shutdown.assert_called_once_with()
@mock.patch('libvirt.open', autospec=True)
def test_system_reset_action_restart(self, libvirt_mock):
domain_mock = mock.Mock()
def test_set_power_state_gracefulrestart(self, libvirt_mock):
conn_mock = libvirt_mock.return_value
domain_mock = conn_mock.lookupByName.return_value
domain_mock.isActive.return_value = True
conn_mock = libvirt_mock.return_value
conn_mock.lookupByName.return_value = domain_mock
data = {'ResetType': 'GracefulRestart'}
response = self.app.post(
'/redfish/v1/Systems/xxxx-yyyy-zzzz/Actions/ComputerSystem.Reset',
json=data)
self.assertEqual(204, response.status_code)
self.test_driver.set_power_state('zzzz-yyyy-xxxx', 'GracefulRestart')
domain_mock.reboot.assert_called_once_with()
@mock.patch('libvirt.open', autospec=True)
def test_system_reset_action_forcerestart(self, libvirt_mock):
domain_mock = mock.Mock()
def test_set_power_state_forcerestart(self, libvirt_mock):
conn_mock = libvirt_mock.return_value
domain_mock = conn_mock.lookupByName.return_value
domain_mock.isActive.return_value = True
conn_mock = libvirt_mock.return_value
conn_mock.lookupByName.return_value = domain_mock
data = {'ResetType': 'ForceRestart'}
response = self.app.post(
'/redfish/v1/Systems/xxxx-yyyy-zzzz/Actions/ComputerSystem.Reset',
json=data)
self.assertEqual(204, response.status_code)
self.test_driver.set_power_state('zzzz-yyyy-xxxx', 'ForceRestart')
domain_mock.reset.assert_called_once_with()
@mock.patch('libvirt.open', autospec=True)
def test_system_reset_action_nmi(self, libvirt_mock):
domain_mock = mock.Mock()
def test_set_power_state_nmi(self, libvirt_mock):
conn_mock = libvirt_mock.return_value
domain_mock = conn_mock.lookupByName.return_value
domain_mock.isActive.return_value = True
conn_mock = libvirt_mock.return_value
conn_mock.lookupByName.return_value = domain_mock
data = {'ResetType': 'Nmi'}
response = self.app.post(
'/redfish/v1/Systems/xxxx-yyyy-zzzz/Actions/ComputerSystem.Reset',
json=data)
self.assertEqual(204, response.status_code)
self.test_driver.set_power_state('zzzz-yyyy-xxxx', 'Nmi')
domain_mock.injectNMI.assert_called_once_with()
@mock.patch('libvirt.openReadOnly', autospec=True)
def test_get_boot_device(self, libvirt_mock):
with open('sushy_tools/tests/unit/emulator/domain.xml', 'r') as f:
data = f.read()
conn_mock = libvirt_mock.return_value
domain_mock = conn_mock.lookupByName.return_value
domain_mock.XMLDesc.return_value = data
boot_device = self.test_driver.get_boot_device('zzzz-yyyy-xxxx')
self.assertEqual('Cd', boot_device)
@mock.patch('libvirt.open', autospec=True)
def test_set_boot_device(self, libvirt_mock):
with open('sushy_tools/tests/unit/emulator/domain.xml', 'r') as f:
data = f.read()
conn_mock = libvirt_mock.return_value
domain_mock = conn_mock.lookupByName.return_value
domain_mock.XMLDesc.return_value = data
self.test_driver.set_boot_device('zzzz-yyyy-xxxx', 'Hdd')
conn_mock.defineXML.assert_called_once_with(mock.ANY)
@mock.patch('libvirt.openReadOnly', autospec=True)
def test_get_boot_mode(self, libvirt_mock):
with open('sushy_tools/tests/unit/emulator/domain.xml', 'r') as f:
data = f.read()
conn_mock = libvirt_mock.return_value
domain_mock = conn_mock.lookupByName.return_value
domain_mock.XMLDesc.return_value = data
boot_mode = self.test_driver.get_boot_mode('zzzz-yyyy-xxxx')
self.assertEqual('Legacy', boot_mode)
@mock.patch('libvirt.open', autospec=True)
def test_set_boot_mode(self, libvirt_mock):
with open('sushy_tools/tests/unit/emulator/domain.xml', 'r') as f:
data = f.read()
conn_mock = libvirt_mock.return_value
domain_mock = conn_mock.lookupByName.return_value
domain_mock.XMLDesc.return_value = data
self.test_driver.set_boot_mode('zzzz-yyyy-xxxx', 'Uefi')
conn_mock.defineXML.assert_called_once_with(mock.ANY)
@mock.patch('libvirt.openReadOnly', autospec=True)
def test_get_total_memory(self, libvirt_mock):
conn_mock = libvirt_mock.return_value
domain_mock = conn_mock.lookupByName.return_value
domain_mock.maxMemory.return_value = 1024 * 1024
memory = self.test_driver.get_total_memory('zzzz-yyyy-xxxx')
self.assertEqual(1, memory)
@mock.patch('libvirt.openReadOnly', autospec=True)
def test_get_total_cpus(self, libvirt_mock):
conn_mock = libvirt_mock.return_value
domain_mock = conn_mock.lookupByName.return_value
domain_mock.isActive.return_value = True
domain_mock.XMLDesc.return_value = b'<empty/>'
domain_mock.maxVcpus.return_value = 2
cpus = self.test_driver.get_total_cpus('zzzz-yyyy-xxxx')
self.assertEqual(2, cpus)
@mock.patch('libvirt.open', autospec=True)
def test_get_bios(self, libvirt_mock):
with open('sushy_tools/tests/unit/emulator/domain.xml') as f:
@ -200,7 +215,7 @@ class EmulatorTestCase(base.BaseTestCase):
bios_attributes = self.test_driver.get_bios('xxx-yyy-zzz')
self.assertEqual(LibvirtDriver.DEFAULT_BIOS_ATTRIBUTES,
bios_attributes)
self.assertEqual(1, conn_mock.defineXML.call_count)
conn_mock.defineXML.assert_called_once_with(mock.ANY)
@mock.patch('libvirt.open', autospec=True)
def test_get_bios_existing(self, libvirt_mock):
@ -231,7 +246,7 @@ class EmulatorTestCase(base.BaseTestCase):
self.test_driver.set_bios('xxx-yyy-zzz',
{"BootMode": "Uefi",
"ProcTurboMode": "Enabled"})
self.assertEqual(1, conn_mock.defineXML.call_count)
conn_mock.defineXML.assert_called_once_with(mock.ANY)
@mock.patch('libvirt.open', autospec=True)
def test_reset_bios(self, libvirt_mock):
@ -243,7 +258,7 @@ class EmulatorTestCase(base.BaseTestCase):
domain_mock.XMLDesc.return_value = domain_xml
self.test_driver.reset_bios('xxx-yyy-zzz')
self.assertEqual(1, conn_mock.defineXML.call_count)
conn_mock.defineXML.assert_called_once_with(mock.ANY)
def test__process_bios_attributes_get_default(self):
with open('sushy_tools/tests/unit/emulator/domain.xml') as f:

View File

@ -10,8 +10,6 @@
# License for the specific language governing permissions and limitations
# under the License.
import json
from oslotest import base
from six.moves import mock
@ -33,7 +31,118 @@ class EmulatorTestCase(base.BaseTestCase):
self.assertEqual('500 INTERNAL SERVER ERROR', response.status)
def test_bios(self, driver_mock):
def test_root_resource(self, driver_mock):
response = self.app.get('/redfish/v1/')
self.assertEqual(200, response.status_code)
self.assertEqual('RedvirtService', response.json['Id'])
def test_collection_resource(self, driver_mock):
type(driver_mock).systems = mock.PropertyMock(
return_value=['host0', 'host1'])
response = self.app.get('/redfish/v1/Systems')
self.assertEqual(200, response.status_code)
self.assertEqual({'@odata.id': '/redfish/v1/Systems/host0'},
response.json['Members'][0])
self.assertEqual({'@odata.id': '/redfish/v1/Systems/host1'},
response.json['Members'][1])
def test_system_resource_get(self, driver_mock):
driver_mock.uuid.return_value = 'zzzz-yyyy-xxxx'
driver_mock.get_power_state.return_value = 'On'
driver_mock.get_total_memory.return_value = 1
driver_mock.get_total_cpus.return_value = 2
driver_mock.get_boot_device.return_value = 'Cd'
driver_mock.get_boot_mode.return_value = 'Legacy'
response = self.app.get('/redfish/v1/Systems/xxxx-yyyy-zzzz')
self.assertEqual(200, response.status_code)
self.assertEqual('xxxx-yyyy-zzzz', response.json['Id'])
self.assertEqual('zzzz-yyyy-xxxx', response.json['UUID'])
self.assertEqual('On', response.json['PowerState'])
self.assertEqual(
1, response.json['MemorySummary']['TotalSystemMemoryGiB'])
self.assertEqual(2, response.json['ProcessorSummary']['Count'])
self.assertEqual(
'Cd', response.json['Boot']['BootSourceOverrideTarget'])
self.assertEqual(
'Legacy', response.json['Boot']['BootSourceOverrideMode'])
def test_system_resource_patch(self, driver_mock):
data = {'Boot': {'BootSourceOverrideTarget': 'Cd'}}
response = self.app.patch('/redfish/v1/Systems/xxxx-yyyy-zzzz',
json=data)
self.assertEqual(204, response.status_code)
set_boot_device = driver_mock.set_boot_device
set_boot_device.assert_called_once_with('xxxx-yyyy-zzzz', 'Cd')
def test_system_reset_action_on(self, driver_mock):
data = {'ResetType': 'On'}
response = self.app.post(
'/redfish/v1/Systems/xxxx-yyyy-zzzz/Actions/ComputerSystem.Reset',
json=data)
self.assertEqual(204, response.status_code)
set_power_state = driver_mock.set_power_state
set_power_state.assert_called_once_with('xxxx-yyyy-zzzz', 'On')
def test_system_reset_action_forceon(self, driver_mock):
data = {'ResetType': 'ForceOn'}
response = self.app.post(
'/redfish/v1/Systems/xxxx-yyyy-zzzz/Actions/ComputerSystem.Reset',
json=data)
self.assertEqual(204, response.status_code)
set_power_state = driver_mock.set_power_state
set_power_state.assert_called_once_with('xxxx-yyyy-zzzz', 'ForceOn')
def test_system_reset_action_forceoff(self, driver_mock):
data = {'ResetType': 'ForceOff'}
response = self.app.post(
'/redfish/v1/Systems/xxxx-yyyy-zzzz/Actions/ComputerSystem.Reset',
json=data)
self.assertEqual(204, response.status_code)
set_power_state = driver_mock.set_power_state
set_power_state.assert_called_once_with('xxxx-yyyy-zzzz', 'ForceOff')
def test_system_reset_action_shutdown(self, driver_mock):
data = {'ResetType': 'GracefulShutdown'}
response = self.app.post(
'/redfish/v1/Systems/xxxx-yyyy-zzzz/Actions/ComputerSystem.Reset',
json=data)
self.assertEqual(204, response.status_code)
set_power_state = driver_mock.set_power_state
set_power_state.assert_called_once_with(
'xxxx-yyyy-zzzz', 'GracefulShutdown')
def test_system_reset_action_restart(self, driver_mock):
data = {'ResetType': 'GracefulRestart'}
response = self.app.post(
'/redfish/v1/Systems/xxxx-yyyy-zzzz/Actions/ComputerSystem.Reset',
json=data)
self.assertEqual(204, response.status_code)
set_power_state = driver_mock.set_power_state
set_power_state.assert_called_once_with(
'xxxx-yyyy-zzzz', 'GracefulRestart')
def test_system_reset_action_forcerestart(self, driver_mock):
data = {'ResetType': 'ForceRestart'}
response = self.app.post(
'/redfish/v1/Systems/xxxx-yyyy-zzzz/Actions/ComputerSystem.Reset',
json=data)
self.assertEqual(204, response.status_code)
set_power_state = driver_mock.set_power_state
set_power_state.assert_called_once_with(
'xxxx-yyyy-zzzz', 'ForceRestart')
def test_system_reset_action_nmi(self, driver_mock):
data = {'ResetType': 'Nmi'}
response = self.app.post(
'/redfish/v1/Systems/xxxx-yyyy-zzzz/Actions/ComputerSystem.Reset',
json=data)
self.assertEqual(204, response.status_code)
set_power_state = driver_mock.set_power_state
set_power_state.assert_called_once_with('xxxx-yyyy-zzzz', 'Nmi')
def test_get_bios(self, driver_mock):
driver_mock.get_bios.return_value = {"attribute 1": "value 1",
"attribute 2": "value 2"}
response = self.app.get('/redfish/v1/Systems/xxxx-yyyy-zzzz/BIOS')
@ -44,35 +153,46 @@ class EmulatorTestCase(base.BaseTestCase):
"attribute 2": "value 2"},
response.json['Attributes'])
def test_bios_settings(self, driver_mock):
def test_get_bios_existing(self, driver_mock):
driver_mock.get_bios.return_value = {"attribute 1": "value 1",
"attribute 2": "value 2"}
response = self.app.get(
'/redfish/v1/Systems/xxxx-yyyy-zzzz/BIOS/Settings')
self.assertEqual('200 OK', response.status)
self.assertEqual(200, response.status_code)
self.assertEqual('Settings', response.json['Id'])
self.assertEqual({"attribute 1": "value 1",
"attribute 2": "value 2"},
response.json['Attributes'])
def test_bios_settings_patch(self, driver_mock):
data = {'Attributes': {'key': 'value'}}
self.app.driver = driver_mock
response = self.app.patch(
'/redfish/v1/Systems/xxxx-yyyy-zzzz/BIOS/Settings',
data=json.dumps({'Attributes': {'key': 'value'}}),
content_type='application/json')
json=data)
self.assertEqual('204 NO CONTENT', response.status)
self.assertEqual(204, response.status_code)
driver_mock.set_bios.assert_called_once_with('xxxx-yyyy-zzzz',
{'key': 'value'})
def test_set_bios(self, driver_mock):
data = {'Attributes': {'key': 'value'}}
self.app.driver = driver_mock
response = self.app.patch(
'/redfish/v1/Systems/xxxx-yyyy-zzzz/BIOS/Settings',
json=data)
self.assertEqual(204, response.status_code)
driver_mock.set_bios.assert_called_once_with(
'xxxx-yyyy-zzzz', data['Attributes'])
def test_reset_bios(self, driver_mock):
self.app.driver = driver_mock
response = self.app.post('/redfish/v1/Systems/xxxx-yyyy-zzzz/'
'BIOS/Actions/Bios.ResetBios')
self.assertEqual('204 NO CONTENT', response.status)
self.assertEqual(204, response.status_code)
driver_mock.reset_bios.assert_called_once_with('xxxx-yyyy-zzzz')
def test_ethernet_interfaces_collection(self, driver_mock):
@ -83,7 +203,7 @@ class EmulatorTestCase(base.BaseTestCase):
response = self.app.get('redfish/v1/Systems/xxx-yyy-zzz/'
'EthernetInterfaces')
self.assertEqual('200 OK', response.status)
self.assertEqual(200, response.status_code)
self.assertEqual('Ethernet Interface Collection',
response.json['Name'])
self.assertEqual(2, response.json['Members@odata.count'])
@ -98,7 +218,7 @@ class EmulatorTestCase(base.BaseTestCase):
response = self.app.get('redfish/v1/Systems/xxx-yyy-zzz/'
'EthernetInterfaces')
self.assertEqual('200 OK', response.status)
self.assertEqual(200, response.status_code)
self.assertEqual('Ethernet Interface Collection',
response.json['Name'])
self.assertEqual(0, response.json['Members@odata.count'])
@ -112,7 +232,7 @@ class EmulatorTestCase(base.BaseTestCase):
response = self.app.get('/redfish/v1/Systems/xxx-yyy-zzz/'
'EthernetInterfaces/nic2')
self.assertEqual('200 OK', response.status)
self.assertEqual(200, response.status_code)
self.assertEqual('nic2', response.json['Id'])
self.assertEqual('VNIC nic2', response.json['Name'])
self.assertEqual('00:11:22:33:44:55',
@ -131,4 +251,4 @@ class EmulatorTestCase(base.BaseTestCase):
response = self.app.get('/redfish/v1/Systems/xxx-yyy-zzz/'
'EthernetInterfaces/nic3')
self.assertEqual('404 NOT FOUND', response.status)
self.assertEqual(404, response.status_code)

View File

@ -13,178 +13,174 @@
# License for the specific language governing permissions and limitations
# under the License.
import os
from munch import Munch
from oslotest import base
from six.moves import mock
from sushy_tools.emulator.drivers.novadriver import OpenStackDriver
from sushy_tools.emulator import main
from sushy_tools.error import FishyError
@mock.patch.object(os, 'environ', dict(OS_CLOUD='fake-cloud', **os.environ))
@mock.patch.object(main, 'driver', None) # This enables Nova driver
@mock.patch('openstack.connect', autospec=True)
class EmulatorTestCase(base.BaseTestCase):
class NovaDriverTestCase(base.BaseTestCase):
def setUp(self):
self.app = main.app.test_client()
super(EmulatorTestCase, self).setUp()
self.nova_patcher = mock.patch('openstack.connect', autospec=True)
self.nova_mock = self.nova_patcher.start()
def test_root_resource(self, nova_mock):
response = self.app.get('/redfish/v1/')
self.assertEqual(200, response.status_code)
self.assertTrue(response.json)
self.test_driver = OpenStackDriver('fake-cloud')
def test_collection_resource(self, nova_mock):
super(NovaDriverTestCase, self).setUp()
def tearDown(self):
self.nova_patcher.stop()
super(NovaDriverTestCase, self).tearDown()
def test_uuid(self):
server = mock.Mock(id='zzzz-yyyy-xxxx')
self.nova_mock.return_value.get_server.return_value = server
uuid = self.test_driver.uuid('zzzz-yyyy-xxxx')
self.assertEqual('zzzz-yyyy-xxxx', uuid)
def test_systems(self):
server0 = mock.Mock(id='host0')
server1 = mock.Mock(id='host1')
nova_mock.return_value.list_servers.return_value = [server0, server1]
self.nova_mock.return_value.list_servers.return_value = [
server0, server1]
response = self.app.get('/redfish/v1/Systems')
systems = self.test_driver.systems
self.assertEqual(200, response.status_code)
self.assertEqual({'@odata.id': '/redfish/v1/Systems/host0'},
response.json['Members'][0])
self.assertEqual({'@odata.id': '/redfish/v1/Systems/host1'},
response.json['Members'][1])
self.assertEqual(['host0', 'host1'], systems)
def test_system_resource_get(self, nova_mock):
def test_get_power_state_on(self,):
server = mock.Mock(id='zzzz-yyyy-xxxx',
power_state=1,
image={'id': 'xxxx-zzzz-yyyy'})
nova_mock.return_value.get_server.return_value = server
power_state=1)
self.nova_mock.return_value.get_server.return_value = server
flavor = mock.Mock(ram=1024, vcpus=2)
nova_mock.return_value.get_flavor.return_value = flavor
power_state = self.test_driver.get_power_state('zzzz-yyyy-xxxx')
self.assertEqual('On', power_state)
def test_get_power_state_off(self):
server = mock.Mock(id='zzzz-yyyy-xxxx',
power_state=0)
self.nova_mock.return_value.get_server.return_value = server
power_state = self.test_driver.get_power_state('zzzz-yyyy-xxxx')
self.assertEqual('Off', power_state)
def test_set_power_state_on(self):
server = mock.Mock(id='zzzz-yyyy-xxxx', power_state=0)
self.nova_mock.return_value.get_server.return_value = server
self.test_driver.set_power_state('zzzz-yyyy-xxxx', 'On')
compute = self.nova_mock.return_value.compute
compute.start_server.assert_called_once_with('zzzz-yyyy-xxxx')
def test_set_power_state_forceon(self):
server = mock.Mock(id='zzzz-yyyy-xxxx', power_state=0)
self.nova_mock.return_value.get_server.return_value = server
self.test_driver.set_power_state('zzzz-yyyy-xxxx', 'ForceOn')
compute = self.nova_mock.return_value.compute
compute.start_server.assert_called_once_with('zzzz-yyyy-xxxx')
def test_set_power_state_forceoff(self):
server = mock.Mock(id='zzzz-yyyy-xxxx', power_state=1)
self.nova_mock.return_value.get_server.return_value = server
self.test_driver.set_power_state('zzzz-yyyy-xxxx', 'ForceOff')
compute = self.nova_mock.return_value.compute
compute.stop_server.assert_called_once_with('zzzz-yyyy-xxxx')
def test_set_power_state_gracefulshutdown(self):
server = mock.Mock(id='zzzz-yyyy-xxxx', power_state=1)
self.nova_mock.return_value.get_server.return_value = server
self.test_driver.set_power_state('zzzz-yyyy-xxxx', 'GracefulShutdown')
compute = self.nova_mock.return_value.compute
compute.stop_server.assert_called_once_with('zzzz-yyyy-xxxx')
def test_set_power_state_gracefulrestart(self):
server = mock.Mock(id='zzzz-yyyy-xxxx', power_state=1)
self.nova_mock.return_value.get_server.return_value = server
self.test_driver.set_power_state('zzzz-yyyy-xxxx', 'GracefulRestart')
compute = self.nova_mock.return_value.compute
compute.reboot_server.assert_called_once_with(
'zzzz-yyyy-xxxx', reboot_type='SOFT')
def test_set_power_state_forcerestart(self):
server = mock.Mock(id='zzzz-yyyy-xxxx', power_state=1)
self.nova_mock.return_value.get_server.return_value = server
self.test_driver.set_power_state(
'zzzz-yyyy-xxxx', 'ForceRestart')
compute = self.nova_mock.return_value.compute
compute.reboot_server.assert_called_once_with(
'zzzz-yyyy-xxxx', reboot_type='HARD')
def test_get_boot_device(self):
server = mock.Mock(id='zzzz-yyyy-xxxx')
self.nova_mock.return_value.get_server.return_value = server
boot_device = self.test_driver.get_boot_device('zzzz-yyyy-xxxx')
self.assertEqual('Pxe', boot_device)
get_server_metadata = (
self.nova_mock.return_value.compute.get_server_metadata)
get_server_metadata.assert_called_once_with(server.id)
def test_set_boot_device(self):
server = mock.Mock(id='zzzz-yyyy-xxxx')
self.nova_mock.return_value.get_server.return_value = server
compute = self.nova_mock.return_value.compute
set_server_metadata = compute.set_server_metadata
self.test_driver.set_boot_device('zzzz-yyyy-xxxx', 'Pxe')
set_server_metadata.assert_called_once_with(
'zzzz-yyyy-xxxx', **{'libvirt:pxe-first': '1'}
)
def test_get_boot_mode(self):
image = mock.Mock(hw_firmware_type='bios')
nova_mock.return_value.image.find_image.return_value = image
self.nova_mock.return_value.image.find_image.return_value = image
response = self.app.get('/redfish/v1/Systems/xxxx-yyyy-zzzz')
boot_mode = self.test_driver.get_boot_mode('zzzz-yyyy-xxxx')
self.assertEqual(200, response.status_code)
self.assertEqual('xxxx-yyyy-zzzz', response.json['Id'])
self.assertEqual('zzzz-yyyy-xxxx', response.json['UUID'])
self.assertEqual('On', response.json['PowerState'])
self.assertEqual(
response.json['MemorySummary']['TotalSystemMemoryGiB'], 1)
self.assertEqual(2, response.json['ProcessorSummary']['Count'])
self.assertEqual(
'Pxe', response.json['Boot']['BootSourceOverrideTarget'])
self.assertEqual(
'Legacy', response.json['Boot']['BootSourceOverrideMode'])
self.assertEqual('Legacy', boot_mode)
def test_system_resource_patch(self, nova_mock):
nova_conn_mock = nova_mock.return_value
server = mock.Mock(power_state=0)
nova_conn_mock.get_server.return_value = server
data = {'Boot': {'BootSourceOverrideTarget': 'Cd'}}
response = self.app.patch('/redfish/v1/Systems/xxxx-yyyy-zzzz',
json=data)
self.assertEqual(204, response.status_code)
nova_conn_mock.compute.set_server_metadata.assert_called_once_with(
server.id, **{'libvirt:pxe-first': ''})
def test_system_reset_action_on(self, nova_mock):
nova_conn_mock = nova_mock.return_value
server = mock.Mock(power_state=0)
nova_conn_mock.get_server.return_value = server
data = {'ResetType': 'On'}
response = self.app.post(
'/redfish/v1/Systems/xxxx-yyyy-zzzz/Actions/ComputerSystem.Reset',
json=data)
self.assertEqual(204, response.status_code)
nova_conn_mock.compute.start_server.assert_called_once_with(server.id)
def test_system_reset_action_forceon(self, nova_mock):
nova_conn_mock = nova_mock.return_value
server = mock.Mock(power_state=0)
nova_conn_mock.get_server.return_value = server
data = {'ResetType': 'ForceOn'}
response = self.app.post(
'/redfish/v1/Systems/xxxx-yyyy-zzzz/Actions/ComputerSystem.Reset',
json=data)
self.assertEqual(204, response.status_code)
nova_conn_mock.compute.start_server.assert_called_once_with(server.id)
def test_system_reset_action_forceoff(self, nova_mock):
nova_conn_mock = nova_mock.return_value
server = mock.Mock(power_state=1)
nova_conn_mock.get_server.return_value = server
data = {'ResetType': 'ForceOff'}
response = self.app.post(
'/redfish/v1/Systems/xxxx-yyyy-zzzz/Actions/ComputerSystem.Reset',
json=data)
self.assertEqual(204, response.status_code)
nova_conn_mock.compute.stop_server.assert_called_once_with(server.id)
def test_system_reset_action_shutdown(self, nova_mock):
nova_conn_mock = nova_mock.return_value
server = mock.Mock(power_state=1)
nova_conn_mock.get_server.return_value = server
data = {'ResetType': 'GracefulShutdown'}
response = self.app.post(
'/redfish/v1/Systems/xxxx-yyyy-zzzz/Actions/ComputerSystem.Reset',
json=data)
self.assertEqual(204, response.status_code)
nova_conn_mock.compute.stop_server.assert_called_once_with(server.id)
def test_system_reset_action_restart(self, nova_mock):
nova_conn_mock = nova_mock.return_value
server = mock.Mock(power_state=1)
nova_conn_mock.get_server.return_value = server
data = {'ResetType': 'GracefulRestart'}
response = self.app.post(
'/redfish/v1/Systems/xxxx-yyyy-zzzz/Actions/ComputerSystem.Reset',
json=data)
self.assertEqual(204, response.status_code)
nova_conn_mock.compute.reboot_server.assert_called_once_with(
server.id, reboot_type='SOFT')
def test_system_reset_action_forcerestart(self, nova_mock):
nova_conn_mock = nova_mock.return_value
server = mock.Mock(power_state=1)
nova_conn_mock.get_server.return_value = server
data = {'ResetType': 'ForceRestart'}
response = self.app.post(
'/redfish/v1/Systems/xxxx-yyyy-zzzz/Actions/ComputerSystem.Reset',
json=data)
self.assertEqual(204, response.status_code)
nova_conn_mock.compute.reboot_server.assert_called_once_with(
server.id, reboot_type='HARD')
def test_get_bios(self, nova_mock):
test_driver = OpenStackDriver('fake-cloud')
def test_set_boot_mode(self):
self.assertRaises(
NotImplementedError,
test_driver.get_bios, 'xxx-yyy-zzz')
FishyError, self.test_driver.set_boot_mode,
'zzzz-yyyy-xxxx', 'Legacy')
def test_set_bios(self, nova_mock):
test_driver = OpenStackDriver('fake-cloud')
def test_get_total_memory(self):
flavor = mock.Mock(ram=1024)
self.nova_mock.return_value.get_flavor.return_value = flavor
memory = self.test_driver.get_total_memory('zzzz-yyyy-xxxx')
self.assertEqual(1, memory)
def test_get_total_cpus(self):
flavor = mock.Mock(vcpus=2)
self.nova_mock.return_value.get_flavor.return_value = flavor
cpus = self.test_driver.get_total_cpus('zzzz-yyyy-xxxx')
self.assertEqual(2, cpus)
def test_get_bios(self):
self.assertRaises(
NotImplementedError,
test_driver.set_bios,
'xxx-yyy-zzz',
{'attribute 1': 'value 1'})
NotImplementedError, self.test_driver.get_bios, 'zzzz-yyyy-xxxx')
def test_reset_bios(self, nova_mock):
test_driver = OpenStackDriver('fake-cloud')
def test_set_bios(self):
self.assertRaises(
NotImplementedError,
test_driver.reset_bios,
'xxx-yyy-zzz')
NotImplementedError, self.test_driver.set_bios,
'zzzz-yyyy-xxxx', {})
def test_get_nics(self, nova_mock):
def test_reset_bios(self):
self.assertRaises(
NotImplementedError, self.test_driver.reset_bios, 'zzzz-yyyy-xxxx')
def test_get_nics(self):
addresses = Munch(
{u'public': [
Munch({u'OS-EXT-IPS-MAC:mac_addr': u'fa:16:3e:46:e3:ac',
@ -205,24 +201,22 @@ class EmulatorTestCase(base.BaseTestCase):
u'addr': u'10.0.0.10',
u'OS-EXT-IPS:type': u'fixed'})]})
server = mock.Mock(addresses=addresses)
nova_mock.return_value.get_server.return_value = server
self.nova_mock.return_value.get_server.return_value = server
test_driver = OpenStackDriver('fake-cloud')
nics = test_driver.get_nics('xxxx-yyyy-zzzz')
nics = self.test_driver.get_nics('xxxx-yyyy-zzzz')
self.assertEqual([{'id': 'fa:16:3e:22:18:31',
'mac': 'fa:16:3e:22:18:31'},
{'id': 'fa:16:3e:46:e3:ac',
'mac': 'fa:16:3e:46:e3:ac'}],
sorted(nics, key=lambda k: k['id']))
def test_get_nics_empty(self, nova_mock):
def test_get_nics_empty(self):
server = mock.Mock(addresses=None)
nova_mock.return_value.get_server.return_value = server
test_driver = OpenStackDriver('fake-cloud')
nics = test_driver.get_nics('xxxx-yyyy-zzzz')
self.nova_mock.return_value.get_server.return_value = server
nics = self.test_driver.get_nics('xxxx-yyyy-zzzz')
self.assertEqual(set(), nics)
def test_get_nics_error(self, nova_mock):
def test_get_nics_error(self):
addresses = Munch(
{u'public': [
Munch({u'version': 6,
@ -239,9 +233,8 @@ class EmulatorTestCase(base.BaseTestCase):
u'addr': u'10.0.0.10',
u'OS-EXT-IPS:type': u'fixed'})]})
server = mock.Mock(addresses=addresses)
nova_mock.return_value.get_server.return_value = server
test_driver = OpenStackDriver('fake-cloud')
nics = test_driver.get_nics('xxxx-yyyy-zzzz')
self.nova_mock.return_value.get_server.return_value = server
nics = self.test_driver.get_nics('xxxx-yyyy-zzzz')
self.assertEqual([{'id': 'fa:16:3e:22:18:31',
'mac': 'fa:16:3e:22:18:31'}],
nics)