"""
Stops the network topology. This function will call the stop() function
of all gears before calling the mininet stop function, so they can have
- their oportunity to do a graceful shutdown.
+ their oportunity to do a graceful shutdown. stop() is called twice. The
+ first is a simple kill with no sleep, the second will sleep if not
+ killed and try with a different signal.
"""
logger.info('stopping topology: {}'.format(self.modname))
for gear in self.gears.values():
- gear.stop()
+ gear.stop(False)
+ for gear in self.gears.values():
+ gear.stop(True)
self.net.stop()
"Basic start function that just reports equipment start"
logger.info('starting "{}"'.format(self.name))
- def stop(self):
+ def stop(self, wait=True):
"Basic start function that just reports equipment stop"
logger.info('stopping "{}"'.format(self.name))
return result
- def stop(self):
+ def stop(self, wait=True):
"""
Stop router:
* Kill daemons
"""
self.logger.debug('stopping')
- return self.tgen.net[self.name].stopRouter()
+ return self.tgen.net[self.name].stopRouter(wait)
def vtysh_cmd(self, command, isjson=False, daemon=None):
"""
self.run('chown -R exabgp:exabgp /etc/exabgp')
self.run('exabgp -e /etc/exabgp/exabgp.env /etc/exabgp/exabgp.cfg')
- def stop(self):
+ def stop(self, wait=True):
"Stop ExaBGP peer and kill the daemon"
self.run('kill `cat /var/run/exabgp/exabgp.pid`')
set_sysctl(self, 'net.ipv4.ip_forward', 0)
set_sysctl(self, 'net.ipv6.conf.all.forwarding', 0)
super(Router, self).terminate()
- def stopRouter(self):
+ def stopRouter(self, wait=True):
# Stop Running Quagga or FRR Daemons
rundaemons = self.cmd('ls -1 /var/run/%s/*.pid' % self.routertype)
if rundaemons is not None:
+ numRunning = 0
for d in StringIO.StringIO(rundaemons):
daemonpid = self.cmd('cat %s' % d.rstrip()).rstrip()
if (daemonpid.isdigit() and pid_exists(int(daemonpid))):
+ logger.info('killing %s %s' % (self.name, os.path.basename(d.rstrip().rsplit(".", 1)[0])))
self.cmd('kill -TERM %s' % daemonpid)
self.waitOutput()
- sleep(2, 'waiting for router "{}" daemons to finish'.format(
- self.name))
- # 2nd round of kill if daemons didn't exist
- for d in StringIO.StringIO(rundaemons):
- daemonpid = self.cmd('cat %s' % d.rstrip()).rstrip()
- if (daemonpid.isdigit() and pid_exists(int(daemonpid))):
- self.cmd('kill -7 %s' % daemonpid)
- self.waitOutput()
+ if pid_exists(int(daemonpid)):
+ numRunning += 1
+ if wait and numRunning > 0:
+ sleep(2)
+ # 2nd round of kill if daemons didn't exit
+ for d in StringIO.StringIO(rundaemons):
+ daemonpid = self.cmd('cat %s' % d.rstrip()).rstrip()
+ if (daemonpid.isdigit() and pid_exists(int(daemonpid))):
+ logger.info('killing (-7) %s %s' % (self.name, os.path.basename(d.rstrip().rsplit(".", 1)[0])))
+ self.cmd('kill -7 %s' % daemonpid)
+ self.waitOutput()
def removeIPs(self):
for interface in self.intfNames():
self.cmd('ip address flush', interface)