diff --git a/tobiko/openstack/ironic/__init__.py b/tobiko/openstack/ironic/__init__.py index 6dabc5b4e..671a28db5 100644 --- a/tobiko/openstack/ironic/__init__.py +++ b/tobiko/openstack/ironic/__init__.py @@ -21,3 +21,5 @@ get_ironic_client = _client.get_ironic_client power_off_node = _node.power_off_node power_on_node = _node.power_on_node IronicNodeType = _node.IronicNodeType +WaitForNodePowerStateError = _node.WaitForNodePowerStateError +WaitForNodePowerStateTimeout = _node.WaitForNodePowerStateTimeout diff --git a/tobiko/tripleo/_overcloud.py b/tobiko/tripleo/_overcloud.py index dca9b852e..7833bcb52 100644 --- a/tobiko/tripleo/_overcloud.py +++ b/tobiko/tripleo/_overcloud.py @@ -73,12 +73,16 @@ def power_on_overcloud_node(server: typing.Union[nova.ServerType]): session = _undercloud.undercloud_keystone_session() node_id = getattr(server, 'OS-EXT-SRV-ATTR:hypervisor_hostname', None) - if node_id is None: - client = nova.get_nova_client(session=session) - nova.activate_server(client=client, server=server) - else: + if node_id is not None: client = ironic.get_ironic_client(session=session) - ironic.power_on_node(client=client, node=node_id) + try: + ironic.power_on_node(client=client, node=node_id) + return + except ironic.WaitForNodePowerStateError: + LOG.exception(f"Failed powering on Ironic node: '{node_id}'") + + client = nova.get_nova_client(session=session) + nova.activate_server(client=client, server=server) def power_off_overcloud_node(server: typing.Union[nova.ServerType]) \ @@ -86,12 +90,16 @@ def power_off_overcloud_node(server: typing.Union[nova.ServerType]) \ session = _undercloud.undercloud_keystone_session() node_id = getattr(server, 'OS-EXT-SRV-ATTR:hypervisor_hostname', None) - if node_id is None: - client = nova.get_nova_client(session=session) - nova.shutoff_server(client=client, server=server) - else: + if node_id is not None: client = ironic.get_ironic_client(session=session) - ironic.power_off_node(client=client, node=node_id) + try: + ironic.power_off_node(client=client, node=node_id) + return + except ironic.WaitForNodePowerStateError: + LOG.exception(f"Failed powering off Ironic node: '{node_id}'") + + client = nova.get_nova_client(session=session) + nova.shutoff_server(client=client, server=server) def overcloud_ssh_client(hostname=None, ip_version=None, network_name=None,