' + \
+ result = '<' + \
' | '.join(lines) + \
' | >'
return result
# default is for when we can't determine the type of the service
- # typically the server is down, or we can't authenticate, or it's too old code
- shapes = {"registry": "diamond", "slicemgr":"ellipse", "aggregate":"box", 'default':'plaintext'}
- abbrevs = {"registry": "REG", "slicemgr":"SA", "aggregate":"AM", 'default':'[unknown interface]'}
+ # typically the server is down, or we can't authenticate, or it's too old
+ # code
+ shapes = {"registry": "diamond", "slicemgr": "ellipse",
+ "aggregate": "box", 'default': 'plaintext'}
+ abbrevs = {"registry": "REG", "slicemgr": "SA",
+ "aggregate": "AM", 'default': '[unknown interface]'}
# return a dictionary that translates into the node's attr
- def get_layout (self):
- layout={}
- ### retrieve cached GetVersion
- version=self.get_version()
- # set the href; xxx would make sense to try and 'guess' the web URL, not the API's one...
- layout['href']=self.url()
- ### set html-style label
- ### see http://www.graphviz.org/doc/info/shapes.html#html
+ def get_layout(self):
+ layout = {}
+ # retrieve cached GetVersion
+ version = self.get_version()
+ # set the href; xxx would make sense to try and 'guess' the web URL,
+ # not the API's one...
+ layout['href'] = self.url()
+ # set html-style label
+ # see http://www.graphviz.org/doc/info/shapes.html#html
# if empty the service is unreachable
if not version:
- label="offline"
+ label = "offline"
else:
- label=''
- try: abbrev=Interface.abbrevs[version['interface']]
- except: abbrev=Interface.abbrevs['default']
+ label = ''
+ try:
+ abbrev = Interface.abbrevs[version['interface']]
+ except:
+ abbrev = Interface.abbrevs['default']
label += abbrev
- if 'hrn' in version: label += " %s"%version['hrn']
- else: label += "[no hrn]"
- if 'code_tag' in version:
- label += " %s"%version['code_tag']
+ if 'hrn' in version:
+ label += " %s" % version['hrn']
+ else:
+ label += "[no hrn]"
+ if 'code_tag' in version:
+ label += " %s" % version['code_tag']
if 'testbed' in version:
- label += " (%s)"%version['testbed']
- layout['label']=Interface.multi_lines_label(self.url(),label)
- ### set shape
- try: shape=Interface.shapes[version['interface']]
- except: shape=Interface.shapes['default']
- layout['shape']=shape
- ### fill color to outline wrongly configured or unreachable bodies
+ label += " (%s)" % version['testbed']
+ layout['label'] = Interface.multi_lines_label(self.url(), label)
+ # set shape
+ try:
+ shape = Interface.shapes[version['interface']]
+ except:
+ shape = Interface.shapes['default']
+ layout['shape'] = shape
+ # fill color to outline wrongly configured or unreachable bodies
# as of sfa-2.0 registry doesn't have 'sfa' not 'geni_api', but have peers
# slicemgr and aggregate have 'geni_api' and 'sfa'
if 'geni_api' not in version and 'peers' not in version:
- layout['style']='filled'
- layout['fillcolor']='gray'
+ layout['style'] = 'filled'
+ layout['fillcolor'] = 'gray'
return layout
+
class Scanner:
# provide the entry points (a list of interfaces)
- def __init__ (self, left_to_right=False, verbose=False):
- self.verbose=verbose
- self.left_to_right=left_to_right
-
- def graph (self,entry_points):
- graph=pygraphviz.AGraph(directed=True)
- if self.left_to_right:
- graph.graph_attr['rankdir']='LR'
- self.scan(entry_points,graph)
+ def __init__(self, left_to_right=False, verbose=False):
+ self.verbose = verbose
+ self.left_to_right = left_to_right
+
+ def graph(self, entry_points):
+ graph = pygraphviz.AGraph(directed=True)
+ if self.left_to_right:
+ graph.graph_attr['rankdir'] = 'LR'
+ self.scan(entry_points, graph)
return graph
-
+
# scan from the given interfaces as entry points
- def scan(self,interfaces,graph):
- if not isinstance(interfaces,list):
- interfaces=[interfaces]
+ def scan(self, interfaces, graph):
+ if not isinstance(interfaces, list):
+ interfaces = [interfaces]
# remember node to interface mapping
- node2interface={}
+ node2interface = {}
# add entry points right away using the interface uid's as a key
- to_scan=interfaces
- for i in interfaces:
+ to_scan = interfaces
+ for i in interfaces:
graph.add_node(i.uid())
- node2interface[graph.get_node(i.uid())]=i
- scanned=[]
+ node2interface[graph.get_node(i.uid())] = i
+ scanned = []
# keep on looping until we reach a fixed point
# don't worry about abels and shapes that will get fixed later on
while to_scan:
for interface in to_scan:
# performing xmlrpc call
- logger.info("retrieving/fetching version at interface %s"%interface.url())
- version=interface.get_version()
+ logger.info(
+ "retrieving/fetching version at interface %s" % interface.url())
+ version = interface.get_version()
if not version:
- logger.info("")
- else:
- for (k,v) in version.iteritems():
- if not isinstance(v,dict):
- logger.debug("\r\t%s:%s"%(k,v))
+ logger.info(
+ "")
+ else:
+ for (k, v) in version.iteritems():
+ if not isinstance(v, dict):
+ logger.debug("\r\t%s:%s" % (k, v))
else:
logger.debug(k)
- for (k1,v1) in v.iteritems():
- logger.debug("\r\t\t%s:%s"%(k1,v1))
+ for (k1, v1) in v.iteritems():
+ logger.debug("\r\t\t%s:%s" % (k1, v1))
# proceed with neighbours
- if 'peers' in version:
- for (next_name,next_url) in version['peers'].iteritems():
- next_interface=Interface(next_url,mentioned_in=interface.url())
+ if 'peers' in version:
+ for (next_name, next_url) in version['peers'].iteritems():
+ next_interface = Interface(
+ next_url, mentioned_in=interface.url())
# locate or create node in graph
try:
# if found, we're good with this one
- next_node=graph.get_node(next_interface.uid())
+ next_node = graph.get_node(next_interface.uid())
except:
# otherwise, let's move on with it
graph.add_node(next_interface.uid())
- next_node=graph.get_node(next_interface.uid())
- node2interface[next_node]=next_interface
+ next_node = graph.get_node(next_interface.uid())
+ node2interface[next_node] = next_interface
to_scan.append(next_interface)
- graph.add_edge(interface.uid(),next_interface.uid())
+ graph.add_edge(interface.uid(), next_interface.uid())
scanned.append(interface)
to_scan.remove(interface)
- # we've scanned the whole graph, let's get the labels and shapes right
+ # we've scanned the whole graph, let's get the labels and shapes
+ # right
for node in graph.nodes():
- interface=node2interface.get(node,None)
+ interface = node2interface.get(node, None)
if interface:
- for (k,v) in interface.get_layout().iteritems():
- node.attr[k]=v
+ for (k, v) in interface.get_layout().iteritems():
+ node.attr[k] = v
else:
- logger.error("MISSED interface with node %s"%node)
-
+ logger.error("MISSED interface with node %s" % node)
+
class SfaScan:
- default_outfiles=['sfa.png','sfa.svg','sfa.dot']
+ default_outfiles = ['sfa.png', 'sfa.svg', 'sfa.dot']
def main(self):
- usage="%prog [options] url-entry-point(s)"
- parser=OptionParser(usage=usage)
+ usage = "%prog [options] url-entry-point(s)"
+ parser = OptionParser(usage=usage)
parser.add_option("-d", "--dir", dest="sfi_dir",
help="config & working directory - default is " + Sfi.default_sfi_dir(),
metavar="PATH", default=Sfi.default_sfi_dir())
- parser.add_option("-o","--output",action='append',dest='outfiles',default=[],
- help="output filenames (cumulative) - defaults are %r"%SfaScan.default_outfiles)
- parser.add_option("-l","--left-to-right",action="store_true",dest="left_to_right",default=False,
+ parser.add_option("-o", "--output", action='append', dest='outfiles', default=[],
+ help="output filenames (cumulative) - defaults are %r" % SfaScan.default_outfiles)
+ parser.add_option("-l", "--left-to-right", action="store_true", dest="left_to_right", default=False,
help="instead of top-to-bottom")
parser.add_option("-v", "--verbose", action="count", dest="verbose", default=0,
help="verbose - can be repeated for more verbosity")
- parser.add_option("-c", "--clean-cache",action='store_true',
- dest='clean_cache',default=False,
+ parser.add_option("-c", "--clean-cache", action='store_true',
+ dest='clean_cache', default=False,
help='clean/trash version cache and exit')
- parser.add_option("-s","--show-cache",action='store_true',
- dest='show_cache',default=False,
+ parser.add_option("-s", "--show-cache", action='store_true',
+ dest='show_cache', default=False,
help='show/display version cache')
-
- (options,args)=parser.parse_args()
+
+ (options, args) = parser.parse_args()
logger.enable_console()
# apply current verbosity to logger
logger.setLevelFromOptVerbose(options.verbose)
- # figure if we need to be verbose for these local classes that only have a bool flag
- bool_verbose=logger.getBoolVerboseFromOpt(options.verbose)
-
- if options.show_cache:
+ # figure if we need to be verbose for these local classes that only
+ # have a bool flag
+ bool_verbose = logger.getBoolVerboseFromOpt(options.verbose)
+
+ if options.show_cache:
VersionCache().show()
sys.exit(0)
if options.clean_cache:
@@ -350,21 +388,23 @@ class SfaScan:
if not args:
parser.print_help()
sys.exit(1)
-
+
if not options.outfiles:
- options.outfiles=SfaScan.default_outfiles
- scanner=Scanner(left_to_right=options.left_to_right, verbose=bool_verbose)
- entries = [ Interface(entry,mentioned_in="command line") for entry in args ]
+ options.outfiles = SfaScan.default_outfiles
+ scanner = Scanner(left_to_right=options.left_to_right,
+ verbose=bool_verbose)
+ entries = [Interface(entry, mentioned_in="command line")
+ for entry in args]
try:
- g=scanner.graph(entries)
+ g = scanner.graph(entries)
logger.info("creating layout")
g.layout(prog='dot')
for outfile in options.outfiles:
- logger.info("drawing in %s"%outfile)
+ logger.info("drawing in %s" % outfile)
g.draw(outfile)
logger.info("done")
# test mode when pygraphviz is not available
except:
- entry=entries[0]
- print "GetVersion at %s returned %s"%(entry.url(),entry.get_version())
-
+ entry = entries[0]
+ print("GetVersion at %s returned %s" %
+ (entry.url(), entry.get_version()))
|