From 62e72a2879e424ebe4c4a94bcb3aaf97eb3e8ced Mon Sep 17 00:00:00 2001 From: huangtianhua Date: Fri, 16 Dec 2016 11:50:55 +0800 Subject: [PATCH] Check detach_interface/attach_interface complete To check whether detach_interface/attach_interface complete to keep consistent with nova underlying. Change-Id: I62e61a2d3633fac35655a8542f93921a1ba17930 Closes-Bug: #1650439 --- heat/engine/clients/os/nova.py | 3 + .../engine/resources/openstack/nova/server.py | 8 +-- heat/tests/openstack/nova/test_server.py | 57 ++++++++++++++++++- 3 files changed, 63 insertions(+), 5 deletions(-) diff --git a/heat/engine/clients/os/nova.py b/heat/engine/clients/os/nova.py index a2c07dfe56..5f73a6136d 100644 --- a/heat/engine/clients/os/nova.py +++ b/heat/engine/clients/os/nova.py @@ -731,6 +731,9 @@ echo -e '%s\tALL=(ALL)\tNOPASSWD: ALL' >> /etc/sudoers wait=tenacity.wait_fixed(0.5), retry=tenacity.retry_if_result(client_plugin.retry_if_result_is_false)) def check_interface_attach(self, server_id, port_id): + if not port_id: + return True + server = self.fetch_server(server_id) if server: interfaces = server.interface_list() diff --git a/heat/engine/resources/openstack/nova/server.py b/heat/engine/resources/openstack/nova/server.py index 3bdcac4471..939e5e1d8b 100644 --- a/heat/engine/resources/openstack/nova/server.py +++ b/heat/engine/resources/openstack/nova/server.py @@ -1147,16 +1147,16 @@ class Server(server_base.BaseServer, sh.SchedulerHintsMixin, updaters.append( progress.ServerUpdateProgress( self.resource_id, 'interface_detach', - complete=True, - handler_extra={'args': (port,)}) + handler_extra={'args': (port,)}, + checker_extra={'args': (port,)}) ) for args in add_nets: updaters.append( progress.ServerUpdateProgress( self.resource_id, 'interface_attach', - complete=True, - handler_extra={'kwargs': args}) + handler_extra={'kwargs': args}, + checker_extra={'args': (args['port_id'],)}) ) return updaters diff --git a/heat/tests/openstack/nova/test_server.py b/heat/tests/openstack/nova/test_server.py index 579502b204..faea9b9df7 100644 --- a/heat/tests/openstack/nova/test_server.py +++ b/heat/tests/openstack/nova/test_server.py @@ -3349,11 +3349,19 @@ class ServersTest(common.HeatTestCase): self.patchobject(return_server, 'interface_list', return_value=[iface]) mock_detach = self.patchobject(return_server, 'interface_detach') mock_attach = self.patchobject(return_server, 'interface_attach') + mock_detach_check = self.patchobject(nova.NovaClientPlugin, + 'check_interface_detach', + return_value=True) + mock_attach_check = self.patchobject(nova.NovaClientPlugin, + 'check_interface_attach', + return_value=True) scheduler.TaskRunner(server.update, update_template)() self.assertEqual((server.UPDATE, server.COMPLETE), server.state) self.assertEqual(1, mock_detach.call_count) self.assertEqual(1, mock_attach.call_count) + self.assertEqual(1, mock_detach_check.call_count) + self.assertEqual(1, mock_attach_check.call_count) def test_server_update_None_networks_with_network_id(self): return_server = self.fc.servers.list()[3] @@ -3378,11 +3386,19 @@ class ServersTest(common.HeatTestCase): self.patchobject(return_server, 'interface_list', return_value=[iface]) mock_detach = self.patchobject(return_server, 'interface_detach') mock_attach = self.patchobject(return_server, 'interface_attach') + mock_detach_check = self.patchobject(nova.NovaClientPlugin, + 'check_interface_detach', + return_value=True) + mock_attach_check = self.patchobject(nova.NovaClientPlugin, + 'check_interface_attach', + return_value=True) scheduler.TaskRunner(server.update, update_template)() self.assertEqual((server.UPDATE, server.COMPLETE), server.state) self.assertEqual(1, mock_detach.call_count) self.assertEqual(1, mock_attach.call_count) + self.assertEqual(1, mock_detach_check.call_count) + self.assertEqual(1, mock_attach_check.call_count) def test_server_update_subnet_with_security_group(self): return_server = self.fc.servers.list()[3] @@ -3427,11 +3443,19 @@ class ServersTest(common.HeatTestCase): self.patchobject(return_server, 'interface_list', return_value=[iface]) mock_detach = self.patchobject(return_server, 'interface_detach') mock_attach = self.patchobject(return_server, 'interface_attach') + mock_detach_check = self.patchobject(nova.NovaClientPlugin, + 'check_interface_detach', + return_value=True) + mock_attach_check = self.patchobject(nova.NovaClientPlugin, + 'check_interface_attach', + return_value=True) scheduler.TaskRunner(server.update, update_template, before=server.t)() self.assertEqual((server.UPDATE, server.COMPLETE), server.state) self.assertEqual(1, mock_detach.call_count) self.assertEqual(1, mock_attach.call_count) + self.assertEqual(1, mock_detach_check.call_count) + self.assertEqual(1, mock_attach_check.call_count) self.assertEqual(3, mock_find.call_count) kwargs = {'network_id': '05d8e681-4b37-4570-bc8d-810089f706b2', 'fixed_ips': [ @@ -3461,10 +3485,18 @@ class ServersTest(common.HeatTestCase): self.patchobject(return_server, 'interface_list', return_value=[iface]) mock_detach = self.patchobject(return_server, 'interface_detach') mock_attach = self.patchobject(return_server, 'interface_attach') + mock_detach_check = self.patchobject(nova.NovaClientPlugin, + 'check_interface_detach', + return_value=True) + mock_attach_check = self.patchobject(nova.NovaClientPlugin, + 'check_interface_attach', + return_value=True) scheduler.TaskRunner(server.update, update_template)() self.assertEqual((server.UPDATE, server.COMPLETE), server.state) self.assertEqual(1, mock_detach.call_count) self.assertEqual(1, mock_attach.call_count) + self.assertEqual(1, mock_detach_check.call_count) + self.assertEqual(1, mock_attach_check.call_count) def test_server_update_networks_with_complex_parameters(self): return_server = self.fc.servers.list()[1] @@ -3513,10 +3545,18 @@ class ServersTest(common.HeatTestCase): return_value=poor_interfaces) mock_detach = self.patchobject(return_server, 'interface_detach') mock_attach = self.patchobject(return_server, 'interface_attach') + mock_detach_check = self.patchobject(nova.NovaClientPlugin, + 'check_interface_detach', + return_value=True) + mock_attach_check = self.patchobject(nova.NovaClientPlugin, + 'check_interface_attach', + return_value=True) scheduler.TaskRunner(server.update, update_template)() self.assertEqual((server.UPDATE, server.COMPLETE), server.state) self.assertEqual(4, mock_detach.call_count) self.assertEqual(2, mock_attach.call_count) + self.assertEqual(4, mock_detach_check.call_count) + self.assertEqual(2, mock_attach_check.call_count) def test_server_update_networks_with_None(self): return_server = self.fc.servers.list()[1] @@ -3553,11 +3593,18 @@ class ServersTest(common.HeatTestCase): return_value=poor_interfaces) mock_detach = self.patchobject(return_server, 'interface_detach') mock_attach = self.patchobject(return_server, 'interface_attach') - + mock_detach_check = self.patchobject(nova.NovaClientPlugin, + 'check_interface_detach', + return_value=True) + mock_attach_check = self.patchobject(nova.NovaClientPlugin, + 'check_interface_attach', + return_value=True) scheduler.TaskRunner(server.update, update_template)() self.assertEqual((server.UPDATE, server.COMPLETE), server.state) self.assertEqual(3, mock_detach.call_count) self.assertEqual(1, mock_attach.call_count) + self.assertEqual(3, mock_detach_check.call_count) + self.assertEqual(1, mock_attach_check.call_count) def test_server_update_networks_with_empty_list(self): return_server = self.fc.servers.list()[1] @@ -3595,11 +3642,19 @@ class ServersTest(common.HeatTestCase): return_value=poor_interfaces) mock_detach = self.patchobject(return_server, 'interface_detach') mock_attach = self.patchobject(return_server, 'interface_attach') + mock_detach_check = self.patchobject(nova.NovaClientPlugin, + 'check_interface_detach', + return_value=True) + mock_attach_check = self.patchobject(nova.NovaClientPlugin, + 'check_interface_attach', + return_value=True) scheduler.TaskRunner(server.update, update_template)() self.assertEqual((server.UPDATE, server.COMPLETE), server.state) self.assertEqual(3, mock_detach.call_count) self.assertEqual(1, mock_attach.call_count) + self.assertEqual(3, mock_detach_check.call_count) + self.assertEqual(1, mock_attach_check.call_count) def test_server_properties_validation_create_and_update(self): return_server = self.fc.servers.list()[1]