diff --git a/ironic/drivers/modules/ipminative.py b/ironic/drivers/modules/ipminative.py index c1196d488d..19c572fa22 100644 --- a/ironic/drivers/modules/ipminative.py +++ b/ironic/drivers/modules/ipminative.py @@ -25,9 +25,13 @@ from ironic.common import exception from ironic.common import states from ironic.conductor import task_manager from ironic.drivers import base +from ironic.openstack.common import importutils from ironic.openstack.common import log as logging -from pyghmi import exceptions as pyghmi_exception -from pyghmi.ipmi import command as ipmi_command + +pyghmi = importutils.try_import('pyghmi') +if pyghmi: + from pyghmi import exceptions as pyghmi_exception + from pyghmi.ipmi import command as ipmi_command opts = [ cfg.IntOpt('retry_timeout', diff --git a/ironic/drivers/pxe.py b/ironic/drivers/pxe.py index 820218707a..5ef45cae5b 100644 --- a/ironic/drivers/pxe.py +++ b/ironic/drivers/pxe.py @@ -78,6 +78,10 @@ class PXEAndIPMINativeDriver(base.BaseDriver): """ def __init__(self): + if not importutils.try_import('pyghmi'): + raise exception.DriverLoadError( + driver=self.__class__.__name__, + reason=_("Unable to import pyghmi library")) self.power = ipminative.NativeIPMIPower() self.deploy = pxe.PXEDeploy() self.pxe_vendor = pxe.VendorPassthru() diff --git a/ironic/tests/drivers/test_ipminative.py b/ironic/tests/drivers/test_ipminative.py index 0ec04a236e..5340a8132e 100644 --- a/ironic/tests/drivers/test_ipminative.py +++ b/ironic/tests/drivers/test_ipminative.py @@ -18,8 +18,11 @@ """ Test class for Native IPMI power driver module. """ + import mock +from oslo.config import cfg + from ironic.common import driver_factory from ironic.common import exception from ironic.common import states @@ -32,7 +35,6 @@ from ironic.tests.conductor import utils as mgr_utils from ironic.tests.db import base as db_base from ironic.tests.db import utils as db_utils from ironic.tests.objects import utils as obj_utils -from oslo.config import cfg CONF = cfg.CONF diff --git a/ironic/tests/drivers/third_party_driver_mocks.py b/ironic/tests/drivers/third_party_driver_mocks.py index 8cf86e6309..09f4f14953 100644 --- a/ironic/tests/drivers/third_party_driver_mocks.py +++ b/ironic/tests/drivers/third_party_driver_mocks.py @@ -22,6 +22,7 @@ respective external libraries' actually being present. Any external library required by a third-party driver should be mocked here. Current list of mocked libraries: seamicroclient + ipminative """ import sys @@ -49,8 +50,27 @@ if not seamicroclient: if 'ironic.drivers.modules.seamicro' in sys.modules: reload(sys.modules['ironic.drivers.modules.seamicro']) - # IPMITool driver checks the system for presense of 'ipmitool' binary during # __init__. We bypass that check in order to run the unit tests, which do not # depend on 'ipmitool' being on the system. ipmitool.TIMING_SUPPORT = False + +pyghmi = importutils.try_import("pyghmi") +if not pyghmi: + p = mock.Mock() + p.exceptions = mock.Mock() + p.exceptions.IpmiException = Exception + p.ipmi = mock.Mock() + p.ipmi.command = mock.Mock() + p.ipmi.command.Command = mock.Mock() + sys.modules['pyghmi'] = p + sys.modules['pyghmi.exceptions'] = p.exceptions + sys.modules['pyghmi.ipmi'] = p.ipmi + sys.modules['pyghmi.ipmi.command'] = p.ipmi.command + # FIXME(deva): the next line is a hack, because several unit tests + # actually depend on this particular string being present + # in pyghmi.ipmi.command.boot_devices + p.ipmi.command.boot_devices = {'pxe': 4} + +if 'ironic.drivers.modules.ipminative' in sys.modules: + reload(sys.modules['ironic.drivers.modules.ipminative']) diff --git a/requirements.txt b/requirements.txt index 92f94597c0..3f680c1b49 100644 --- a/requirements.txt +++ b/requirements.txt @@ -27,5 +27,4 @@ six>=1.7.0 jsonpatch>=1.1 WSME>=0.6 Jinja2 -pyghmi>=0.6.11 oslo.messaging>=1.3.0