vlmc: Add X_HASH operation
authorFilippos Giannakos <philipgian@grnet.gr>
Mon, 22 Jul 2013 10:15:47 +0000 (13:15 +0300)
committerFilippos Giannakos <philipgian@grnet.gr>
Mon, 22 Jul 2013 10:15:47 +0000 (13:15 +0300)
xseg/tools/archipelago/archipelago/cli.py
xseg/tools/archipelago/archipelago/common.py
xseg/tools/archipelago/archipelago/vlmc.py

index ab30208..549e663 100755 (executable)
@@ -158,6 +158,13 @@ def vlmc_parser():
     map_info_parser.add_argument('-v', '--verbose',  action='store_true',
                                  default=False, help='')
 
     map_info_parser.add_argument('-v', '--verbose',  action='store_true',
                                  default=False, help='')
 
+    hash_parser = subparsers.add_parser('hash', help='Hash snapshot')
+    #group = hash_parser.add_mutually_exclusive_group(required=True)
+    hash_parser.add_argument('-p', '--pool', type=str, nargs='?',
+                                 help='for backwards compatiblity with rbd')
+    hash_parser.add_argument('name', type=str,  help='Snapshot name')
+    hash_parser.set_defaults(func=vlmc.hash)
+
     return parser
 
 
     return parser
 
 
index 5de2e32..64d412b 100755 (executable)
@@ -1024,3 +1024,7 @@ class Request(object):
     @classmethod
     def get_hash_request(cls, xseg, dst, target, size=0, offset=0):
         return cls(xseg, dst, target, op=X_HASH, size=size, offset=offset)
     @classmethod
     def get_hash_request(cls, xseg, dst, target, size=0, offset=0):
         return cls(xseg, dst, target, op=X_HASH, size=size, offset=offset)
+
+    @classmethod
+    def get_hash_request(cls, xseg, dst, target):
+        return cls(xseg, dst, target, op=X_HASH)
index a5fc39f..1ce873d 100755 (executable)
@@ -148,6 +148,30 @@ def snapshot(name, snap_name=None, cli=False, **kwargs):
     if cli:
         sys.stdout.write("Snapshot name: %s\n" % snap_name)
 
     if cli:
         sys.stdout.write("Snapshot name: %s\n" % snap_name)
 
+@exclusive(get_port=True)
+def hash(name, cli=False, **kwargs):
+    if len(name) < 6:
+        raise Error("Name should have at least len 6")
+
+    vtool_port = get_vtool_port()
+    xseg_ctx = Xseg_ctx(segment.get_spec(), vtool_port)
+    mport = peers['mapperd'].portno_start
+    req = Request.get_hash_request(xseg_ctx, mport, name)
+    req.submit()
+    req.wait()
+    ret = req.success()
+    if ret:
+        xhash = req.get_data(xseg_reply_hash).contents
+        hash_name = ctypes.string_at(xhash.target, xhash.targetlen)
+    req.put()
+    xseg_ctx.shutdown()
+
+    if not ret:
+        raise Error("vlmc hash failed")
+    if cli:
+        sys.stdout.write("Hash name: %s\n" % hash_name)
+        return hash_name
+
 def list_volumes(**kwargs):
     if isinstance(peers['blockerm'], Sosd):
         import rados
 def list_volumes(**kwargs):
     if isinstance(peers['blockerm'], Sosd):
         import rados