*** Starting CLI:
mininet>
```
+
+To enable more debug messages in other Topogen subsystems (like Mininet), more
+logging messages can be displayed by modifying the test configuration file
+`pytest.ini`:
+
+```ini
+[topogen]
+# Change the default verbosity line from 'info'...
+#verbosity = info
+# ...to 'debug'
+verbosity = debug
+```
import os
import sys
import json
+import ConfigParser
from mininet.net import Mininet
from mininet.log import setLogLevel
from lib import topotest
+CWD = os.path.dirname(os.path.realpath(__file__))
+
# pylint: disable=C0103
# Global Topogen variable. This is being used to keep the Topogen available on
# all test functions without declaring a test local variable.
class Topogen(object):
"A topology test builder helper."
+ CONFIG_SECTION = 'topogen'
+
def __init__(self, cls):
+ self.config = None
self.topo = None
self.net = None
self.gears = {}
# Set the global variable so the test cases can access it anywhere
set_topogen(self)
+ # Load the default topology configurations
+ self._load_config()
+
# Initialize the API
self._mininet_reset()
cls()
for gear in self.gears.values():
gear.net = self.net
+ def _load_config(self):
+ """
+ Loads the configuration file `pytest.ini` located at the root dir of
+ topotests.
+ """
+ defaults = {
+ 'verbosity': 'info',
+ 'frrdir': '/usr/lib/frr',
+ 'quaggadir': '/usr/lib/quagga',
+ 'routertype': 'frr',
+ }
+ self.config = ConfigParser.ConfigParser(defaults)
+ pytestini_path = os.path.join(CWD, '../pytest.ini')
+ self.config.read(pytestini_path)
+
def add_router(self, name=None, cls=topotest.Router, **params):
"""
Adds a new router to the topology. This function has the following
options:
- name: (optional) select the router name
+ * `name`: (optional) select the router name
+ * `daemondir`: (optional) custom daemon binary directory
+ * `routertype`: (optional) `quagga` or `frr`
Returns a TopoRouter.
"""
if name is None:
if name in self.gears:
raise KeyError('router already exists')
+ params['frrdir'] = self.config.get(self.CONFIG_SECTION, 'frrdir')
+ params['quaggadir'] = self.config.get(self.CONFIG_SECTION, 'quaggadir')
+ if not params.has_key('routertype'):
+ params['routertype'] = self.config.get(self.CONFIG_SECTION, 'routertype')
+
self.gears[name] = TopoRouter(self, cls, name, **params)
self.routern += 1
return self.gears[name]
return dict((rname, gear) for rname, gear in self.gears.iteritems()
if isinstance(gear, TopoRouter))
- def start_topology(self, log_level='info'):
+ def start_topology(self, log_level=None):
"""
Starts the topology class. Possible `log_level`s are:
'debug': all information possible
'error': only error and critical messages
'critical': only critical messages
"""
+ # If log_level is not specified use the configuration.
+ if log_level is None:
+ log_level = self.config.get('topogen', 'verbosity')
+
# Run mininet
setLogLevel(log_level)
self.net.start()
'ospf6d': 0, 'isisd': 0, 'bgpd': 0, 'pimd': 0,
'ldpd': 0}
+ def _config_frr(self, **params):
+ "Configure FRR binaries"
+ self.daemondir = params.get('frrdir')
+ if self.daemondir is None:
+ self.daemondir = '/usr/lib/frr'
+
+ zebra_path = os.path.join(self.daemondir, 'zebra')
+ if not os.path.isfile(zebra_path):
+ raise Exception("FRR zebra binary doesn't exist at {}".format(zebra_path))
+
+ def _config_quagga(self, **params):
+ "Configure Quagga binaries"
+ self.daemondir = params.get('quaggadir')
+ if self.daemondir is None:
+ self.daemondir = '/usr/lib/quagga'
+
+ zebra_path = os.path.join(self.daemondir, 'zebra')
+ if not os.path.isfile(zebra_path):
+ raise Exception("Quagga zebra binary doesn't exist at {}".format(zebra_path))
+
# pylint: disable=W0221
# Some params are only meaningful for the parent class.
def config(self, **params):
# User did not specify the daemons directory, try to autodetect it.
self.daemondir = params.get('daemondir')
if self.daemondir is None:
- self.daemondir = '/usr/lib/frr'
- if not os.path.isfile(os.path.join(self.daemondir, 'zebra')):
- self.daemondir = '/usr/lib/quagga'
- self.routertype = 'quagga'
- if not os.path.isfile(os.path.join(self.daemondir, 'zebra')):
- raise Exception('No FRR or Quagga binaries found')
+ self.routertype = params.get('routertype', 'frr')
+ if self.routertype == 'quagga':
+ self._config_quagga(**params)
+ else:
+ self._config_frr(**params)
else:
# Test the provided path
zpath = os.path.join(self.daemondir, 'zebra')
# Skip pytests example directory
[pytest]
norecursedirs = .git example-test
+
+[topogen]
+# Default configuration values
+#
+# 'verbosity' controls how much data the underline systems will use to
+# provide output (e.g. mininet output, test debug output etc...). The
+# value is 'info', but can be changed to 'debug' to provide more details.
+#verbosity = info
+
+# Default daemons binaries path.
+#frrdir = /usr/lib/frr
+#quaggadir = /usr/lib/quagga
+
+# Default router type to use. Possible values are:
+# 'frr' and 'quagga'.
+#routertype = frr