diff --git a/ironic/drivers/ilo.py b/ironic/drivers/ilo.py index ae22dd7add..9ec2f143b3 100644 --- a/ironic/drivers/ilo.py +++ b/ironic/drivers/ilo.py @@ -22,6 +22,7 @@ from ironic.common.i18n import _ from ironic.drivers import base from ironic.drivers.modules import agent from ironic.drivers.modules.ilo import boot +from ironic.drivers.modules.ilo import console from ironic.drivers.modules.ilo import deploy from ironic.drivers.modules.ilo import inspect from ironic.drivers.modules.ilo import management @@ -48,7 +49,7 @@ class IloVirtualMediaIscsiDriver(base.BaseDriver): self.power = power.IloPower() self.boot = boot.IloVirtualMediaBoot() self.deploy = deploy.IloVirtualMediaIscsiDeploy() - self.console = deploy.IloConsoleInterface() + self.console = console.IloConsoleInterface() self.management = management.IloManagement() self.vendor = vendor.VendorPassthru() self.inspect = inspect.IloInspect() @@ -72,7 +73,7 @@ class IloVirtualMediaAgentDriver(base.BaseDriver): self.power = power.IloPower() self.deploy = deploy.IloVirtualMediaAgentDeploy() - self.console = deploy.IloConsoleInterface() + self.console = console.IloConsoleInterface() self.management = management.IloManagement() self.vendor = vendor.IloVirtualMediaAgentVendorInterface() self.inspect = inspect.IloInspect() diff --git a/ironic/drivers/modules/ilo/console.py b/ironic/drivers/modules/ilo/console.py new file mode 100644 index 0000000000..c8b4f0c4e0 --- /dev/null +++ b/ironic/drivers/modules/ilo/console.py @@ -0,0 +1,47 @@ +# Copyright 2015 Hewlett-Packard Development Company, L.P. +# +# 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. +""" +iLO Deploy Driver(s) and supporting methods. +""" + +from ironic.common import exception +from ironic.common.i18n import _ +from ironic.drivers.modules.ilo import common as ilo_common +from ironic.drivers.modules import ipmitool + + +class IloConsoleInterface(ipmitool.IPMIShellinaboxConsole): + """A ConsoleInterface that uses ipmitool and shellinabox.""" + + def get_properties(self): + props = ilo_common.REQUIRED_PROPERTIES.copy() + props.update(ilo_common.CONSOLE_PROPERTIES) + return props + + def validate(self, task): + """Validate the Node console info. + + :param task: a task from TaskManager. + :raises: InvalidParameterValue + :raises: MissingParameterValue when a required parameter is missing + + """ + node = task.node + driver_info_dict = ilo_common.parse_driver_info(node) + if 'console_port' not in driver_info_dict: + raise exception.MissingParameterValue(_( + "Missing 'console_port' parameter in node's driver_info.")) + + ilo_common.update_ipmi_properties(task) + super(IloConsoleInterface, self).validate(task) diff --git a/ironic/drivers/modules/ilo/deploy.py b/ironic/drivers/modules/ilo/deploy.py index 562da3551b..f9d00e5b67 100644 --- a/ironic/drivers/modules/ilo/deploy.py +++ b/ironic/drivers/modules/ilo/deploy.py @@ -31,7 +31,6 @@ from ironic.drivers.modules import agent from ironic.drivers.modules import deploy_utils from ironic.drivers.modules.ilo import boot as ilo_boot from ironic.drivers.modules.ilo import common as ilo_common -from ironic.drivers.modules import ipmitool from ironic.drivers.modules import iscsi_deploy from ironic.drivers.modules import pxe @@ -361,29 +360,3 @@ class IloPXEDeploy(iscsi_deploy.ISCSIDeploy): manager_utils.node_power_action(task, states.POWER_OFF) _disable_secure_boot_if_supported(task) return super(IloPXEDeploy, self).tear_down(task) - - -class IloConsoleInterface(ipmitool.IPMIShellinaboxConsole): - """A ConsoleInterface that uses ipmitool and shellinabox.""" - - def get_properties(self): - d = ilo_common.REQUIRED_PROPERTIES.copy() - d.update(ilo_common.CONSOLE_PROPERTIES) - return d - - def validate(self, task): - """Validate the Node console info. - - :param task: a task from TaskManager. - :raises: InvalidParameterValue - :raises: MissingParameterValue when a required parameter is missing - - """ - node = task.node - driver_info = ilo_common.parse_driver_info(node) - if 'console_port' not in driver_info: - raise exception.MissingParameterValue(_( - "Missing 'console_port' parameter in node's driver_info.")) - - ilo_common.update_ipmi_properties(task) - super(IloConsoleInterface, self).validate(task) diff --git a/ironic/drivers/pxe.py b/ironic/drivers/pxe.py index 7f25c946ec..39f9671a8d 100644 --- a/ironic/drivers/pxe.py +++ b/ironic/drivers/pxe.py @@ -29,6 +29,7 @@ from ironic.drivers.modules.amt import vendor as amt_vendor from ironic.drivers.modules.cimc import management as cimc_mgmt from ironic.drivers.modules.cimc import power as cimc_power from ironic.drivers.modules import iboot +from ironic.drivers.modules.ilo import console as ilo_console from ironic.drivers.modules.ilo import deploy as ilo_deploy from ironic.drivers.modules.ilo import inspect as ilo_inspect from ironic.drivers.modules.ilo import management as ilo_management @@ -212,7 +213,7 @@ class PXEAndIloDriver(base.BaseDriver): self.boot = pxe.PXEBoot() self.deploy = ilo_deploy.IloPXEDeploy() self.vendor = ilo_vendor.VendorPassthru() - self.console = ilo_deploy.IloConsoleInterface() + self.console = ilo_console.IloConsoleInterface() self.management = ilo_management.IloManagement() self.inspect = ilo_inspect.IloInspect() self.raid = agent.AgentRAID() diff --git a/ironic/tests/unit/drivers/modules/ilo/test_console.py b/ironic/tests/unit/drivers/modules/ilo/test_console.py new file mode 100644 index 0000000000..0a7206ac2a --- /dev/null +++ b/ironic/tests/unit/drivers/modules/ilo/test_console.py @@ -0,0 +1,72 @@ +# Copyright 2015 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. + +"""Test class for common methods used by iLO modules.""" + +import mock +from oslo_config import cfg +import six + +from ironic.common import exception +from ironic.conductor import task_manager +from ironic.drivers.modules.ilo import common as ilo_common +from ironic.drivers.modules import ipmitool +from ironic.tests.unit.conductor import mgr_utils +from ironic.tests.unit.db import base as db_base +from ironic.tests.unit.db import utils as db_utils +from ironic.tests.unit.objects import utils as obj_utils + + +if six.PY3: + import io + file = io.BytesIO + +INFO_DICT = db_utils.get_test_ilo_info() +CONF = cfg.CONF + + +class IloConsoleInterfaceTestCase(db_base.DbTestCase): + + def setUp(self): + super(IloConsoleInterfaceTestCase, self).setUp() + mgr_utils.mock_the_extension_manager(driver="iscsi_ilo") + self.node = obj_utils.create_test_node( + self.context, driver='iscsi_ilo', driver_info=INFO_DICT) + + @mock.patch.object(ipmitool.IPMIShellinaboxConsole, 'validate', + spec_set=True, autospec=True) + @mock.patch.object(ilo_common, 'update_ipmi_properties', spec_set=True, + autospec=True) + def test_validate(self, update_ipmi_mock, + ipmi_validate_mock): + with task_manager.acquire(self.context, self.node.uuid, + shared=False) as task: + task.node.driver_info['console_port'] = 60 + task.driver.console.validate(task) + update_ipmi_mock.assert_called_once_with(task) + ipmi_validate_mock.assert_called_once_with(mock.ANY, task) + + @mock.patch.object(ipmitool.IPMIShellinaboxConsole, 'validate', + spec_set=True, autospec=True) + @mock.patch.object(ilo_common, 'update_ipmi_properties', spec_set=True, + autospec=True) + def test_validate_exc(self, update_ipmi_mock, + ipmi_validate_mock): + with task_manager.acquire(self.context, self.node.uuid, + shared=False) as task: + self.assertRaises(exception.MissingParameterValue, + task.driver.console.validate, task) + self.assertEqual(0, update_ipmi_mock.call_count) + self.assertEqual(0, ipmi_validate_mock.call_count) diff --git a/ironic/tests/unit/drivers/test_pxe.py b/ironic/tests/unit/drivers/test_pxe.py index 9b91befcce..d44f06cefe 100644 --- a/ironic/tests/unit/drivers/test_pxe.py +++ b/ironic/tests/unit/drivers/test_pxe.py @@ -27,7 +27,7 @@ from ironic.drivers.modules.amt import vendor as amt_vendor from ironic.drivers.modules.cimc import management as cimc_management from ironic.drivers.modules.cimc import power as cimc_power from ironic.drivers.modules import iboot -from ironic.drivers.modules.ilo import deploy as ilo_deploy +from ironic.drivers.modules.ilo import console as ilo_console from ironic.drivers.modules.ilo import inspect as ilo_inspect from ironic.drivers.modules.ilo import management as ilo_management from ironic.drivers.modules.ilo import power as ilo_power @@ -159,7 +159,7 @@ class PXEDriversTestCase(testtools.TestCase): self.assertIsInstance(driver.deploy, iscsi_deploy.ISCSIDeploy) self.assertIsInstance(driver.vendor, iscsi_deploy.VendorPassthru) self.assertIsInstance(driver.console, - ilo_deploy.IloConsoleInterface) + ilo_console.IloConsoleInterface) self.assertIsInstance(driver.management, ilo_management.IloManagement) self.assertIsInstance(driver.inspect, ilo_inspect.IloInspect)