(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:
ahrenholz 2013-08-30 18:41:39 +00:00
parent 8f007a223f
commit aad3f07560
2 changed files with 25 additions and 10 deletions

View file

@ -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

View file

@ -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