1
# vim: tabstop=4 shiftwidth=4 softtabstop=4
3
# Copyright 2012 Nicira, Inc
5
# Licensed under the Apache License, Version 2.0 (the "License"); you may
6
# not use this file except in compliance with the License. You may obtain
7
# a copy of the License at
9
# http://www.apache.org/licenses/LICENSE-2.0
11
# Unless required by applicable law or agreed to in writing, software
12
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14
# License for the specific language governing permissions and limitations
17
from xml.etree import ElementTree
19
from nova import flags
21
from nova import utils
22
from nova.virt import firewall
23
from nova.virt.libvirt import vif
24
from nova.virt.libvirt import connection
29
class LibvirtVifTestCase(test.TestCase):
32
'cidr': '101.168.1.0/24',
33
'cidr_v6': '101:1db9::/64',
34
'gateway_v6': '101:1db9::1',
36
'netmask': '255.255.255.0',
38
'bridge_interface': 'eth0',
40
'gateway': '101.168.1.1',
41
'broadcast': '101.168.1.255',
46
'mac': 'ca:fe:de:ad:be:ef',
47
'gateway_v6': net['gateway_v6'],
48
'ips': [{'ip': '101.168.1.9'}],
49
'dhcp_server': '191.168.1.1',
50
'vif_uuid': 'vif-xxx-yyy-zzz'
54
'uuid': 'instance-uuid'
58
super(LibvirtVifTestCase, self).setUp()
59
self.flags(allow_same_net_traffic=True)
62
def fake_execute(*cmd, **kwargs):
63
self.executes.append(cmd)
66
self.stubs.Set(utils, 'execute', fake_execute)
67
t = __import__('Cheetah.Template', globals(), locals(),
69
self.Template = t.Template
70
xml_file = open(FLAGS.libvirt_xml_template)
71
self.xml_template = xml_file.read()
73
def _create_xml_info(self, vif_type, nics):
78
'memory_kb': 100 * 1024,
82
'disk_prefix': '/dev/sda',
84
'root_device_type': 'disk',
88
'ephemeral_device': False,
90
'use_virtio_for_bridges': False,
93
def _get_instance_xml(self, driver, vif_type):
94
nic_dict = driver.plug(self.instance, self.net, self.mapping)
95
xml_info = self._create_xml_info(vif_type, [nic_dict])
96
xml = str(self.Template(self.xml_template, searchList=[xml_info]))
99
def test_bridge_driver(self):
100
d = vif.LibvirtBridgeDriver()
101
xml = self._get_instance_xml(d, 'bridge')
103
doc = ElementTree.fromstring(xml)
104
ret = doc.findall('./devices/interface')
105
self.assertEqual(len(ret), 1)
107
self.assertEqual(node.get("type"), "bridge")
108
br_name = node.find("source").get("bridge")
109
self.assertEqual(br_name, self.net['bridge'])
110
mac = node.find("mac").get("address")
111
self.assertEqual(mac, self.mapping['mac'])
113
d.unplug(None, self.net, self.mapping)
115
def test_ovs_ethernet_driver(self):
116
d = vif.LibvirtOpenVswitchDriver()
117
xml = self._get_instance_xml(d, 'ethernet')
119
doc = ElementTree.fromstring(xml)
120
ret = doc.findall('./devices/interface')
121
self.assertEqual(len(ret), 1)
123
self.assertEqual(node.get("type"), "ethernet")
124
dev_name = node.find("target").get("dev")
125
self.assertTrue(dev_name.startswith("tap"))
126
mac = node.find("mac").get("address")
127
self.assertEqual(mac, self.mapping['mac'])
128
script = node.find("script").get("path")
129
self.assertEquals(script, "")
131
d.unplug(None, self.net, self.mapping)
133
def test_ovs_virtualport_driver(self):
134
d = vif.LibvirtOpenVswitchVirtualPortDriver()
135
xml = self._get_instance_xml(d, 'ovs_virtualport')
137
doc = ElementTree.fromstring(xml)
138
ret = doc.findall('./devices/interface')
139
self.assertEqual(len(ret), 1)
141
self.assertEqual(node.get("type"), "bridge")
143
br_name = node.find("source").get("bridge")
144
self.assertEqual(br_name, FLAGS.libvirt_ovs_bridge)
145
mac = node.find("mac").get("address")
146
self.assertEqual(mac, self.mapping['mac'])
147
vp = node.find("virtualport")
148
self.assertEqual(vp.get("type"), "openvswitch")
149
iface_id_found = False
150
for p_elem in vp.findall("parameters"):
151
iface_id = p_elem.get("interfaceid", None)
153
self.assertEqual(iface_id, self.mapping['vif_uuid'])
154
iface_id_found = True
156
self.assertTrue(iface_id_found)
157
d.unplug(None, self.net, self.mapping)
159
def test_quantum_bridge_ethernet_driver(self):
160
d = vif.QuantumLinuxBridgeVIFDriver()
161
xml = self._get_instance_xml(d, 'ethernet')
163
doc = ElementTree.fromstring(xml)
164
ret = doc.findall('./devices/interface')
165
self.assertEqual(len(ret), 1)
167
self.assertEqual(node.get("type"), "ethernet")
168
dev_name = node.find("target").get("dev")
169
self.assertTrue(dev_name.startswith("tap"))
170
mac = node.find("mac").get("address")
171
self.assertEqual(mac, self.mapping['mac'])
172
script = node.find("script").get("path")
173
self.assertEquals(script, "")
175
d.unplug(None, self.net, self.mapping)