Source code for ironic.tests.drivers.drac.test_bios

# -*- coding: utf-8 -*-
#
# Copyright 2015 Dell, Inc.
# 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 DRAC BIOS interface
"""

import mock

from ironic.common import exception
from ironic.conductor import task_manager
from ironic.drivers.modules.drac import bios
from ironic.drivers.modules.drac import client as drac_client
from ironic.drivers.modules.drac import management as drac_mgmt
from ironic.drivers.modules.drac import resource_uris
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.drivers.drac import bios_wsman_mock
from ironic.tests.drivers.drac import utils as test_utils
from ironic.tests.objects import utils as obj_utils
from six.moves.urllib.parse import unquote

FAKE_DRAC = db_utils.get_test_drac_info()


def _base_config(responses=[]):
    for resource in [resource_uris.DCIM_BIOSEnumeration,
                     resource_uris.DCIM_BIOSString,
                     resource_uris.DCIM_BIOSInteger]:
        xml_root = test_utils.mock_wsman_root(
            bios_wsman_mock.Enumerations[resource]['XML'])
        responses.append(xml_root)
    return responses


def _set_config(responses=[]):
    ccj_xml = test_utils.build_soap_xml([{'DCIM_LifecycleJob':
                                          {'Name': 'fake'}}],
                                        resource_uris.DCIM_LifecycleJob)
    responses.append(test_utils.mock_wsman_root(ccj_xml))
    return _base_config(responses)


def _mock_pywsman_responses(client, responses):
    mpw = client.Client.return_value
    mpw.enumerate.side_effect = responses
    return mpw


@mock.patch.object(drac_client, 'pywsman')
[docs]class DracBiosTestCase(db_base.DbTestCase):
[docs] def setUp(self): super(DracBiosTestCase, self).setUp() mgr_utils.mock_the_extension_manager(driver='fake_drac') self.node = obj_utils.create_test_node(self.context, driver='fake_drac', driver_info=FAKE_DRAC)
[docs] def test_get_config(self, client): _mock_pywsman_responses(client, _base_config()) expected = {} for resource in [resource_uris.DCIM_BIOSEnumeration, resource_uris.DCIM_BIOSString, resource_uris.DCIM_BIOSInteger]: expected.update(bios_wsman_mock.Enumerations[resource]['Dict']) result = bios.get_config(self.node) self.assertEqual(expected, result)
[docs] def test_set_config_empty(self, client): _mock_pywsman_responses(client, _set_config()) with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: res = bios.set_config(task) self.assertFalse(res)
[docs] def test_set_config_nochange(self, client): _mock_pywsman_responses(client, _set_config()) with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: task.node = self.node res = bios.set_config(task, MemTest='Disabled', ProcCStates='Disabled', SystemModelName='PowerEdge R630', AssetTag=None, Proc1NumCores=8, AcPwrRcvryUserDelay=60) self.assertFalse(res)
[docs] def test_set_config_ro(self, client): _mock_pywsman_responses(client, _set_config()) with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: task.node = self.node self.assertRaises(exception.DracOperationFailed, bios.set_config, task, ProcCStates="Enabled")
[docs] def test_set_config_enum_invalid(self, client): _mock_pywsman_responses(client, _set_config()) with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: task.node = self.node self.assertRaises(exception.DracOperationFailed, bios.set_config, task, MemTest="Never")
[docs] def test_set_config_string_toolong(self, client): _mock_pywsman_responses(client, _set_config()) tag = ('Never have I seen such a silly long asset tag! ' 'It is really rather ridiculous, don\'t you think?') with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: task.node = self.node self.assertRaises(exception.DracOperationFailed, bios.set_config, task, AssetTag=tag)
[docs] def test_set_config_string_nomatch(self, client): _mock_pywsman_responses(client, _set_config()) tag = unquote('%80') with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: task.node = self.node self.assertRaises(exception.DracOperationFailed, bios.set_config, task, AssetTag=tag)
[docs] def test_set_config_integer_toosmall(self, client): _mock_pywsman_responses(client, _set_config()) with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: task.node = self.node self.assertRaises(exception.DracOperationFailed, bios.set_config, task, AcPwrRcvryUserDelay=0)
[docs] def test_set_config_integer_toobig(self, client): _mock_pywsman_responses(client, _set_config()) with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: task.node = self.node self.assertRaises(exception.DracOperationFailed, bios.set_config, task, AcPwrRcvryUserDelay=600)
[docs] def test_set_config_needreboot(self, client): mock_pywsman = _mock_pywsman_responses(client, _set_config()) invoke_xml = test_utils.mock_wsman_root( bios_wsman_mock.Invoke_Commit) # TODO(victor-lowther) This needs more work. # Specifically, we will need to verify that # invoke was handed the XML blob we expected. mock_pywsman.invoke.return_value = invoke_xml with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: task.node = self.node res = bios.set_config(task, AssetTag="An Asset Tag", MemTest="Enabled") self.assertTrue(res)
@mock.patch.object(drac_mgmt, 'check_for_config_job', spec_set=True, autospec=True) @mock.patch.object(drac_mgmt, 'create_config_job', spec_set=True, autospec=True)
[docs] def test_commit_config(self, mock_ccj, mock_cfcj, client): with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: task.node = self.node bios.commit_config(task) self.assertTrue(mock_cfcj.called) self.assertTrue(mock_ccj.called)
@mock.patch.object(drac_client.Client, 'wsman_invoke', spec_set=True, autospec=True)
[docs] def test_abandon_config(self, mock_wi, client): _mock_pywsman_responses(client, _set_config()) with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: task.node = self.node bios.abandon_config(task) self.assertTrue(mock_wi.called)