def _init_topo(self, cls): """ Initialize the topogily provided by the user. The user topology class must call get_topogen() during build() to get the topogen object. """ # Set the global variable so the test cases can access it anywhere set_topogen(self) # Test for MPLS Kernel modules available self.hasmpls = False if not topotest.module_present('mpls-router'): logger.info('MPLS tests will not run (missing mpls-router kernel module)') elif not topotest.module_present('mpls-iptunnel'): logger.info('MPLS tests will not run (missing mpls-iptunnel kernel module)') else: self.hasmpls = True # Load the default topology configurations self._load_config() # Initialize the API self._mininet_reset() cls() self.net = Mininet(controller=None, topo=self.topo) for gear in self.gears.values(): gear.net = self.net
def _init_topo(self, cls): """ Initialize the topogily provided by the user. The user topology class must call get_topogen() during build() to get the topogen object. """ # Set the global variable so the test cases can access it anywhere set_topogen(self) # Test for MPLS Kernel modules available self.hasmpls = False if not topotest.module_present("mpls-router"): logger.info( "MPLS tests will not run (missing mpls-router kernel module)") elif not topotest.module_present("mpls-iptunnel"): logger.info( "MPLS tests will not run (missing mpls-iptunnel kernel module)" ) else: self.hasmpls = True # Load the default topology configurations self._load_config() # Initialize the API self._mininet_reset() cls() self.net = Mininet(controller=None, topo=self.topo) for gear in self.gears.values(): gear.net = self.net
def diagnose_env_linux(): """ Run diagnostics in the running environment. Returns `True` when everything is ok, otherwise `False`. """ ret = True # Test log path exists before installing handler. if not os.path.isdir("/tmp"): logger.warning("could not find /tmp for logs") else: os.system("mkdir /tmp/topotests") # Log diagnostics to file so it can be examined later. fhandler = logging.FileHandler( filename="/tmp/topotests/diagnostics.txt") fhandler.setLevel(logging.DEBUG) fhandler.setFormatter( logging.Formatter(fmt="%(asctime)s %(levelname)s: %(message)s")) logger.addHandler(fhandler) logger.info("Running environment diagnostics") # Load configuration config = configparser.ConfigParser(defaults=tgen_defaults) pytestini_path = os.path.join(CWD, "../pytest.ini") config.read(pytestini_path) # Assert that we are running as root if os.getuid() != 0: logger.error("you must run topotest as root") ret = False # Assert that we have mininet if os.system("which mn >/dev/null 2>/dev/null") != 0: logger.error( "could not find mininet binary (mininet is not installed)") ret = False # Assert that we have iproute installed if os.system("which ip >/dev/null 2>/dev/null") != 0: logger.error("could not find ip binary (iproute is not installed)") ret = False # Assert that we have gdb installed if os.system("which gdb >/dev/null 2>/dev/null") != 0: logger.error("could not find gdb binary (gdb is not installed)") ret = False # Assert that FRR utilities exist frrdir = config.get("topogen", "frrdir") if not os.path.isdir(frrdir): logger.error("could not find {} directory".format(frrdir)) ret = False else: try: pwd.getpwnam("frr")[2] except KeyError: logger.warning('could not find "frr" user') try: grp.getgrnam("frr")[2] except KeyError: logger.warning('could not find "frr" group') try: if "frr" not in grp.getgrnam("frrvty").gr_mem: logger.error( '"frr" user and group exist, but user is not under "frrvty"' ) except KeyError: logger.warning('could not find "frrvty" group') for fname in [ "zebra", "ospfd", "ospf6d", "bgpd", "ripd", "ripngd", "isisd", "pimd", "ldpd", "pbrd", ]: path = os.path.join(frrdir, fname) if not os.path.isfile(path): # LDPd is an exception if fname == "ldpd": logger.info( "could not find {} in {}".format(fname, frrdir) + "(LDPd tests will not run)") continue logger.warning("could not find {} in {}".format(fname, frrdir)) ret = False else: if fname != "zebra": continue os.system( "{} -v 2>&1 >/tmp/topotests/frr_zebra.txt".format(path)) # Test MPLS availability krel = platform.release() if topotest.version_cmp(krel, "4.5") < 0: logger.info( 'LDPd tests will not run (have kernel "{}", but it requires 4.5)'. format(krel)) # Test for MPLS Kernel modules available if not topotest.module_present("mpls-router", load=False) != 0: logger.info( "LDPd tests will not run (missing mpls-router kernel module)") if not topotest.module_present("mpls-iptunnel", load=False) != 0: logger.info( "LDPd tests will not run (missing mpls-iptunnel kernel module)") # TODO remove me when we start supporting exabgp >= 4 try: p = os.popen("exabgp -v") line = p.readlines() version = line[0].split() if topotest.version_cmp(version[2], "4") >= 0: logger.warning( "BGP topologies are still using exabgp version 3, expect failures" ) # We want to catch all exceptions # pylint: disable=W0702 except: logger.warning("failed to find exabgp or returned error") # After we logged the output to file, remove the handler. logger.removeHandler(fhandler) return ret
def diagnose_env_linux(): """ Run diagnostics in the running environment. Returns `True` when everything is ok, otherwise `False`. """ ret = True # Test log path exists before installing handler. if not os.path.isdir('/tmp'): logger.warning('could not find /tmp for logs') else: os.system('mkdir /tmp/topotests') # Log diagnostics to file so it can be examined later. fhandler = logging.FileHandler(filename='/tmp/topotests/diagnostics.txt') fhandler.setLevel(logging.DEBUG) fhandler.setFormatter( logging.Formatter(fmt='%(asctime)s %(levelname)s: %(message)s') ) logger.addHandler(fhandler) logger.info('Running environment diagnostics') # Load configuration config = ConfigParser.ConfigParser(tgen_defaults) pytestini_path = os.path.join(CWD, '../pytest.ini') config.read(pytestini_path) # Assert that we are running as root if os.getuid() != 0: logger.error('you must run topotest as root') ret = False # Assert that we have mininet if os.system('which mn >/dev/null 2>/dev/null') != 0: logger.error('could not find mininet binary (mininet is not installed)') ret = False # Assert that we have iproute installed if os.system('which ip >/dev/null 2>/dev/null') != 0: logger.error('could not find ip binary (iproute is not installed)') ret = False # Assert that we have gdb installed if os.system('which gdb >/dev/null 2>/dev/null') != 0: logger.error('could not find gdb binary (gdb is not installed)') ret = False # Assert that FRR utilities exist frrdir = config.get('topogen', 'frrdir') hasfrr = False if not os.path.isdir(frrdir): logger.error('could not find {} directory'.format(frrdir)) ret = False else: hasfrr = True try: pwd.getpwnam('frr')[2] except KeyError: logger.warning('could not find "frr" user') try: grp.getgrnam('frr')[2] except KeyError: logger.warning('could not find "frr" group') try: if 'frr' not in grp.getgrnam('frrvty').gr_mem: logger.error('"frr" user and group exist, but user is not under "frrvty"') except KeyError: logger.warning('could not find "frrvty" group') for fname in ['zebra', 'ospfd', 'ospf6d', 'bgpd', 'ripd', 'ripngd', 'isisd', 'pimd', 'ldpd']: path = os.path.join(frrdir, fname) if not os.path.isfile(path): # LDPd is an exception if fname == 'ldpd': logger.info('could not find {} in {}'.format(fname, frrdir) + '(LDPd tests will not run)') continue logger.warning('could not find {} in {}'.format(fname, frrdir)) ret = False else: if fname != 'zebra': continue os.system( '{} -v 2>&1 >/tmp/topotests/frr_zebra.txt'.format(path) ) # Assert that Quagga utilities exist quaggadir = config.get('topogen', 'quaggadir') if hasfrr: # if we have frr, don't check for quagga pass elif not os.path.isdir(quaggadir): logger.info('could not find {} directory (quagga tests will not run)'.format(quaggadir)) else: ret = True try: pwd.getpwnam('quagga')[2] except KeyError: logger.info('could not find "quagga" user') try: grp.getgrnam('quagga')[2] except KeyError: logger.info('could not find "quagga" group') try: if 'quagga' not in grp.getgrnam('quaggavty').gr_mem: logger.error('"quagga" user and group exist, but user is not under "quaggavty"') except KeyError: logger.warning('could not find "quaggavty" group') for fname in ['zebra', 'ospfd', 'ospf6d', 'bgpd', 'ripd', 'ripngd', 'isisd', 'pimd']: path = os.path.join(quaggadir, fname) if not os.path.isfile(path): logger.warning('could not find {} in {}'.format(fname, quaggadir)) ret = False else: if fname != 'zebra': continue os.system( '{} -v 2>&1 >/tmp/topotests/quagga_zebra.txt'.format(path) ) # Test MPLS availability krel = platform.release() if topotest.version_cmp(krel, '4.5') < 0: logger.info('LDPd tests will not run (have kernel "{}", but it requires 4.5)'.format(krel)) # Test for MPLS Kernel modules available if not topotest.module_present('mpls-router', load=False) != 0: logger.info('LDPd tests will not run (missing mpls-router kernel module)') if not topotest.module_present('mpls-iptunnel', load=False) != 0: logger.info('LDPd tests will not run (missing mpls-iptunnel kernel module)') # TODO remove me when we start supporting exabgp >= 4 try: output = subprocess.check_output(['exabgp', '-v']) line = output.split('\n')[0] version = line.split(' ')[2] if topotest.version_cmp(version, '4') >= 0: logger.warning('BGP topologies are still using exabgp version 3, expect failures') # We want to catch all exceptions # pylint: disable=W0702 except: logger.warning('failed to find exabgp or returned error') # After we logged the output to file, remove the handler. logger.removeHandler(fhandler) return ret
def _init_topo(self, topodef): """ Initialize the topogily provided by the user. The user topology class must call get_topogen() during build() to get the topogen object. """ # Set the global variable so the test cases can access it anywhere set_topogen(self) # Increase host based limits topotest.fix_host_limits() # Test for MPLS Kernel modules available self.hasmpls = False if not topotest.module_present("mpls-router"): logger.info( "MPLS tests will not run (missing mpls-router kernel module)") elif not topotest.module_present("mpls-iptunnel"): logger.info( "MPLS tests will not run (missing mpls-iptunnel kernel module)" ) else: self.hasmpls = True # Load the default topology configurations self._load_config() # Create new log directory self.logdir = topotest.get_logs_path(g_extra_config["rundir"]) subprocess.check_call("mkdir -p {0} && chmod 1777 {0}".format( self.logdir), shell=True) try: routertype = self.config.get(self.CONFIG_SECTION, "routertype") # Only allow group, if it exist. gid = grp.getgrnam(routertype)[2] os.chown(self.logdir, 0, gid) os.chmod(self.logdir, 0o775) except KeyError: # Allow anyone, but set the sticky bit to avoid file deletions os.chmod(self.logdir, 0o1777) # Remove old twisty way of creating sub-classed topology object which has it's # build method invoked which calls Topogen methods which then call Topo methods # to create a topology within the Topo object, which is then used by # Mininet(Micronet) to build the actual topology. assert not inspect.isclass(topodef) self.net = Mininet(controller=None) # New direct way: Either a dictionary defines the topology or a build function # is supplied, or a json filename all of which build the topology by calling # Topogen methods which call Mininet(Micronet) methods to create the actual # topology. if not inspect.isclass(topodef): if callable(topodef): topodef(self) self.net.configure_hosts() elif is_string(topodef): # topojson imports topogen in one function too, # switch away from this use here to the topojson # fixutre and remove this case from lib.topojson import build_topo_from_json with open(topodef, "r") as topof: self.json_topo = json.load(topof) build_topo_from_json(self, self.json_topo) self.net.configure_hosts() elif topodef: self.add_topology_from_dict(topodef)
def diagnose_env_linux(rundir): """ Run diagnostics in the running environment. Returns `True` when everything is ok, otherwise `False`. """ ret = True # Load configuration config = configparser.ConfigParser(defaults=tgen_defaults) pytestini_path = os.path.join(CWD, "../pytest.ini") config.read(pytestini_path) # Test log path exists before installing handler. os.system("mkdir -p " + rundir) # Log diagnostics to file so it can be examined later. fhandler = logging.FileHandler( filename="{}/diagnostics.txt".format(rundir)) fhandler.setLevel(logging.DEBUG) fhandler.setFormatter(logging.Formatter(fmt=topolog.FORMAT)) logger.addHandler(fhandler) logger.info("Running environment diagnostics") # Assert that we are running as root if os.getuid() != 0: logger.error("you must run topotest as root") ret = False # Assert that we have mininet # if os.system("which mn >/dev/null 2>/dev/null") != 0: # logger.error("could not find mininet binary (mininet is not installed)") # ret = False # Assert that we have iproute installed if os.system("which ip >/dev/null 2>/dev/null") != 0: logger.error("could not find ip binary (iproute is not installed)") ret = False # Assert that we have gdb installed if os.system("which gdb >/dev/null 2>/dev/null") != 0: logger.error("could not find gdb binary (gdb is not installed)") ret = False # Assert that FRR utilities exist frrdir = config.get("topogen", "frrdir") if not os.path.isdir(frrdir): logger.error("could not find {} directory".format(frrdir)) ret = False else: try: pwd.getpwnam("frr")[2] except KeyError: logger.warning('could not find "frr" user') try: grp.getgrnam("frr")[2] except KeyError: logger.warning('could not find "frr" group') try: if "frr" not in grp.getgrnam("frrvty").gr_mem: logger.error( '"frr" user and group exist, but user is not under "frrvty"' ) except KeyError: logger.warning('could not find "frrvty" group') for fname in [ "zebra", "ospfd", "ospf6d", "bgpd", "ripd", "ripngd", "isisd", "pimd", "pim6d", "ldpd", "pbrd", ]: path = os.path.join(frrdir, fname) if not os.path.isfile(path): # LDPd is an exception if fname == "ldpd": logger.info( "could not find {} in {}".format(fname, frrdir) + "(LDPd tests will not run)") continue logger.warning("could not find {} in {}".format(fname, frrdir)) ret = False else: if fname != "zebra": continue os.system("{} -v 2>&1 >{}/frr_zebra.txt".format(path, rundir)) # Test MPLS availability krel = platform.release() if topotest.version_cmp(krel, "4.5") < 0: logger.info( 'LDPd tests will not run (have kernel "{}", but it requires 4.5)'. format(krel)) # Test for MPLS Kernel modules available if not topotest.module_present("mpls-router", load=False) != 0: logger.info( "LDPd tests will not run (missing mpls-router kernel module)") if not topotest.module_present("mpls-iptunnel", load=False) != 0: logger.info( "LDPd tests will not run (missing mpls-iptunnel kernel module)") if not get_exabgp_cmd(): logger.warning("Failed to find exabgp < 4") logger.removeHandler(fhandler) fhandler.close() return ret
def diagnose_env_linux(): """ Run diagnostics in the running environment. Returns `True` when everything is ok, otherwise `False`. """ ret = True # Test log path exists before installing handler. if not os.path.isdir('/tmp'): logger.warning('could not find /tmp for logs') else: os.system('mkdir /tmp/topotests') # Log diagnostics to file so it can be examined later. fhandler = logging.FileHandler(filename='/tmp/topotests/diagnostics.txt') fhandler.setLevel(logging.DEBUG) fhandler.setFormatter( logging.Formatter(fmt='%(asctime)s %(levelname)s: %(message)s') ) logger.addHandler(fhandler) logger.info('Running environment diagnostics') # Load configuration config = configparser.ConfigParser(tgen_defaults) pytestini_path = os.path.join(CWD, '../pytest.ini') config.read(pytestini_path) # Assert that we are running as root if os.getuid() != 0: logger.error('you must run topotest as root') ret = False # Assert that we have mininet if os.system('which mn >/dev/null 2>/dev/null') != 0: logger.error('could not find mininet binary (mininet is not installed)') ret = False # Assert that we have iproute installed if os.system('which ip >/dev/null 2>/dev/null') != 0: logger.error('could not find ip binary (iproute is not installed)') ret = False # Assert that we have gdb installed if os.system('which gdb >/dev/null 2>/dev/null') != 0: logger.error('could not find gdb binary (gdb is not installed)') ret = False # Assert that FRR utilities exist frrdir = config.get('topogen', 'frrdir') hasfrr = False if not os.path.isdir(frrdir): logger.error('could not find {} directory'.format(frrdir)) ret = False else: hasfrr = True try: pwd.getpwnam('frr')[2] except KeyError: logger.warning('could not find "frr" user') try: grp.getgrnam('frr')[2] except KeyError: logger.warning('could not find "frr" group') try: if 'frr' not in grp.getgrnam('frrvty').gr_mem: logger.error('"frr" user and group exist, but user is not under "frrvty"') except KeyError: logger.warning('could not find "frrvty" group') for fname in ['zebra', 'ospfd', 'ospf6d', 'bgpd', 'ripd', 'ripngd', 'isisd', 'pimd', 'ldpd']: path = os.path.join(frrdir, fname) if not os.path.isfile(path): # LDPd is an exception if fname == 'ldpd': logger.info('could not find {} in {}'.format(fname, frrdir) + '(LDPd tests will not run)') continue logger.warning('could not find {} in {}'.format(fname, frrdir)) ret = False else: if fname != 'zebra': continue os.system( '{} -v 2>&1 >/tmp/topotests/frr_zebra.txt'.format(path) ) # Assert that Quagga utilities exist quaggadir = config.get('topogen', 'quaggadir') if hasfrr: # if we have frr, don't check for quagga pass elif not os.path.isdir(quaggadir): logger.info('could not find {} directory (quagga tests will not run)'.format(quaggadir)) else: ret = True try: pwd.getpwnam('quagga')[2] except KeyError: logger.info('could not find "quagga" user') try: grp.getgrnam('quagga')[2] except KeyError: logger.info('could not find "quagga" group') try: if 'quagga' not in grp.getgrnam('quaggavty').gr_mem: logger.error('"quagga" user and group exist, but user is not under "quaggavty"') except KeyError: logger.warning('could not find "quaggavty" group') for fname in ['zebra', 'ospfd', 'ospf6d', 'bgpd', 'ripd', 'ripngd', 'isisd', 'pimd']: path = os.path.join(quaggadir, fname) if not os.path.isfile(path): logger.warning('could not find {} in {}'.format(fname, quaggadir)) ret = False else: if fname != 'zebra': continue os.system( '{} -v 2>&1 >/tmp/topotests/quagga_zebra.txt'.format(path) ) # Test MPLS availability krel = platform.release() if topotest.version_cmp(krel, '4.5') < 0: logger.info('LDPd tests will not run (have kernel "{}", but it requires 4.5)'.format(krel)) # Test for MPLS Kernel modules available if not topotest.module_present('mpls-router', load=False) != 0: logger.info('LDPd tests will not run (missing mpls-router kernel module)') if not topotest.module_present('mpls-iptunnel', load=False) != 0: logger.info('LDPd tests will not run (missing mpls-iptunnel kernel module)') # TODO remove me when we start supporting exabgp >= 4 try: output = subprocess.check_output(['exabgp', '-v']) line = output.split('\n')[0] version = line.split(' ')[2] if topotest.version_cmp(version, '4') >= 0: logger.warning('BGP topologies are still using exabgp version 3, expect failures') # We want to catch all exceptions # pylint: disable=W0702 except: logger.warning('failed to find exabgp or returned error') # After we logged the output to file, remove the handler. logger.removeHandler(fhandler) return ret