Change in vdsm[master]: Functional test for Multiple Gateways source routing
ibarkan at redhat.com
ibarkan at redhat.com
Wed Oct 1 08:15:21 UTC 2014
Ido Barkan has uploaded a new change for review.
Change subject: Functional test for Multiple Gateways source routing
......................................................................
Functional test for Multiple Gateways source routing
adding assertions on the source routing definitions taht are configured
when the network is configured with DHCP.
Change-Id: Ib510bb56c205dffc98aa2bae3f55c1b4c7f6f56f
Signed-off-by: ibarkan <ibarkan at redhat.com>
---
M AUTHORS
M tests/functional/dhcp.py
M tests/functional/networkTests.py
M tests/functional/utils.py
4 files changed, 49 insertions(+), 8 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/12/33612/1
diff --git a/AUTHORS b/AUTHORS
index 25197a5..28aec45 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -37,6 +37,7 @@
Lee Yarwood <lyarwood at redht.com>
Jarod.W <work.iec23801 at gmail.com>
Vitor de Lima <vitor.lima at eldorado.org.br>
+ Ido Barkan <ibarkan at redhat.com>
[....send patches to get your name here....]
diff --git a/tests/functional/dhcp.py b/tests/functional/dhcp.py
index abed8c8..9e1338f 100644
--- a/tests/functional/dhcp.py
+++ b/tests/functional/dhcp.py
@@ -42,15 +42,18 @@
def __init__(self):
self.proc = None
- def start(self, interface, dhcpRangeFrom, dhcpRangeTo):
+ def start(self, interface, dhcpRangeFrom, dhcpRangeTo, router=None):
# --dhcp-option=3 don't send gateway address which would break routing
+ # --dhcp-option=3,<router> advertise specific router
# -O 6 don't reply with any DNS servers either
# -d do not daemonize and log to stderr
# -p 0 disable all the dnsmasq dns functionality
self.proc = execCmd([
_DNSMASQ_BINARY.cmd, '--dhcp-authoritative',
'-p', '0', '--dhcp-range=' + dhcpRangeFrom + ',' +
- dhcpRangeTo + ',2m', '--dhcp-option=3', '-O', '6',
+ dhcpRangeTo + ',2m',
+ '--dhcp-option=3,%s' % (router,) if router else '--dhcp-option=3',
+ '-O', '6',
'-i', interface, '-I', 'lo', '-d',
'--bind-interfaces'], sync=False)
sleep(_START_CHECK_TIMEOUT)
diff --git a/tests/functional/networkTests.py b/tests/functional/networkTests.py
index 9a49238..ca4062a 100644
--- a/tests/functional/networkTests.py
+++ b/tests/functional/networkTests.py
@@ -21,6 +21,7 @@
import os.path
import json
import signal
+import netaddr
from hookValidation import ValidatesHook
from testlib import (VdsmTestCase as TestCaseBase, namedTemporaryDir,
@@ -34,11 +35,11 @@
import veth
from nose import with_setup
from nose.plugins.skip import SkipTest
-from utils import SUCCESS, VdsProxy, cleanupRules
+from utils import SUCCESS, VdsProxy, cleanupRules, wait_for_predicate
from vdsm.ipwrapper import (ruleAdd, ruleDel, routeAdd, routeDel, routeExists,
ruleExists, Route, Rule, addrFlush, LinkType,
- getLinks)
+ getLinks, routeShowTable)
from vdsm.constants import EXT_BRCTL
from vdsm.utils import RollbackContext, execCmd
@@ -94,11 +95,12 @@
@contextmanager
-def dnsmasqDhcp(interface):
+def dnsmasqDhcp(interface, dhcp_router=None):
"""Manages the life cycle of dnsmasq as a DHCP server."""
dhcpServer = dhcp.Dnsmasq()
try:
- dhcpServer.start(interface, DHCP_RANGE_FROM, DHCP_RANGE_TO)
+ dhcpServer.start(interface, DHCP_RANGE_FROM, DHCP_RANGE_TO,
+ router=dhcp_router)
except dhcp.DhcpError as e:
raise SkipTest(e)
@@ -1907,10 +1909,12 @@
@RequireVethMod
@ValidateRunningAsRoot
def testSetupNetworksAddDelDhcp(self, bridged):
+ self.assertTrue(
+ os.path.exists('/etc/dhcp/dhclient.d/sourceRoute.sh'))
with vethIf() as (left, right):
veth.setIP(left, IP_ADDRESS, IP_CIDR)
veth.setLinkUp(left)
- with dnsmasqDhcp(left):
+ with dnsmasqDhcp(left, dhcp_router=IP_GATEWAY):
network = {NETWORK_NAME: {'nic': right, 'bridged': bridged,
'bootproto': 'dhcp',
'blockingdhcp': True}}
@@ -1921,7 +1925,6 @@
net = self.vdsm_net.netinfo.networks[NETWORK_NAME]
self.assertEqual(net['bootproto4'], 'dhcp')
-
if bridged:
self.assertEqual(net['cfg']['BOOTPROTO'], 'dhcp')
@@ -1929,11 +1932,35 @@
self.assertIn(NETWORK_NAME, devs)
self.assertEqual(devs[NETWORK_NAME]['cfg']['BOOTPROTO'],
'dhcp')
+ route_rule_dev = NETWORK_NAME
else:
devs = self.vdsm_net.netinfo.nics
self.assertIn(right, devs)
self.assertEqual(devs[right]['cfg']['BOOTPROTO'], 'dhcp')
+ route_rule_dev = right
+
+ device_ip_addr = netaddr.IPAddress(net['addr'])
+ routing_table = str(device_ip_addr.value)
+ rule1 = Rule(table=routing_table,
+ destination=IP_NETWORK_AND_CIDR,
+ srcDevice=NETWORK_NAME)
+ rule2 = Rule(table=routing_table,
+ source=IP_NETWORK_AND_CIDR)
+
+ # DHCP source routing configuration is async hence we wait
+ # patiently
+ rules_exist = lambda: (ruleExists(rule1) and ruleExists(rule2))
+ wait_for_predicate(rules_exist, 10)
+ routes = [Route.fromText(r)
+ for r in routeShowTable(routing_table)]
+ default_route = Route('0.0.0.0/0', via=IP_GATEWAY,
+ device=str(route_rule_dev))
+ specific_route = Route(IP_NETWORK_AND_CIDR,
+ via=str(device_ip_addr),
+ device=str(route_rule_dev))
+ self.assertIn(default_route, routes)
+ self.assertIn(specific_route, routes)
network = {NETWORK_NAME: {'remove': True}}
status, msg = self.vdsm_net.setupNetworks(network, {}, NOCHK)
diff --git a/tests/functional/utils.py b/tests/functional/utils.py
index 40c59ba..394b61f 100644
--- a/tests/functional/utils.py
+++ b/tests/functional/utils.py
@@ -227,3 +227,13 @@
def updateVmPolicy(self, vmId, vcpuLimit):
result = self.vdscli.updateVmPolicy([vmId, vcpuLimit])
return result['status']['code'], result['status']['message']
+
+
+def wait_for_predicate(predicate, timeout, poll_period=1):
+ absolute_timeout = time.time() + timeout
+ while time.time() <= absolute_timeout:
+ res = predicate()
+ if res:
+ return res
+ time.sleep(poll_period)
+ return False
--
To view, visit http://gerrit.ovirt.org/33612
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib510bb56c205dffc98aa2bae3f55c1b4c7f6f56f
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Ido Barkan <ibarkan at redhat.com>
More information about the vdsm-patches
mailing list