Add 'ovs_interfaceid' to nova network VIF model
Instead of relying on the hypervisor VIF drivers to make up the correct 'interfaceid' parameter based on the VIF uuid, explicitly tell them what the ovs interfaceid value should be. Blueprint: libvirt-vif-driver Change-Id: I77bb1bcb8f38c8c6e20e9ccbbbd490b251f32fef Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
@@ -27,7 +27,7 @@ CONF = cfg.CONF
|
|||||||
|
|
||||||
class LibvirtVifTestCase(test.TestCase):
|
class LibvirtVifTestCase(test.TestCase):
|
||||||
|
|
||||||
net = {
|
net_bridge = {
|
||||||
'cidr': '101.168.1.0/24',
|
'cidr': '101.168.1.0/24',
|
||||||
'cidr_v6': '101:1db9::/64',
|
'cidr_v6': '101:1db9::/64',
|
||||||
'gateway_v6': '101:1db9::1',
|
'gateway_v6': '101:1db9::1',
|
||||||
@@ -42,15 +42,39 @@ class LibvirtVifTestCase(test.TestCase):
|
|||||||
'id': 'network-id-xxx-yyy-zzz'
|
'id': 'network-id-xxx-yyy-zzz'
|
||||||
}
|
}
|
||||||
|
|
||||||
mapping = {
|
mapping_bridge = {
|
||||||
'mac': 'ca:fe:de:ad:be:ef',
|
'mac': 'ca:fe:de:ad:be:ef',
|
||||||
'gateway_v6': net['gateway_v6'],
|
'gateway_v6': net_bridge['gateway_v6'],
|
||||||
'ips': [{'ip': '101.168.1.9'}],
|
'ips': [{'ip': '101.168.1.9'}],
|
||||||
'dhcp_server': '191.168.1.1',
|
'dhcp_server': '191.168.1.1',
|
||||||
'vif_uuid': 'vif-xxx-yyy-zzz',
|
'vif_uuid': 'vif-xxx-yyy-zzz',
|
||||||
'vif_devname': 'tap-xxx-yyy-zzz'
|
'vif_devname': 'tap-xxx-yyy-zzz'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
net_ovs = {
|
||||||
|
'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',
|
||||||
|
'vlan': 99,
|
||||||
|
'gateway': '101.168.1.1',
|
||||||
|
'broadcast': '101.168.1.255',
|
||||||
|
'dns1': '8.8.8.8',
|
||||||
|
'id': 'network-id-xxx-yyy-zzz'
|
||||||
|
}
|
||||||
|
|
||||||
|
mapping_ovs = {
|
||||||
|
'mac': 'ca:fe:de:ad:be:ef',
|
||||||
|
'gateway_v6': net_ovs['gateway_v6'],
|
||||||
|
'ips': [{'ip': '101.168.1.9'}],
|
||||||
|
'dhcp_server': '191.168.1.1',
|
||||||
|
'vif_uuid': 'vif-xxx-yyy-zzz',
|
||||||
|
'vif_devname': 'tap-xxx-yyy-zzz',
|
||||||
|
'ovs_interfaceid': 'aaa-bbb-ccc',
|
||||||
|
}
|
||||||
|
|
||||||
instance = {
|
instance = {
|
||||||
'name': 'instance-name',
|
'name': 'instance-name',
|
||||||
'uuid': 'instance-uuid'
|
'uuid': 'instance-uuid'
|
||||||
@@ -67,7 +91,7 @@ class LibvirtVifTestCase(test.TestCase):
|
|||||||
|
|
||||||
self.stubs.Set(utils, 'execute', fake_execute)
|
self.stubs.Set(utils, 'execute', fake_execute)
|
||||||
|
|
||||||
def _get_instance_xml(self, driver):
|
def _get_instance_xml(self, driver, net, mapping):
|
||||||
conf = vconfig.LibvirtConfigGuest()
|
conf = vconfig.LibvirtConfigGuest()
|
||||||
conf.virt_type = "qemu"
|
conf.virt_type = "qemu"
|
||||||
conf.name = "fake-name"
|
conf.name = "fake-name"
|
||||||
@@ -75,7 +99,7 @@ class LibvirtVifTestCase(test.TestCase):
|
|||||||
conf.memory = 100 * 1024
|
conf.memory = 100 * 1024
|
||||||
conf.vcpus = 4
|
conf.vcpus = 4
|
||||||
|
|
||||||
nic = driver.get_config(self.instance, self.net, self.mapping)
|
nic = driver.get_config(self.instance, net, mapping)
|
||||||
conf.add_device(nic)
|
conf.add_device(nic)
|
||||||
return conf.to_xml()
|
return conf.to_xml()
|
||||||
|
|
||||||
@@ -126,7 +150,9 @@ class LibvirtVifTestCase(test.TestCase):
|
|||||||
libvirt_type='kvm')
|
libvirt_type='kvm')
|
||||||
|
|
||||||
d = vif.LibvirtBridgeDriver()
|
d = vif.LibvirtBridgeDriver()
|
||||||
xml = self._get_instance_xml(d)
|
xml = self._get_instance_xml(d,
|
||||||
|
self.net_bridge,
|
||||||
|
self.mapping_bridge)
|
||||||
|
|
||||||
doc = etree.fromstring(xml)
|
doc = etree.fromstring(xml)
|
||||||
ret = doc.findall('./devices/interface')
|
ret = doc.findall('./devices/interface')
|
||||||
@@ -143,7 +169,9 @@ class LibvirtVifTestCase(test.TestCase):
|
|||||||
libvirt_type='kvm')
|
libvirt_type='kvm')
|
||||||
|
|
||||||
d = vif.LibvirtBridgeDriver()
|
d = vif.LibvirtBridgeDriver()
|
||||||
xml = self._get_instance_xml(d)
|
xml = self._get_instance_xml(d,
|
||||||
|
self.net_bridge,
|
||||||
|
self.mapping_bridge)
|
||||||
|
|
||||||
doc = etree.fromstring(xml)
|
doc = etree.fromstring(xml)
|
||||||
ret = doc.findall('./devices/interface')
|
ret = doc.findall('./devices/interface')
|
||||||
@@ -160,7 +188,9 @@ class LibvirtVifTestCase(test.TestCase):
|
|||||||
libvirt_type='qemu')
|
libvirt_type='qemu')
|
||||||
|
|
||||||
d = vif.LibvirtBridgeDriver()
|
d = vif.LibvirtBridgeDriver()
|
||||||
xml = self._get_instance_xml(d)
|
xml = self._get_instance_xml(d,
|
||||||
|
self.net_bridge,
|
||||||
|
self.mapping_bridge)
|
||||||
|
|
||||||
doc = etree.fromstring(xml)
|
doc = etree.fromstring(xml)
|
||||||
ret = doc.findall('./devices/interface')
|
ret = doc.findall('./devices/interface')
|
||||||
@@ -177,7 +207,9 @@ class LibvirtVifTestCase(test.TestCase):
|
|||||||
libvirt_type='xen')
|
libvirt_type='xen')
|
||||||
|
|
||||||
d = vif.LibvirtBridgeDriver()
|
d = vif.LibvirtBridgeDriver()
|
||||||
xml = self._get_instance_xml(d)
|
xml = self._get_instance_xml(d,
|
||||||
|
self.net_bridge,
|
||||||
|
self.mapping_bridge)
|
||||||
|
|
||||||
doc = etree.fromstring(xml)
|
doc = etree.fromstring(xml)
|
||||||
ret = doc.findall('./devices/interface')
|
ret = doc.findall('./devices/interface')
|
||||||
@@ -191,7 +223,9 @@ class LibvirtVifTestCase(test.TestCase):
|
|||||||
|
|
||||||
def test_bridge_driver(self):
|
def test_bridge_driver(self):
|
||||||
d = vif.LibvirtBridgeDriver()
|
d = vif.LibvirtBridgeDriver()
|
||||||
xml = self._get_instance_xml(d)
|
xml = self._get_instance_xml(d,
|
||||||
|
self.net_bridge,
|
||||||
|
self.mapping_bridge)
|
||||||
|
|
||||||
doc = etree.fromstring(xml)
|
doc = etree.fromstring(xml)
|
||||||
ret = doc.findall('./devices/interface')
|
ret = doc.findall('./devices/interface')
|
||||||
@@ -199,13 +233,15 @@ class LibvirtVifTestCase(test.TestCase):
|
|||||||
node = ret[0]
|
node = ret[0]
|
||||||
self.assertEqual(node.get("type"), "bridge")
|
self.assertEqual(node.get("type"), "bridge")
|
||||||
br_name = node.find("source").get("bridge")
|
br_name = node.find("source").get("bridge")
|
||||||
self.assertEqual(br_name, self.net['bridge'])
|
self.assertEqual(br_name, self.net_bridge['bridge'])
|
||||||
mac = node.find("mac").get("address")
|
mac = node.find("mac").get("address")
|
||||||
self.assertEqual(mac, self.mapping['mac'])
|
self.assertEqual(mac, self.mapping_bridge['mac'])
|
||||||
|
|
||||||
def test_ovs_ethernet_driver(self):
|
def test_ovs_ethernet_driver(self):
|
||||||
d = vif.LibvirtOpenVswitchDriver()
|
d = vif.LibvirtOpenVswitchDriver()
|
||||||
xml = self._get_instance_xml(d)
|
xml = self._get_instance_xml(d,
|
||||||
|
self.net_ovs,
|
||||||
|
self.mapping_ovs)
|
||||||
|
|
||||||
doc = etree.fromstring(xml)
|
doc = etree.fromstring(xml)
|
||||||
ret = doc.findall('./devices/interface')
|
ret = doc.findall('./devices/interface')
|
||||||
@@ -215,13 +251,15 @@ class LibvirtVifTestCase(test.TestCase):
|
|||||||
dev_name = node.find("target").get("dev")
|
dev_name = node.find("target").get("dev")
|
||||||
self.assertTrue(dev_name.startswith("tap"))
|
self.assertTrue(dev_name.startswith("tap"))
|
||||||
mac = node.find("mac").get("address")
|
mac = node.find("mac").get("address")
|
||||||
self.assertEqual(mac, self.mapping['mac'])
|
self.assertEqual(mac, self.mapping_ovs['mac'])
|
||||||
script = node.find("script").get("path")
|
script = node.find("script").get("path")
|
||||||
self.assertEquals(script, "")
|
self.assertEquals(script, "")
|
||||||
|
|
||||||
def test_ovs_virtualport_driver(self):
|
def test_ovs_virtualport_driver(self):
|
||||||
d = vif.LibvirtOpenVswitchVirtualPortDriver()
|
d = vif.LibvirtOpenVswitchVirtualPortDriver()
|
||||||
xml = self._get_instance_xml(d)
|
xml = self._get_instance_xml(d,
|
||||||
|
self.net_ovs,
|
||||||
|
self.mapping_ovs)
|
||||||
|
|
||||||
doc = etree.fromstring(xml)
|
doc = etree.fromstring(xml)
|
||||||
ret = doc.findall('./devices/interface')
|
ret = doc.findall('./devices/interface')
|
||||||
@@ -232,21 +270,24 @@ class LibvirtVifTestCase(test.TestCase):
|
|||||||
br_name = node.find("source").get("bridge")
|
br_name = node.find("source").get("bridge")
|
||||||
self.assertEqual(br_name, "br0")
|
self.assertEqual(br_name, "br0")
|
||||||
mac = node.find("mac").get("address")
|
mac = node.find("mac").get("address")
|
||||||
self.assertEqual(mac, self.mapping['mac'])
|
self.assertEqual(mac, self.mapping_ovs['mac'])
|
||||||
vp = node.find("virtualport")
|
vp = node.find("virtualport")
|
||||||
self.assertEqual(vp.get("type"), "openvswitch")
|
self.assertEqual(vp.get("type"), "openvswitch")
|
||||||
iface_id_found = False
|
iface_id_found = False
|
||||||
for p_elem in vp.findall("parameters"):
|
for p_elem in vp.findall("parameters"):
|
||||||
iface_id = p_elem.get("interfaceid", None)
|
iface_id = p_elem.get("interfaceid", None)
|
||||||
if iface_id:
|
if iface_id:
|
||||||
self.assertEqual(iface_id, self.mapping['vif_uuid'])
|
self.assertEqual(iface_id,
|
||||||
|
self.mapping_ovs['ovs_interfaceid'])
|
||||||
iface_id_found = True
|
iface_id_found = True
|
||||||
|
|
||||||
self.assertTrue(iface_id_found)
|
self.assertTrue(iface_id_found)
|
||||||
|
|
||||||
def test_quantum_bridge_ethernet_driver(self):
|
def test_quantum_bridge_ethernet_driver(self):
|
||||||
d = vif.QuantumLinuxBridgeVIFDriver()
|
d = vif.QuantumLinuxBridgeVIFDriver()
|
||||||
xml = self._get_instance_xml(d)
|
xml = self._get_instance_xml(d,
|
||||||
|
self.net_bridge,
|
||||||
|
self.mapping_bridge)
|
||||||
|
|
||||||
doc = etree.fromstring(xml)
|
doc = etree.fromstring(xml)
|
||||||
ret = doc.findall('./devices/interface')
|
ret = doc.findall('./devices/interface')
|
||||||
@@ -256,13 +297,15 @@ class LibvirtVifTestCase(test.TestCase):
|
|||||||
dev_name = node.find("target").get("dev")
|
dev_name = node.find("target").get("dev")
|
||||||
self.assertTrue(dev_name.startswith("tap"))
|
self.assertTrue(dev_name.startswith("tap"))
|
||||||
mac = node.find("mac").get("address")
|
mac = node.find("mac").get("address")
|
||||||
self.assertEqual(mac, self.mapping['mac'])
|
self.assertEqual(mac, self.mapping_ovs['mac'])
|
||||||
br_name = node.find("source").get("bridge")
|
br_name = node.find("source").get("bridge")
|
||||||
self.assertEqual(br_name, "br0")
|
self.assertEqual(br_name, "br0")
|
||||||
|
|
||||||
def test_quantum_hybrid_driver(self):
|
def test_quantum_hybrid_driver(self):
|
||||||
d = vif.LibvirtHybridOVSBridgeDriver()
|
d = vif.LibvirtHybridOVSBridgeDriver()
|
||||||
xml = self._get_instance_xml(d)
|
xml = self._get_instance_xml(d,
|
||||||
|
self.net_ovs,
|
||||||
|
self.mapping_ovs)
|
||||||
|
|
||||||
doc = etree.fromstring(xml)
|
doc = etree.fromstring(xml)
|
||||||
ret = doc.findall('./devices/interface')
|
ret = doc.findall('./devices/interface')
|
||||||
@@ -270,6 +313,6 @@ class LibvirtVifTestCase(test.TestCase):
|
|||||||
node = ret[0]
|
node = ret[0]
|
||||||
self.assertEqual(node.get("type"), "bridge")
|
self.assertEqual(node.get("type"), "bridge")
|
||||||
br_name = node.find("source").get("bridge")
|
br_name = node.find("source").get("bridge")
|
||||||
self.assertEqual(br_name, self.net['bridge'])
|
self.assertEqual(br_name, self.net_ovs['bridge'])
|
||||||
mac = node.find("mac").get("address")
|
mac = node.find("mac").get("address")
|
||||||
self.assertEqual(mac, self.mapping['mac'])
|
self.assertEqual(mac, self.mapping_ovs['mac'])
|
||||||
|
Reference in New Issue
Block a user