Merge "Convert conductor manager unit tests to hardware types"

This commit is contained in:
Zuul 2018-05-25 10:55:08 +00:00 committed by Gerrit Code Review
commit 96aeaa8d9b
4 changed files with 688 additions and 787 deletions

View File

@ -17,13 +17,10 @@
"""Test utils for Ironic Managers.""" """Test utils for Ironic Managers."""
import fixtures
from futurist import periodics from futurist import periodics
import mock import mock
from oslo_utils import strutils from oslo_utils import strutils
from oslo_utils import uuidutils from oslo_utils import uuidutils
import pkg_resources
from stevedore import dispatch
from ironic.common import driver_factory from ironic.common import driver_factory
from ironic.common import exception from ironic.common import exception
@ -32,47 +29,6 @@ from ironic.conductor import manager
from ironic import objects from ironic import objects
class DriverFactoryFixture(fixtures.Fixture):
"""A fixture to mock a factor of drivers/hardware types/interfaces."""
def __init__(self, factory_class, ):
self.factory_class = factory_class
def mock_the_extension_manager(driver="fake", namespace="ironic.drivers"):
"""Get a fake stevedore NameDispatchExtensionManager instance.
:param namespace: A string representing the namespace over which to
search for entrypoints.
:returns mock_ext_mgr: A DriverFactory instance that has been faked.
:returns mock_ext: A real plugin loaded by mock_ext_mgr in the specified
namespace.
"""
entry_point = None
for ep in list(pkg_resources.iter_entry_points(namespace)):
s = "%s" % ep
if driver == s[:s.index(' =')]:
entry_point = ep
break
# NOTE(lucasagomes): Initialize the _extension_manager before
# instantiating a DriverFactory class to avoid
# a real NameDispatchExtensionManager to be created
# with the real namespace.
driver_factory.DriverFactory._extension_manager = (
dispatch.NameDispatchExtensionManager('ironic.no-such-namespace',
lambda x: True))
mock_ext_mgr = driver_factory.DriverFactory()
mock_ext = mock_ext_mgr._extension_manager._load_one_plugin(
entry_point, True, [], {}, False)
mock_ext_mgr._extension_manager.extensions = [mock_ext]
mock_ext_mgr._extension_manager.by_name = dict((e.name, e)
for e in [mock_ext])
return (mock_ext_mgr, mock_ext)
class CommonMixIn(object): class CommonMixIn(object):
@staticmethod @staticmethod
def _create_node(**kwargs): def _create_node(**kwargs):

View File

@ -1,50 +0,0 @@
# coding=utf-8
# Copyright 2013 Hewlett-Packard Development Company, L.P.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""Tests for Ironic Manager test utils."""
from ironic.tests import base
from ironic.tests.unit.conductor import mgr_utils
class UtilsTestCase(base.TestCase):
def test_fails_to_load_extension(self):
self.assertRaises(AttributeError,
mgr_utils.mock_the_extension_manager,
'fake',
'bad.namespace')
self.assertRaises(AttributeError,
mgr_utils.mock_the_extension_manager,
'no-such-driver',
'ironic.drivers')
def test_get_mockable_ext_mgr(self):
(mgr, ext) = mgr_utils.mock_the_extension_manager('fake',
'ironic.drivers')
# confirm that stevedore did not scan the actual entrypoints
self.assertNotEqual(mgr._extension_manager.namespace, 'ironic.drivers')
# confirm mgr has only one extension
self.assertEqual(1, len(mgr._extension_manager.extensions))
# confirm that we got a reference to the extension in this manager
self.assertEqual(ext, mgr._extension_manager.extensions[0])
# confirm that it is the "fake" driver we asked for
self.assertEqual("fake = ironic.drivers.fake:FakeDriver",
"%s" % ext.entry_point)
# Confirm driver is loaded
self.assertIn('fake', mgr.names)

View File

@ -30,6 +30,7 @@ from ironic.conductor import notification_utils
from ironic.conductor import task_manager from ironic.conductor import task_manager
from ironic.drivers import fake_hardware from ironic.drivers import fake_hardware
from ironic.drivers import generic from ironic.drivers import generic
from ironic.drivers.modules import fake
from ironic import objects from ironic import objects
from ironic.objects import fields from ironic.objects import fields
from ironic.tests import base as tests_base from ironic.tests import base as tests_base
@ -447,26 +448,25 @@ class RegisterInterfacesTestCase(mgr_utils.ServiceSetUpMixin,
self.assertFalse(reg_mock.called) self.assertFalse(reg_mock.called)
@mock.patch.object(fake.FakeConsole, 'start_console', autospec=True)
@mock.patch.object(notification_utils, 'emit_console_notification')
class StartConsolesTestCase(mgr_utils.ServiceSetUpMixin, db_base.DbTestCase): class StartConsolesTestCase(mgr_utils.ServiceSetUpMixin, db_base.DbTestCase):
@mock.patch.object(notification_utils, 'emit_console_notification') def test__start_consoles(self, mock_notify, mock_start_console):
def test__start_consoles(self, mock_notify):
obj_utils.create_test_node(self.context, obj_utils.create_test_node(self.context,
driver='fake', driver='fake-hardware',
console_enabled=True) console_enabled=True)
obj_utils.create_test_node( obj_utils.create_test_node(
self.context, self.context,
uuid=uuidutils.generate_uuid(), uuid=uuidutils.generate_uuid(),
driver='fake', driver='fake-hardware',
console_enabled=True console_enabled=True
) )
obj_utils.create_test_node( obj_utils.create_test_node(
self.context, self.context,
uuid=uuidutils.generate_uuid(), uuid=uuidutils.generate_uuid(),
driver='fake' driver='fake-hardware'
) )
self._start_service() self._start_service()
with mock.patch.object(self.driver.console,
'start_console') as mock_start_console:
self.service._start_consoles(self.context) self.service._start_consoles(self.context)
self.assertEqual(2, mock_start_console.call_count) self.assertEqual(2, mock_start_console.call_count)
mock_notify.assert_has_calls( mock_notify.assert_has_calls(
@ -475,29 +475,24 @@ class StartConsolesTestCase(mgr_utils.ServiceSetUpMixin, db_base.DbTestCase):
mock.call(mock.ANY, 'console_restore', mock.call(mock.ANY, 'console_restore',
fields.NotificationStatus.END)]) fields.NotificationStatus.END)])
@mock.patch.object(notification_utils, 'emit_console_notification') def test__start_consoles_no_console_enabled(self, mock_notify,
def test__start_consoles_no_console_enabled(self, mock_notify): mock_start_console):
obj_utils.create_test_node(self.context, obj_utils.create_test_node(self.context,
driver='fake', driver='fake-hardware',
console_enabled=False) console_enabled=False)
self._start_service() self._start_service()
with mock.patch.object(self.driver.console,
'start_console') as mock_start_console:
self.service._start_consoles(self.context) self.service._start_consoles(self.context)
self.assertFalse(mock_start_console.called) self.assertFalse(mock_start_console.called)
self.assertFalse(mock_notify.called) self.assertFalse(mock_notify.called)
@mock.patch.object(notification_utils, 'emit_console_notification') def test__start_consoles_failed(self, mock_notify, mock_start_console):
def test__start_consoles_failed(self, mock_notify):
test_node = obj_utils.create_test_node(self.context, test_node = obj_utils.create_test_node(self.context,
driver='fake', driver='fake-hardware',
console_enabled=True) console_enabled=True)
self._start_service() self._start_service()
with mock.patch.object(self.driver.console,
'start_console') as mock_start_console:
mock_start_console.side_effect = Exception() mock_start_console.side_effect = Exception()
self.service._start_consoles(self.context) self.service._start_consoles(self.context)
mock_start_console.assert_called_once_with(mock.ANY) mock_start_console.assert_called_once_with(mock.ANY, mock.ANY)
test_node.refresh() test_node.refresh()
self.assertFalse(test_node.console_enabled) self.assertFalse(test_node.console_enabled)
self.assertIsNotNone(test_node.last_error) self.assertIsNotNone(test_node.last_error)
@ -507,16 +502,14 @@ class StartConsolesTestCase(mgr_utils.ServiceSetUpMixin, db_base.DbTestCase):
mock.call(mock.ANY, 'console_restore', mock.call(mock.ANY, 'console_restore',
fields.NotificationStatus.ERROR)]) fields.NotificationStatus.ERROR)])
@mock.patch.object(notification_utils, 'emit_console_notification')
@mock.patch.object(base_manager, 'LOG') @mock.patch.object(base_manager, 'LOG')
def test__start_consoles_node_locked(self, log_mock, mock_notify): def test__start_consoles_node_locked(self, log_mock, mock_notify,
mock_start_console):
test_node = obj_utils.create_test_node(self.context, test_node = obj_utils.create_test_node(self.context,
driver='fake', driver='fake-hardware',
console_enabled=True, console_enabled=True,
reservation='fake-host') reservation='fake-host')
self._start_service() self._start_service()
with mock.patch.object(self.driver.console,
'start_console') as mock_start_console:
self.service._start_consoles(self.context) self.service._start_consoles(self.context)
self.assertFalse(mock_start_console.called) self.assertFalse(mock_start_console.called)
test_node.refresh() test_node.refresh()
@ -525,17 +518,15 @@ class StartConsolesTestCase(mgr_utils.ServiceSetUpMixin, db_base.DbTestCase):
self.assertTrue(log_mock.warning.called) self.assertTrue(log_mock.warning.called)
self.assertFalse(mock_notify.called) self.assertFalse(mock_notify.called)
@mock.patch.object(notification_utils, 'emit_console_notification')
@mock.patch.object(base_manager, 'LOG') @mock.patch.object(base_manager, 'LOG')
def test__start_consoles_node_not_found(self, log_mock, mock_notify): def test__start_consoles_node_not_found(self, log_mock, mock_notify,
mock_start_console):
test_node = obj_utils.create_test_node(self.context, test_node = obj_utils.create_test_node(self.context,
driver='fake', driver='fake-hardware',
console_enabled=True) console_enabled=True)
self._start_service() self._start_service()
with mock.patch.object(task_manager, 'acquire') as mock_acquire: with mock.patch.object(task_manager, 'acquire') as mock_acquire:
mock_acquire.side_effect = exception.NodeNotFound(node='not found') mock_acquire.side_effect = exception.NodeNotFound(node='not found')
with mock.patch.object(self.driver.console,
'start_console') as mock_start_console:
self.service._start_consoles(self.context) self.service._start_consoles(self.context)
self.assertFalse(mock_start_console.called) self.assertFalse(mock_start_console.called)
test_node.refresh() test_node.refresh()

File diff suppressed because it is too large Load Diff