first step towards using testbox properly
[tests.git] / system / utils.py
index 971ff52..2d30edc 100644 (file)
@@ -1,7 +1,140 @@
 # $Id$
 import time
+import os
+import commands
+from pprint import PrettyPrinter
 
 # how could this accept a list again ?
 def header(message):
     now=time.strftime("%H:%M:%S", time.localtime())
     print "*",now,'--',message
+
+def pprint(message,spec,depth=2):
+    now=time.strftime("%H:%M:%S", time.localtime())
+    print ">",now,"--",message
+    PrettyPrinter(indent=8,depth=depth).pprint(spec)
+
+def show_site_spec (site):
+    print '======== site',site['site_fields']['name']
+    for (k,v) in site.iteritems():
+        if k=='nodes':
+            if v: 
+                print '\t\t','nodes : ',
+                for node in v:  
+                    print node['node_fields']['hostname'],'',
+                print ''
+        elif k=='users':
+            if v: 
+                print '\t\tusers : ',
+                for user in v:  
+                    print user['name'],'',
+                print ''
+        elif k == 'site_fields':
+            print '\t\tlogin_base',':',v['login_base']
+        elif k == 'address_fields':
+            pass
+        else:
+            print '\t\t',k,
+            PrettyPrinter(indent=8,depth=2).pprint(v)
+        
+def show_initscript_spec (initscript):
+    print '======== initscript',initscript['initscript_fields']['name']
+
+def show_key_spec (key):
+    print '======== key',key['name']
+
+def show_slice_spec (slice):
+    print '======== slice',slice['slice_fields']['name']
+    for (k,v) in slice.iteritems():
+        if k=='nodenames':
+            if v: 
+                print '\t\tnodes : ',
+                for nodename in v:  
+                    print nodename,'',
+                print ''
+        elif k=='usernames':
+            if v: 
+                print '\t\tusers : ',
+                for username in v:  
+                    print username,'',
+                print ''
+        elif k=='slice_fields':
+            print '\t\tfields',':',
+            print 'max_nodes=',v['max_nodes'],
+            print ''
+        else:
+            print '\t\t',k,v
+
+def show_test_spec (message,all_plc_specs):
+    now=time.strftime("%H:%M:%S", time.localtime())
+    print ">",now,"--",message
+    for plc_spec in all_plc_specs:
+        show_test_spec_pass (plc_spec,1)
+        show_test_spec_pass (plc_spec,2)
+
+def show_test_spec_pass (plc_spec,passno):
+    for (key,val) in plc_spec.iteritems():
+        if passno == 2:
+            if key == 'sites':
+                for site in val:
+                    show_site_spec(site)
+            elif key=='initscripts':
+                for initscript in val:
+                    show_initscript_spec (initscript)
+            elif key=='slices':
+                for slice in val:
+                    show_slice_spec (slice)
+            elif key=='keys':
+                for key in val:
+                    show_key_spec (key)
+        elif passno == 1:
+            if key not in ['sites','initscripts','slices','keys']:
+                print '\t',key,':',val
+
+def system(command):
+    now=time.strftime("%H:%M:%S", time.localtime())
+    print "+",now,':',command
+    return os.system("set -x; " + command)
+
+# checks whether a given hostname/ip responds to ping
+ping_timeout_option = None
+def check_ping (hostname):
+    # check OS (support for macos)
+    global ping_timeout_option
+    if not ping_timeout_option:
+        (status,osname) = commands.getstatusoutput("uname -s")
+        if status != 0:
+            raise Exception, "Cannot figure your OS name"
+        if osname == "Linux":
+            ping_timeout_option="-w"
+        elif osname == "Darwin":
+            ping_timeout_option="-t"
+
+    command="ping -c 1 %s 1 %s"%(ping_timeout_option,hostname)
+    (status,output) = commands.getstatusoutput(command)
+    return status == 0
+
+# inserts a backslash before each occurence of the following chars
+# \ " ' < > & | ; ( ) $ * ~ 
+def backslash_shell_specials (command):
+    result=''
+    for char in command:
+        if char in "\\\"'<>&|;()$*~":
+            result +='\\'+char
+        else:
+            result +=char
+    return result
+
+# check main IP address against the provided hostname
+def is_local (hostname):
+    if hostname == "localhost":
+        return True
+    import socket
+    try:
+        local_ip = socket.gethostbyname(socket.gethostname())
+        remote_ip = socket.gethostbyname(hostname)
+        return local_ip==remote_ip
+    except:
+        header("WARNING : something wrong in is_local with hostname=%s"%hostname)
+        return False
+