Fix tests/baremetal/test_driver.py

Unit tests for baremetal/driver.py were not functioning and were
falsely reporting success due to inheriting from the wrong class.
This lead to drift between the tests and the code over time.
I decided it was easier to re-implement tests/baremetal/test_driver.py
instead of trying to fix the drift. This gave me the chance to make
the test class easier to extend. Additional tests will be added
in the future, when I refactor driver.py:spawn().

This patch also has some minor variable name changes for baremetal/driver.py.

blueprint general-bare-metal-provisioning-framework.

Change-Id: I36ba5ed340b722b9a6e8d02d6d57d3c8d53b1eef
This commit is contained in:
Devananda van der Veen
2012-12-22 16:35:58 -08:00
parent 80eb567d28
commit 63c728771a

View File

@@ -1,3 +1,7 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# coding=utf-8
# Copyright 2012 Hewlett-Packard Development Company, L.P.
# Copyright (c) 2012 NTT DOCOMO, INC.
# Copyright (c) 2011 University of Southern California / ISI
# All Rights Reserved.
@@ -15,180 +19,161 @@
# under the License.
"""
Tests for baremetal driver.
Tests for the base baremetal driver class.
"""
from nova import exception
import mox
from nova.openstack.common import cfg
from nova.tests.baremetal.db import base
from nova.tests.baremetal.db import utils
from nova import exception
from nova import test
from nova.tests.baremetal.db import base as bm_db_base
from nova.tests.baremetal.db import utils as bm_db_utils
from nova.tests.image import fake as fake_image
from nova.tests import test_virt_drivers
from nova.tests import utils as test_utils
from nova.tests import utils
from nova.virt.baremetal import baremetal_states
from nova.virt.baremetal import db
from nova.virt.baremetal import driver as bm_driver
from nova.virt.baremetal import volume_driver
from nova.virt.firewall import NoopFirewallDriver
from nova.virt.baremetal import fake
from nova.virt import firewall
CONF = cfg.CONF
class FakeVifDriver(object):
def plug(self, instance, vif):
pass
def unplug(self, instance, vif):
pass
FakeFirewallDriver = NoopFirewallDriver
class FakeVolumeDriver(volume_driver.VolumeDriver):
def __init__(self, virtapi):
super(FakeVolumeDriver, self).__init__(virtapi)
self._initiator = "testtesttest"
NODE = utils.new_bm_node(cpus=2, memory_mb=4096, service_host="host1")
NICS = [
{'address': '01:23:45:67:89:01', 'datapath_id': '0x1', 'port_no': 1, },
{'address': '01:23:45:67:89:02', 'datapath_id': '0x2', 'port_no': 2, },
]
def class_path(class_):
return class_.__module__ + '.' + class_.__name__
COMMON_FLAGS = dict(
firewall_driver=class_path(FakeFirewallDriver),
firewall_driver='nova.virt.baremetal.fake.FakeFirewallDriver',
host='test_host',
)
BAREMETAL_FLAGS = dict(
driver='nova.virt.baremetal.fake.Fake',
host=NODE['service_host'],
instance_type_extra_specs=['cpu_arch:test'],
driver='nova.virt.baremetal.fake.FakeDriver',
instance_type_extra_specs=['cpu_arch:test', 'test_spec:test_value'],
power_manager='nova.virt.baremetal.fake.FakePowerManager',
sql_connection='sqlite:///:memory:',
vif_driver=class_path(FakeVifDriver),
volume_driver=class_path(FakeVolumeDriver),
vif_driver='nova.virt.baremetal.fake.FakeVifDriver',
volume_driver='nova.virt.baremetal.fake.FakeVolumeDriver',
group='baremetal',
)
def _create_baremetal_stuff():
context = test_utils.get_test_admin_context()
node = db.bm_node_create(context, NODE)
for nic in NICS:
db.bm_interface_create(context,
node['id'],
nic['address'],
nic['datapath_id'],
nic['port_no'])
return node
class BaremetalDriverSpawnTestCase(base.Database):
class BareMetalDriverNoDBTestCase(test.TestCase):
def setUp(self):
super(BaremetalDriverSpawnTestCase, self).setUp()
super(BareMetalDriverNoDBTestCase, self).setUp()
self.flags(**COMMON_FLAGS)
self.flags(**BAREMETAL_FLAGS)
fake_image.stub_out_image_service(self.stubs)
self.node = _create_baremetal_stuff()
self.node_id = self.node['id']
self.context = test_utils.get_test_admin_context()
self.instance = test_utils.get_test_instance()
self.network_info = test_utils.get_test_network_info()
self.block_device_info = None
self.image_meta = test_utils.get_test_image_info(None, self.instance)
self.driver = bm_driver.BareMetalDriver(None)
self.kwargs = dict(
context=self.context,
instance=self.instance,
image_meta=self.image_meta,
injected_files=[('/foo', 'bar'), ('/abc', 'xyz')],
admin_password='testpass',
network_info=self.network_info,
block_device_info=self.block_device_info)
self.addCleanup(fake_image.FakeImageService_reset)
def test_ok(self):
self.instance['node'] = str(self.node_id)
self.driver.spawn(**self.kwargs)
node = db.bm_node_get(self.context, self.node_id)
self.assertEqual(node['instance_uuid'], self.instance['uuid'])
self.assertEqual(node['task_state'], baremetal_states.ACTIVE)
def test_without_node(self):
self.assertRaises(
exception.NovaException,
self.driver.spawn,
**self.kwargs)
def test_node_not_found(self):
self.instance['node'] = "123456789"
self.assertRaises(
exception.InstanceNotFound,
self.driver.spawn,
**self.kwargs)
def test_node_in_use(self):
self.instance['node'] = str(self.node_id)
db.bm_node_update(self.context, self.node_id,
{'instance_uuid': 'something'})
self.assertRaises(
exception.NovaException,
self.driver.spawn,
**self.kwargs)
def test_validate_driver_loading(self):
self.assertTrue(isinstance(self.driver.driver,
fake.FakeDriver))
self.assertTrue(isinstance(self.driver.vif_driver,
fake.FakeVifDriver))
self.assertTrue(isinstance(self.driver.volume_driver,
fake.FakeVolumeDriver))
self.assertTrue(isinstance(self.driver.firewall_driver,
fake.FakeFirewallDriver))
class BaremetalDriverTestCase(test_virt_drivers._VirtDriverTestCase,
base.Database):
class BareMetalDriverWithDBTestCase(bm_db_base.BMDBTestCase):
def setUp(self):
super(BaremetalDriverTestCase, self).setUp()
self.driver_module = 'nova.virt.baremetal.BareMetalDriver'
super(BareMetalDriverWithDBTestCase, self).setUp()
self.flags(**COMMON_FLAGS)
self.node = _create_baremetal_stuff()
self.node_id = self.node['id']
self.flags(**BAREMETAL_FLAGS)
fake_image.stub_out_image_service(self.stubs)
self.context = utils.get_test_admin_context()
self.driver = bm_driver.BareMetalDriver(None)
self.node_info = bm_db_utils.new_bm_node(
id=123,
service_host='test_host',
cpus=2,
memory_mb=2048,
)
self.nic_info = [
{'address': '01:23:45:67:89:01', 'datapath_id': '0x1',
'port_no': 1},
{'address': '01:23:45:67:89:02', 'datapath_id': '0x2',
'port_no': 2},
]
self.addCleanup(fake_image.FakeImageService_reset)
def _get_running_instance(self):
instance_ref = test_utils.get_test_instance()
instance_ref['node'] = str(self.node_id)
network_info = test_utils.get_test_network_info()
image_info = test_utils.get_test_image_info(None, instance_ref)
self.connection.spawn(self.ctxt, instance_ref, image_info,
[], 'herp', network_info=network_info)
return instance_ref, network_info
def test_loading_baremetal_drivers(self):
from nova.virt.baremetal import fake
drv = bm_driver.BareMetalDriver(None)
self.assertTrue(isinstance(drv.baremetal_nodes, fake.Fake))
self.assertTrue(isinstance(drv._vif_driver, FakeVifDriver))
self.assertTrue(isinstance(drv._firewall_driver, FakeFirewallDriver))
self.assertTrue(isinstance(drv._volume_driver, FakeVolumeDriver))
def _create_node(self):
self.node = db.bm_node_create(self.context, self.node_info)
for nic in self.nic_info:
db.bm_interface_create(
self.context,
self.node['id'],
nic['address'],
nic['datapath_id'],
nic['port_no'],
)
self.test_instance = utils.get_test_instance()
self.test_instance['node'] = self.node['id']
self.spawn_params = dict(
admin_password='test_pass',
block_device_info=None,
context=self.context,
image_meta=utils.get_test_image_info(None,
self.test_instance),
injected_files=[('/fake/path', 'hello world')],
instance=self.test_instance,
network_info=utils.get_test_network_info(),
)
def test_get_host_stats(self):
self.flags(instance_type_extra_specs=['cpu_arch:x86_64',
'x:123',
'y:456', ])
drv = bm_driver.BareMetalDriver(None)
cap_list = drv.get_host_stats()
self.assertTrue(isinstance(cap_list, list))
self.assertEqual(len(cap_list), 1)
cap = cap_list[0]
self.assertEqual(cap['cpu_arch'], 'x86_64')
self.assertEqual(cap['x'], '123')
self.assertEqual(cap['y'], '456')
self.assertEqual(cap['hypervisor_type'], 'baremetal')
self.assertEqual(cap['driver'],
'nova.virt.baremetal.fake.Fake')
self._create_node()
stats = self.driver.get_host_stats()
self.assertTrue(isinstance(stats, list))
self.assertEqual(len(stats), 1)
stats = stats[0]
self.assertEqual(stats['cpu_arch'], 'test')
self.assertEqual(stats['test_spec'], 'test_value')
self.assertEqual(stats['hypervisor_type'], 'baremetal')
self.assertEqual(stats['hypervisor_hostname'], '123')
self.assertEqual(stats['host'], 'test_host')
self.assertEqual(stats['vcpus'], 2)
self.assertEqual(stats['host_memory_total'], 2048)
def test_spawn_ok(self):
self._create_node()
self.driver.spawn(**self.spawn_params)
row = db.bm_node_get(self.context, self.node['id'])
self.assertEqual(row['task_state'], baremetal_states.ACTIVE)
def test_spawn_node_in_use(self):
self._create_node()
db.bm_node_update(self.context, self.node['id'],
{'instance_uuid': '1234-5678'})
self.assertRaises(exception.NovaException,
self.driver.spawn, **self.spawn_params)
row = db.bm_node_get(self.context, self.node['id'])
self.assertEqual(row['task_state'], None)
def test_spawn_node_not_found(self):
self._create_node()
db.bm_node_update(self.context, self.node['id'],
{'id': 9876})
self.assertRaises(exception.InstanceNotFound,
self.driver.spawn, **self.spawn_params)
row = db.bm_node_get(self.context, 9876)
self.assertEqual(row['task_state'], None)
def test_spawn_fails(self):
self._create_node()
self.mox.StubOutWithMock(fake.FakePowerManager, 'activate_node')
fake.FakePowerManager.activate_node().AndRaise(test.TestingException)
self.mox.ReplayAll()
self.assertRaises(test.TestingException,
self.driver.spawn, **self.spawn_params)
row = db.bm_node_get(self.context, self.node['id'])
self.assertEqual(row['task_state'], baremetal_states.ERROR)