tcptest.py runs on top of python3, and uses ArgumentParser
authorThierry Parmentelat <thierry.parmentelat@inria.fr>
Wed, 30 May 2018 09:12:06 +0000 (11:12 +0200)
committerThierry Parmentelat <thierry.parmentelat@inria.fr>
Wed, 30 May 2018 09:12:06 +0000 (11:12 +0200)
system/plcsh_stress_test.py
system/tcptest.py

index fea09af..fa4551b 100755 (executable)
@@ -1,5 +1,10 @@
 #!/usr/bin/env plcsh
 #
+# WARNING: as opposed to the rest of the python code in this repo
+# the current script runs on top of plcsh and so it is for now
+# pinned as python2 code
+#
+#
 # Test script utility class
 #
 # Mark Huang <mlhuang@cs.princeton.edu>
@@ -123,7 +128,7 @@ def random_site(namelengths):
         'latitude': int(randfloat(-90.0, 90.0) * 1000) / 1000.0,
         'longitude': int(randfloat(-180.0, 180.0) * 1000) / 1000.0,
         }
-            
+
 def random_address_type():
     return {
         'name': randstr(20),
@@ -344,7 +349,7 @@ class Test:
         self.verbose = verbose
         self.preserve = preserve
         self.federating = federating
-        
+
         self.site_ids = []
         self.address_type_ids = []
         self.address_ids = []
@@ -363,7 +368,7 @@ class Test:
         self.slice_tag_ids = []
 
     def Cardinals (self):
-        return [len(x) for x in ( 
+        return [len(x) for x in (
                 self.api.GetNodes({},['node_id']),
                 self.api.GetSites({},['site_id']),
                 self.api.GetPersons({},['person_id']),
@@ -425,7 +430,7 @@ class Test:
             self.AddConfFiles(sizes['conf_files'])
             self.AddSlices(sizes['slices_per_site'])
             self.AddSliceTags(sizes['attributes_per_slice'])
-        
+
         else:
             self.RecordStatus()
             self.AddSites(sizes['sites'])
@@ -469,7 +474,7 @@ class Test:
         self.DeleteAddressTypes()
         self.DeleteSites()
 
-    # record current (old) objects 
+    # record current (old) objects
     def RecordStatus (self):
         self.old_site_ids = [ s['site_id'] for s in self.api.GetSites({},['site_id']) ]
         self.old_person_ids = [ s['person_id'] for s in self.api.GetPersons({},['person_id']) ]
@@ -834,7 +839,7 @@ class Test:
             self.api.DeletePerson(person_id)
 
             if self.check:
-                assert not self.api.GetPersons([person_id])                         
+                assert not self.api.GetPersons([person_id])
 
             if self.verbose:
                 print "Deleted user", person_id
@@ -939,7 +944,7 @@ class Test:
             # locate tag type
             tag_type_id = self.nodegroup_type_ids[i]
             tagname=self.api.GetTagTypes([tag_type_id])[0]['tagname']
-            
+
             # Add node group
             groupname = random_nodegroup() ['groupname']
             value = 'yes'
@@ -1005,7 +1010,7 @@ class Test:
         be added to a random node group if AddNodeGroups() was
         previously run.
         """
-        
+
         node_types = self.api.GetNodeTypes()
         if not node_types:
             raise Exception, "No node types"
@@ -1055,7 +1060,7 @@ class Test:
             # Update node
             node_fields = random_node(node_types,boot_states,self.namelengths)
             self.api.UpdateNode(node_id, node_fields)
-            
+
             node = self.api.GetNodes([node_id])[0]
 
             # Add to a random set of node groups
@@ -1133,7 +1138,7 @@ class Test:
         network_methods = self.api.GetNetworkMethods()
         if not network_methods:
             raise Exception, "No network methods"
-        
+
         network_types = self.api.GetNetworkTypes()
         if not network_types:
             raise Exception, "No network types"
@@ -1168,7 +1173,7 @@ class Test:
         network_methods = self.api.GetNetworkMethods()
         if not network_methods:
             raise Exception, "No network methods"
-        
+
         network_types = self.api.GetNetworkTypes()
         if not network_types:
             raise Exception, "No network types"
@@ -1208,7 +1213,7 @@ class Test:
             assert not self.api.GetInterfaces(self.interface_ids)
 
         self.interface_ids = []
-        
+
     def AddIlinks (self, n):
         """
         Add random links between interfaces.
@@ -1442,7 +1447,7 @@ class Test:
 
     def AddTagTypes(self,n_sa,n_ng,n_il):
         """
-        Add as many tag types as there are nodegroups, 
+        Add as many tag types as there are nodegroups,
         will use value=yes for each nodegroup
         """
 
@@ -1459,7 +1464,7 @@ class Test:
                 self.slice_type_ids + \
                 self.nodegroup_type_ids + \
                 self.ilink_type_ids
-            
+
             tt_role_ids=random_roles(role_ids)
             for tt_role_id in tt_role_ids:
                 self.api.AddRoleToTagType(tt_role_id,tag_type_id)
@@ -1665,7 +1670,7 @@ class Test:
                         if node_id is not None:
                             print "to node", node_id,
                         print
-                        
+
     def UpdateSliceTags(self):
         """
         Make random changes to any slice attributes we may have added.
@@ -1715,19 +1720,19 @@ class Test:
 
 def main():
     parser = OptionParser()
-    parser.add_option("-c", "--check", action = "store_true", default = False, 
+    parser.add_option("-c", "--check", action = "store_true", default = False,
                       help = "Check most actions (default: %default)")
-    parser.add_option("-q", "--quiet", action = "store_true", default = False, 
+    parser.add_option("-q", "--quiet", action = "store_true", default = False,
                       help = "Be quiet (default: %default)")
     parser.add_option("-p","--preserve", action="store_true", default =False,
                       help = "Do not delete created objects")
-    parser.add_option("-t", "--tiny", action = "store_true", default = False, 
+    parser.add_option("-t", "--tiny", action = "store_true", default = False,
                       help = "Run a tiny test (default: %default)")
-    parser.add_option("-l", "--large", action = "store_true", default = False, 
+    parser.add_option("-l", "--large", action = "store_true", default = False,
                       help = "Run a large test (default: %default)")
-    parser.add_option("-x", "--xlarge", action = "store_true", default = False, 
+    parser.add_option("-x", "--xlarge", action = "store_true", default = False,
                       help = "Run an XL test (default: %default)")
-    parser.add_option("-s", "--short-names", action="store_true", dest="short_names", default = False, 
+    parser.add_option("-s", "--short-names", action="store_true", dest="short_names", default = False,
                       help = "Generate smaller names for checking UI rendering")
     parser.add_option ("-f", "--foreign", action="store_true", dest="federating", default = False,
                        help = "Create a fake peer and add items in it (no update, no delete)")
index abdc6fb..88c2b0d 100755 (executable)
@@ -1,7 +1,7 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 # Thierry Parmentelat <thierry.parmentelat@inria.fr>
-# Copyright (C) 2010 INRIA 
+# Copyright (C) 2010 INRIA
 #
 
 # this is a small and simple standalone utility
@@ -9,72 +9,80 @@
 # we keep this in python2 for now until python3
 # can be taken for granted in sliceimage
 
-from __future__ import print_function
+# pylint: disable=c0111, c0103, w0622, r0903, r0201, w0703
 
 import sys
 import time
 import subprocess
 import socket
-import SocketServer
+import socketserver
 import threading
-from optparse import OptionParser    
+from argparse import ArgumentParser
+
 
 def myprint(message, id='client'):
     now = time.strftime("%H:%M:%S", time.localtime())
-    print("* {now} ({id}) -- {message}".format(**locals()))
+    print("* {now} ({id}) -- {message}"
+          .format(now=now, id=id, message=message))
     sys.stdout.flush()
 
+
 def show_network_status(id):
     myprint("ip address show", id=id)
     subprocess.call(['ip', 'address', 'show'])
     myprint("ip route show", id=id)
     subprocess.call(['ip', 'route', 'show'])
 
-class EchoRequestHandler(SocketServer.StreamRequestHandler):
+
+class EchoRequestHandler(socketserver.StreamRequestHandler):
     def handle(self):
         line = self.rfile.readline()
         self.wfile.write(line)
 
-class UppercaseRequestHandler(SocketServer.StreamRequestHandler):
+
+class UppercaseRequestHandler(socketserver.StreamRequestHandler):
     def handle(self):
         line = self.rfile.readline()
         self.wfile.write(line.upper())
 
+
 class Server:
     """
     A TCP server, running for some finite amount of time
     """
     def main(self):
-        parser = OptionParser()
-        parser.add_option("-p", "--port", action="store", dest="port", type="int",
-                          default=10000, help="port number")
-        parser.add_option("-a", "--address", action="store", dest="address", 
-                          default=socket.gethostname(), help="address")
-        parser.add_option("-t", "--timeout", action="store", dest="timeout", type="int",
-                          default="0")
-        (options, args) = parser.parse_args()
-
-        if len(args) != 0:
+        parser = ArgumentParser()
+        parser.add_argument("-p", "--port", type=int, default=10000,
+                            action="store", dest="port",
+                            help="port number")
+        parser.add_argument("-a", "--address", action="store", dest="address",
+                            default=socket.gethostname(), help="address")
+        parser.add_argument("-t", "--timeout", action="store", dest="timeout",
+                            type=int, default="0")
+        args = parser.parse_args()
+
+        if not args:
             parser.print_help()
             sys.exit(1)
 
         myprint("==================== tcptest.py server", id='server')
         show_network_status(id='server')
-        server = SocketServer.TCPServer((options.address, options.port),
+        server = socketserver.TCPServer((args.address, args.port),
                                         UppercaseRequestHandler)
         try:
-            if options.timeout:
+            if args.timeout:
                 t = threading.Thread(target=server.serve_forever)
-                t.setDaemon(True) # don't hang on exit
+                t.setDaemon(True)  # don't hang on exit
                 t.start()
-                time.sleep(options.timeout)
+                time.sleep(args.timeout)
                 sys.exit(0)
             else:
-                server.serve_forever()        
-        except KeyboardInterrupt as e:
+                server.serve_forever()
+        except KeyboardInterrupt:
             print('Bailing out on keyboard interrupt')
             sys.exit(1)
-            
+
+
 class Ready:
     """
     A utility that does exit(0) iff network as perceived
@@ -82,20 +90,21 @@ class Ready:
     so one can wait for the right conditions.
     """
     def main(self):
-        parser = OptionParser()
+        parser = ArgumentParser()
         # by default use another port so we don't run into
         # the SO_LINGER kind of trouble
-        parser.add_option("-p", "--port", action="store", dest="port", type="int",
-                          default=9999, help="port number")
-        parser.add_option("-a", "--address", action="store", dest="address", 
-                          default=socket.gethostname(), help="address")
-        (options, args) = parser.parse_args()
+        parser.add_argument("-p", "--port", action="store", dest="port",
+                            type=int, default=9999, help="port number")
+        parser.add_argument("-a", "--address", action="store", dest="address",
+                            default=socket.gethostname(), help="address")
+        args = parser.parse_args()
 
         myprint("==================== tcptest.py ready", id='ready')
-        def can_bind ():
+
+        def can_bind():
             s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
             try:
-                s.bind((options.address, options.port))
+                s.bind((args.address, args.port))
                 return True
             except Exception as e:
                 print(e)
@@ -106,55 +115,58 @@ class Ready:
             return subprocess.check_call(command, shell=True) == 0
 
         sys.exit(0 if can_bind() and eth0_has_ipv4() else 1)
-        
+
+
 class Client:
     """
     Runs a client against a Server instance
     """
     def main(self):
-        parser = OptionParser()
-        parser.add_option("-p","--port", action="store", dest="port", type="int",
-                          default=10000, help="port number")
-        parser.add_option("-a","--address", action="store", dest="address", 
-                          default=socket.gethostname(), help="address")
-        parser.add_option("-s","--sleep", action="store", dest="sleep", type="int",
-                          default=1, help="sleep seconds")
-        parser.add_option("-l","--loops", action="store", dest="loops", type="int",
-                          default=1, help="iteration loops")
-        
-        (options, args) = parser.parse_args()
-        if len(args) != 0:
+        parser = ArgumentParser()
+        parser.add_argument("-p", "--port", action="store", dest="port",
+                            type=int, default=10000, help="port number")
+        parser.add_argument("-a", "--address", action="store", dest="address",
+                            default=socket.gethostname(), help="address")
+        parser.add_argument("-s", "--sleep", action="store", dest="sleep",
+                            type=int, default=1, help="sleep seconds")
+        parser.add_argument("-l", "--loops", action="store", dest="loops",
+                            type=int, default=1, help="iteration loops")
+
+        args = parser.parse_args()
+        if not args:
             parser.print_help()
             sys.exit(1)
 
         myprint("==================== tcptest.py client", id='client')
-        result=True
-        for i in range(1,options.loops+1):
+        result = True
+        for i in range(1, args.loops+1):
             s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-            s.connect((options.address, options.port))
-            mout=i*'ping ' + '\n'
-            min=mout.upper()
+            s.connect((args.address, args.port))
+            mout = i*b'ping_out ' + b'\n'
+            min =  i*b'PING_in  ' + b'\n'
             if s.send(mout) != len(mout):
                 myprint("cannot send {}".format(mout.strip()))
-                result=False
+                result = False
                 break
-            line=s.recv(len(min))
+            line = s.recv(len(min))
             if line is not line:
-                myprint("unexpected reception\ngot:{}\nexpected: {}".format(line, min))
+                myprint("unexpected reception\ngot:{}\nexpected: {}"
+                        .format(line, min))
                 result = False
             else:
                 myprint("OK:{}".format(mout.strip()))
-            # leave the connection open, but the last one (so 1 iter returns fast)
-            if i != options.loops:
-                time.sleep(options.sleep)
+            # leave the connection open, but the last (so 1 iter returns fast)
+            if i != args.loops:
+                time.sleep(args.sleep)
             myprint("disconnecting")
             s.close()
         myprint("Done")
-        exit_return=0
+        exit_return = 0
         if not result:
-            exit_return=1
+            exit_return = 1
         sys.exit(exit_return)
 
+
 if __name__ == '__main__':
     for arg in sys.argv[1:]:
         if arg.find("client") >= 0: