Source code for ironic.drivers.modules.msftocs.management
# Copyright 2015 Cloudbase Solutions Srl
# 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.
from ironic.common import boot_devices
from ironic.common import exception
from ironic.common.i18n import _
from ironic.conductor import task_manager
from ironic.drivers import base
from ironic.drivers.modules.msftocs import common as msftocs_common
from ironic.drivers.modules.msftocs import msftocsclient
from ironic.drivers import utils as drivers_utils
BOOT_TYPE_TO_DEVICE_MAP = {
msftocsclient.BOOT_TYPE_FORCE_PXE: boot_devices.PXE,
msftocsclient.BOOT_TYPE_FORCE_DEFAULT_HDD: boot_devices.DISK,
msftocsclient.BOOT_TYPE_FORCE_INTO_BIOS_SETUP: boot_devices.BIOS,
}
DEVICE_TO_BOOT_TYPE_MAP = {v: k for k, v in BOOT_TYPE_TO_DEVICE_MAP.items()}
DEFAULT_BOOT_DEVICE = boot_devices.DISK
[docs]class MSFTOCSManagement(base.ManagementInterface):
[docs] def get_properties(self):
"""Returns the driver's properties."""
return msftocs_common.get_properties()
[docs] def validate(self, task):
"""Validate the driver_info in the node.
Check if the driver_info contains correct required fields.
:param task: a TaskManager instance containing the target node.
:raises: MissingParameterValue if any required parameters are missing.
:raises: InvalidParameterValue if any parameters have invalid values.
"""
msftocs_common.parse_driver_info(task.node)
[docs] def get_supported_boot_devices(self, task):
"""Get a list of the supported boot devices.
:param task: a task from TaskManager.
:returns: A list with the supported boot devices.
"""
return list(BOOT_TYPE_TO_DEVICE_MAP.values())
def _check_valid_device(self, device, node):
"""Checks if the desired boot device is valid for this driver.
:param device: a boot device.
:param node: the target node.
:raises: InvalidParameterValue if the boot device is not valid.
"""
if device not in DEVICE_TO_BOOT_TYPE_MAP:
raise exception.InvalidParameterValue(
_("set_boot_device called with invalid device %(device)s for "
"node %(node_id)s.") %
{'device': device, 'node_id': node.uuid})
@task_manager.require_exclusive_lock
[docs] def set_boot_device(self, task, device, persistent=False):
"""Set the boot device for the task's node.
Set the boot device to use on next boot of the node.
:param task: a task from TaskManager.
:param device: the boot device.
:param persistent: Boolean value. True if the boot device will
persist to all future boots, False if not.
Default: False.
:raises: InvalidParameterValue if an invalid boot device is specified.
"""
self._check_valid_device(device, task.node)
client, blade_id = msftocs_common.get_client_info(
task.node.driver_info)
boot_mode = drivers_utils.get_node_capability(task.node, 'boot_mode')
uefi = (boot_mode == 'uefi')
boot_type = DEVICE_TO_BOOT_TYPE_MAP[device]
client.set_next_boot(blade_id, boot_type, persistent, uefi)
[docs] def get_boot_device(self, task):
"""Get the current boot device for the task's node.
Returns the current boot device of the node.
:param task: a task from TaskManager.
:returns: a dictionary containing:
:boot_device: the boot device
:persistent: Whether the boot device will persist to all
future boots or not, None if it is unknown.
"""
client, blade_id = msftocs_common.get_client_info(
task.node.driver_info)
device = BOOT_TYPE_TO_DEVICE_MAP.get(
client.get_next_boot(blade_id), DEFAULT_BOOT_DEVICE)
# Note(alexpilotti): Although the ChasssisManager REST API allows to
# specify the persistent boot status in SetNextBoot, currently it does
# not provide a way to retrieve the value with GetNextBoot.
# This is being addressed in the ChassisManager API.
return {'boot_device': device,
'persistent': None}
[docs] def get_sensors_data(self, task):
raise NotImplementedError()