allow default node class to be specified when initalizing an XML parser
write and parse default services and node types to/from XML ServicePlan (Boeing r1814)
This commit is contained in:
parent
c635c54a3a
commit
96f346804b
1 changed files with 48 additions and 5 deletions
|
@ -121,12 +121,14 @@ def xmltypetonodeclass(session, type):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
class CoreDocumentParser(object):
|
class CoreDocumentParser(object):
|
||||||
def __init__(self, session, filename, start=False):
|
def __init__(self, session, filename, start=False,
|
||||||
|
nodecls=pycore.nodes.CoreNode):
|
||||||
self.session = session
|
self.session = session
|
||||||
self.verbose = self.session.getcfgitembool('verbose', False)
|
self.verbose = self.session.getcfgitembool('verbose', False)
|
||||||
self.filename = filename
|
self.filename = filename
|
||||||
self.dom = parse(filename)
|
self.dom = parse(filename)
|
||||||
self.start = start
|
self.start = start
|
||||||
|
self.nodecls = nodecls
|
||||||
|
|
||||||
#self.scenario = getoneelement(self.dom, "Scenario")
|
#self.scenario = getoneelement(self.dom, "Scenario")
|
||||||
self.np = getoneelement(self.dom, "NetworkPlan")
|
self.np = getoneelement(self.dom, "NetworkPlan")
|
||||||
|
@ -140,6 +142,7 @@ class CoreDocumentParser(object):
|
||||||
# link parameters parsed in parsenets(), applied in parsenodes()
|
# link parameters parsed in parsenets(), applied in parsenodes()
|
||||||
self.linkparams = {}
|
self.linkparams = {}
|
||||||
|
|
||||||
|
self.parsedefaultservices()
|
||||||
self.parsenets()
|
self.parsenets()
|
||||||
self.parsenodes()
|
self.parsenodes()
|
||||||
self.parseservices()
|
self.parseservices()
|
||||||
|
@ -239,7 +242,7 @@ class CoreDocumentParser(object):
|
||||||
if type == "rj45":
|
if type == "rj45":
|
||||||
nodecls = pycore.nodes.RJ45Node
|
nodecls = pycore.nodes.RJ45Node
|
||||||
else:
|
else:
|
||||||
nodecls = pycore.nodes.CoreNode
|
nodecls = self.nodecls
|
||||||
n = self.session.addobj(cls = nodecls, objid = id, name = name,
|
n = self.session.addobj(cls = nodecls, objid = id, name = name,
|
||||||
start = self.start)
|
start = self.start)
|
||||||
if name in self.coords:
|
if name in self.coords:
|
||||||
|
@ -349,6 +352,21 @@ class CoreDocumentParser(object):
|
||||||
value = int(value)
|
value = int(value)
|
||||||
return (key, value)
|
return (key, value)
|
||||||
|
|
||||||
|
def parsedefaultservices(self):
|
||||||
|
''' Prior to parsing nodes, use session.services manager to store
|
||||||
|
default services for node types
|
||||||
|
'''
|
||||||
|
for node in self.sp.getElementsByTagName("Node"):
|
||||||
|
type = node.getAttribute("type")
|
||||||
|
if type == '':
|
||||||
|
continue # node-specific service config
|
||||||
|
services = []
|
||||||
|
for service in node.getElementsByTagName("Service"):
|
||||||
|
services.append(str(service.getAttribute("name")))
|
||||||
|
self.session.services.defaultservices[type] = services
|
||||||
|
self.session.info("default services for type %s set to %s" % \
|
||||||
|
(type, services))
|
||||||
|
|
||||||
def parseservices(self):
|
def parseservices(self):
|
||||||
''' After node objects exist, parse service customizations and add them
|
''' After node objects exist, parse service customizations and add them
|
||||||
to the nodes.
|
to the nodes.
|
||||||
|
@ -357,6 +375,8 @@ class CoreDocumentParser(object):
|
||||||
# parse services and store configs into session.services.configs
|
# parse services and store configs into session.services.configs
|
||||||
for node in self.sp.getElementsByTagName("Node"):
|
for node in self.sp.getElementsByTagName("Node"):
|
||||||
name = node.getAttribute("name")
|
name = node.getAttribute("name")
|
||||||
|
if name == '':
|
||||||
|
continue # node type without name
|
||||||
n = self.session.objbyname(name)
|
n = self.session.objbyname(name)
|
||||||
if n is None:
|
if n is None:
|
||||||
self.warn("skipping service config for unknown node '%s'" % \
|
self.warn("skipping service config for unknown node '%s'" % \
|
||||||
|
@ -369,6 +389,15 @@ class CoreDocumentParser(object):
|
||||||
svclists[n.objid] += "|" + svcname
|
svclists[n.objid] += "|" + svcname
|
||||||
else:
|
else:
|
||||||
svclists[n.objid] = svcname
|
svclists[n.objid] = svcname
|
||||||
|
# nodes in NetworkPlan but not in ServicePlan use the
|
||||||
|
# default services for their type
|
||||||
|
for node in self.np.getElementsByTagName("Node"):
|
||||||
|
id, name, type = self.getcommonattributes(node)
|
||||||
|
if id in svclists:
|
||||||
|
continue # custom config exists
|
||||||
|
else:
|
||||||
|
svclists[int(id)] = None # use defaults
|
||||||
|
|
||||||
# associate nodes with services
|
# associate nodes with services
|
||||||
for objid in sorted(svclists.keys()):
|
for objid in sorted(svclists.keys()):
|
||||||
n = self.session.obj(objid)
|
n = self.session.obj(objid)
|
||||||
|
@ -496,6 +525,7 @@ class CoreDocumentWriter(Document):
|
||||||
|
|
||||||
def populatefromsession(self):
|
def populatefromsession(self):
|
||||||
self.session.emane.setup() # not during runtime?
|
self.session.emane.setup() # not during runtime?
|
||||||
|
self.adddefaultservices()
|
||||||
self.addnets()
|
self.addnets()
|
||||||
self.addnodes()
|
self.addnodes()
|
||||||
self.addmetadata()
|
self.addmetadata()
|
||||||
|
@ -691,6 +721,19 @@ class CoreDocumentWriter(Document):
|
||||||
coords = self.createTextNode(coordstxt)
|
coords = self.createTextNode(coordstxt)
|
||||||
pt.appendChild(coords)
|
pt.appendChild(coords)
|
||||||
|
|
||||||
|
def adddefaultservices(self):
|
||||||
|
''' Add default services and node types to the ServicePlan.
|
||||||
|
'''
|
||||||
|
for type in self.session.services.defaultservices:
|
||||||
|
defaults = self.session.services.getdefaultservices(type)
|
||||||
|
spn = self.createElement("Node")
|
||||||
|
spn.setAttribute("type", type)
|
||||||
|
self.sp.appendChild(spn)
|
||||||
|
for svc in defaults:
|
||||||
|
s = self.createElement("Service")
|
||||||
|
spn.appendChild(s)
|
||||||
|
s.setAttribute("name", str(svc._name))
|
||||||
|
|
||||||
def addservices(self, node):
|
def addservices(self, node):
|
||||||
''' Add services and their customizations to the ServicePlan.
|
''' Add services and their customizations to the ServicePlan.
|
||||||
'''
|
'''
|
||||||
|
@ -790,15 +833,15 @@ class CoreDocumentWriter(Document):
|
||||||
addtextparamtoparent(self, meta, k, v)
|
addtextparamtoparent(self, meta, k, v)
|
||||||
#addparamtoparent(self, meta, k, v)
|
#addparamtoparent(self, meta, k, v)
|
||||||
|
|
||||||
def opensessionxml(session, filename, start=False):
|
def opensessionxml(session, filename, start=False, nodecls=pycore.nodes.CoreNode):
|
||||||
''' Import a session from the EmulationScript XML format.
|
''' Import a session from the EmulationScript XML format.
|
||||||
'''
|
'''
|
||||||
doc = CoreDocumentParser(session, filename, start)
|
doc = CoreDocumentParser(session, filename, start, nodecls)
|
||||||
if start:
|
if start:
|
||||||
session.name = os.path.basename(filename)
|
session.name = os.path.basename(filename)
|
||||||
session.filename = filename
|
session.filename = filename
|
||||||
session.node_count = str(session.getnodecount())
|
session.node_count = str(session.getnodecount())
|
||||||
session.checkruntime()
|
session.instantiate()
|
||||||
|
|
||||||
def savesessionxml(session, filename):
|
def savesessionxml(session, filename):
|
||||||
''' Export a session to the EmulationScript XML format.
|
''' Export a session to the EmulationScript XML format.
|
||||||
|
|
Loading…
Reference in a new issue