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
This commit is contained in:
Édouard Thuleau 2018-01-12 16:20:32 +01:00
parent 459353eec2
commit 1f5fe3190b
3 changed files with 49 additions and 19 deletions

View File

@ -222,22 +222,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

@ -1043,7 +1043,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):
@ -1062,7 +1062,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')
@ -1081,8 +1084,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)