Merge branch 'develop' into debian-develop
[archipelago] / python / archipelago / archipelago.py
similarity index 78%
rename from xseg/tools/archipelago/archipelago/archipelago.py
rename to python/archipelago/archipelago.py
index 3f1b7e1..75be990 100755 (executable)
@@ -44,7 +44,7 @@ from subprocess import check_call
 from .common import *
 from .vlmc import showmapped as vlmc_showmapped
 from .vlmc import get_mapped as vlmc_get_mapped
-
+from blktap import VlmcTapdisk
 
 def start_peer(peer, cli=False):
     if peer.is_running():
@@ -124,42 +124,7 @@ def peer_running(peer, cli):
         return False
 
 
-def make_segdev(cli=False):
-    try:
-        os.stat(str(CHARDEV_NAME))
-        raise Error("Segdev already exists")
-    except Error as e:
-        raise e
-    except:
-        pass
-    cmd = ["mknod", str(CHARDEV_NAME), "c", str(CHARDEV_MAJOR),
-           str(CHARDEV_MINOR)]
-    if cli:
-        print ' '.join(cmd)
-    try:
-        check_call(cmd, shell=False)
-    except Exception:
-        raise Error("Segdev device creation failed.")
-
-
-def remove_segdev():
-    try:
-        os.stat(str(CHARDEV_NAME))
-    except OSError, (err, reason):
-        if err == errno.ENOENT:
-            return
-        raise OSError(str(CHARDEV_NAME) + ' ' + reason)
-    try:
-        os.unlink(str(CHARDEV_NAME))
-    except:
-        raise Error("Segdev device removal failed.")
-
-
 def start_peers(peers, cli=False):
-    for m in modules:
-        if not loaded_module(m):
-            raise Error("Cannot start userspace peers. " + m +
-                        " module not loaded")
     for r, _ in config['roles']:
         p = peers[r]
         start_peer(p, cli)
@@ -180,7 +145,14 @@ def start(user=False, role=None, cli=False, **kwargs):
         return start_peer(p, cli)
 
     if user:
-        return start_peers(peers, cli)
+        get_segment().create()
+        start_peers(peers, cli)
+        mapped = vlmc_get_mapped()
+        if mapped:
+            for m in mapped:
+                if VlmcTapdisk.is_paused(m.device):
+                    VlmcTapdisk.unpause(m.device)
+        return
 
     if status() > 0:
         raise Error("Cannot start. Try stopping first")
@@ -191,15 +163,10 @@ def start(user=False, role=None, cli=False, **kwargs):
         print "===================="
         print ""
     try:
-        for m in modules:
-            load_module(m, None)
-        time.sleep(0.5)
-        make_segdev(cli)
-        time.sleep(0.5)
-        segment.create()
+        get_segment().create()
         time.sleep(0.5)
         start_peers(peers, cli)
-        load_module(xsegbd, xsegbd_args)
+        load_module("blktap", None)
     except Exception as e:
         if cli:
             print red(e)
@@ -214,13 +181,25 @@ def stop(user=False, role=None, cli=False, **kwargs):
             raise Error("Invalid peer %s" % role)
         return stop_peer(p, cli)
     if user:
-        return stop_peers(peers, cli)
+        mapped = vlmc_get_mapped()
+        if mapped:
+            for m in mapped:
+                if not VlmcTapdisk.is_paused(m.device):
+                    VlmcTapdisk.pause(m.device)
+        stop_peers(peers, cli)
+        return get_segment().destroy()
     #check devices
     if cli:
         print "===================="
         print "Stoping archipelago"
         print "===================="
         print ""
+    if not loaded_module("blktap"):
+        stop_peers(peers, cli)
+        time.sleep(0.5)
+        get_segment().destroy()
+        return
+
     if cli:
         if vlmc_showmapped() > 0:
             raise Error("Cannot stop archipelago. Mapped volumes exist")
@@ -228,16 +207,22 @@ def stop(user=False, role=None, cli=False, **kwargs):
         mapped = vlmc_get_mapped()
         if mapped and len(mapped) > 0:
             raise Error("Cannot stop archipelago. Mapped volumes exist")
-    unload_module(xsegbd)
     stop_peers(peers, cli)
-    remove_segdev()
-    for m in reversed(modules):
-        unload_module(m)
-        time.sleep(0.3)
+    time.sleep(0.5)
+    get_segment().destroy()
 
 
 def status(cli=False, **kwargs):
     r = 0
+    if not loaded_module("blktap"):
+        for role, _ in reversed(config['roles']):
+            p = peers[role]
+            if peer_running(p, cli):
+                r += 1
+        if cli:
+            pretty_print("blktap", red('Not loaded'))
+        return r
+
     if cli:
         if vlmc_showmapped() > 0:
             r += 1
@@ -245,21 +230,13 @@ def status(cli=False, **kwargs):
         mapped = vlmc_get_mapped()
         if mapped and len(mapped) > 0:
             r += 1
-    if loaded_module(xsegbd):
+    if loaded_module("blktap"):
         if cli:
-            pretty_print(xsegbd, green('Loaded'))
-        r += 1
+            pretty_print("blktap", green('Loaded'))
+        #r += 1
     else:
         if cli:
-            pretty_print(xsegbd, red('Not loaded'))
-    for m in reversed(modules):
-        if loaded_module(m):
-            if cli:
-                pretty_print(m, green('Loaded'))
-            r += 1
-        else:
-            if cli:
-                pretty_print(m, red('Not loaded'))
+            pretty_print("blktap", red('Not loaded'))
     for role, _ in reversed(config['roles']):
         p = peers[role]
         if peer_running(p, cli):