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 1f5fe3190b)
This commit is contained in:
Édouard Thuleau 2018-01-12 16:20:32 +01:00 committed by Matt Riedemann
parent e708799c04
commit 5a646d82ba
3 changed files with 49 additions and 19 deletions

View File

@ -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

View File

@ -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()

View File

@ -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)