add archipelagos tool prototype
authorGiannakos Filippos <philipgian@grnet.gr>
Mon, 29 Oct 2012 15:40:45 +0000 (17:40 +0200)
committerGiannakos Filippos <philipgian@grnet.gr>
Mon, 29 Oct 2012 15:44:55 +0000 (17:44 +0200)
xseg/archipelagos [new file with mode: 0644]

diff --git a/xseg/archipelagos b/xseg/archipelagos
new file mode 100644 (file)
index 0000000..e2ed1cb
--- /dev/null
@@ -0,0 +1,259 @@
+#!/usr/bin/env python
+#
+# archipelagos tool
+
+import os, sys, subprocess, argparse, time, psutil
+from subprocess import call, check_call
+
+BIN_PATH="/usr/bin"
+MAPPER="mt-mapperd"
+VLMC="st-vlmcd"
+BLOCKER="pfiled"
+PIDFILE_PATH="/var/run/lock/archipelagos"
+
+try:
+    execfile(os.path.expanduser("/etc/default/archipelagos"), globals())
+except:
+    pass
+
+#FIXME check defaults
+peer_blockerb = [BLOCKER, ["-p" , str(BPORT), "-g", str(SPEC), "-n", str(NR_OPS),
+        str(PITHOS), str(IMAGES), "-d", "--pidfile", os.join(PIDFILE_PATH, "blockerd.pid")], "blockerb"]
+peer_blockerm = [BLOCKER, ["-p" , str(MBPORT), "-g", str(SPEC), "-n", str(NR_OPS),
+        str(PITHOSMAPS), str(MAPS), "-d", "--pidfile", os.join(PIDFILE_PATH, "blockerm.pid")], "blockerm" ]
+peer_vlmcd = [VLMC, ["-t" , "1", "-sp",  str(VPORT_START), "-ep", str(VPORT_END), 
+        "-g", str(SPEC), "-n", str(NR_OPS), "-bp", str(BPORT), "-mp", str(MPORT),
+       "-d", "--pidfile", os.join(PIDFILE_PATH, "vlmcd.pid")], "vlmcd"]
+peer_mapperd = [MAPPER, ["-t" , "1", "-p",  str(MPORT), "-mbp", str(MBPORT),
+        "-g", str(SPEC), "-n", str(NR_OPS), "-bp", str(BPORT), "-d", "--pidfile",
+       os.join(PIDFILE_PATH, "mapper.pid"], "mapper"]
+
+peers = [peer_blockerb, peer_blockerm, peer_vlmcd, peer_mapperd]
+modules = ["xseg", "segdev", "xseg_posix", "xseg_pthread", "xseg_segdev"]
+xsegbd = "xsegbd"
+    
+def exclusive(fn):
+    def exclusive_args(args):
+        file = "/tmp/vlmc_map.lock"
+        while True:
+            try:
+                fd = os.open(file, os.O_CREAT|os.O_EXCL|os.O_WRONLY)
+                break;
+            except Exception, reason:
+                print >> sys.stderr, reason
+                time.sleep(0.05)
+        try:
+            fn(args)
+        finally:
+            os.close(fd)
+            os.unlink(file)
+
+    return exclusive_args
+
+@exclusive
+def vlmc_showmapped(args):
+    print "id\tpool\timage\tsnap\tdevice"
+    try:
+        for f in os.listdir(XSEGBD_SYSFS + "devices/"):
+            d_id = open(XSEGBD_SYSFS + "devices/" + f + "/id").read().strip()
+            target = open(XSEGBD_SYSFS + "devices/"+ f + "/target").read().strip()
+
+            print "%s\t%s\t%s\t%s\t%s" % (d_id, '-', target, '-', DEVICE_PREFIX +
+            d_id)
+    except Exception, reason:
+        print >> sys.stderr, reason
+        sys.exit(-1)
+
+def loadrc(rc):
+    #FIXME
+    #check config file sanity
+    try:
+        if rc == None:
+            execfile(os.path.expanduser("/etc/default/archipelagos"), globals())
+        else:
+            execfile(rc, globals())
+    except:
+        pass
+
+def loaded_modules():
+    lines = open("/proc/modules").read().split("\n")
+    modules = [f.split(" ")[0] for f in lines]
+    return modules
+
+def load_module(name):
+    modules = loaded_modules()
+    if name in modules:
+        return -2
+    cmd = ["modprobe -v %s" % name]
+    try:
+        check_call(cmd, shell=False);
+    except Exception:
+            sys.stderr.write("Module %s failed to load. \n" % name)
+            return -1
+    return 0
+
+def unload_module(name):
+    modules = loaded_modules()
+    if name not in modules:
+        return -2
+    cmd = ["modprobe -rv %s" % name]
+    try:
+        check_call(cmd, shell=False);
+    except Exception:
+            sys.stderr.write("Module %s failed to unload. \n" % name)
+            return -1
+    return 0
+
+def create_segment():
+    #fixme blocking....
+    cmd = ["xseg", str(SPEC), "create"]
+    try:
+        check_call(cmd, shell=False);
+    except Exception:
+            sys.stderr.write("Cannot create segment. \n" % name)
+            return -1
+    return 0
+
+def destroy_segment():
+    #fixme blocking....
+    cmd = ["xseg", str(SPEC), "destroy"]
+    try:
+        check_call(cmd, shell=False);
+    except Exception:
+            sys.stderr.write("Cannot destroy segment. \n" % name)
+            return -1
+    return 0
+
+def check_running(name, pid = -1):
+    for p in psutil.process_iter():
+        if p.name == name:
+            if pid != -1:
+                if pid != p.pid:
+                    return -1
+            else:
+                return pid
+    return -1
+
+def check_pidfile(name):
+    pidfile = os.join(PIDFILE_PATH, name + ".pid")
+    try:
+        pf = open(pidfile, "r")
+        pid = pf.read()
+        pf.close()
+    except:
+        if pf :
+            pf.close()
+        return -1
+
+    return pid
+
+def start_peer(peer):
+    cmd = [peer[0]] + peer[1]
+    try:
+        check_call(cmd, shell=False);
+    except Exception:
+        sys.stderr.write("Segdev %s device creation failed. \n" % name)
+        return -1
+    return 0
+
+def stop_peer(peer):
+    pid = check_pidfile(peer[2])
+    if pid < 0:
+        print " process not running"
+        return -1
+
+    os.kill(pid, SIGTERM)
+    i = 0
+    while check_running(peer[0], pid) > 0:
+        time.sleep(0.1)
+        i += 1
+        if i > 100:
+            print "process did not die in 10 secs"
+            return -1
+    return 0
+
+def make_segdev():
+    if os.stat(str(CHARDEV_NAME)):
+        return -2
+    cmd = ["mknod", str(CHARDEV_NAME), "c", str(CHARDEV_MAJOR), str(CHARDEV_MINOR)]
+    try:
+        check_call(cmd, shell=False);
+    except Exception:
+        sys.stderr.write("Segdev %s device creation failed. \n" % name)
+        return -1
+    return 0
+
+def remove_segdev():
+    if not os.stat(str(CHARDEV_NAME)):
+        return -2
+    try:
+        os.unlink(str(CHARDEV_NAME))
+    except:
+        sys.stderr.write("Segdev %s device removal failed. \n" % name)
+        return -1
+
+
+def start(args):
+    
+    
+    #if sth running or loaded 
+    # return -1
+
+    for m in modules:
+        if load_module(m) < 0:
+            stop(args)
+            return -1
+
+    if make_segdev < 0:
+        stop(args)
+        return -1
+    
+    for p in peers:
+        if start_peer(p) < 0:
+            stop(args)
+            return -1
+
+    if create_segment() < 0:
+        stop(args)
+        return -1
+
+    if load_module(xsegbd) < 0:
+        stop(args)
+        return -1
+    return 0
+
+def stop(args):
+    #check devices
+    if unload_module(xsegbd):
+        return -1
+
+    #destroy segment with timeout
+    if destroy_segment() < 0:
+        return -1
+
+    for p in peers.reverse():
+        stop_peer(p)
+
+    remove_segdev()
+    
+    for m in modules:
+        unload_module(m)
+
+
+    
+
+
+if __name__ == "__main__":
+    # parse arguments and discpatch to the correct func
+    parser = argparse.ArgumentParser(description='vlmc tool')
+    parser.add_argument('-c', '--config', type=str, nargs='?', help='config file')
+    subparsers = parser.add_subparsers()
+
+    start_parser = subparsers.add_parser('start', help='Resize volume')
+    start_parser.set_defaults(func=start)
+    
+    start_parser = subparsers.add_parser('stop', help='Resize volume')
+    start_parser.set_defaults(func=stop)
+
+    args = parser.parse_args()
+    args.func(args)