From 7c5d2771f777030791a50c63a0cdf99fc4610ba6 Mon Sep 17 00:00:00 2001 From: cody burkard <cody@onlab.us> Date: Thu, 2 Oct 2014 22:02:59 -0700 Subject: [PATCH] wait for sshd to start in example --- examples/baresshd.py | 10 ++++++++-- examples/test/test_baresshd.py | 26 ++++++++++++++------------ mininet/util.py | 8 +++++--- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/examples/baresshd.py b/examples/baresshd.py index 68316178..59f13202 100755 --- a/examples/baresshd.py +++ b/examples/baresshd.py @@ -4,9 +4,10 @@ import sys from mininet.node import Host -from mininet.util import ensureRoot +from mininet.util import ensureRoot, waitListening ensureRoot() +timeout = 5 print "*** Creating nodes" h1 = Host( 'h1' ) @@ -33,5 +34,10 @@ if len( sys.argv ) > 1: cmd += ' ' + ' '.join( sys.argv[ 1: ] ) h1.cmd( cmd ) +listening = waitListening( server=h1, port=22, timeout=timeout ) -print "*** You may now ssh into", h1.name, "at", h1.IP() +if listening: + print "*** You may now ssh into", h1.name, "at", h1.IP() +else: + print ( "*** Warning: after %s seconds, %s is not listening on port 22" + % ( timeout, h1.name ) ) diff --git a/examples/test/test_baresshd.py b/examples/test/test_baresshd.py index d7087615..22cc84ca 100755 --- a/examples/test/test_baresshd.py +++ b/examples/test/test_baresshd.py @@ -6,21 +6,18 @@ import unittest import pexpect -from time import sleep from mininet.clean import cleanup, sh class testBareSSHD( unittest.TestCase ): - opts = [ '\(yes/no\)\?', 'Welcome to h1', 'refused', pexpect.EOF, pexpect.TIMEOUT ] + opts = [ 'Welcome to h1', pexpect.EOF, pexpect.TIMEOUT ] def connected( self ): "Log into ssh server, check banner, then exit" - p = pexpect.spawn( 'ssh 10.0.0.1 -i /tmp/ssh/test_rsa exit' ) + p = pexpect.spawn( 'ssh 10.0.0.1 -o StrictHostKeyChecking=no -i /tmp/ssh/test_rsa exit' ) while True: index = p.expect( self.opts ) if index == 0: - p.sendline( 'yes' ) - elif index == 1: return True else: return False @@ -37,18 +34,23 @@ def setUp( self ): cmd = ( 'python -m mininet.examples.baresshd ' '-o AuthorizedKeysFile=/tmp/ssh/authorized_keys ' '-o StrictModes=no' ) - sh( cmd ) + p = pexpect.spawn( cmd ) + runOpts = [ 'You may now ssh into h1 at 10.0.0.1', + 'after 5 seconds, h1 is not listening on port 22', + pexpect.EOF, pexpect.TIMEOUT ] + while True: + index = p.expect( runOpts ) + if index == 0: + break + else: + self.tearDown() + self.fail( 'sshd failed to start in host h1' ) def testSSH( self ): "Simple test to verify that we can ssh into h1" result = False # try to connect up to 3 times; sshd can take a while to start - for _ in range( 3 ): - result = self.connected() - if result: - break - else: - sleep( 1 ) + result = self.connected() self.assertTrue( result ) def tearDown( self ): diff --git a/mininet/util.py b/mininet/util.py index 41acfccc..bb1935f0 100644 --- a/mininet/util.py +++ b/mininet/util.py @@ -543,7 +543,8 @@ def ensureRoot(): return def waitListening( client=None, server='127.0.0.1', port=80, timeout=None ): - "Wait until server is listening on port" + """Wait until server is listening on port. + returns True if server is listening""" run = ( client.cmd if client else partial( quietRun, shell=True ) ) if not run( 'which telnet' ): @@ -554,12 +555,13 @@ def waitListening( client=None, server='127.0.0.1', port=80, timeout=None ): time = 0 while 'Connected' not in run( cmd ): if timeout: + print time if time >= timeout: error( 'could not connect to %s on port %d\n' % ( server, port ) ) - break + return False output('waiting for', server, 'to listen on port', port, '\n') sleep( .5 ) time += .5 - + return True -- GitLab