libvirt vif-plugging fixes. Fixes bug 939252 , bug 939254
- fix OVS vif-plugging on red hat / fedora by supporting recent libvirt change that provides OVS + libvirt integration. - Create unit tests that provide coverage for all libvirt vif drivers - Correctly set vm-uuid flag in existing OVS vif-plugging mechanism. Change-Id: I29eeeda92d44a1c026d1c17cf169a1bf2b5a0cc1
This commit is contained in:
		
							
								
								
									
										159
									
								
								nova/tests/test_libvirt_vif.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										159
									
								
								nova/tests/test_libvirt_vif.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,159 @@
 | 
				
			|||||||
 | 
					# vim: tabstop=4 shiftwidth=4 softtabstop=4
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#    Copyright 2012 Nicira, Inc
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#    Licensed under the Apache License, Version 2.0 (the "License"); you may
 | 
				
			||||||
 | 
					#    not use this file except in compliance with the License. You may obtain
 | 
				
			||||||
 | 
					#    a copy of the License at
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#         http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#    Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
				
			||||||
 | 
					#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 | 
				
			||||||
 | 
					#    License for the specific language governing permissions and limitations
 | 
				
			||||||
 | 
					#    under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from xml.etree import ElementTree
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from nova import flags
 | 
				
			||||||
 | 
					from nova import test
 | 
				
			||||||
 | 
					from nova import utils
 | 
				
			||||||
 | 
					from nova.virt import firewall
 | 
				
			||||||
 | 
					from nova.virt import vif
 | 
				
			||||||
 | 
					from nova.virt.libvirt import connection
 | 
				
			||||||
 | 
					from nova.virt.libvirt.vif import LibvirtBridgeDriver, \
 | 
				
			||||||
 | 
					                LibvirtOpenVswitchDriver, LibvirtOpenVswitchVirtualPortDriver
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FLAGS = flags.FLAGS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class LibvirtVifTestCase(test.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    net = {
 | 
				
			||||||
 | 
					             'cidr': '101.168.1.0/24',
 | 
				
			||||||
 | 
					             'cidr_v6': '101:1db9::/64',
 | 
				
			||||||
 | 
					             'gateway_v6': '101:1db9::1',
 | 
				
			||||||
 | 
					             'netmask_v6': '64',
 | 
				
			||||||
 | 
					             'netmask': '255.255.255.0',
 | 
				
			||||||
 | 
					             'bridge': 'br0',
 | 
				
			||||||
 | 
					             'bridge_interface': 'eth0',
 | 
				
			||||||
 | 
					             'vlan': 99,
 | 
				
			||||||
 | 
					             'gateway': '101.168.1.1',
 | 
				
			||||||
 | 
					             'broadcast': '101.168.1.255',
 | 
				
			||||||
 | 
					             'dns1': '8.8.8.8'
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    mapping = {
 | 
				
			||||||
 | 
					        'mac': 'ca:fe:de:ad:be:ef',
 | 
				
			||||||
 | 
					        'gateway_v6': net['gateway_v6'],
 | 
				
			||||||
 | 
					        'ips': [{'ip': '101.168.1.9'}],
 | 
				
			||||||
 | 
					        'dhcp_server': '191.168.1.1',
 | 
				
			||||||
 | 
					        'vif_uuid': 'vif-xxx-yyy-zzz'
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    instance = {
 | 
				
			||||||
 | 
					        'uuid': 'instance-uuid'
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def setUp(self):
 | 
				
			||||||
 | 
					        super(LibvirtVifTestCase, self).setUp()
 | 
				
			||||||
 | 
					        self.flags(allow_same_net_traffic=True)
 | 
				
			||||||
 | 
					        self.executes = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        def fake_execute(*cmd, **kwargs):
 | 
				
			||||||
 | 
					            self.executes.append(cmd)
 | 
				
			||||||
 | 
					            return None, None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.stubs.Set(utils, 'execute', fake_execute)
 | 
				
			||||||
 | 
					        t = __import__('Cheetah.Template', globals(), locals(),
 | 
				
			||||||
 | 
					                       ['Template'], -1)
 | 
				
			||||||
 | 
					        self.Template = t.Template
 | 
				
			||||||
 | 
					        xml_file = open(FLAGS.libvirt_xml_template)
 | 
				
			||||||
 | 
					        self.xml_template = xml_file.read()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _create_xml_info(self, vif_type, nics):
 | 
				
			||||||
 | 
					        return     {
 | 
				
			||||||
 | 
					                    'type': 'qemu',
 | 
				
			||||||
 | 
					                    'name': 'fake-name',
 | 
				
			||||||
 | 
					                    'uuid': 'fake-uuid',
 | 
				
			||||||
 | 
					                    'memory_kb': 100 * 1024,
 | 
				
			||||||
 | 
					                    'basepath': 'foobar',
 | 
				
			||||||
 | 
					                    'vcpus': 4,
 | 
				
			||||||
 | 
					                    'rescue': False,
 | 
				
			||||||
 | 
					                    'disk_prefix': '/dev/sda',
 | 
				
			||||||
 | 
					                    'driver_type': 'raw',
 | 
				
			||||||
 | 
					                    'root_device_type': 'disk',
 | 
				
			||||||
 | 
					                    'vif_type': vif_type,
 | 
				
			||||||
 | 
					                    'nics': nics,
 | 
				
			||||||
 | 
					                    'ebs_root': True,
 | 
				
			||||||
 | 
					                    'ephemeral_device': False,
 | 
				
			||||||
 | 
					                    'volumes': [],
 | 
				
			||||||
 | 
					                    'use_virtio_for_bridges': False,
 | 
				
			||||||
 | 
					                    'ephemerals': []}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _get_instance_xml(self, driver, vif_type):
 | 
				
			||||||
 | 
					        nic_dict = driver.plug(self.instance, self.net, self.mapping)
 | 
				
			||||||
 | 
					        xml_info = self._create_xml_info(vif_type, [nic_dict])
 | 
				
			||||||
 | 
					        xml = str(self.Template(self.xml_template, searchList=[xml_info]))
 | 
				
			||||||
 | 
					        return xml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_bridge_driver(self):
 | 
				
			||||||
 | 
					        d = LibvirtBridgeDriver()
 | 
				
			||||||
 | 
					        xml = self._get_instance_xml(d, 'bridge')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        doc = ElementTree.fromstring(xml)
 | 
				
			||||||
 | 
					        ret = doc.findall('./devices/interface')
 | 
				
			||||||
 | 
					        self.assertEqual(len(ret), 1)
 | 
				
			||||||
 | 
					        node = ret[0]
 | 
				
			||||||
 | 
					        self.assertEqual(node.get("type"), "bridge")
 | 
				
			||||||
 | 
					        br_name = node.find("source").get("bridge")
 | 
				
			||||||
 | 
					        self.assertEqual(br_name, self.net['bridge'])
 | 
				
			||||||
 | 
					        mac = node.find("mac").get("address")
 | 
				
			||||||
 | 
					        self.assertEqual(mac, self.mapping['mac'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        d.unplug(None, self.net, self.mapping)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_ovs_ethernet_driver(self):
 | 
				
			||||||
 | 
					        d = LibvirtOpenVswitchDriver()
 | 
				
			||||||
 | 
					        xml = self._get_instance_xml(d, 'ethernet')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        doc = ElementTree.fromstring(xml)
 | 
				
			||||||
 | 
					        ret = doc.findall('./devices/interface')
 | 
				
			||||||
 | 
					        self.assertEqual(len(ret), 1)
 | 
				
			||||||
 | 
					        node = ret[0]
 | 
				
			||||||
 | 
					        self.assertEqual(node.get("type"), "ethernet")
 | 
				
			||||||
 | 
					        dev_name = node.find("target").get("dev")
 | 
				
			||||||
 | 
					        self.assertTrue(dev_name.startswith("tap"))
 | 
				
			||||||
 | 
					        mac = node.find("mac").get("address")
 | 
				
			||||||
 | 
					        self.assertEqual(mac, self.mapping['mac'])
 | 
				
			||||||
 | 
					        script = node.find("script").get("path")
 | 
				
			||||||
 | 
					        self.assertEquals(script, "")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        d.unplug(None, self.net, self.mapping)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_ovs_virtualport_driver(self):
 | 
				
			||||||
 | 
					        d = LibvirtOpenVswitchVirtualPortDriver()
 | 
				
			||||||
 | 
					        xml = self._get_instance_xml(d, 'ovs_virtualport')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        doc = ElementTree.fromstring(xml)
 | 
				
			||||||
 | 
					        ret = doc.findall('./devices/interface')
 | 
				
			||||||
 | 
					        self.assertEqual(len(ret), 1)
 | 
				
			||||||
 | 
					        node = ret[0]
 | 
				
			||||||
 | 
					        self.assertEqual(node.get("type"), "bridge")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        br_name = node.find("source").get("bridge")
 | 
				
			||||||
 | 
					        self.assertEqual(br_name, FLAGS.libvirt_ovs_bridge)
 | 
				
			||||||
 | 
					        mac = node.find("mac").get("address")
 | 
				
			||||||
 | 
					        self.assertEqual(mac, self.mapping['mac'])
 | 
				
			||||||
 | 
					        vp = node.find("virtualport")
 | 
				
			||||||
 | 
					        self.assertEqual(vp.get("type"), "openvswitch")
 | 
				
			||||||
 | 
					        iface_id_found = False
 | 
				
			||||||
 | 
					        for p_elem in vp.findall("parameters"):
 | 
				
			||||||
 | 
					            iface_id = p_elem.get("interfaceid", None)
 | 
				
			||||||
 | 
					            if iface_id:
 | 
				
			||||||
 | 
					                self.assertEqual(iface_id, self.mapping['vif_uuid'])
 | 
				
			||||||
 | 
					                iface_id_found = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.assertTrue(iface_id_found)
 | 
				
			||||||
 | 
					        d.unplug(None, self.net, self.mapping)
 | 
				
			||||||
		Reference in New Issue
	
	Block a user