diff --git a/watcher/common/nova_helper.py b/watcher/common/nova_helper.py index 55a1aff94..c4b0e7399 100644 --- a/watcher/common/nova_helper.py +++ b/watcher/common/nova_helper.py @@ -478,6 +478,9 @@ class NovaHelper(object): 'OS-EXT-SRV-ATTR:host') != dest_hostname \ and retry: instance = self.nova.servers.get(instance.id) + if not getattr(instance, 'OS-EXT-STS:task_state'): + LOG.debug("Instance task state: %s is null" % instance_id) + break LOG.debug( 'Waiting the migration of {0} to {1}'.format( instance, diff --git a/watcher/tests/common/test_nova_helper.py b/watcher/tests/common/test_nova_helper.py index a554b502c..778b569ee 100644 --- a/watcher/tests/common/test_nova_helper.py +++ b/watcher/tests/common/test_nova_helper.py @@ -165,6 +165,27 @@ class TestNovaHelper(base.TestCase): ) self.assertFalse(is_success) + @mock.patch.object(time, 'sleep', mock.Mock()) + def test_live_migrate_instance_with_task_state( + self, mock_glance, mock_cinder, mock_neutron, mock_nova): + nova_util = nova_helper.NovaHelper() + server = self.fake_server(self.instance_uuid) + setattr(server, 'OS-EXT-SRV-ATTR:host', + self.source_node) + setattr(server, 'OS-EXT-STS:task_state', '') + self.fake_nova_find_list(nova_util, find=server, list=None) + nova_util.live_migrate_instance( + self.instance_uuid, self.destination_node + ) + time.sleep.assert_not_called() + + setattr(server, 'OS-EXT-STS:task_state', 'migrating') + self.fake_nova_find_list(nova_util, find=server, list=server) + nova_util.live_migrate_instance( + self.instance_uuid, self.destination_node + ) + time.sleep.assert_called_with(1) + @mock.patch.object(time, 'sleep', mock.Mock()) def test_live_migrate_instance_no_destination_node( self, mock_glance, mock_cinder, mock_neutron, mock_nova):