From 165853ee2c4545f4d55768ec72ed3c9837a5e352 Mon Sep 17 00:00:00 2001
From: licanwei
Date: Wed, 25 Oct 2017 19:29:54 -0700
Subject: [PATCH] check task_state in the live_migrate_instance
If server migration fails, the while loop will not break
until retry to 0,
we can check the task_state to avoid this situation.
Closes-Bug: #1728476
Change-Id: I07e1048eb736263a261456ee78c96fee9db13cb5
---
watcher/common/nova_helper.py | 3 +++
watcher/tests/common/test_nova_helper.py | 21 +++++++++++++++++++++
2 files changed, 24 insertions(+)
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):