Migrate python-oneviewclient validations to oneview hardware type
As part of the process to stop the use of ``python-oneviewclient`` in favor of ``python-hpOneView`` and ``python-ilorest-library``, the validations of the ``python-oneviewclient`` have to be migrated to the ``oneview`` hardware type. Change-Id: I9031f6e9a59901d3241c6802938252bb63cfe6ca Partial-Bug: #1693788
This commit is contained in:
parent
c6b615cc5b
commit
b1aa04481f
@ -16,6 +16,7 @@
|
|||||||
import re
|
import re
|
||||||
|
|
||||||
from oslo_log import log as logging
|
from oslo_log import log as logging
|
||||||
|
from oslo_serialization import jsonutils
|
||||||
from oslo_utils import importutils
|
from oslo_utils import importutils
|
||||||
from six.moves.urllib import parse
|
from six.moves.urllib import parse
|
||||||
|
|
||||||
@ -238,47 +239,28 @@ def get_oneview_info(node):
|
|||||||
return oneview_info
|
return oneview_info
|
||||||
|
|
||||||
|
|
||||||
def validate_oneview_resources_compatibility(oneview_client, task):
|
def validate_oneview_resources_compatibility(task):
|
||||||
"""Validates if the node configuration is consistent with OneView.
|
"""Validate if the node configuration is consistent with OneView.
|
||||||
|
|
||||||
This method calls python-oneviewclient functions to validate if the node
|
This method calls hpOneView functions to validate if the node
|
||||||
configuration is consistent with the OneView resources it represents,
|
configuration is consistent with the OneView resources it represents,
|
||||||
including server_hardware_uri, server_hardware_type_uri,
|
including serverHardwareUri, serverHardwareTypeUri, serverGroupUri
|
||||||
server_profile_template_uri, enclosure_group_uri and node ports. Also
|
serverProfileTemplateUri, enclosureGroupUri and node ports. If any
|
||||||
verifies if a Server Profile is applied to the Server Hardware the node
|
validation fails, the driver will raise an appropriate OneViewError.
|
||||||
represents when in pre-allocation model. If any validation fails,
|
|
||||||
python-oneviewclient will raise an appropriate OneViewException.
|
|
||||||
|
|
||||||
:param oneview_client: an instance of the OneView client
|
|
||||||
:param: task: a TaskManager instance containing the node to act on.
|
:param: task: a TaskManager instance containing the node to act on.
|
||||||
|
:raises: OneViewError if any validation fails.
|
||||||
"""
|
"""
|
||||||
|
ports = task.ports
|
||||||
node_ports = task.ports
|
oneview_client = get_hponeview_client()
|
||||||
|
|
||||||
oneview_info = get_oneview_info(task.node)
|
oneview_info = get_oneview_info(task.node)
|
||||||
|
|
||||||
try:
|
_validate_node_server_profile_template(oneview_client, oneview_info)
|
||||||
spt_uuid = oneview_utils.get_uuid_from_uri(
|
_validate_node_server_hardware_type(oneview_client, oneview_info)
|
||||||
oneview_info.get("server_profile_template_uri")
|
_validate_node_enclosure_group(oneview_client, oneview_info)
|
||||||
)
|
_validate_server_profile_template_mac_type(oneview_client, oneview_info)
|
||||||
|
_validate_node_port_mac_server_hardware(
|
||||||
oneview_client.validate_node_server_profile_template(oneview_info)
|
oneview_client, oneview_info, ports)
|
||||||
oneview_client.validate_node_server_hardware_type(oneview_info)
|
|
||||||
oneview_client.validate_node_enclosure_group(oneview_info)
|
|
||||||
oneview_client.validate_node_server_hardware(
|
|
||||||
oneview_info,
|
|
||||||
task.node.properties.get('memory_mb'),
|
|
||||||
task.node.properties.get('cpus')
|
|
||||||
)
|
|
||||||
oneview_client.is_node_port_mac_compatible_with_server_hardware(
|
|
||||||
oneview_info, node_ports
|
|
||||||
)
|
|
||||||
oneview_client.validate_server_profile_template_mac_type(spt_uuid)
|
|
||||||
|
|
||||||
except oneview_exceptions.OneViewException as oneview_exc:
|
|
||||||
msg = (_("Error validating node resources with OneView: %s") %
|
|
||||||
oneview_exc)
|
|
||||||
raise exception.OneViewError(error=msg)
|
|
||||||
|
|
||||||
|
|
||||||
def _verify_node_info(node_namespace, node_info_dict, info_required):
|
def _verify_node_info(node_namespace, node_info_dict, info_required):
|
||||||
@ -344,3 +326,255 @@ def ensure_server_profile(task):
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
raise exception.OneViewError(error=exc)
|
raise exception.OneViewError(error=exc)
|
||||||
|
|
||||||
|
|
||||||
|
def _get_server_hardware_mac_from_ilo(server_hardware):
|
||||||
|
"""Get the MAC of Server Hardware's iLO controller.
|
||||||
|
|
||||||
|
:param: server_hardware: a server hardware uuid or uri
|
||||||
|
:return: MAC of Server Hardware's iLO controller.
|
||||||
|
:raises: InvalidParameterValue if required iLO credentials are missing.
|
||||||
|
:raises: OneViewError if can't get mac from a server hardware via iLO or
|
||||||
|
if fails to get JSON object with the default path.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
ilo_client = get_ilorest_client(server_hardware)
|
||||||
|
ilo_path = "/rest/v1/systems/1"
|
||||||
|
hardware = jsonutils.loads(ilo_client.get(ilo_path).text)
|
||||||
|
hardware_mac = hardware['HostCorrelation']['HostMACAddress'][0]
|
||||||
|
except redfish.JsonDecodingError as exc:
|
||||||
|
LOG.error("Failed in JSON object getting path: %s", ilo_path)
|
||||||
|
raise exception.OneViewError(error=exc)
|
||||||
|
except (ValueError, TypeError, IndexError) as exc:
|
||||||
|
LOG.error(
|
||||||
|
"Failed to get mac from server hardware %(server_hardware)s "
|
||||||
|
"via iLO. Error: %(message)s", {
|
||||||
|
"server_hardware": server_hardware.get("uri"),
|
||||||
|
"message": exc
|
||||||
|
}
|
||||||
|
)
|
||||||
|
raise exception.OneViewError(error=exc)
|
||||||
|
|
||||||
|
return hardware_mac
|
||||||
|
|
||||||
|
|
||||||
|
def _get_server_hardware_mac(server_hardware):
|
||||||
|
"""Get the MAC address of the first PXE bootable port of an Ethernet port.
|
||||||
|
|
||||||
|
:param: server_hardware: OneView Server Hardware object.
|
||||||
|
:return: MAC of the first Ethernet and function 'a' port of the
|
||||||
|
Server Hardware object.
|
||||||
|
:raises: OneViewError if there is no Ethernet port on the Server Hardware
|
||||||
|
or if there is no portMap on the Server Hardware requested.
|
||||||
|
"""
|
||||||
|
sh_physical_port = None
|
||||||
|
|
||||||
|
if server_hardware.get('portMap'):
|
||||||
|
for device in server_hardware.get(
|
||||||
|
'portMap', {}).get('deviceSlots', ()):
|
||||||
|
for physical_port in device.get('physicalPorts', ()):
|
||||||
|
if physical_port.get('type') == 'Ethernet':
|
||||||
|
sh_physical_port = physical_port
|
||||||
|
break
|
||||||
|
if sh_physical_port:
|
||||||
|
for virtual_port in sh_physical_port.get('virtualPorts', ()):
|
||||||
|
# NOTE(nicodemos): Ironic oneview drivers needs to use a
|
||||||
|
# port that type is Ethernet and function identifier 'a' for
|
||||||
|
# this FlexNIC to be able to make a deploy using PXE.
|
||||||
|
if virtual_port.get('portFunction') == 'a':
|
||||||
|
return virtual_port.get('mac', ()).lower()
|
||||||
|
raise exception.OneViewError(
|
||||||
|
_("There is no Ethernet port on the Server Hardware: %s") %
|
||||||
|
server_hardware.get('uri'))
|
||||||
|
else:
|
||||||
|
raise exception.OneViewError(
|
||||||
|
_("The Server Hardware: %s doesn't have a list of adapters/slots, "
|
||||||
|
"their ports and attributes. This information is available only "
|
||||||
|
"for blade servers. Is this a rack server?") %
|
||||||
|
server_hardware.get('uri'))
|
||||||
|
|
||||||
|
|
||||||
|
def _validate_node_server_profile_template(oneview_client, oneview_info):
|
||||||
|
"""Validate if the Server Profile Template is consistent.
|
||||||
|
|
||||||
|
:param: oneview_client: an instance of the HPE OneView client.
|
||||||
|
:param: oneview_info: the OneView related info in an Ironic node.
|
||||||
|
:raises: OneViewError if the node's Server Profile Template is not
|
||||||
|
consistent.
|
||||||
|
"""
|
||||||
|
server_profile_template = oneview_client.server_profile_templates.get(
|
||||||
|
oneview_info['server_profile_template_uri'])
|
||||||
|
server_hardware = oneview_client.server_hardware.get(
|
||||||
|
oneview_info['server_hardware_uri'])
|
||||||
|
|
||||||
|
_validate_server_profile_template_server_hardware_type(
|
||||||
|
server_profile_template, server_hardware)
|
||||||
|
_validate_spt_enclosure_group(server_profile_template, server_hardware)
|
||||||
|
_validate_server_profile_template_manage_boot(server_profile_template)
|
||||||
|
|
||||||
|
|
||||||
|
def _validate_server_profile_template_server_hardware_type(
|
||||||
|
server_profile_template, server_hardware):
|
||||||
|
"""Validate if the Server Hardware Types are the same.
|
||||||
|
|
||||||
|
Validate if the Server Profile Template and the Server Hardware have the
|
||||||
|
same Server Hardware Type.
|
||||||
|
|
||||||
|
:param: server_profile_template: OneView Server Profile Template object.
|
||||||
|
:param: server_hardware: OneView Server Hardware object.
|
||||||
|
:raises: OneViewError if the Server Profile Template and the Server
|
||||||
|
Hardware does not have the same Server Hardware Type.
|
||||||
|
"""
|
||||||
|
spt_server_hardware_type_uri = (
|
||||||
|
server_profile_template.get('serverHardwareTypeUri')
|
||||||
|
)
|
||||||
|
sh_server_hardware_type_uri = server_hardware.get('serverHardwareTypeUri')
|
||||||
|
|
||||||
|
if spt_server_hardware_type_uri != sh_server_hardware_type_uri:
|
||||||
|
message = _(
|
||||||
|
"Server profile template %(spt_uri)s serverHardwareTypeUri is "
|
||||||
|
"inconsistent with server hardware %(server_hardware_uri)s "
|
||||||
|
"serverHardwareTypeUri.") % {
|
||||||
|
'spt_uri': server_profile_template.get('uri'),
|
||||||
|
'server_hardware_uri': server_hardware.get('uri')}
|
||||||
|
raise exception.OneViewError(message)
|
||||||
|
|
||||||
|
|
||||||
|
def _validate_spt_enclosure_group(server_profile_template, server_hardware):
|
||||||
|
"""Validate Server Profile Template's Enclosure Group and Server Hardware's.
|
||||||
|
|
||||||
|
:param: server_profile_template: OneView Server Profile Template object.
|
||||||
|
:param: server_hardware: OneView Server Hardware object.
|
||||||
|
:raises: OneViewError if the Server Profile Template's Enclosure Group does
|
||||||
|
not match the Server Hardware's.
|
||||||
|
"""
|
||||||
|
spt_enclosure_group_uri = server_profile_template.get('enclosureGroupUri')
|
||||||
|
sh_enclosure_group_uri = server_hardware.get('serverGroupUri')
|
||||||
|
|
||||||
|
if spt_enclosure_group_uri != sh_enclosure_group_uri:
|
||||||
|
message = _("Server profile template %(spt_uri)s enclosureGroupUri is "
|
||||||
|
"inconsistent with server hardware %(sh_uri)s "
|
||||||
|
"serverGroupUri.") % {
|
||||||
|
'spt_uri': server_profile_template.get('uri'),
|
||||||
|
'sh_uri': server_hardware.get('uri')}
|
||||||
|
raise exception.OneViewError(message)
|
||||||
|
|
||||||
|
|
||||||
|
def _validate_server_profile_template_manage_boot(server_profile_template):
|
||||||
|
"""Validate if the Server Profile Template allows to manage the boot order.
|
||||||
|
|
||||||
|
:param: server_profile_template: OneView Server Profile Template object.
|
||||||
|
:raises: OneViewError if the Server Profile Template does not allows to
|
||||||
|
manage the boot order.
|
||||||
|
"""
|
||||||
|
manage_boot = server_profile_template.get('boot', {}).get('manageBoot')
|
||||||
|
|
||||||
|
if not manage_boot:
|
||||||
|
message = _("Server Profile Template: %s, does not allow to manage "
|
||||||
|
"boot order.") % server_profile_template.get('uri')
|
||||||
|
raise exception.OneViewError(message)
|
||||||
|
|
||||||
|
|
||||||
|
def _validate_node_server_hardware_type(oneview_client, oneview_info):
|
||||||
|
"""Validate if the node's Server Hardware Type matches Server Hardware's.
|
||||||
|
|
||||||
|
:param: oneview_client: the HPE OneView Client.
|
||||||
|
:param: oneview_info: the OneView related info in an Ironic node.
|
||||||
|
:raises: OneViewError if the node's Server Hardware Type group doesn't
|
||||||
|
match the Server Hardware's.
|
||||||
|
"""
|
||||||
|
node_server_hardware_type_uri = oneview_info['server_hardware_type_uri']
|
||||||
|
server_hardware = oneview_client.server_hardware.get(
|
||||||
|
oneview_info['server_hardware_uri'])
|
||||||
|
server_hardware_sht_uri = server_hardware.get('serverHardwareTypeUri')
|
||||||
|
|
||||||
|
if server_hardware_sht_uri != node_server_hardware_type_uri:
|
||||||
|
message = _("Node server_hardware_type_uri is inconsistent "
|
||||||
|
"with OneView's server hardware %(server_hardware_uri)s "
|
||||||
|
"serverHardwareTypeUri.") % {
|
||||||
|
'server_hardware_uri': server_hardware.get('uri')}
|
||||||
|
raise exception.OneViewError(message)
|
||||||
|
|
||||||
|
|
||||||
|
def _validate_node_enclosure_group(oneview_client, oneview_info):
|
||||||
|
"""Validate if the node's Enclosure Group matches the Server Hardware's.
|
||||||
|
|
||||||
|
:param: oneview_client: an instance of the HPE OneView client.
|
||||||
|
:param: oneview_info: the OneView related info in an Ironic node.
|
||||||
|
:raises: OneViewError if the node's enclosure group doesn't match the
|
||||||
|
Server Hardware's.
|
||||||
|
"""
|
||||||
|
server_hardware = oneview_client.server_hardware.get(
|
||||||
|
oneview_info['server_hardware_uri'])
|
||||||
|
sh_enclosure_group_uri = server_hardware.get('serverGroupUri')
|
||||||
|
node_enclosure_group_uri = oneview_info['enclosure_group_uri']
|
||||||
|
|
||||||
|
if node_enclosure_group_uri and (
|
||||||
|
sh_enclosure_group_uri != node_enclosure_group_uri):
|
||||||
|
message = _(
|
||||||
|
"Node enclosure_group_uri '%(node_enclosure_group_uri)s' "
|
||||||
|
"is inconsistent with OneView's server hardware "
|
||||||
|
"serverGroupUri '%(sh_enclosure_group_uri)s' of "
|
||||||
|
"ServerHardware %(server_hardware)s") % {
|
||||||
|
'node_enclosure_group_uri': node_enclosure_group_uri,
|
||||||
|
'sh_enclosure_group_uri': sh_enclosure_group_uri,
|
||||||
|
'server_hardware': server_hardware.get('uri')}
|
||||||
|
raise exception.OneViewError(message)
|
||||||
|
|
||||||
|
|
||||||
|
def _validate_node_port_mac_server_hardware(oneview_client,
|
||||||
|
oneview_info, ports):
|
||||||
|
"""Validate if a port matches the node's Server Hardware's MAC.
|
||||||
|
|
||||||
|
:param: oneview_client: an instance of the HPE OneView client.
|
||||||
|
:param: oneview_info: the OneView related info in an Ironic node.
|
||||||
|
:param: ports: a list of Ironic node's ports.
|
||||||
|
:raises: OneViewError if there is no port with MAC address matching one
|
||||||
|
in OneView.
|
||||||
|
|
||||||
|
"""
|
||||||
|
server_hardware = oneview_client.server_hardware.get(
|
||||||
|
oneview_info['server_hardware_uri'])
|
||||||
|
|
||||||
|
if not ports:
|
||||||
|
return
|
||||||
|
|
||||||
|
# NOTE(nicodemos) If hponeview client's unable to get the MAC of the Server
|
||||||
|
# Hardware and raises an exception, the driver will try to get it from
|
||||||
|
# the iLOrest client.
|
||||||
|
try:
|
||||||
|
mac = _get_server_hardware_mac(server_hardware)
|
||||||
|
except exception.OneViewError:
|
||||||
|
mac = _get_server_hardware_mac_from_ilo(server_hardware)
|
||||||
|
|
||||||
|
incompatible_macs = []
|
||||||
|
for port in ports:
|
||||||
|
if port.address.lower() == mac.lower():
|
||||||
|
return
|
||||||
|
incompatible_macs.append(port.address)
|
||||||
|
|
||||||
|
message = _("The ports of the node are not compatible with its "
|
||||||
|
"server hardware %(server_hardware_uri)s. There are no Ironic "
|
||||||
|
"port MAC's: %(port_macs)s, that matches with the "
|
||||||
|
"server hardware's MAC: %(server_hardware_mac)s") % {
|
||||||
|
'server_hardware_uri': server_hardware.get('uri'),
|
||||||
|
'port_macs': ', '.join(incompatible_macs),
|
||||||
|
'server_hardware_mac': mac}
|
||||||
|
raise exception.OneViewError(message)
|
||||||
|
|
||||||
|
|
||||||
|
def _validate_server_profile_template_mac_type(oneview_client, oneview_info):
|
||||||
|
"""Validate if the node's Server Profile Template's MAC type is physical.
|
||||||
|
|
||||||
|
:param: oneview_client: an instance of the HPE OneView client.
|
||||||
|
:param: oneview_info: the OneView related info in an Ironic node.
|
||||||
|
:raises: OneViewError if the node's Server Profile Template's MAC type is
|
||||||
|
not physical.
|
||||||
|
"""
|
||||||
|
server_profile_template = oneview_client.server_profile_templates.get(
|
||||||
|
oneview_info['server_profile_template_uri']
|
||||||
|
)
|
||||||
|
if server_profile_template.get('macType') != 'Physical':
|
||||||
|
message = _("The server profile template %s is not set to use "
|
||||||
|
"physical MAC.") % server_profile_template.get('uri')
|
||||||
|
raise exception.OneViewError(message)
|
||||||
|
@ -219,10 +219,6 @@ class OneViewIscsiDeploy(iscsi_deploy.ISCSIDeploy, OneViewPeriodicTasks):
|
|||||||
|
|
||||||
oneview_driver = common.ISCSI_PXE_ONEVIEW
|
oneview_driver = common.ISCSI_PXE_ONEVIEW
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super(OneViewIscsiDeploy, self).__init__()
|
|
||||||
self.oneview_client = common.get_oneview_client()
|
|
||||||
|
|
||||||
def get_properties(self):
|
def get_properties(self):
|
||||||
return deploy_utils.get_properties()
|
return deploy_utils.get_properties()
|
||||||
|
|
||||||
@ -230,8 +226,7 @@ class OneViewIscsiDeploy(iscsi_deploy.ISCSIDeploy, OneViewPeriodicTasks):
|
|||||||
def validate(self, task):
|
def validate(self, task):
|
||||||
common.verify_node_info(task.node)
|
common.verify_node_info(task.node)
|
||||||
try:
|
try:
|
||||||
common.validate_oneview_resources_compatibility(
|
common.validate_oneview_resources_compatibility(task)
|
||||||
self.oneview_client, task)
|
|
||||||
except exception.OneViewError as oneview_exc:
|
except exception.OneViewError as oneview_exc:
|
||||||
raise exception.InvalidParameterValue(oneview_exc)
|
raise exception.InvalidParameterValue(oneview_exc)
|
||||||
super(OneViewIscsiDeploy, self).validate(task)
|
super(OneViewIscsiDeploy, self).validate(task)
|
||||||
@ -263,10 +258,6 @@ class OneViewAgentDeploy(agent.AgentDeploy, OneViewPeriodicTasks):
|
|||||||
|
|
||||||
oneview_driver = common.AGENT_PXE_ONEVIEW
|
oneview_driver = common.AGENT_PXE_ONEVIEW
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super(OneViewAgentDeploy, self).__init__()
|
|
||||||
self.oneview_client = common.get_oneview_client()
|
|
||||||
|
|
||||||
def get_properties(self):
|
def get_properties(self):
|
||||||
return deploy_utils.get_properties()
|
return deploy_utils.get_properties()
|
||||||
|
|
||||||
@ -274,8 +265,7 @@ class OneViewAgentDeploy(agent.AgentDeploy, OneViewPeriodicTasks):
|
|||||||
def validate(self, task):
|
def validate(self, task):
|
||||||
common.verify_node_info(task.node)
|
common.verify_node_info(task.node)
|
||||||
try:
|
try:
|
||||||
common.validate_oneview_resources_compatibility(
|
common.validate_oneview_resources_compatibility(task)
|
||||||
self.oneview_client, task)
|
|
||||||
except exception.OneViewError as oneview_exc:
|
except exception.OneViewError as oneview_exc:
|
||||||
raise exception.InvalidParameterValue(oneview_exc)
|
raise exception.InvalidParameterValue(oneview_exc)
|
||||||
super(OneViewAgentDeploy, self).validate(task)
|
super(OneViewAgentDeploy, self).validate(task)
|
||||||
|
@ -34,10 +34,6 @@ oneview_utils = importutils.try_import('oneview_client.utils')
|
|||||||
class OneViewInspect(inspector.Inspector):
|
class OneViewInspect(inspector.Inspector):
|
||||||
"""Interface for in band inspection."""
|
"""Interface for in band inspection."""
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super(OneViewInspect, self).__init__()
|
|
||||||
self.oneview_client = common.get_oneview_client()
|
|
||||||
|
|
||||||
def get_properties(self):
|
def get_properties(self):
|
||||||
return deploy_utils.get_properties()
|
return deploy_utils.get_properties()
|
||||||
|
|
||||||
@ -59,8 +55,7 @@ class OneViewInspect(inspector.Inspector):
|
|||||||
common.verify_node_info(task.node)
|
common.verify_node_info(task.node)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
common.validate_oneview_resources_compatibility(
|
common.validate_oneview_resources_compatibility(task)
|
||||||
self.oneview_client, task)
|
|
||||||
except exception.OneViewError as oneview_exc:
|
except exception.OneViewError as oneview_exc:
|
||||||
raise exception.InvalidParameterValue(oneview_exc)
|
raise exception.InvalidParameterValue(oneview_exc)
|
||||||
|
|
||||||
|
@ -150,10 +150,6 @@ def set_boot_device(task):
|
|||||||
|
|
||||||
class OneViewManagement(base.ManagementInterface):
|
class OneViewManagement(base.ManagementInterface):
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super(OneViewManagement, self).__init__()
|
|
||||||
self.oneview_client = common.get_oneview_client()
|
|
||||||
|
|
||||||
def get_properties(self):
|
def get_properties(self):
|
||||||
return deploy_utils.get_properties()
|
return deploy_utils.get_properties()
|
||||||
|
|
||||||
@ -177,8 +173,7 @@ class OneViewManagement(base.ManagementInterface):
|
|||||||
common.verify_node_info(task.node)
|
common.verify_node_info(task.node)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
common.validate_oneview_resources_compatibility(
|
common.validate_oneview_resources_compatibility(task)
|
||||||
self.oneview_client, task)
|
|
||||||
|
|
||||||
if not deploy_utils.is_node_in_use_by_ironic(task.node):
|
if not deploy_utils.is_node_in_use_by_ironic(task.node):
|
||||||
raise exception.InvalidParameterValue(
|
raise exception.InvalidParameterValue(
|
||||||
|
@ -58,10 +58,6 @@ SET_POWER_STATE_MAP = {
|
|||||||
|
|
||||||
class OneViewPower(base.PowerInterface):
|
class OneViewPower(base.PowerInterface):
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super(OneViewPower, self).__init__()
|
|
||||||
self.oneview_client = common.get_oneview_client()
|
|
||||||
|
|
||||||
def get_properties(self):
|
def get_properties(self):
|
||||||
return deploy_utils.get_properties()
|
return deploy_utils.get_properties()
|
||||||
|
|
||||||
@ -90,9 +86,7 @@ class OneViewPower(base.PowerInterface):
|
|||||||
common.verify_node_info(task.node)
|
common.verify_node_info(task.node)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
common.validate_oneview_resources_compatibility(
|
common.validate_oneview_resources_compatibility(task)
|
||||||
self.oneview_client, task
|
|
||||||
)
|
|
||||||
if deploy_utils.is_node_in_use_by_oneview(task.node):
|
if deploy_utils.is_node_in_use_by_oneview(task.node):
|
||||||
raise exception.InvalidParameterValue(
|
raise exception.InvalidParameterValue(
|
||||||
_("Node %s is in use by OneView.") % task.node.uuid)
|
_("Node %s is in use by OneView.") % task.node.uuid)
|
||||||
|
@ -256,36 +256,137 @@ class OneViewCommonTestCase(db_base.DbTestCase):
|
|||||||
{"a": '', "b": None, "c": "something"},
|
{"a": '', "b": None, "c": "something"},
|
||||||
["a", "b", "c"])
|
["a", "b", "c"])
|
||||||
|
|
||||||
@mock.patch.object(common, 'get_oneview_client', spec_set=True,
|
@mock.patch.object(common, 'get_hponeview_client', autospec=True)
|
||||||
autospec=True)
|
@mock.patch.object(common, '_validate_node_server_profile_template')
|
||||||
|
@mock.patch.object(common, '_validate_node_server_hardware_type')
|
||||||
|
@mock.patch.object(common, '_validate_node_enclosure_group')
|
||||||
|
@mock.patch.object(common, '_validate_node_port_mac_server_hardware')
|
||||||
|
@mock.patch.object(common, '_validate_server_profile_template_mac_type')
|
||||||
def test_validate_oneview_resources_compatibility(
|
def test_validate_oneview_resources_compatibility(
|
||||||
self, mock_get_ov_client
|
self, mock_spt_mac_type, mock_port_mac_sh, mock_enclosure,
|
||||||
):
|
mock_sh_type, mock_sp_template, mock_hponeview):
|
||||||
"""Validate compatibility of resources.
|
"""Validate compatibility of resources.
|
||||||
|
|
||||||
1) Check validate_node_server_profile_template method is called
|
1) Check _validate_node_server_profile_template method is called
|
||||||
2) Check validate_node_server_hardware_type method is called
|
2) Check _validate_node_server_hardware_type method is called
|
||||||
3) Check validate_node_enclosure_group method is called
|
3) Check _validate_node_enclosure_group method is called
|
||||||
4) Check validate_node_server_hardware method is called
|
4) Check _validate_node_port_mac_server_hardware method is called
|
||||||
5) Check is_node_port_mac_compatible_with_server_hardware method
|
5) Check _validate_server_profile_template_mac_type method is called
|
||||||
is called
|
|
||||||
6) Check validate_server_profile_template_mac_type method is called
|
|
||||||
"""
|
"""
|
||||||
oneview_client = mock_get_ov_client()
|
oneview_client = mock_hponeview()
|
||||||
|
fake_port = db_utils.create_test_port()
|
||||||
|
fake_port.address = 'AA:BB:CC:DD:EE'
|
||||||
|
fake_device = {'physicalPorts': [
|
||||||
|
{'type': 'Ethernet',
|
||||||
|
'virtualPorts': [
|
||||||
|
{'portFunction': 'a',
|
||||||
|
'mac': 'AA:BB:CC:DD:EE'}
|
||||||
|
]}
|
||||||
|
]}
|
||||||
|
fake_spt = {
|
||||||
|
'serverHardwareTypeUri': 'fake_sht_uri',
|
||||||
|
'enclosureGroupUri': 'fake_eg_uri',
|
||||||
|
'macType': 'Physical',
|
||||||
|
'boot': {'manageBoot': True}
|
||||||
|
}
|
||||||
|
fake_sh = {
|
||||||
|
'serverHardwareTypeUri': 'fake_sht_uri',
|
||||||
|
'serverGroupUri': 'fake_eg_uri',
|
||||||
|
'processorCoreCount': 4,
|
||||||
|
'processorCount': 2,
|
||||||
|
'memoryMb': 4096,
|
||||||
|
'portMap': {'deviceSlots': [fake_device]}
|
||||||
|
}
|
||||||
|
oneview_client.server_profile_templates.get.return_value = fake_spt
|
||||||
|
oneview_client.server_hardware.get.return_value = fake_sh
|
||||||
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid) as task:
|
with task_manager.acquire(self.context, self.node.uuid) as task:
|
||||||
common.validate_oneview_resources_compatibility(oneview_client,
|
task.ports = [fake_port]
|
||||||
task)
|
common.validate_oneview_resources_compatibility(task)
|
||||||
self.assertTrue(
|
self.assertTrue(mock_sp_template.called)
|
||||||
oneview_client.validate_node_server_profile_template.called)
|
self.assertTrue(mock_sh_type.called)
|
||||||
self.assertTrue(
|
self.assertTrue(mock_enclosure.called)
|
||||||
oneview_client.validate_node_server_hardware_type.called)
|
self.assertTrue(mock_port_mac_sh.called)
|
||||||
self.assertTrue(
|
self.assertTrue(mock_spt_mac_type.called)
|
||||||
oneview_client.validate_node_enclosure_group.called)
|
|
||||||
self.assertTrue(
|
@mock.patch.object(common, 'get_hponeview_client', autospec=True)
|
||||||
oneview_client.validate_node_server_hardware.called)
|
def test__validate_server_profile_template_mac_type_virtual(
|
||||||
self.assertTrue(
|
self, mock_hponeview):
|
||||||
oneview_client.
|
oneview_client = mock_hponeview()
|
||||||
is_node_port_mac_compatible_with_server_hardware.called)
|
fake_spt = {'macType': 'Virtual'}
|
||||||
self.assertTrue(
|
oneview_client.server_hardware.get.return_value = fake_spt
|
||||||
oneview_client.
|
oneview_info = {'server_profile_template_uri': 'fake_uri'}
|
||||||
validate_server_profile_template_mac_type.called)
|
|
||||||
|
self.assertRaises(exception.OneViewError,
|
||||||
|
common._validate_server_profile_template_mac_type,
|
||||||
|
oneview_client, oneview_info)
|
||||||
|
|
||||||
|
@mock.patch.object(common, 'get_hponeview_client', autospec=True)
|
||||||
|
def test__validate_node_port_mac_server_hardware_invalid(
|
||||||
|
self, mock_hponeview):
|
||||||
|
oneview_client = mock_hponeview()
|
||||||
|
fake_device = {
|
||||||
|
'physicalPorts': [
|
||||||
|
{'type': 'notEthernet',
|
||||||
|
'mac': '00:11:22:33:44',
|
||||||
|
'virtualPorts': [{
|
||||||
|
'portFunction': 'a',
|
||||||
|
'mac': 'AA:BB:CC:DD:EE'}]},
|
||||||
|
{'type': 'Ethernet',
|
||||||
|
'mac': '11:22:33:44:55',
|
||||||
|
'virtualPorts': [{
|
||||||
|
'portFunction': 'a',
|
||||||
|
'mac': 'BB:CC:DD:EE:FF'}]}]}
|
||||||
|
fake_sh = {'portMap': {'deviceSlots': [fake_device]}}
|
||||||
|
fake_port = db_utils.create_test_port(address='AA:BB:CC:DD:EE')
|
||||||
|
oneview_client.server_hardware.get.return_value = fake_sh
|
||||||
|
oneview_info = db_utils.get_test_oneview_driver_info()
|
||||||
|
|
||||||
|
self.assertRaises(exception.OneViewError,
|
||||||
|
common._validate_node_port_mac_server_hardware,
|
||||||
|
oneview_client, oneview_info, [fake_port])
|
||||||
|
|
||||||
|
@mock.patch.object(common, 'get_hponeview_client', autospec=True)
|
||||||
|
def test__validate_node_enclosure_group_invalid(self, mock_hponeview):
|
||||||
|
oneview_client = mock_hponeview()
|
||||||
|
fake_sh = {'serverGroupUri': 'invalid_fake_eg_uri'}
|
||||||
|
oneview_client.server_hardware.get.return_value = fake_sh
|
||||||
|
oneview_info = {'server_hardware_uri': 'fake_sh_uri',
|
||||||
|
'enclosure_group_uri': 'fake_eg_uri'}
|
||||||
|
|
||||||
|
self.assertRaises(exception.OneViewError,
|
||||||
|
common._validate_node_enclosure_group,
|
||||||
|
oneview_client, oneview_info)
|
||||||
|
|
||||||
|
@mock.patch.object(common, 'get_hponeview_client', autospec=True)
|
||||||
|
def test__validate_node_server_hardware_type(self, mock_hponeview):
|
||||||
|
oneview_client = mock_hponeview()
|
||||||
|
fake_sh = {'serverHardwareTypeUri': 'invalid_fake_sh_uri'}
|
||||||
|
oneview_client.server_hardware.get.return_value = fake_sh
|
||||||
|
oneview_info = {'server_hardware_uri': 'fake_sh_uri',
|
||||||
|
'server_hardware_type_uri': 'fake_sht_uri'}
|
||||||
|
|
||||||
|
self.assertRaises(exception.OneViewError,
|
||||||
|
common._validate_node_server_hardware_type,
|
||||||
|
oneview_client, oneview_info)
|
||||||
|
|
||||||
|
def test__validate_server_profile_template_manage_boot_false(self):
|
||||||
|
fake_spt = {'boot': {'manageBoot': False}}
|
||||||
|
self.assertRaises(exception.OneViewError,
|
||||||
|
common._validate_server_profile_template_manage_boot,
|
||||||
|
fake_spt)
|
||||||
|
|
||||||
|
def test__validate_spt_enclosure_group_invalid(self):
|
||||||
|
fake_spt = {'enclosureGroupUri': 'fake_eg_uri'}
|
||||||
|
fake_sh = {'serverGroupUri': 'invalid_fake_eg_uri'}
|
||||||
|
self.assertRaises(exception.OneViewError,
|
||||||
|
common._validate_spt_enclosure_group,
|
||||||
|
fake_spt, fake_sh)
|
||||||
|
|
||||||
|
def test__validate_server_profile_template_server_hardware_type(self):
|
||||||
|
fake_spt = {'serverHardwareTypeUri': 'fake_sht_uri'}
|
||||||
|
fake_sh = {'serverHardwareTypeUri': 'invalid_fake_sht_uri'}
|
||||||
|
self.assertRaises(
|
||||||
|
exception.OneViewError,
|
||||||
|
common._validate_server_profile_template_server_hardware_type,
|
||||||
|
fake_spt, fake_sh)
|
||||||
|
@ -272,13 +272,17 @@ class OneViewIscsiDeployTestCase(db_base.DbTestCase):
|
|||||||
expected = common.COMMON_PROPERTIES
|
expected = common.COMMON_PROPERTIES
|
||||||
self.assertEqual(expected, self.driver.deploy.get_properties())
|
self.assertEqual(expected, self.driver.deploy.get_properties())
|
||||||
|
|
||||||
|
@mock.patch.object(common, 'validate_oneview_resources_compatibility',
|
||||||
|
spect_set=True, autospec=True)
|
||||||
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'validate',
|
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'validate',
|
||||||
spec_set=True, autospec=True)
|
spec_set=True, autospec=True)
|
||||||
def test_validate(self, iscsi_deploy_validate):
|
def test_validate(
|
||||||
|
self, iscsi_deploy_validate_mock, mock_validate):
|
||||||
with task_manager.acquire(self.context, self.node.uuid,
|
with task_manager.acquire(self.context, self.node.uuid,
|
||||||
shared=False) as task:
|
shared=False) as task:
|
||||||
task.driver.deploy.validate(task)
|
task.driver.deploy.validate(task)
|
||||||
iscsi_deploy_validate.assert_called_once_with(mock.ANY, task)
|
self.assertTrue(mock_validate.called)
|
||||||
|
iscsi_deploy_validate_mock.assert_called_once_with(mock.ANY, task)
|
||||||
|
|
||||||
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'prepare', autospec=True)
|
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'prepare', autospec=True)
|
||||||
@mock.patch.object(deploy_utils, 'allocate_server_hardware_to_ironic')
|
@mock.patch.object(deploy_utils, 'allocate_server_hardware_to_ironic')
|
||||||
@ -395,13 +399,16 @@ class OneViewAgentDeployTestCase(db_base.DbTestCase):
|
|||||||
expected = common.COMMON_PROPERTIES
|
expected = common.COMMON_PROPERTIES
|
||||||
self.assertEqual(expected, self.driver.deploy.get_properties())
|
self.assertEqual(expected, self.driver.deploy.get_properties())
|
||||||
|
|
||||||
|
@mock.patch.object(common, 'validate_oneview_resources_compatibility',
|
||||||
|
spect_set=True, autospec=True)
|
||||||
@mock.patch.object(agent.AgentDeploy, 'validate',
|
@mock.patch.object(agent.AgentDeploy, 'validate',
|
||||||
spec_set=True, autospec=True)
|
spec_set=True, autospec=True)
|
||||||
def test_validate(self, agent_deploy_validate_mock):
|
def test_validate(
|
||||||
|
self, agent_deploy_validate_mock, mock_validate):
|
||||||
with task_manager.acquire(self.context, self.node.uuid,
|
with task_manager.acquire(self.context, self.node.uuid,
|
||||||
shared=False) as task:
|
shared=False) as task:
|
||||||
task.driver.deploy.validate(task)
|
task.driver.deploy.validate(task)
|
||||||
agent_deploy_validate_mock.assert_called_once_with(mock.ANY, task)
|
self.assertTrue(mock_validate.called)
|
||||||
|
|
||||||
@mock.patch.object(agent.AgentDeploy, 'prepare',
|
@mock.patch.object(agent.AgentDeploy, 'prepare',
|
||||||
spec_set=True, autospec=True)
|
spec_set=True, autospec=True)
|
||||||
|
@ -43,13 +43,14 @@ class AgentPXEOneViewInspectTestCase(db_base.DbTestCase):
|
|||||||
shared=True) as task:
|
shared=True) as task:
|
||||||
self.assertEqual(expected, task.driver.inspect.get_properties())
|
self.assertEqual(expected, task.driver.inspect.get_properties())
|
||||||
|
|
||||||
@mock.patch.object(oneview_common, 'verify_node_info')
|
@mock.patch.object(
|
||||||
def test_validate(self, mock_verify_node_info):
|
oneview_common, 'validate_oneview_resources_compatibility')
|
||||||
|
def test_validate(self, mock_validate):
|
||||||
self.config(enabled=False, group='inspector')
|
self.config(enabled=False, group='inspector')
|
||||||
with task_manager.acquire(self.context, self.node.uuid,
|
with task_manager.acquire(self.context, self.node.uuid,
|
||||||
shared=False) as task:
|
shared=False) as task:
|
||||||
task.driver.inspect.validate(task)
|
task.driver.inspect.validate(task)
|
||||||
mock_verify_node_info.assert_called_once_with(task.node)
|
self.assertTrue(mock_validate.called)
|
||||||
|
|
||||||
@mock.patch.object(deploy_utils, 'allocate_server_hardware_to_ironic')
|
@mock.patch.object(deploy_utils, 'allocate_server_hardware_to_ironic')
|
||||||
def test_inspect_hardware(self, mock_allocate_server_hardware_to_ironic):
|
def test_inspect_hardware(self, mock_allocate_server_hardware_to_ironic):
|
||||||
@ -78,13 +79,14 @@ class ISCSIPXEOneViewInspectTestCase(db_base.DbTestCase):
|
|||||||
shared=True) as task:
|
shared=True) as task:
|
||||||
self.assertEqual(expected, task.driver.inspect.get_properties())
|
self.assertEqual(expected, task.driver.inspect.get_properties())
|
||||||
|
|
||||||
@mock.patch.object(oneview_common, 'verify_node_info')
|
@mock.patch.object(
|
||||||
def test_validate(self, mock_verify_node_info):
|
oneview_common, 'validate_oneview_resources_compatibility')
|
||||||
|
def test_validate(self, mock_validate):
|
||||||
self.config(enabled=False, group='inspector')
|
self.config(enabled=False, group='inspector')
|
||||||
with task_manager.acquire(self.context, self.node.uuid,
|
with task_manager.acquire(self.context, self.node.uuid,
|
||||||
shared=False) as task:
|
shared=False) as task:
|
||||||
task.driver.inspect.validate(task)
|
task.driver.inspect.validate(task)
|
||||||
mock_verify_node_info.assert_called_once_with(task.node)
|
self.assertTrue(mock_validate.called)
|
||||||
|
|
||||||
@mock.patch.object(deploy_utils, 'allocate_server_hardware_to_ironic')
|
@mock.patch.object(deploy_utils, 'allocate_server_hardware_to_ironic')
|
||||||
def test_inspect_hardware(self, mock_allocate_server_hardware_to_ironic):
|
def test_inspect_hardware(self, mock_allocate_server_hardware_to_ironic):
|
||||||
|
@ -197,15 +197,19 @@ class OneViewManagementDriverTestCase(db_base.DbTestCase):
|
|||||||
)
|
)
|
||||||
self.info = common.get_oneview_info(self.node)
|
self.info = common.get_oneview_info(self.node)
|
||||||
|
|
||||||
@mock.patch.object(deploy_utils, 'is_node_in_use_by_ironic')
|
@mock.patch.object(deploy_utils, 'is_node_in_use_by_ironic',
|
||||||
@mock.patch.object(common, 'validate_oneview_resources_compatibility')
|
spect_set=True, autospec=True)
|
||||||
|
@mock.patch.object(common, 'validate_oneview_resources_compatibility',
|
||||||
|
spect_set=True, autospec=True)
|
||||||
def test_validate(self, mock_validate, mock_ironic_node):
|
def test_validate(self, mock_validate, mock_ironic_node):
|
||||||
mock_ironic_node.return_value = True
|
mock_ironic_node.return_value = True
|
||||||
with task_manager.acquire(self.context, self.node.uuid) as task:
|
with task_manager.acquire(self.context, self.node.uuid,
|
||||||
|
shared=False) as task:
|
||||||
task.driver.management.validate(task)
|
task.driver.management.validate(task)
|
||||||
self.assertTrue(mock_validate.called)
|
self.assertTrue(mock_validate.called)
|
||||||
|
|
||||||
@mock.patch.object(deploy_utils, 'is_node_in_use_by_ironic')
|
@mock.patch.object(deploy_utils, 'is_node_in_use_by_ironic',
|
||||||
|
spect_set=True, autospec=True)
|
||||||
def test_validate_for_node_not_in_use_by_ironic(self, mock_ironic_node):
|
def test_validate_for_node_not_in_use_by_ironic(self, mock_ironic_node):
|
||||||
mock_ironic_node.return_value = False
|
mock_ironic_node.return_value = False
|
||||||
with task_manager.acquire(self.context, self.node.uuid) as task:
|
with task_manager.acquire(self.context, self.node.uuid) as task:
|
||||||
|
Loading…
Reference in New Issue
Block a user