use /etc/hosts if it has private bridge addresses
smbaker [Mon, 21 Jan 2013 23:27:44 +0000 (15:27 -0800)]
scripts/mpi-copy.py

index 4fe52ad..adaa1be 100755 (executable)
@@ -39,7 +39,6 @@ def fetch_output_nofail(inpath,outpath):
     if (pid==0):
         outfd = os.open(outpath, os.O_RDONLY|os.O_NONBLOCK)
         infd = os.open(inpath, os.O_WRONLY)
-#        infile = os.fdopen(infd,'w')
 
         flags = fcntl.fcntl(outfd, fcntl.F_GETFL)
         fcntl.fcntl(outfd, fcntl.F_SETFL, flags & ~os.O_NONBLOCK)
@@ -57,6 +56,72 @@ def fetch_output_nofail(inpath,outpath):
 
     return output
 
+def get_iplist_old():
+    outpath = '/vsys/slice_config.out'
+    inpath = '/vsys/slice_config.in'
+
+    ###
+    ### If vsys is not set up, wait a bit and try again
+
+    counter = 1
+    while True:
+            signal.signal(signal.SIGALRM, alarm)
+            output = fetch_output_nofail(inpath,outpath)
+            if (output is not None or counter==INSANE):
+                break
+            print "No access to vsys. Looping (%d)..."%counter
+            counter = counter+1
+
+    if (output is None) and (output != ""):
+        print "Could not connect to Vsys. Giving up."
+        exit(1)
+
+    master = None
+    nodes = []
+    wholestring = output.split("\n")
+    for eachline in wholestring:
+      if eachline == "\n" or eachline == "":
+        continue
+      line = eachline.split()
+      if line[0] == "vsys_ipList:":
+          nodeNames = line[1]
+          nodes = nodeNames.split(",")
+          master = nodes[0]
+
+    return (nodes, master)
+
+def get_iplist_new():
+    master = None
+    nodes = []
+    if os.path.exists("/etc/hosts"):
+        lines = open("/etc/hosts","r").readlines()
+        for line in lines:
+            # Format is: ip pvt.node_hostname private<n>
+            # The private addesses will all have "private" in them
+
+            if "private" in line:
+                line = line.strip()
+                parts = line.split(" ")
+
+                # parts[0] = ip
+                # parts[1] = pvt.node_hostname
+                # parts[2] = private<n>
+
+                nodes.append(parts[1])
+
+    if len(nodes)>0:
+        master = nodes[0]
+
+    return (nodes, master)
+
+def get_iplist():
+    # try to get it from /etc/hosts first, get it from vsys as a fallback
+    (nodes, master) = get_iplist_new()
+    if nodes == []:
+        (nodes, master) = get_iplist_old()
+
+    return (nodes, master)
+
 def write_hostnamefile(wholestring, hostfile_pathname):
     for eachline in wholestring:
       if eachline == "\n" or eachline == "":
@@ -89,50 +154,20 @@ homedir = "/home/" + sliceName
 cmd = "sudo chown -R " + sliceName + " /vsys"
 os.system(cmd)
 
-outpath = '/vsys/slice_config.out'
-inpath = '/vsys/slice_config.in'
-
-###
-### If vsys is not set up, wait a bit and try again
-
-counter = 1
-while True:
-        signal.signal(signal.SIGALRM, alarm)
-        output = fetch_output_nofail(inpath,outpath)
-        if (output is not None or counter==INSANE):
-            break
-        print "No access to vsys. Looping (%d)..."%counter
-        counter = counter+1
-
-if (output is None):
-    print "Could not connect to Vsys. Giving up."
-    exit(1)
-
-outfd = os.open(outpath, os.O_RDONLY|os.O_NONBLOCK)
-infile = open(inpath, 'w')
+(nodes, master) = get_iplist()
 
-flags = fcntl.fcntl(outfd, fcntl.F_GETFL)
-fcntl.fcntl(outfd, fcntl.F_SETFL, flags & ~os.O_NONBLOCK)
-outfile = os.fdopen(outfd)
-
-infile.write('1')
-output = ''
-
-while (True):
-        batch = outfile.read()
-        if (batch):
-                output+=batch
-        else:
-                break
-
-wholestring = output.split("\n")
 hostfile_pathname = homedir + "/" + hostfileName
-write_hostnamefile(wholestring, hostfile_pathname)
+file(hostfile_pathname, "w").write("\n".join(nodes) + "\n")
 
-nodes = open(hostfile_pathname, "r")
+nodesFile = open(hostfile_pathname, "r")
 
 username = getpass.getuser()
-wholefile = nodes.readlines()
+wholefile = nodesFile.readlines()
+
+#if master.startswith("pvt."):
+    # this is necessary, otherwise hadoop's dfs won't start
+#    print "changing hostname to", master
+#    os.system("sudo hostname " + master)
 
 for n in wholefile[1:]:
   node = n.rstrip()
@@ -144,8 +179,15 @@ for n in wholefile[1:]:
       break
     else:
       os.system("sleep 10")
+  print "creating dir %s on %s" % (directory, node)
   cmd = "ssh -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no " + username + "@" + node + " \"if [ ! -d " + directory + " ]; then mkdir " + directory + "; fi\""
   os.system(cmd)
   for eachfile in fileList:
+     print "copying %s to %s" % (eachfile, node)
      cmd = "scp -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no " + eachfile + " " + username + "@" + node + ":" + directory
      os.system(cmd)
+
+#  if master.startswith("pvt."):
+#      print "setting hostname on", node
+#      s = "ssh -o StrictHostKeyChecking=no %s@%s sudo hostname %s" % (username, node, node)
+#      os.system(s)