From 5a646d82bad6a71da28296e3ab06dc5ce2c0f716 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89douard=20Thuleau?= Date: Fri, 12 Jan 2018 16:20:32 +0100 Subject: [PATCH] Update plugs Contrail methods to work with privsep As privsep uses the msgpack to send method arguments to the privsep daemon, we could not use anymore custom data type like nova.objects.instance.Instance. Change-Id: I09f04d5b2f1cb39339ad7c4569186db5d361797a Closes-Bug: #1742963 (cherry picked from commit 1f5fe3190bf2e0987945a6ef9ec430673c9fa736) --- nova/privsep/libvirt.py | 39 ++++++++++++++++-------- nova/tests/unit/virt/libvirt/test_vif.py | 14 ++++++--- nova/virt/libvirt/vif.py | 15 +++++++-- 3 files changed, 49 insertions(+), 19 deletions(-) diff --git a/nova/privsep/libvirt.py b/nova/privsep/libvirt.py index 8baade3ff6ec..da8dccb2ef1d 100644 --- a/nova/privsep/libvirt.py +++ b/nova/privsep/libvirt.py @@ -223,22 +223,35 @@ def unplug_plumgrid_vif(dev): @nova.privsep.sys_admin_pctxt.entrypoint -def plug_contrail_vif(instance, vif, ip_addr, ip6_addr, ptype): - cmd_args = ('--oper=add --uuid=%s --instance_uuid=%s --vn_uuid=%s ' - '--vm_project_uuid=%s --ip_address=%s --ipv6_address=%s' - ' --vm_name=%s --mac=%s --tap_name=%s --port_type=%s ' - '--tx_vlan_id=%d --rx_vlan_id=%d' - % (vif['id'], instance.uuid, vif['network']['id'], - instance.project_id, ip_addr, ip6_addr, - instance.display_name, vif['address'], - vif['devname'], ptype, -1, -1)) - processutils.execute('vrouter-port-control', cmd_args) +def plug_contrail_vif(project_id, vm_id, vm_name, vif_id, net_id, port_type, + dev_name, mac, ip_addr, ip6_addr): + cmd = ( + 'vrouter-port-control', + '--oper=add', + '--vm_project_uuid=%s' % project_id, + '--instance_uuid=%s' % vm_id, + ' --vm_name=%s' % vm_name, + '--uuid=%s' % vif_id, + '--vn_uuid=%s' % net_id, + '--port_type=%s' % port_type, + '--tap_name=%s' % dev_name, + '--mac=%s' % mac, + '--ip_address=%s' % ip_addr, + '--ipv6_address=%s' % ip6_addr, + '--tx_vlan_id=-1', + '--rx_vlan_id=-1', + ) + processutils.execute(*cmd) @nova.privsep.sys_admin_pctxt.entrypoint -def unplug_contrail_vif(vif): - cmd_args = ('--oper=delete --uuid=%s' % (vif['id'])) - processutils.execute('vrouter-port-control', cmd_args) +def unplug_contrail_vif(port_id): + cmd = ( + 'vrouter-port-control', + '--oper=delete', + '--uuid=%s' % port_id, + ) + processutils.execute(*cmd) @nova.privsep.sys_admin_pctxt.entrypoint diff --git a/nova/tests/unit/virt/libvirt/test_vif.py b/nova/tests/unit/virt/libvirt/test_vif.py index 43db5fbf5a91..bb6264d19ac2 100644 --- a/nova/tests/unit/virt/libvirt/test_vif.py +++ b/nova/tests/unit/virt/libvirt/test_vif.py @@ -1057,7 +1057,7 @@ class LibvirtVifTestCase(test.NoDBTestCase): def test_unplug_vrouter_with_details(self, mock_unplug_contrail): d = vif.LibvirtGenericVIFDriver() d.unplug(self.instance, self.vif_vrouter) - mock_unplug_contrail.assert_called_once_with(self.vif_vrouter) + mock_unplug_contrail.assert_called_once_with(self.vif_vrouter['id']) @mock.patch('nova.privsep.libvirt.plug_contrail_vif') def test_plug_vrouter_with_details(self, mock_plug_contrail): @@ -1076,7 +1076,10 @@ class LibvirtVifTestCase(test.NoDBTestCase): mock.call('ip', 'link', 'set', 'tap-xxx-yyy-zzz', 'up', run_as_root=True, check_exit_code=[0, 2, 254])]) mock_plug_contrail.called_once_with( - instance, self.vif_vrouter, '0.0.0.0', None, 'NovaVMPort') + instance.project_id, instance.uuid, instance.display_name, + self.vif_vrouter['id'], self.vif_vrouter['network']['id'], + 'NovaVMPort', self.vif_vrouter['devname'], + self.vif_vrouter['address'], '0.0.0.0', None) @mock.patch('nova.network.linux_net.create_tap_dev') @mock.patch('nova.privsep.libvirt.plug_contrail_vif') @@ -1095,8 +1098,11 @@ class LibvirtVifTestCase(test.NoDBTestCase): mock_create_tap_dev.assert_called_once_with('tap-xxx-yyy-zzz', multiqueue=True) - mock_plug_contrail.assert_called_once_with( - instance, self.vif_vrouter, '0.0.0.0', None, 'NovaVMPort') + mock_plug_contrail.called_once_with( + instance.project_id, instance.uuid, instance.display_name, + self.vif_vrouter['id'], self.vif_vrouter['network']['id'], + 'NovaVMPort', self.vif_vrouter['devname'], + self.vif_vrouter['address'], '0.0.0.0', None) def test_ivs_ethernet_driver(self): d = vif.LibvirtGenericVIFDriver() diff --git a/nova/virt/libvirt/vif.py b/nova/virt/libvirt/vif.py index b0a75bd11bbc..6d5f2385e97d 100644 --- a/nova/virt/libvirt/vif.py +++ b/nova/virt/libvirt/vif.py @@ -724,7 +724,17 @@ class LibvirtGenericVIFDriver(object): instance.flavor) linux_net.create_tap_dev(dev, multiqueue=multiqueue) nova.privsep.libvirt.plug_contrail_vif( - instance, vif, ip_addr, ip6_addr, ptype) + instance.project_id, + instance.uuid, + instance.display_name, + vif['id'], + vif['network']['id'], + ptype, + dev, + vif['address'], + ip_addr, + ip6_addr, + ) except processutils.ProcessExecutionError: LOG.exception(_("Failed while plugging vif"), instance=instance) @@ -875,8 +885,9 @@ class LibvirtGenericVIFDriver(object): Unbind the vif from a Contrail virtual port. """ dev = self.get_vif_devname(vif) + port_id = vif['id'] try: - nova.privsep.libvirt.unplug_contrail_vif(vif) + nova.privsep.libvirt.unplug_contrail_vif(port_id) linux_net.delete_net_dev(dev) except processutils.ProcessExecutionError: LOG.exception(_("Failed while unplugging vif"), instance=instance)