summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--etc/nova/rootwrap.d/compute.filters3
-rw-r--r--nova/privsep/libvirt.py19
-rw-r--r--nova/tests/unit/virt/libvirt/test_vif.py59
-rw-r--r--nova/virt/libvirt/vif.py14
-rw-r--r--releasenotes/notes/privsep-queens-rootwrap-adds-907aa1bc8e3eb2ca.yaml2
5 files changed, 41 insertions, 56 deletions
diff --git a/etc/nova/rootwrap.d/compute.filters b/etc/nova/rootwrap.d/compute.filters
index 3cf5318055..3405374b8b 100644
--- a/etc/nova/rootwrap.d/compute.filters
+++ b/etc/nova/rootwrap.d/compute.filters
@@ -46,9 +46,6 @@ ovs-vsctl: CommandFilter, ovs-vsctl, root
# nova/network/linux_net.py: 'ivs-ctl', ....
ivs-ctl: CommandFilter, ivs-ctl, root
-# nova/virt/libvirt/vif.py: 'vrouter-port-control', ...
-vrouter-port-control: CommandFilter, vrouter-port-control, root
-
# nova/network/linux_net.py: 'ovs-ofctl', ....
ovs-ofctl: CommandFilter, ovs-ofctl, root
diff --git a/nova/privsep/libvirt.py b/nova/privsep/libvirt.py
index 2eba2c6818..05bd124518 100644
--- a/nova/privsep/libvirt.py
+++ b/nova/privsep/libvirt.py
@@ -256,6 +256,25 @@ 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)
+
+
+@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)
+
+
+@nova.privsep.sys_admin_pctxt.entrypoint
def disable_multicast_snooping(interface):
"""Disable multicast snooping for a bridge."""
with open('/sys/class/net/%s/bridge/multicast_snooping' % interface,
diff --git a/nova/tests/unit/virt/libvirt/test_vif.py b/nova/tests/unit/virt/libvirt/test_vif.py
index 78fafc751d..5187af0b73 100644
--- a/nova/tests/unit/virt/libvirt/test_vif.py
+++ b/nova/tests/unit/virt/libvirt/test_vif.py
@@ -1039,16 +1039,14 @@ class LibvirtVifTestCase(test.NoDBTestCase):
self.vif_iovisor['network']['id'],
self.instance.project_id)])
- def test_unplug_vrouter_with_details(self):
+ @mock.patch('nova.privsep.libvirt.unplug_contrail_vif')
+ def test_unplug_vrouter_with_details(self, mock_unplug_contrail):
d = vif.LibvirtGenericVIFDriver()
- with mock.patch.object(utils, 'execute') as execute:
- d.unplug(self.instance, self.vif_vrouter)
- execute.assert_called_once_with(
- 'vrouter-port-control',
- '--oper=delete --uuid=vif-xxx-yyy-zzz',
- run_as_root=True)
+ d.unplug(self.instance, self.vif_vrouter)
+ mock_unplug_contrail.assert_called_once_with(self.vif_vrouter)
- def test_plug_vrouter_with_details(self):
+ @mock.patch('nova.privsep.libvirt.plug_contrail_vif')
+ def test_plug_vrouter_with_details(self, mock_plug_contrail):
d = vif.LibvirtGenericVIFDriver()
instance = mock.Mock()
instance.name = 'instance-name'
@@ -1062,23 +1060,14 @@ class LibvirtVifTestCase(test.NoDBTestCase):
mock.call('ip', 'tuntap', 'add', 'tap-xxx-yyy-zzz', 'mode',
'tap', run_as_root=True, check_exit_code=[0, 2, 254]),
mock.call('ip', 'link', 'set', 'tap-xxx-yyy-zzz', 'up',
- run_as_root=True, check_exit_code=[0, 2, 254]),
- mock.call('vrouter-port-control',
- '--oper=add --uuid=vif-xxx-yyy-zzz '
- '--instance_uuid=46a4308b-e75a-4f90-a34a-650c86ca18b2 '
- '--vn_uuid=network-id-xxx-yyy-zzz '
- '--vm_project_uuid=b168ea26fa0c49c1a84e1566d9565fa5 '
- '--ip_address=0.0.0.0 '
- '--ipv6_address=None '
- '--vm_name=instance1 '
- '--mac=ca:fe:de:ad:be:ef '
- '--tap_name=tap-xxx-yyy-zzz '
- '--port_type=NovaVMPort '
- '--tx_vlan_id=-1 '
- '--rx_vlan_id=-1', run_as_root=True)])
+ 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')
@mock.patch('nova.network.linux_net.create_tap_dev')
- def test_plug_vrouter_with_details_multiqueue(self, mock_create_tap_dev):
+ @mock.patch('nova.privsep.libvirt.plug_contrail_vif')
+ def test_plug_vrouter_with_details_multiqueue(
+ self, mock_plug_contrail, mock_create_tap_dev):
d = vif.LibvirtGenericVIFDriver()
instance = mock.Mock()
instance.name = 'instance-name'
@@ -1088,24 +1077,12 @@ class LibvirtVifTestCase(test.NoDBTestCase):
instance.image_meta = objects.ImageMeta.from_dict({
'properties': {'hw_vif_multiqueue_enabled': True}})
instance.flavor.vcpus = 2
- with mock.patch.object(utils, 'execute') as execute:
- d.plug(instance, self.vif_vrouter)
- mock_create_tap_dev.assert_called_once_with('tap-xxx-yyy-zzz',
- multiqueue=True)
- execute.assert_called_once_with(
- 'vrouter-port-control',
- '--oper=add --uuid=vif-xxx-yyy-zzz '
- '--instance_uuid=46a4308b-e75a-4f90-a34a-650c86ca18b2 '
- '--vn_uuid=network-id-xxx-yyy-zzz '
- '--vm_project_uuid=b168ea26fa0c49c1a84e1566d9565fa5 '
- '--ip_address=0.0.0.0 '
- '--ipv6_address=None '
- '--vm_name=instance1 '
- '--mac=ca:fe:de:ad:be:ef '
- '--tap_name=tap-xxx-yyy-zzz '
- '--port_type=NovaVMPort '
- '--tx_vlan_id=-1 '
- '--rx_vlan_id=-1', run_as_root=True)
+ d.plug(instance, self.vif_vrouter)
+ 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')
def test_ivs_ethernet_driver(self):
d = vif.LibvirtGenericVIFDriver()
diff --git a/nova/virt/libvirt/vif.py b/nova/virt/libvirt/vif.py
index 03f03d2387..b0a75bd11b 100644
--- a/nova/virt/libvirt/vif.py
+++ b/nova/virt/libvirt/vif.py
@@ -719,19 +719,12 @@ class LibvirtGenericVIFDriver(object):
if (CONF.libvirt.virt_type == 'lxc'):
ptype = 'NameSpacePort'
- 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))
try:
multiqueue = self._is_multiqueue_enabled(instance.image_meta,
instance.flavor)
linux_net.create_tap_dev(dev, multiqueue=multiqueue)
- utils.execute('vrouter-port-control', cmd_args, run_as_root=True)
+ nova.privsep.libvirt.plug_contrail_vif(
+ instance, vif, ip_addr, ip6_addr, ptype)
except processutils.ProcessExecutionError:
LOG.exception(_("Failed while plugging vif"), instance=instance)
@@ -882,9 +875,8 @@ class LibvirtGenericVIFDriver(object):
Unbind the vif from a Contrail virtual port.
"""
dev = self.get_vif_devname(vif)
- cmd_args = ("--oper=delete --uuid=%s" % (vif['id']))
try:
- utils.execute('vrouter-port-control', cmd_args, run_as_root=True)
+ nova.privsep.libvirt.unplug_contrail_vif(vif)
linux_net.delete_net_dev(dev)
except processutils.ProcessExecutionError:
LOG.exception(_("Failed while unplugging vif"), instance=instance)
diff --git a/releasenotes/notes/privsep-queens-rootwrap-adds-907aa1bc8e3eb2ca.yaml b/releasenotes/notes/privsep-queens-rootwrap-adds-907aa1bc8e3eb2ca.yaml
index dd4938bd25..2ed2f70b03 100644
--- a/releasenotes/notes/privsep-queens-rootwrap-adds-907aa1bc8e3eb2ca.yaml
+++ b/releasenotes/notes/privsep-queens-rootwrap-adds-907aa1bc8e3eb2ca.yaml
@@ -13,4 +13,4 @@ upgrade:
configuration: blkid; cat; chown; cryptsetup; dd; ebrctl; ifc_ctl; kpartx;
losetup; lvcreate; lvremove; lvs; mkdir; mm-ctl; mount; nova-idmapshift;
ploop; prl_disk_tool; qemu-nbd; readlink; shred; tee; touch; umount; vgs;
- and xend.
+ vrouter-port-control; and xend.