Change in vdsm[master]: sourceroute: pass IPv4 configuration using an existing conta...

osvoboda at redhat.com osvoboda at redhat.com
Fri May 29 14:22:29 UTC 2015


Ondřej Svoboda has uploaded a new change for review.

Change subject: sourceroute: pass IPv4 configuration using an existing container class
......................................................................

sourceroute: pass IPv4 configuration using an existing container class

Change-Id: I5166fe3074ae6318adfafdbacaa1a6a607a646c6
Signed-off-by: Ondřej Svoboda <osvoboda at redhat.com>
---
M tests/functional/networkTests.py
M vdsm/network/configurators/__init__.py
M vdsm/network/sourceroute.py
M vdsm/network/sourceroutethread.py
4 files changed, 43 insertions(+), 35 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/07/41607/1

diff --git a/tests/functional/networkTests.py b/tests/functional/networkTests.py
index 5486cac..63666a7 100644
--- a/tests/functional/networkTests.py
+++ b/tests/functional/networkTests.py
@@ -39,6 +39,7 @@
 
 from network import api, errors, sourceroute, tc
 from network.configurators.ifcfg import Ifcfg
+from network.models import IPv4
 
 from hookValidation import ValidatesHook
 from testlib import (VdsmTestCase as TestCaseBase, namedTemporaryDir,
@@ -190,8 +191,8 @@
 
 
 def _get_source_route(device_name, ipv4_address):
-    return sourceroute.StaticSourceRoute(
-        device_name, ipv4_address, IP_MASK, IP_GATEWAY)
+    ipv4 = IPv4(ipv4_address, IP_MASK, IP_GATEWAY)
+    return sourceroute.StaticSourceRoute(device_name, ipv4)
 
 
 @expandPermutations
diff --git a/vdsm/network/configurators/__init__.py b/vdsm/network/configurators/__init__.py
index 5c58a94..05a98ea 100644
--- a/vdsm/network/configurators/__init__.py
+++ b/vdsm/network/configurators/__init__.py
@@ -122,23 +122,22 @@
     def removeQoS(self, top_device):
         qos.remove_outbound(top_device)
 
-    def _addSourceRoute(self, netEnt):
-        ipv4 = netEnt.ipv4
+    def _addSourceRoute(self, device):
+        ipv4 = device.ipv4
         # bootproto is None for both static and no bootproto
-        if ipv4.bootproto != 'dhcp' and netEnt.master is None:
+        if ipv4.bootproto != 'dhcp' and device.master is None:
             logging.debug("Adding source route: name=%s, addr=%s, netmask=%s, "
-                          "gateway=%s" % (netEnt.name, ipv4.address,
+                          "gateway=%s" % (device.name, ipv4.address,
                                           ipv4.netmask, ipv4.gateway))
             if (ipv4.gateway in (None, '0.0.0.0')
                or not ipv4.address or not ipv4.netmask):
                     logging.warning(
                         'invalid input for source routing: name=%s, '
                         'addr=%s, netmask=%s, gateway=%s',
-                        netEnt.name, ipv4.address, ipv4.netmask,
+                        device.name, ipv4.address, ipv4.netmask,
                         ipv4.gateway)
             else:
-                source_route = StaticSourceRoute(netEnt.name, ipv4.address,
-                                                 ipv4.netmask, ipv4.gateway)
+                source_route = StaticSourceRoute(device.name, device.ipv4)
                 source_route.prepare_configuration()
                 self.configureSourceRoute(source_route)
 
diff --git a/vdsm/network/sourceroute.py b/vdsm/network/sourceroute.py
index e4ecf3c..9f6079d 100644
--- a/vdsm/network/sourceroute.py
+++ b/vdsm/network/sourceroute.py
@@ -28,45 +28,48 @@
 from vdsm.ipwrapper import Route, routeShowTable, Rule, ruleList
 from vdsm.utils import rmFile
 
+from .models import IPv4
+
 
 TRACKED_INTERFACES_FOLDER = P_VDSM_RUN + 'trackedInterfaces'
 
 
 class StaticSourceRoute(object):
-    def __init__(self, device, ipaddr=None, mask=None, gateway=None):
+    def __init__(self, device, ipv4=None):
         self.device = device
-        self._ipaddr = ipaddr
-        self._mask = mask
-        self._gateway = gateway
-        self._table = str(self._generateTableId(ipaddr)) if ipaddr else None
-        self._network = self._parse_network(ipaddr, mask)
+        self.ipv4 = ipv4 or IPv4()
+        self._generate_table_id()
+        self._parse_network()
 
-    def _parse_network(self, ipaddr, mask):
-        if not ipaddr or not mask:
-            return None
-        network = netaddr.IPNetwork('%s/%s' % (ipaddr, mask))
-        return "%s/%s" % (network.network, network.prefixlen)
+    def _parse_network(self):
+        if not self.ipv4.address or not self.ipv4.netmask:
+            self.network = None
+        network = netaddr.IPNetwork('%s/%s' % (self.ipv4.address,
+                                               self.ipv4.netmask))
+        self.network = '%s/%s' % (network.network, network.prefixlen)
 
-    def _generateTableId(self, ipaddr):
+    def _generate_table_id(self):
         # TODO: Future proof for IPv6
-        return netaddr.IPAddress(ipaddr).value
+        if not self.ipv4.address:
+            self.table = None
+        self.table = str(netaddr.IPAddress(self.ipv4.address).value)
 
     def _buildRoutes(self):
-        return [Route(network='0.0.0.0/0', via=self._gateway,
-                      device=self.device, table=self._table),
-                Route(network=self._network, via=self._ipaddr,
-                      device=self.device, table=self._table)]
+        return [Route(network='0.0.0.0/0', via=self.ipv4.gateway,
+                      device=self.device, table=self.table),
+                Route(network=self.network, via=self.ipv4.address,
+                      device=self.device, table=self.table)]
 
     def _buildRules(self):
-        return [Rule(source=self._network, table=self._table),
-                Rule(destination=self._network, table=self._table,
+        return [Rule(source=self.network, table=self.table),
+                Rule(destination=self.network, table=self.table,
                      srcDevice=self.device)]
 
     def prepare_configuration(self):
         logging.info('Configuring gateway - IP: %s, network: %s, subnet: %s, '
-                     'gateway: %s, table: %s, device: %s', self._ipaddr,
-                     self._network, self._mask, self._gateway, self._table,
-                     self.device)
+                     'gateway: %s, table: %s, device: %s', self.ipv4.address,
+                     self.network, self.ipv4.netmask, self.ipv4.gateway,
+                     self.table, self.device)
 
         self.routes = self._buildRoutes()
         self.rules = self._buildRules()
diff --git a/vdsm/network/sourceroutethread.py b/vdsm/network/sourceroutethread.py
index 2a54376..7cc127c 100644
--- a/vdsm/network/sourceroutethread.py
+++ b/vdsm/network/sourceroutethread.py
@@ -26,6 +26,7 @@
 from vdsm import utils
 
 from .configurators.iproute2 import Iproute2
+from .models import IPv4
 from .sourceroute import DynamicSourceRoute
 
 
@@ -50,10 +51,14 @@
                         logging.error('invalid DHCP response %s',
                                       sourceRouteContents)
                     else:
-                        source_route = DynamicSourceRoute(device, ip, mask,
-                                                          gateway)
-                        source_route.prepare_configuration()
-                        configurator.configureSourceRoute(source_route)
+                        try:
+                            ipv4 = IPv4(ip, mask, gateway)
+                        except:
+                            logging.exception('Invalid DHCP response')
+                        else:
+                            source_route = DynamicSourceRoute(device, ipv4)
+                            source_route.prepare_configuration()
+                            configurator.configureSourceRoute(source_route)
                 else:
                     source_route = DynamicSourceRoute(device)
                     if source_route.prepare_removal():


-- 
To view, visit https://gerrit.ovirt.org/41607
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I5166fe3074ae6318adfafdbacaa1a6a607a646c6
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Ondřej Svoboda <osvoboda at redhat.com>


More information about the vdsm-patches mailing list