From 7879c3ee19ff579aeb771cefd5a9882f6da5ca1f Mon Sep 17 00:00:00 2001 From: Thierry Parmentelat Date: Wed, 30 May 2018 11:12:06 +0200 Subject: [PATCH] tcptest.py runs on top of python3, and uses ArgumentParser --- system/plcsh_stress_test.py | 47 +++++++------ system/tcptest.py | 130 ++++++++++++++++++++---------------- 2 files changed, 97 insertions(+), 80 deletions(-) diff --git a/system/plcsh_stress_test.py b/system/plcsh_stress_test.py index fea09af..fa4551b 100755 --- a/system/plcsh_stress_test.py +++ b/system/plcsh_stress_test.py @@ -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 @@ -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)") diff --git a/system/tcptest.py b/system/tcptest.py index abdc6fb..88c2b0d 100755 --- a/system/tcptest.py +++ b/system/tcptest.py @@ -1,7 +1,7 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # Thierry Parmentelat -# 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: -- 2.43.0