Files
infix/test/infamy/env.py
T
Tobias Waldekranz b272f1f6d0 test: env: Add support for querying global attributes
This will let other Infamy submodules tune their behavior based on the
particular test system they are running on.

Attributes are defined by creating graph-global attributes with an
"ix_" prefix.
2024-05-17 23:42:18 +02:00

86 lines
2.4 KiB
Python

import argparse
import networkx
import os
import pydot
import shlex
import sys
from . import neigh, netconf, tap, topology
class NullEnv:
def attr(self, _, default=None):
return default
ENV = NullEnv()
class ArgumentParser(argparse.ArgumentParser):
def __init__(self, ltop):
super().__init__()
self.add_argument("-d", "--debug", default=False, action="store_true")
self.add_argument("-l", "--logical-topology", dest="ltop", default=ltop)
self.add_argument("-p", "--package", default=None)
self.add_argument("-y", "--yangdir", default=None)
self.add_argument("ptop", nargs=1, metavar="topology")
class Env(object):
def __init__(self, ltop=None, argv=sys.argv[1::], environ=os.environ):
if "INFAMY_ARGS" in environ:
argv = shlex.split(environ["INFAMY_ARGS"]) + argv
self.args = ArgumentParser(ltop).parse_args(argv)
pdot = pydot.graph_from_dot_file(self.args.ptop[0])[0]
self.ptop = topology.Topology(pdot)
self.ltop = None
if self.args.ltop:
ldot = pydot.graph_from_dot_file(self.args.ltop)[0]
self.ltop = topology.Topology(ldot)
if not self.ltop.map_to(self.ptop):
raise tap.TestSkip()
print(repr(self.ltop))
global ENV
ENV = self
def attr(self, name, default=None):
val = self.ptop.get_attr("ix_" + name)
if val == None:
return default
try:
return int(val, 0)
except ValueError:
pass
return val
def attach(self, node, port, factory_default=True):
if self.ltop:
mapping = self.ltop.mapping[node]
node, port = self.ltop.xlate(node, port)
else:
mapping = None
password=self.ptop.get_password(node)
if not password:
password = "admin"
ctrl = self.ptop.get_ctrl()
cport, _ = self.ptop.get_mgmt_link(ctrl, node)
print(f"Probing {node} on port {cport} for IPv6LL mgmt address ...")
mgmtip = neigh.ll6ping(cport)
if not mgmtip:
raise Exception(f"Failed, cannot find mgmt IP for {node}")
return netconf.Device(
location=netconf.Location(cport, mgmtip, password),
mapping=mapping,
yangdir=self.args.yangdir,
factory_default=factory_default
)