Merge "Remove pre-allocation model for OneView drivers"
This commit is contained in:
commit
9966bfc651
@ -1569,17 +1569,11 @@ function enroll_nodes {
|
|||||||
mac_address=$(echo $hardware_info |awk '{print $5}')
|
mac_address=$(echo $hardware_info |awk '{print $5}')
|
||||||
local applied_server_profile_uri
|
local applied_server_profile_uri
|
||||||
applied_server_profile_uri=$(echo $hardware_info |awk '{print $6}')
|
applied_server_profile_uri=$(echo $hardware_info |awk '{print $6}')
|
||||||
local dynamic_allocation
|
|
||||||
dynamic_allocation=$(echo $hardware_info |awk '{print $7}')
|
|
||||||
dynamic_allocation=$(trueorfalse False dynamic_allocation)
|
|
||||||
|
|
||||||
node_options+=" -i server_hardware_uri=$server_hardware_uri"
|
node_options+=" -i server_hardware_uri=$server_hardware_uri"
|
||||||
if [[ -n "$applied_server_profile_uri" ]]; then
|
if [[ -n "$applied_server_profile_uri" ]]; then
|
||||||
node_options+=" -i applied_server_profile_uri=$applied_server_profile_uri"
|
node_options+=" -i applied_server_profile_uri=$applied_server_profile_uri"
|
||||||
fi
|
fi
|
||||||
if [[ "$dynamic_allocation" == "True" ]]; then
|
|
||||||
node_options+=" -i dynamic_allocation=$dynamic_allocation"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$node_capabilities" ]]; then
|
if [[ "$node_capabilities" ]]; then
|
||||||
node_capabilities+=","
|
node_capabilities+=","
|
||||||
|
@ -42,14 +42,11 @@ works together with the ironic OneView driver to access a machine in OneView,
|
|||||||
the ``python-oneviewclient`` being responsible for the communication with the
|
the ``python-oneviewclient`` being responsible for the communication with the
|
||||||
OneView appliance.
|
OneView appliance.
|
||||||
|
|
||||||
The Mitaka version of the ironic OneView drivers only supported what we call
|
From the Newton release on, OneView drivers enables a new feature called
|
||||||
**pre-allocation** of nodes, meaning that resources in OneView are allocated
|
**dynamic allocation** of nodes [6]_. In this model, the driver allocates
|
||||||
prior to the node being made available in ironic. This model is deprecated and
|
resources in OneView only at boot time, allowing idle resources in ironic
|
||||||
will be supported until OpenStack's Pike release. From the Newton release on,
|
to be used by OneView users, enabling actual resource sharing among ironic
|
||||||
OneView drivers enables a new feature called **dynamic allocation** of nodes
|
and OneView users.
|
||||||
[6]_. In this model, the driver allocates resources in OneView only at boot
|
|
||||||
time, allowing idle resources in ironic to be used by OneView users, enabling
|
|
||||||
actual resource sharing among ironic and OneView users.
|
|
||||||
|
|
||||||
Since OneView can claim nodes in ``available`` state at any time, a set of
|
Since OneView can claim nodes in ``available`` state at any time, a set of
|
||||||
tasks runs periodically to detect nodes in use by OneView. A node in use by
|
tasks runs periodically to detect nodes in use by OneView. A node in use by
|
||||||
@ -121,12 +118,6 @@ Configuring and enabling the driver
|
|||||||
2. Update the [oneview] section of your ``ironic.conf`` file with your
|
2. Update the [oneview] section of your ``ironic.conf`` file with your
|
||||||
OneView credentials and CA certificate files information.
|
OneView credentials and CA certificate files information.
|
||||||
|
|
||||||
.. note::
|
|
||||||
If you are using the deprecated ``pre-allocation`` feature (i.e.:
|
|
||||||
``dynamic_allocation`` is set to False on all nodes), you can disable the
|
|
||||||
driver periodic tasks by setting ``enable_periodic_tasks=false`` on the
|
|
||||||
[oneview] section of ``ironic.conf``
|
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
An operator can set the ``periodic_check_interval`` option in the [oneview]
|
An operator can set the ``periodic_check_interval`` option in the [oneview]
|
||||||
section to set the interval between running the periodic check. The default
|
section to set the interval between running the periodic check. The default
|
||||||
@ -177,12 +168,6 @@ Configuring and enabling the driver
|
|||||||
2. Update the [oneview] section of your ``ironic.conf`` file with your
|
2. Update the [oneview] section of your ``ironic.conf`` file with your
|
||||||
OneView credentials and CA certificate files information.
|
OneView credentials and CA certificate files information.
|
||||||
|
|
||||||
.. note::
|
|
||||||
If you are using the deprecated ``pre-allocation`` feature (i.e.:
|
|
||||||
``dynamic_allocation`` is set to False on all nodes), you can disable the
|
|
||||||
driver periodic tasks by setting ``enable_periodic_tasks=false`` on the
|
|
||||||
[oneview] section of ``ironic.conf``
|
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
An operator can set the ``periodic_check_interval`` option in the [oneview]
|
An operator can set the ``periodic_check_interval`` option in the [oneview]
|
||||||
section to set the interval between running the periodic check. The default
|
section to set the interval between running the periodic check. The default
|
||||||
@ -224,9 +209,9 @@ memory size, CPU cores, processor architecture and disk size, of a given
|
|||||||
hardware. OneView drivers do in-band inspection, that involves booting a
|
hardware. OneView drivers do in-band inspection, that involves booting a
|
||||||
ramdisk on the hardware and fetching information directly from it. For that,
|
ramdisk on the hardware and fetching information directly from it. For that,
|
||||||
your cloud controller needs to have the ``ironic-inspector`` component
|
your cloud controller needs to have the ``ironic-inspector`` component
|
||||||
[10]_ running and properly enabled in ironic's configuration file.
|
[9]_ running and properly enabled in ironic's configuration file.
|
||||||
|
|
||||||
See [11]_ for more information on how to install and configure
|
See [10]_ for more information on how to install and configure
|
||||||
``ironic-inspector``.
|
``ironic-inspector``.
|
||||||
|
|
||||||
Registering a OneView node in ironic
|
Registering a OneView node in ironic
|
||||||
@ -243,12 +228,6 @@ etc. In this case, to be enrolled, the node must have the following parameters:
|
|||||||
|
|
||||||
- ``server_hardware_uri``: URI of the ``Server Hardware`` on OneView.
|
- ``server_hardware_uri``: URI of the ``Server Hardware`` on OneView.
|
||||||
|
|
||||||
- ``dynamic_allocation``: Boolean value to enable or disable (True/False)
|
|
||||||
``dynamic allocation`` for the given node. If this parameter is not set,
|
|
||||||
the driver will consider the ``pre-allocation`` model to maintain
|
|
||||||
compatibility on ironic upgrade. The support for this key will be dropped
|
|
||||||
in the Pike release, where only dynamic allocation will be used.
|
|
||||||
|
|
||||||
* In ``properties/capabilities``
|
* In ``properties/capabilities``
|
||||||
|
|
||||||
- ``server_hardware_type_uri``: URI of the ``Server Hardware Type`` of the
|
- ``server_hardware_type_uri``: URI of the ``Server Hardware Type`` of the
|
||||||
@ -294,13 +273,6 @@ from them MUST comply with the following requirements:
|
|||||||
Node ports should be created considering the **MAC address of the first
|
Node ports should be created considering the **MAC address of the first
|
||||||
Interface** of the given ``Server Hardware``.
|
Interface** of the given ``Server Hardware``.
|
||||||
|
|
||||||
.. note::
|
|
||||||
Old versions of ironic using ``pre-allocation`` model (before Newton
|
|
||||||
release) and nodes with `dynamic_allocation` flag disabled shall have their
|
|
||||||
``Server Profiles`` applied during node enrollment and can have their ports
|
|
||||||
created using the `Virtual` MAC addresses provided on ``Server Profile``
|
|
||||||
application.
|
|
||||||
|
|
||||||
To tell ironic which NIC should be connected to the provisioning network, do::
|
To tell ironic which NIC should be connected to the provisioning network, do::
|
||||||
|
|
||||||
$ ironic port-create -n $NODE_UUID -a $MAC_ADDRESS
|
$ ironic port-create -n $NODE_UUID -a $MAC_ADDRESS
|
||||||
@ -319,102 +291,6 @@ Profile``, ``Server Profile Template`` and other OneView entities, refer to
|
|||||||
power state change. Ironic will NOT change the power state of machines
|
power state change. Ironic will NOT change the power state of machines
|
||||||
which the Server Profile was applied by another OneView user.
|
which the Server Profile was applied by another OneView user.
|
||||||
|
|
||||||
Migrating from pre-allocation to dynamic allocation
|
|
||||||
===================================================
|
|
||||||
|
|
||||||
The migration of a node from an ironic deployment using ``pre-allocation``
|
|
||||||
model to the new ``dynamic allocation`` model can be done by using
|
|
||||||
``ironic-oneview-cli`` facilities to migrate nodes (further details on [8]_).
|
|
||||||
However, the same results can be achieved using the ironic CLI as explained
|
|
||||||
below.
|
|
||||||
|
|
||||||
Checking if a node can be migrated
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
It is recommended to migrate nodes which are in a stable `provision state`. That
|
|
||||||
means the conductor is not performing an operation with the node, what can
|
|
||||||
impact in the execution of a migration. The possible stable `provision_state`
|
|
||||||
values [9_] are: `enroll`, `manageable`, `available`, `active`, `error`,
|
|
||||||
`clean failed` and `inspect failed`.
|
|
||||||
|
|
||||||
Dynamic allocation mode changes the way a ``Server Profile`` is associated with
|
|
||||||
a node. In ``pre-allocation`` mode, when a node is registered in ironic, there
|
|
||||||
must be a ``Server Profile`` applied to the ``Server Hardware`` represented by
|
|
||||||
the given node what means, from the OneView point of view, the hardware is in
|
|
||||||
use. In the ``dynamic allocation`` mode a ``Server Hardware`` is associated only
|
|
||||||
when the node is in use by the Compute service or the OneView itself. As a
|
|
||||||
result, there are different steps to perform if the node has an instance
|
|
||||||
provisioned, in other words, when the `provisioning_state` is set to `active`.
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
Verify if the node has not already been migrated by checking if there is
|
|
||||||
a `dynamic_allocation` field set to ``True`` in the `driver_info`
|
|
||||||
namespace by doing::
|
|
||||||
|
|
||||||
$ ironic node-show --fields driver_info
|
|
||||||
|
|
||||||
Migrating nodes in `active` state
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
List nodes that are in `active` state doing::
|
|
||||||
|
|
||||||
$ ironic node-list --provision-state active --fields uuid driver_info
|
|
||||||
|
|
||||||
Execute the following steps for each node:
|
|
||||||
|
|
||||||
1. Identify the ``Server Hardware`` UUID looking at ``server_hardware_uri``
|
|
||||||
property (formatted as ``/rest/server-hardware/<server-hardware-uuid>``) in
|
|
||||||
the node's ``driver_info`` namespace doing::
|
|
||||||
|
|
||||||
$ ironic node-show <node-uuid> --fields driver_info
|
|
||||||
|
|
||||||
2. Log into OneView and find the ``Server Hardware`` searching for the
|
|
||||||
``Server Hardware`` UUID identified in step 1. On the overview section,
|
|
||||||
find the applied ``Server Profile`` entry, click on it and copy the
|
|
||||||
``Server Profile`` URI. The copied excerpt should look like
|
|
||||||
``/rest/server-profiles/<server-profile-uuid>``.
|
|
||||||
|
|
||||||
3. Then, set the copied excerpt from the ``Server Profile`` URI to the property
|
|
||||||
``applied_server_profile_uri`` in the ``driver_info`` namespace doing::
|
|
||||||
|
|
||||||
$ ironic node-update <node-uuid> add driver_info/applied_server_profile_uri=<server_profile_uri>
|
|
||||||
|
|
||||||
4. Finally, set the `dynamic_allocation` flag in the ``driver_info`` namespace
|
|
||||||
to ``True`` in order to finish the migration of the node doing::
|
|
||||||
|
|
||||||
$ ironic node-update <node-uuid> add driver_info/dynamic_allocation=True
|
|
||||||
|
|
||||||
Other cases for migration
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
Remember these steps are valid for nodes in the following states: `enroll`,
|
|
||||||
`manageable`, `available`, `error`, `clean failed` and `inspect failed`. So,
|
|
||||||
list the nodes in a given state, then execute the migration following steps for
|
|
||||||
each node:
|
|
||||||
|
|
||||||
1. Place the node in maintenance mode to prevent ironic from working on the node
|
|
||||||
during the migration doing::
|
|
||||||
|
|
||||||
$ ironic node-set-maintenance --reason "Migrating node to dynamic allocation" <node_uuid> true
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
It's recommended to check if the node's state has not changed as there is no way
|
|
||||||
of locking the node between these commands.
|
|
||||||
|
|
||||||
2. Identify which ``Server Profile`` is associated by checking the property
|
|
||||||
``server_hardware_uri`` in the ``driver_info`` namespace. Using the
|
|
||||||
``server_hardware_uri``, log into OneView and remove the ``Server Profile``.
|
|
||||||
|
|
||||||
3. Set the `dynamic_allocation` to ``True`` in the flag ``driver_info``
|
|
||||||
namespace doing::
|
|
||||||
|
|
||||||
$ ironic node-update $NODE_UUID add driver_info/dynamic_allocation=True
|
|
||||||
|
|
||||||
4. Finally, in order to put the node back into the resource pool, remove the
|
|
||||||
node from maintenance mode doing::
|
|
||||||
|
|
||||||
$ ironic node-set-maintenance <node_uuid> false
|
|
||||||
|
|
||||||
3rd Party Tools
|
3rd Party Tools
|
||||||
===============
|
===============
|
||||||
|
|
||||||
@ -427,8 +303,7 @@ ironic-oneview-cli
|
|||||||
The ``ironic-oneView`` CLI is a command line interface for management tasks
|
The ``ironic-oneView`` CLI is a command line interface for management tasks
|
||||||
involving OneView nodes. Its features include a facility to create of ironic
|
involving OneView nodes. Its features include a facility to create of ironic
|
||||||
nodes with all required parameters for OneView nodes, creation of Nova flavors
|
nodes with all required parameters for OneView nodes, creation of Nova flavors
|
||||||
for OneView nodes and, starting from version 0.3.0, the migration of nodes from
|
for OneView nodes.
|
||||||
``pre-allocation`` to the ``dynamic allocation`` model.
|
|
||||||
|
|
||||||
For more details on how Ironic-OneView CLI works and how to set it up, see
|
For more details on how Ironic-OneView CLI works and how to set it up, see
|
||||||
[8]_.
|
[8]_.
|
||||||
@ -437,9 +312,7 @@ ironic-oneviewd
|
|||||||
^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
The ``ironic-oneviewd`` daemon monitors the ironic inventory of resources and
|
The ``ironic-oneviewd`` daemon monitors the ironic inventory of resources and
|
||||||
provides facilities to operators managing OneView driver deployments. The
|
provides facilities to operators managing OneView driver deployments.
|
||||||
daemon supports both allocation models (dynamic and pre-allocation) as of
|
|
||||||
version 0.1.0.
|
|
||||||
|
|
||||||
For more details on how Ironic-OneViewd works and how to set it up, see [7]_.
|
For more details on how Ironic-OneViewd works and how to set it up, see [7]_.
|
||||||
|
|
||||||
@ -453,6 +326,5 @@ References
|
|||||||
.. [6] Dynamic Allocation in OneView drivers - http://specs.openstack.org/openstack/ironic-specs/specs/not-implemented/oneview-drivers-dynamic-allocation.html
|
.. [6] Dynamic Allocation in OneView drivers - http://specs.openstack.org/openstack/ironic-specs/specs/not-implemented/oneview-drivers-dynamic-allocation.html
|
||||||
.. [7] ironic-oneviewd - https://pypi.python.org/pypi/ironic-oneviewd/
|
.. [7] ironic-oneviewd - https://pypi.python.org/pypi/ironic-oneviewd/
|
||||||
.. [8] ironic-oneview-cli - https://pypi.python.org/pypi/ironic-oneview-cli/
|
.. [8] ironic-oneview-cli - https://pypi.python.org/pypi/ironic-oneview-cli/
|
||||||
.. [9] :ref:`states`
|
.. [9] ironic-inspector - http://docs.openstack.org/developer/ironic-inspector/
|
||||||
.. [10] ironic-inspector - http://docs.openstack.org/developer/ironic-inspector/
|
.. [10] ironic-inspector install - http://docs.openstack.org/developer/ironic-inspector/install.html
|
||||||
.. [11] ironic-inspector install - http://docs.openstack.org/developer/ironic-inspector/install.html
|
|
||||||
|
@ -15,7 +15,6 @@
|
|||||||
|
|
||||||
from oslo_log import log as logging
|
from oslo_log import log as logging
|
||||||
from oslo_utils import importutils
|
from oslo_utils import importutils
|
||||||
from oslo_utils import strutils
|
|
||||||
|
|
||||||
from ironic.common import exception
|
from ironic.common import exception
|
||||||
from ironic.common.i18n import _, _LE
|
from ironic.common.i18n import _, _LE
|
||||||
@ -179,22 +178,10 @@ def validate_oneview_resources_compatibility(oneview_client, task):
|
|||||||
task.node.properties.get('memory_mb'),
|
task.node.properties.get('memory_mb'),
|
||||||
task.node.properties.get('cpus')
|
task.node.properties.get('cpus')
|
||||||
)
|
)
|
||||||
|
oneview_client.is_node_port_mac_compatible_with_server_hardware(
|
||||||
# NOTE(thiagop): Support to pre-allocation will be dropped in the Pike
|
oneview_info, node_ports
|
||||||
# release.
|
)
|
||||||
# NOTE(mrtenio): The Server Profile Template needs to have a physical
|
oneview_client.validate_server_profile_template_mac_type(spt_uuid)
|
||||||
# MAC when using dynamic_allocation. This will be the default behavior
|
|
||||||
# in the Pike Release.
|
|
||||||
if is_dynamic_allocation_enabled(task.node):
|
|
||||||
oneview_client.is_node_port_mac_compatible_with_server_hardware(
|
|
||||||
oneview_info, node_ports
|
|
||||||
)
|
|
||||||
oneview_client.validate_server_profile_template_mac_type(spt_uuid)
|
|
||||||
else:
|
|
||||||
oneview_client.check_server_profile_is_applied(oneview_info)
|
|
||||||
oneview_client.is_node_port_mac_compatible_with_server_profile(
|
|
||||||
oneview_info, node_ports
|
|
||||||
)
|
|
||||||
|
|
||||||
except oneview_exceptions.OneViewException as oneview_exc:
|
except oneview_exceptions.OneViewException as oneview_exc:
|
||||||
msg = (_("Error validating node resources with OneView: %s") %
|
msg = (_("Error validating node resources with OneView: %s") %
|
||||||
@ -272,15 +259,3 @@ def node_has_server_profile(func):
|
|||||||
)
|
)
|
||||||
return func(self, *args, **kwargs)
|
return func(self, *args, **kwargs)
|
||||||
return inner
|
return inner
|
||||||
|
|
||||||
|
|
||||||
def is_dynamic_allocation_enabled(node):
|
|
||||||
flag = node.driver_info.get('dynamic_allocation')
|
|
||||||
if flag:
|
|
||||||
try:
|
|
||||||
return strutils.bool_from_string(flag, strict=True)
|
|
||||||
except ValueError:
|
|
||||||
msg = (_LE("Invalid dynamic_allocation parameter value "
|
|
||||||
"'%(flag)s' in node's %(node_uuid)s driver_info.") %
|
|
||||||
{"flag": flag, "node_uuid": node.uuid})
|
|
||||||
raise exception.InvalidParameterValue(msg)
|
|
||||||
|
@ -246,27 +246,23 @@ class OneViewIscsiDeploy(iscsi_deploy.ISCSIDeploy, OneViewPeriodicTasks):
|
|||||||
|
|
||||||
@METRICS.timer('OneViewIscsiDeploy.prepare')
|
@METRICS.timer('OneViewIscsiDeploy.prepare')
|
||||||
def prepare(self, task):
|
def prepare(self, task):
|
||||||
if common.is_dynamic_allocation_enabled(task.node):
|
deploy_utils.prepare(self.oneview_client, task)
|
||||||
deploy_utils.prepare(self.oneview_client, task)
|
|
||||||
super(OneViewIscsiDeploy, self).prepare(task)
|
super(OneViewIscsiDeploy, self).prepare(task)
|
||||||
|
|
||||||
@METRICS.timer('OneViewIscsiDeploy.tear_down')
|
@METRICS.timer('OneViewIscsiDeploy.tear_down')
|
||||||
def tear_down(self, task):
|
def tear_down(self, task):
|
||||||
if (common.is_dynamic_allocation_enabled(task.node) and
|
if not CONF.conductor.automated_clean:
|
||||||
not CONF.conductor.automated_clean):
|
|
||||||
deploy_utils.tear_down(self.oneview_client, task)
|
deploy_utils.tear_down(self.oneview_client, task)
|
||||||
return super(OneViewIscsiDeploy, self).tear_down(task)
|
return super(OneViewIscsiDeploy, self).tear_down(task)
|
||||||
|
|
||||||
@METRICS.timer('OneViewIscsiDeploy.prepare_cleaning')
|
@METRICS.timer('OneViewIscsiDeploy.prepare_cleaning')
|
||||||
def prepare_cleaning(self, task):
|
def prepare_cleaning(self, task):
|
||||||
if common.is_dynamic_allocation_enabled(task.node):
|
deploy_utils.prepare_cleaning(self.oneview_client, task)
|
||||||
deploy_utils.prepare_cleaning(self.oneview_client, task)
|
|
||||||
return super(OneViewIscsiDeploy, self).prepare_cleaning(task)
|
return super(OneViewIscsiDeploy, self).prepare_cleaning(task)
|
||||||
|
|
||||||
@METRICS.timer('OneViewIscsiDeploy.tear_down_cleaning')
|
@METRICS.timer('OneViewIscsiDeploy.tear_down_cleaning')
|
||||||
def tear_down_cleaning(self, task):
|
def tear_down_cleaning(self, task):
|
||||||
if common.is_dynamic_allocation_enabled(task.node):
|
deploy_utils.tear_down_cleaning(self.oneview_client, task)
|
||||||
deploy_utils.tear_down_cleaning(self.oneview_client, task)
|
|
||||||
super(OneViewIscsiDeploy, self).tear_down_cleaning(task)
|
super(OneViewIscsiDeploy, self).tear_down_cleaning(task)
|
||||||
|
|
||||||
|
|
||||||
@ -381,25 +377,21 @@ class OneViewAgentDeploy(OneViewAgentDeployMixin, agent.AgentDeploy,
|
|||||||
|
|
||||||
@METRICS.timer('OneViewAgentDeploy.prepare')
|
@METRICS.timer('OneViewAgentDeploy.prepare')
|
||||||
def prepare(self, task):
|
def prepare(self, task):
|
||||||
if common.is_dynamic_allocation_enabled(task.node):
|
deploy_utils.prepare(self.oneview_client, task)
|
||||||
deploy_utils.prepare(self.oneview_client, task)
|
|
||||||
super(OneViewAgentDeploy, self).prepare(task)
|
super(OneViewAgentDeploy, self).prepare(task)
|
||||||
|
|
||||||
@METRICS.timer('OneViewAgentDeploy.tear_down')
|
@METRICS.timer('OneViewAgentDeploy.tear_down')
|
||||||
def tear_down(self, task):
|
def tear_down(self, task):
|
||||||
if (common.is_dynamic_allocation_enabled(task.node) and
|
if not CONF.conductor.automated_clean:
|
||||||
not CONF.conductor.automated_clean):
|
|
||||||
deploy_utils.tear_down(self.oneview_client, task)
|
deploy_utils.tear_down(self.oneview_client, task)
|
||||||
return super(OneViewAgentDeploy, self).tear_down(task)
|
return super(OneViewAgentDeploy, self).tear_down(task)
|
||||||
|
|
||||||
@METRICS.timer('OneViewAgentDeploy.prepare_cleaning')
|
@METRICS.timer('OneViewAgentDeploy.prepare_cleaning')
|
||||||
def prepare_cleaning(self, task):
|
def prepare_cleaning(self, task):
|
||||||
if common.is_dynamic_allocation_enabled(task.node):
|
deploy_utils.prepare_cleaning(self.oneview_client, task)
|
||||||
deploy_utils.prepare_cleaning(self.oneview_client, task)
|
|
||||||
return super(OneViewAgentDeploy, self).prepare_cleaning(task)
|
return super(OneViewAgentDeploy, self).prepare_cleaning(task)
|
||||||
|
|
||||||
@METRICS.timer('OneViewAgentDeploy.tear_down_cleaning')
|
@METRICS.timer('OneViewAgentDeploy.tear_down_cleaning')
|
||||||
def tear_down_cleaning(self, task):
|
def tear_down_cleaning(self, task):
|
||||||
if common.is_dynamic_allocation_enabled(task.node):
|
deploy_utils.tear_down_cleaning(self.oneview_client, task)
|
||||||
deploy_utils.tear_down_cleaning(self.oneview_client, task)
|
|
||||||
super(OneViewAgentDeploy, self).tear_down_cleaning(task)
|
super(OneViewAgentDeploy, self).tear_down_cleaning(task)
|
||||||
|
@ -234,58 +234,18 @@ class OneViewCommonTestCase(db_base.DbTestCase):
|
|||||||
def test_validate_oneview_resources_compatibility(
|
def test_validate_oneview_resources_compatibility(
|
||||||
self, mock_get_ov_client
|
self, mock_get_ov_client
|
||||||
):
|
):
|
||||||
oneview_client = mock_get_ov_client()
|
"""Validate compatibility of resources.
|
||||||
with task_manager.acquire(self.context, self.node.uuid) as task:
|
|
||||||
common.validate_oneview_resources_compatibility(oneview_client,
|
|
||||||
task)
|
|
||||||
self.assertTrue(
|
|
||||||
oneview_client.validate_node_server_hardware.called)
|
|
||||||
self.assertTrue(
|
|
||||||
oneview_client.validate_node_server_hardware_type.called)
|
|
||||||
self.assertTrue(
|
|
||||||
oneview_client.validate_node_enclosure_group.called)
|
|
||||||
self.assertTrue(
|
|
||||||
oneview_client.validate_node_server_profile_template.called)
|
|
||||||
self.assertTrue(
|
|
||||||
oneview_client.check_server_profile_is_applied.called)
|
|
||||||
self.assertTrue(
|
|
||||||
oneview_client.
|
|
||||||
is_node_port_mac_compatible_with_server_profile.called)
|
|
||||||
self.assertFalse(
|
|
||||||
oneview_client.
|
|
||||||
is_node_port_mac_compatible_with_server_hardware.called)
|
|
||||||
self.assertFalse(
|
|
||||||
oneview_client.validate_spt_primary_boot_connection.called)
|
|
||||||
self.assertFalse(
|
|
||||||
oneview_client.
|
|
||||||
validate_server_profile_template_mac_type.called)
|
|
||||||
|
|
||||||
@mock.patch.object(common, 'get_oneview_client', spec_set=True,
|
1) Check validate_node_server_profile_template method is called
|
||||||
autospec=True)
|
2) Check validate_node_server_hardware_type method is called
|
||||||
def test_validate_oneview_resources_compatibility_dynamic_allocation(
|
3) Check validate_node_enclosure_group method is called
|
||||||
self, mock_get_ov_client
|
4) Check validate_node_server_hardware method is called
|
||||||
):
|
5) Check is_node_port_mac_compatible_with_server_hardware method
|
||||||
"""Validate compatibility of resources for Dynamic Allocation model.
|
|
||||||
|
|
||||||
1) Set 'dynamic_allocation' flag as True on node's driver_info
|
|
||||||
2) Check validate_node_server_profile_template method is called
|
|
||||||
3) Check validate_node_server_hardware_type method is called
|
|
||||||
4) Check validate_node_enclosure_group method is called
|
|
||||||
5) Check validate_node_server_hardware method is called
|
|
||||||
6) Check is_node_port_mac_compatible_with_server_hardware method
|
|
||||||
is called
|
is called
|
||||||
7) Check validate_server_profile_template_mac_type method is called
|
6) Check validate_server_profile_template_mac_type method is called
|
||||||
8) Check check_server_profile_is_applied method is not called
|
|
||||||
9) Check is_node_port_mac_compatible_with_server_profile method is
|
|
||||||
not called
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
oneview_client = mock_get_ov_client()
|
oneview_client = mock_get_ov_client()
|
||||||
with task_manager.acquire(self.context, self.node.uuid) as task:
|
with task_manager.acquire(self.context, self.node.uuid) as task:
|
||||||
driver_info = task.node.driver_info
|
|
||||||
driver_info['dynamic_allocation'] = True
|
|
||||||
task.node.driver_info = driver_info
|
|
||||||
|
|
||||||
common.validate_oneview_resources_compatibility(oneview_client,
|
common.validate_oneview_resources_compatibility(oneview_client,
|
||||||
task)
|
task)
|
||||||
self.assertTrue(
|
self.assertTrue(
|
||||||
@ -302,118 +262,3 @@ class OneViewCommonTestCase(db_base.DbTestCase):
|
|||||||
self.assertTrue(
|
self.assertTrue(
|
||||||
oneview_client.
|
oneview_client.
|
||||||
validate_server_profile_template_mac_type.called)
|
validate_server_profile_template_mac_type.called)
|
||||||
self.assertFalse(
|
|
||||||
oneview_client.check_server_profile_is_applied.called)
|
|
||||||
self.assertFalse(
|
|
||||||
oneview_client.
|
|
||||||
is_node_port_mac_compatible_with_server_profile.called)
|
|
||||||
|
|
||||||
def test_is_dynamic_allocation_enabled_boolean(self):
|
|
||||||
"""Ensure Dynamic Allocation is enabled when flag is True.
|
|
||||||
|
|
||||||
1) Set 'dynamic_allocation' flag as True on node's driver_info
|
|
||||||
2) Check Dynamic Allocation is enabled for the given node
|
|
||||||
|
|
||||||
"""
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid) as task:
|
|
||||||
driver_info = task.node.driver_info
|
|
||||||
driver_info['dynamic_allocation'] = True
|
|
||||||
task.node.driver_info = driver_info
|
|
||||||
|
|
||||||
self.assertTrue(
|
|
||||||
common.is_dynamic_allocation_enabled(task.node)
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_is_dynamic_allocation_enabled_string(self):
|
|
||||||
"""Ensure Dynamic Allocation is enabled when flag is 'True'.
|
|
||||||
|
|
||||||
1) Set 'dynamic_allocation' flag as True on node's driver_info
|
|
||||||
2) Check Dynamic Allocation is enabled for the given node
|
|
||||||
|
|
||||||
"""
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid) as task:
|
|
||||||
driver_info = task.node.driver_info
|
|
||||||
driver_info['dynamic_allocation'] = 'True'
|
|
||||||
task.node.driver_info = driver_info
|
|
||||||
|
|
||||||
self.assertTrue(
|
|
||||||
common.is_dynamic_allocation_enabled(task.node)
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_is_dynamic_allocation_enabled_false_boolean(self):
|
|
||||||
"""Ensure Dynamic Allocation is disabled when flag is False.
|
|
||||||
|
|
||||||
1) Set 'dynamic_allocation' flag as False on node's driver_info
|
|
||||||
2) Check Dynamic Allocation is disabled for the given node
|
|
||||||
|
|
||||||
"""
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid) as task:
|
|
||||||
driver_info = task.node.driver_info
|
|
||||||
driver_info['dynamic_allocation'] = False
|
|
||||||
task.node.driver_info = driver_info
|
|
||||||
|
|
||||||
self.assertFalse(
|
|
||||||
common.is_dynamic_allocation_enabled(task.node)
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_is_dynamic_allocation_enabled_false_string(self):
|
|
||||||
"""Ensure Dynamic Allocation is disabled when flag is 'False'.
|
|
||||||
|
|
||||||
1) Set 'dynamic_allocation' flag as False on node's driver_info
|
|
||||||
2) Check Dynamic Allocation is disabled for the given node
|
|
||||||
|
|
||||||
"""
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid) as task:
|
|
||||||
driver_info = task.node.driver_info
|
|
||||||
driver_info['dynamic_allocation'] = 'False'
|
|
||||||
task.node.driver_info = driver_info
|
|
||||||
|
|
||||||
self.assertFalse(
|
|
||||||
common.is_dynamic_allocation_enabled(task.node)
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_is_dynamic_allocation_enabled_none_object(self):
|
|
||||||
"""Ensure Dynamic Allocation is disabled when flag is None.
|
|
||||||
|
|
||||||
1) Set 'dynamic_allocation' flag as None on node's driver_info
|
|
||||||
2) Check Dynamic Allocation is disabled for the given node
|
|
||||||
|
|
||||||
"""
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid) as task:
|
|
||||||
driver_info = task.node.driver_info
|
|
||||||
driver_info['dynamic_allocation'] = None
|
|
||||||
task.node.driver_info = driver_info
|
|
||||||
|
|
||||||
self.assertFalse(
|
|
||||||
common.is_dynamic_allocation_enabled(task.node)
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_is_dynamic_allocation_enabled_without_flag(self):
|
|
||||||
"""Ensure Dynamic Allocation is disabled when node doesn't have flag.
|
|
||||||
|
|
||||||
1) Create a node without 'dynamic_allocation' flag
|
|
||||||
2) Check Dynamic Allocation is disabled for the given node
|
|
||||||
|
|
||||||
"""
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid) as task:
|
|
||||||
self.assertFalse(
|
|
||||||
common.is_dynamic_allocation_enabled(task.node)
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_is_dynamic_allocation_enabled_with_invalid_value_for_flag(self):
|
|
||||||
"""Ensure raises an InvalidParameterValue when flag is invalid.
|
|
||||||
|
|
||||||
1) Create a node with an invalid value for 'dynamic_allocation' flag
|
|
||||||
2) Check if method raises an InvalidParameterValue for the given node
|
|
||||||
|
|
||||||
"""
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid) as task:
|
|
||||||
driver_info = task.node.driver_info
|
|
||||||
driver_info['dynamic_allocation'] = 'invalid flag'
|
|
||||||
task.node.driver_info = driver_info
|
|
||||||
|
|
||||||
self.assertRaises(
|
|
||||||
exception.InvalidParameterValue,
|
|
||||||
common.is_dynamic_allocation_enabled,
|
|
||||||
task.node
|
|
||||||
)
|
|
||||||
|
@ -599,13 +599,16 @@ class OneViewIscsiDeployTestCase(db_base.DbTestCase):
|
|||||||
|
|
||||||
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'prepare',
|
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'prepare',
|
||||||
spec_set=True, autospec=True)
|
spec_set=True, autospec=True)
|
||||||
def test_prepare(self, iscsi_deploy_prepare_mock, mock_get_ov_client):
|
@mock.patch.object(deploy_utils, 'allocate_server_hardware_to_ironic')
|
||||||
|
def test_prepare(self, allocate_server_hardware_mock,
|
||||||
|
iscsi_deploy_prepare_mock, mock_get_ov_client):
|
||||||
self.node.provision_state = states.DEPLOYING
|
self.node.provision_state = states.DEPLOYING
|
||||||
self.node.save()
|
self.node.save()
|
||||||
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.prepare(task)
|
task.driver.deploy.prepare(task)
|
||||||
iscsi_deploy_prepare_mock.assert_called_once_with(mock.ANY, task)
|
iscsi_deploy_prepare_mock.assert_called_once_with(mock.ANY, task)
|
||||||
|
self.assertTrue(allocate_server_hardware_mock.called)
|
||||||
|
|
||||||
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'prepare',
|
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'prepare',
|
||||||
spec_set=True, autospec=True)
|
spec_set=True, autospec=True)
|
||||||
@ -626,25 +629,6 @@ class OneViewIscsiDeployTestCase(db_base.DbTestCase):
|
|||||||
iscsi_deploy_prepare_mock.assert_called_once_with(
|
iscsi_deploy_prepare_mock.assert_called_once_with(
|
||||||
mock.ANY, task)
|
mock.ANY, task)
|
||||||
|
|
||||||
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'prepare',
|
|
||||||
spec_set=True, autospec=True)
|
|
||||||
@mock.patch.object(deploy_utils, 'allocate_server_hardware_to_ironic')
|
|
||||||
def test_prepare_with_dynamic_allocation_enabled(
|
|
||||||
self, allocate_server_hardware_mock,
|
|
||||||
iscsi_deploy_prepare_mock, mock_get_ov_client
|
|
||||||
):
|
|
||||||
driver_info = self.node.driver_info
|
|
||||||
driver_info['dynamic_allocation'] = True
|
|
||||||
self.node.driver_info = driver_info
|
|
||||||
self.node.provision_state = states.DEPLOYING
|
|
||||||
self.node.save()
|
|
||||||
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid,
|
|
||||||
shared=False) as task:
|
|
||||||
task.driver.deploy.prepare(task)
|
|
||||||
iscsi_deploy_prepare_mock.assert_called_once_with(mock.ANY, task)
|
|
||||||
self.assertTrue(allocate_server_hardware_mock.called)
|
|
||||||
|
|
||||||
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'deploy',
|
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'deploy',
|
||||||
spec_set=True, autospec=True)
|
spec_set=True, autospec=True)
|
||||||
def test_deploy(self, iscsi_deploy_mock, mock_get_ov_client):
|
def test_deploy(self, iscsi_deploy_mock, mock_get_ov_client):
|
||||||
@ -666,14 +650,10 @@ class OneViewIscsiDeployTestCase(db_base.DbTestCase):
|
|||||||
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'tear_down', spec_set=True,
|
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'tear_down', spec_set=True,
|
||||||
autospec=True)
|
autospec=True)
|
||||||
@mock.patch.object(deploy_utils, 'deallocate_server_hardware_from_ironic')
|
@mock.patch.object(deploy_utils, 'deallocate_server_hardware_from_ironic')
|
||||||
def test_tear_down_with_dynamic_allocation_enabled(
|
def test_tear_down_with_automated_clean_disabled(
|
||||||
self, deallocate_server_hardware_mock,
|
self, deallocate_server_hardware_mock,
|
||||||
iscsi_tear_down_mock, mock_get_ov_client
|
iscsi_tear_down_mock, mock_get_ov_client
|
||||||
):
|
):
|
||||||
driver_info = self.node.driver_info
|
|
||||||
driver_info['dynamic_allocation'] = True
|
|
||||||
self.node.driver_info = driver_info
|
|
||||||
self.node.save()
|
|
||||||
CONF.conductor.automated_clean = False
|
CONF.conductor.automated_clean = False
|
||||||
iscsi_tear_down_mock.return_value = states.DELETED
|
iscsi_tear_down_mock.return_value = states.DELETED
|
||||||
|
|
||||||
@ -684,29 +664,12 @@ class OneViewIscsiDeployTestCase(db_base.DbTestCase):
|
|||||||
self.assertEqual(states.DELETED, returned_state)
|
self.assertEqual(states.DELETED, returned_state)
|
||||||
self.assertTrue(deallocate_server_hardware_mock.called)
|
self.assertTrue(deallocate_server_hardware_mock.called)
|
||||||
|
|
||||||
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'prepare_cleaning',
|
|
||||||
spec_set=True, autospec=True)
|
|
||||||
def test_prepare_cleaning(self, iscsi_prep_clean_mock, mock_get_ov_client):
|
|
||||||
iscsi_prep_clean_mock.return_value = states.CLEANWAIT
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid,
|
|
||||||
shared=False) as task:
|
|
||||||
ret = task.driver.deploy.prepare_cleaning(task)
|
|
||||||
self.assertEqual(states.CLEANWAIT, ret)
|
|
||||||
iscsi_prep_clean_mock.assert_called_once_with(mock.ANY, task)
|
|
||||||
|
|
||||||
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'prepare_cleaning',
|
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'prepare_cleaning',
|
||||||
spec_set=True, autospec=True)
|
spec_set=True, autospec=True)
|
||||||
@mock.patch.object(deploy_utils, 'allocate_server_hardware_to_ironic')
|
@mock.patch.object(deploy_utils, 'allocate_server_hardware_to_ironic')
|
||||||
def test_prepare_cleaning_with_dynamic_allocation_enabled(
|
def test_prepare_cleaning(self, allocate_server_hardware_mock,
|
||||||
self, allocate_server_hardware_mock,
|
iscsi_prep_clean_mock, mock_get_ov_client):
|
||||||
iscsi_prep_clean_mock, mock_get_ov_client
|
|
||||||
):
|
|
||||||
driver_info = self.node.driver_info
|
|
||||||
driver_info['dynamic_allocation'] = True
|
|
||||||
self.node.driver_info = driver_info
|
|
||||||
self.node.save()
|
|
||||||
iscsi_prep_clean_mock.return_value = states.CLEANWAIT
|
iscsi_prep_clean_mock.return_value = states.CLEANWAIT
|
||||||
|
|
||||||
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:
|
||||||
ret = task.driver.deploy.prepare_cleaning(task)
|
ret = task.driver.deploy.prepare_cleaning(task)
|
||||||
@ -714,27 +677,13 @@ class OneViewIscsiDeployTestCase(db_base.DbTestCase):
|
|||||||
iscsi_prep_clean_mock.assert_called_once_with(mock.ANY, task)
|
iscsi_prep_clean_mock.assert_called_once_with(mock.ANY, task)
|
||||||
self.assertTrue(allocate_server_hardware_mock.called)
|
self.assertTrue(allocate_server_hardware_mock.called)
|
||||||
|
|
||||||
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'tear_down_cleaning',
|
|
||||||
spec_set=True, autospec=True)
|
|
||||||
def test_tear_down_cleaning(self, iscsi_tear_down_clean_mock,
|
|
||||||
mock_get_ov_client):
|
|
||||||
iscsi_tear_down_clean_mock.return_value = states.CLEANWAIT
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid,
|
|
||||||
shared=False) as task:
|
|
||||||
task.driver.deploy.tear_down_cleaning(task)
|
|
||||||
iscsi_tear_down_clean_mock.assert_called_once_with(mock.ANY, task)
|
|
||||||
|
|
||||||
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'tear_down_cleaning',
|
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'tear_down_cleaning',
|
||||||
spec_set=True, autospec=True)
|
spec_set=True, autospec=True)
|
||||||
@mock.patch.object(deploy_utils, 'deallocate_server_hardware_from_ironic')
|
@mock.patch.object(deploy_utils, 'deallocate_server_hardware_from_ironic')
|
||||||
def test_tear_down_cleaning_with_dynamic_allocation_enabled(
|
def test_tear_down_cleaning(
|
||||||
self, deallocate_server_hardware_mock,
|
self, deallocate_server_hardware_mock, iscsi_tear_down_clean_mock,
|
||||||
iscsi_tear_down_clean_mock, mock_get_ov_client
|
mock_get_ov_client
|
||||||
):
|
):
|
||||||
driver_info = self.node.driver_info
|
|
||||||
driver_info['dynamic_allocation'] = True
|
|
||||||
self.node.driver_info = driver_info
|
|
||||||
self.node.save()
|
|
||||||
iscsi_tear_down_clean_mock.return_value = states.CLEANWAIT
|
iscsi_tear_down_clean_mock.return_value = states.CLEANWAIT
|
||||||
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid,
|
with task_manager.acquire(self.context, self.node.uuid,
|
||||||
@ -781,13 +730,16 @@ class OneViewAgentDeployTestCase(db_base.DbTestCase):
|
|||||||
|
|
||||||
@mock.patch.object(agent.AgentDeploy, 'prepare',
|
@mock.patch.object(agent.AgentDeploy, 'prepare',
|
||||||
spec_set=True, autospec=True)
|
spec_set=True, autospec=True)
|
||||||
def test_prepare(self, agent_deploy_prepare_mock, mock_get_ov_client):
|
@mock.patch.object(deploy_utils, 'allocate_server_hardware_to_ironic')
|
||||||
|
def test_prepare(self, allocate_server_hardware_mock,
|
||||||
|
agent_deploy_prepare_mock, mock_get_ov_client):
|
||||||
self.node.provision_state = states.DEPLOYING
|
self.node.provision_state = states.DEPLOYING
|
||||||
self.node.save()
|
self.node.save()
|
||||||
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.prepare(task)
|
task.driver.deploy.prepare(task)
|
||||||
agent_deploy_prepare_mock.assert_called_once_with(mock.ANY, task)
|
agent_deploy_prepare_mock.assert_called_once_with(mock.ANY, task)
|
||||||
|
self.assertTrue(allocate_server_hardware_mock.called)
|
||||||
|
|
||||||
@mock.patch.object(agent.AgentDeploy, 'prepare',
|
@mock.patch.object(agent.AgentDeploy, 'prepare',
|
||||||
spec_set=True, autospec=True)
|
spec_set=True, autospec=True)
|
||||||
@ -808,25 +760,6 @@ class OneViewAgentDeployTestCase(db_base.DbTestCase):
|
|||||||
agent_deploy_prepare_mock.assert_called_once_with(
|
agent_deploy_prepare_mock.assert_called_once_with(
|
||||||
mock.ANY, task)
|
mock.ANY, task)
|
||||||
|
|
||||||
@mock.patch.object(agent.AgentDeploy, 'prepare',
|
|
||||||
spec_set=True, autospec=True)
|
|
||||||
@mock.patch.object(deploy_utils, 'allocate_server_hardware_to_ironic')
|
|
||||||
def test_prepare_with_dynamic_allocation_enabled(
|
|
||||||
self, allocate_server_hardware_mock,
|
|
||||||
agent_deploy_prepare_mock, mock_get_ov_client
|
|
||||||
):
|
|
||||||
driver_info = self.node.driver_info
|
|
||||||
driver_info['dynamic_allocation'] = True
|
|
||||||
self.node.driver_info = driver_info
|
|
||||||
self.node.provision_state = states.DEPLOYING
|
|
||||||
self.node.save()
|
|
||||||
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid,
|
|
||||||
shared=False) as task:
|
|
||||||
task.driver.deploy.prepare(task)
|
|
||||||
agent_deploy_prepare_mock.assert_called_once_with(mock.ANY, task)
|
|
||||||
self.assertTrue(allocate_server_hardware_mock.called)
|
|
||||||
|
|
||||||
@mock.patch.object(agent.AgentDeploy, 'deploy',
|
@mock.patch.object(agent.AgentDeploy, 'deploy',
|
||||||
spec_set=True, autospec=True)
|
spec_set=True, autospec=True)
|
||||||
def test_deploy(self, agent_deploy_mock, mock_get_ov_client):
|
def test_deploy(self, agent_deploy_mock, mock_get_ov_client):
|
||||||
@ -835,30 +768,15 @@ class OneViewAgentDeployTestCase(db_base.DbTestCase):
|
|||||||
task.driver.deploy.deploy(task)
|
task.driver.deploy.deploy(task)
|
||||||
agent_deploy_mock.assert_called_once_with(mock.ANY, task)
|
agent_deploy_mock.assert_called_once_with(mock.ANY, task)
|
||||||
|
|
||||||
@mock.patch.object(agent.AgentDeploy, 'tear_down', spec_set=True,
|
|
||||||
autospec=True)
|
|
||||||
def test_tear_down(self, agent_tear_down_mock, mock_get_ov_client):
|
|
||||||
agent_tear_down_mock.return_value = states.DELETED
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid,
|
|
||||||
shared=False) as task:
|
|
||||||
returned_state = task.driver.deploy.tear_down(task)
|
|
||||||
agent_tear_down_mock.assert_called_once_with(mock.ANY, task)
|
|
||||||
self.assertEqual(states.DELETED, returned_state)
|
|
||||||
|
|
||||||
@mock.patch.object(agent.AgentDeploy, 'tear_down', spec_set=True,
|
@mock.patch.object(agent.AgentDeploy, 'tear_down', spec_set=True,
|
||||||
autospec=True)
|
autospec=True)
|
||||||
@mock.patch.object(deploy_utils, 'deallocate_server_hardware_from_ironic')
|
@mock.patch.object(deploy_utils, 'deallocate_server_hardware_from_ironic')
|
||||||
def test_tear_down_with_dynamic_allocation_enabled(
|
def test_tear_down_with_automated_clean_disabled(
|
||||||
self, deallocate_server_hardware_mock,
|
self, deallocate_server_hardware_mock,
|
||||||
agent_tear_down_mock, mock_get_ov_client
|
agent_tear_down_mock, mock_get_ov_client
|
||||||
):
|
):
|
||||||
driver_info = self.node.driver_info
|
|
||||||
driver_info['dynamic_allocation'] = True
|
|
||||||
self.node.driver_info = driver_info
|
|
||||||
self.node.save()
|
|
||||||
CONF.conductor.automated_clean = False
|
CONF.conductor.automated_clean = False
|
||||||
agent_tear_down_mock.return_value = states.DELETED
|
agent_tear_down_mock.return_value = states.DELETED
|
||||||
|
|
||||||
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:
|
||||||
returned_state = task.driver.deploy.tear_down(task)
|
returned_state = task.driver.deploy.tear_down(task)
|
||||||
@ -866,29 +784,12 @@ class OneViewAgentDeployTestCase(db_base.DbTestCase):
|
|||||||
self.assertEqual(states.DELETED, returned_state)
|
self.assertEqual(states.DELETED, returned_state)
|
||||||
self.assertTrue(deallocate_server_hardware_mock.called)
|
self.assertTrue(deallocate_server_hardware_mock.called)
|
||||||
|
|
||||||
@mock.patch.object(agent.AgentDeploy, 'prepare_cleaning',
|
|
||||||
spec_set=True, autospec=True)
|
|
||||||
def test_prepare_cleaning(self, agent_prep_clean_mock, mock_get_ov_client):
|
|
||||||
agent_prep_clean_mock.return_value = states.CLEANWAIT
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid,
|
|
||||||
shared=False) as task:
|
|
||||||
ret = task.driver.deploy.prepare_cleaning(task)
|
|
||||||
self.assertEqual(states.CLEANWAIT, ret)
|
|
||||||
agent_prep_clean_mock.assert_called_once_with(mock.ANY, task)
|
|
||||||
|
|
||||||
@mock.patch.object(agent.AgentDeploy, 'prepare_cleaning',
|
@mock.patch.object(agent.AgentDeploy, 'prepare_cleaning',
|
||||||
spec_set=True, autospec=True)
|
spec_set=True, autospec=True)
|
||||||
@mock.patch.object(deploy_utils, 'allocate_server_hardware_to_ironic')
|
@mock.patch.object(deploy_utils, 'allocate_server_hardware_to_ironic')
|
||||||
def test_prepare_cleaning_with_dynamic_allocation_enabled(
|
def test_prepare_cleaning(self, allocate_server_hardware_mock,
|
||||||
self, allocate_server_hardware_mock,
|
agent_prep_clean_mock, mock_get_ov_client):
|
||||||
agent_prep_clean_mock, mock_get_ov_client
|
|
||||||
):
|
|
||||||
driver_info = self.node.driver_info
|
|
||||||
driver_info['dynamic_allocation'] = True
|
|
||||||
self.node.driver_info = driver_info
|
|
||||||
self.node.save()
|
|
||||||
agent_prep_clean_mock.return_value = states.CLEANWAIT
|
agent_prep_clean_mock.return_value = states.CLEANWAIT
|
||||||
|
|
||||||
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:
|
||||||
ret = task.driver.deploy.prepare_cleaning(task)
|
ret = task.driver.deploy.prepare_cleaning(task)
|
||||||
@ -896,29 +797,14 @@ class OneViewAgentDeployTestCase(db_base.DbTestCase):
|
|||||||
agent_prep_clean_mock.assert_called_once_with(mock.ANY, task)
|
agent_prep_clean_mock.assert_called_once_with(mock.ANY, task)
|
||||||
self.assertTrue(allocate_server_hardware_mock.called)
|
self.assertTrue(allocate_server_hardware_mock.called)
|
||||||
|
|
||||||
@mock.patch.object(agent.AgentDeploy, 'tear_down_cleaning',
|
|
||||||
spec_set=True, autospec=True)
|
|
||||||
def test_tear_down_cleaning(self, agent_tear_down_clean_mock,
|
|
||||||
mock_get_ov_client):
|
|
||||||
agent_tear_down_clean_mock.return_value = states.CLEANWAIT
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid,
|
|
||||||
shared=False) as task:
|
|
||||||
task.driver.deploy.tear_down_cleaning(task)
|
|
||||||
agent_tear_down_clean_mock.assert_called_once_with(mock.ANY, task)
|
|
||||||
|
|
||||||
@mock.patch.object(agent.AgentDeploy, 'tear_down_cleaning',
|
@mock.patch.object(agent.AgentDeploy, 'tear_down_cleaning',
|
||||||
spec_set=True, autospec=True)
|
spec_set=True, autospec=True)
|
||||||
@mock.patch.object(deploy_utils, 'deallocate_server_hardware_from_ironic')
|
@mock.patch.object(deploy_utils, 'deallocate_server_hardware_from_ironic')
|
||||||
def test_tear_down_cleaning_with_dynamic_allocation_enabled(
|
def test_tear_down_cleaning(
|
||||||
self, deallocate_server_hardware_mock,
|
self, deallocate_server_hardware_mock, agent_tear_down_clean_mock,
|
||||||
agent_tear_down_clean_mock, mock_get_ov_client
|
mock_get_ov_client
|
||||||
):
|
):
|
||||||
driver_info = self.node.driver_info
|
|
||||||
driver_info['dynamic_allocation'] = True
|
|
||||||
self.node.driver_info = driver_info
|
|
||||||
self.node.save()
|
|
||||||
agent_tear_down_clean_mock.return_value = states.CLEANWAIT
|
agent_tear_down_clean_mock.return_value = states.CLEANWAIT
|
||||||
|
|
||||||
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.tear_down_cleaning(task)
|
task.driver.deploy.tear_down_cleaning(task)
|
||||||
|
@ -65,7 +65,6 @@ class OneViewDeployUtilsTestCase(db_base.DbTestCase):
|
|||||||
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid) as task:
|
with task_manager.acquire(self.context, self.node.uuid) as task:
|
||||||
driver_info = task.node.driver_info
|
driver_info = task.node.driver_info
|
||||||
driver_info['dynamic_allocation'] = True
|
|
||||||
task.node.driver_info = driver_info
|
task.node.driver_info = driver_info
|
||||||
task.node.provision_state = states.DEPLOYING
|
task.node.provision_state = states.DEPLOYING
|
||||||
self.assertRaises(
|
self.assertRaises(
|
||||||
@ -174,7 +173,6 @@ class OneViewDeployUtilsTestCase(db_base.DbTestCase):
|
|||||||
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid) as task:
|
with task_manager.acquire(self.context, self.node.uuid) as task:
|
||||||
driver_info = task.node.driver_info
|
driver_info = task.node.driver_info
|
||||||
driver_info['dynamic_allocation'] = True
|
|
||||||
task.node.driver_info = driver_info
|
task.node.driver_info = driver_info
|
||||||
task.node.provision_state = states.DEPLOYING
|
task.node.provision_state = states.DEPLOYING
|
||||||
self.assertRaises(
|
self.assertRaises(
|
||||||
@ -220,7 +218,6 @@ class OneViewDeployUtilsTestCase(db_base.DbTestCase):
|
|||||||
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid) as task:
|
with task_manager.acquire(self.context, self.node.uuid) as task:
|
||||||
driver_info = task.node.driver_info
|
driver_info = task.node.driver_info
|
||||||
driver_info['dynamic_allocation'] = True
|
|
||||||
task.node.driver_info = driver_info
|
task.node.driver_info = driver_info
|
||||||
self.assertTrue(
|
self.assertTrue(
|
||||||
deploy_utils.is_node_in_use_by_oneview(oneview_client,
|
deploy_utils.is_node_in_use_by_oneview(oneview_client,
|
||||||
@ -278,7 +275,6 @@ class OneViewDeployUtilsTestCase(db_base.DbTestCase):
|
|||||||
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid) as task:
|
with task_manager.acquire(self.context, self.node.uuid) as task:
|
||||||
driver_info = task.node.driver_info
|
driver_info = task.node.driver_info
|
||||||
driver_info['dynamic_allocation'] = True
|
|
||||||
driver_info['applied_server_profile_uri'] = 'same/applied_sp_uri/'
|
driver_info['applied_server_profile_uri'] = 'same/applied_sp_uri/'
|
||||||
task.node.driver_info = driver_info
|
task.node.driver_info = driver_info
|
||||||
self.assertTrue(
|
self.assertTrue(
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
upgrade:
|
||||||
|
- |
|
||||||
|
The pre-allocation model for OneView drivers was deprecated in Newton
|
||||||
|
cycle (Ironic 6.1.0) and all pertaining code was marked for removal
|
||||||
|
during Pike cycle. From now on, OneView drivers works only with dynamic
|
||||||
|
allocation model.
|
Loading…
x
Reference in New Issue
Block a user