""" Library for the robot based system test tool of the OpenDaylight project. Authors: Baohua Yang@IBM, Denghui Huang@IBM Updated: 2013-11-10 """ import re from robot.libraries.BuiltIn import BuiltIn import Common class Topologynew(object): ''' Topology class provide topology database and provide many method to get property of topology. node_boilerplate = {u'type': u'MD_SAL', u'id': u'openflow:%d'} ''' topo_nodes_db = [ [], [{u'type': u'MD_SAL', u'id': u'openflow:1'}], [{u'type': u'MD_SAL', u'id': u'openflow:1'}, {u'type': u'MD_SAL', u'id': u'openflow:2'}, {u'type': u'MD_SAL', u'id': u'openflow:3'}] ] def __init__(self): self.builtin = BuiltIn() def get_nodes_from_topology(self, topo_level): ''' get nodes from topology database by topology tree level ''' if isinstance(topo_level, str) or isinstance(topo_level, unicode): if topo_level.isdigit(): topo_level = int(topo_level) if topo_level <= 0: return None return self.topo_nodes_db[topo_level] else: return None elif isinstance(topo_level, int): if topo_level <= 0: return None return self.topo_nodes_db[topo_level] else: return None def get_nodes_from_tree_topo(self, topo, exceptroot="0"): ''' This function generates a dictionary that contains type and id of each node. It follows tree level topology. @parameter topo: either an interer (in this case, depth is set and fanout will be 2) or a string in format of "(a,b)" (a and b are integers and they stands for depth and fanout respectively) @return array of dicitonary objects that contains info about each node ''' depth = 0 fanout = 2 if isinstance(topo, str) or isinstance(topo, unicode): t = tuple(int(v) for v in re.findall("[0-9]+", topo)) if len(t) == 1: depth = t[0] elif len(t) == 2: depth = t[0] fanout = t[1] else: return None # topology consists of two parameters: depth and fanout elif isinstance(topo, int): depth = topo else: return None # topo parameter is not given in a desired way num_nodes = Common.num_of_nodes(depth, fanout) nodelist = [] for i in xrange(1, num_nodes + 1): temp = {"id": "00:00:00:00:00:00:00:%s" % format(i, '02x'), "type": "OF"} nodelist.append(temp) if int(exceptroot): del nodelist[0] return nodelist def get_ids_of_leaf_nodes(self, fanout, depth): ''' For a tree structure, it numerates leaf nodes by following depth-first strategy @parameter fanout: fanout of tree @parameter depth: total depth of a tree @return leafnodes: list of ids of leaf nodes ''' leafnodes = [] self._enumerate_nodes(0, 1, 1, fanout, depth - 1, leafnodes) return leafnodes def _enumerate_nodes(self, currentdepth, nodeid, currentbranch, fanout, depth, leafnodes): if currentdepth == depth: leafnodes.append("00:00:00:00:00:00:00:%s" % format(nodeid, '02x')) return 1 nodes = 1 for i in xrange(1, fanout + 1): nodes += self._enumerate_nodes(currentdepth + 1, nodeid + nodes, i, fanout, depth, leafnodes) return nodes if __name__ == '__main__': topologynew = Topologynew() # print topologynew.get_nodes_from_tree_topo(2) # print topologynew.get_nodes_from_tree_topo('2') print topologynew.get_nodes_from_tree_topo('(2,3)') # print topologynew.get_ids_of_leaf_nodes(2,2 )#, depth)