(Boeing r1760)
fix Session.instantiate() for EMANE slave servers, which wait for their platform ID and starting NEM ID from the master server
This commit is contained in:
parent
8f007a223f
commit
aad3f07560
2 changed files with 25 additions and 10 deletions
|
@ -32,6 +32,7 @@ class Emane(ConfigurableManager):
|
||||||
_name = "emane"
|
_name = "emane"
|
||||||
_type = coreapi.CORE_TLV_REG_EMULSRV
|
_type = coreapi.CORE_TLV_REG_EMULSRV
|
||||||
_hwaddr_prefix = "02:02"
|
_hwaddr_prefix = "02:02"
|
||||||
|
(SUCCESS, NOT_NEEDED, NOT_READY) = (0, 1, 2)
|
||||||
|
|
||||||
def __init__(self, session):
|
def __init__(self, session):
|
||||||
ConfigurableManager.__init__(self, session)
|
ConfigurableManager.__init__(self, session)
|
||||||
|
@ -141,37 +142,43 @@ class Emane(ConfigurableManager):
|
||||||
|
|
||||||
def setup(self):
|
def setup(self):
|
||||||
''' Populate self._objs with EmaneNodes; perform distributed setup;
|
''' Populate self._objs with EmaneNodes; perform distributed setup;
|
||||||
associate models with EmaneNodes from self.config.
|
associate models with EmaneNodes from self.config. Returns
|
||||||
|
Emane.(SUCCESS, NOT_NEEDED, NOT_READY) in order to delay session
|
||||||
|
instantiation.
|
||||||
'''
|
'''
|
||||||
with self.session._objslock:
|
with self.session._objslock:
|
||||||
for obj in self.session.objs():
|
for obj in self.session.objs():
|
||||||
if isinstance(obj, EmaneNode):
|
if isinstance(obj, EmaneNode):
|
||||||
self.addobj(obj)
|
self.addobj(obj)
|
||||||
if len(self._objs) == 0:
|
if len(self._objs) == 0:
|
||||||
return False
|
return Emane.NOT_NEEDED
|
||||||
if self.checkdistributed():
|
if self.checkdistributed():
|
||||||
# we are slave, but haven't received a platformid yet
|
# we are slave, but haven't received a platformid yet
|
||||||
cfgval = self.getconfig(None, self.emane_config._name,
|
cfgval = self.getconfig(None, self.emane_config._name,
|
||||||
self.emane_config.getdefaultvalues())[1]
|
self.emane_config.getdefaultvalues())[1]
|
||||||
i = self.emane_config.getnames().index('platform_id_start')
|
i = self.emane_config.getnames().index('platform_id_start')
|
||||||
if cfgval[i] == self.emane_config.getdefaultvalues()[i]:
|
if cfgval[i] == self.emane_config.getdefaultvalues()[i]:
|
||||||
return False
|
return Emane.NOT_READY
|
||||||
self.setnodemodels()
|
self.setnodemodels()
|
||||||
return True
|
return Emane.SUCCESS
|
||||||
|
|
||||||
def startup(self):
|
def startup(self):
|
||||||
''' after all the EmaneNode objects have been added, build XML files
|
''' After all the EmaneNode objects have been added, build XML files
|
||||||
and start the daemons
|
and start the daemons. Returns Emane.(SUCCESS, NOT_NEEDED, or
|
||||||
|
NOT_READY) which is used to delay session instantiation.
|
||||||
'''
|
'''
|
||||||
self.reset()
|
self.reset()
|
||||||
if not self.setup():
|
r = self.setup()
|
||||||
return
|
if r != Emane.SUCCESS:
|
||||||
|
return r # NOT_NEEDED or NOT_READY
|
||||||
with self._objslock:
|
with self._objslock:
|
||||||
self.buildxml()
|
self.buildxml()
|
||||||
self.starteventmonitor()
|
self.starteventmonitor()
|
||||||
if self.numnems() > 0:
|
if self.numnems() > 0:
|
||||||
|
# TODO: check and return failure for these methods
|
||||||
self.startdaemons()
|
self.startdaemons()
|
||||||
self.installnetifs()
|
self.installnetifs()
|
||||||
|
return Emane.SUCCESS
|
||||||
|
|
||||||
def poststartup(self):
|
def poststartup(self):
|
||||||
''' Retransmit location events now that all NEMs are active.
|
''' Retransmit location events now that all NEMs are active.
|
||||||
|
@ -544,7 +551,13 @@ class Emane(ConfigurableManager):
|
||||||
conftype = msg.gettlv(coreapi.CORE_TLV_CONF_TYPE)
|
conftype = msg.gettlv(coreapi.CORE_TLV_CONF_TYPE)
|
||||||
if conftype == coreapi.CONF_TYPE_FLAGS_UPDATE and \
|
if conftype == coreapi.CONF_TYPE_FLAGS_UPDATE and \
|
||||||
self.session.master == False:
|
self.session.master == False:
|
||||||
self.startup()
|
# instantiation was previously delayed by self.setup()
|
||||||
|
# returning Emane.NOT_READY
|
||||||
|
h = None
|
||||||
|
with session._handlerslock:
|
||||||
|
for h in self.session._handlers:
|
||||||
|
break
|
||||||
|
self.session.instantiate(handler=h)
|
||||||
|
|
||||||
return r
|
return r
|
||||||
|
|
||||||
|
|
|
@ -573,8 +573,10 @@ class Session(object):
|
||||||
for transition to the runtime state.
|
for transition to the runtime state.
|
||||||
'''
|
'''
|
||||||
self.writeobjs()
|
self.writeobjs()
|
||||||
|
# controlnet may be needed by some EMANE models
|
||||||
self.addremovectrlif(node=None, remove=False)
|
self.addremovectrlif(node=None, remove=False)
|
||||||
self.emane.startup()
|
if self.emane.startup() == self.emane.NOT_READY:
|
||||||
|
return # instantiate() will be invoked again upon Emane.configure()
|
||||||
self.broker.startup()
|
self.broker.startup()
|
||||||
self.mobility.startup()
|
self.mobility.startup()
|
||||||
# boot the services on each node
|
# boot the services on each node
|
||||||
|
|
Loading…
Add table
Reference in a new issue