Blob Blame History Raw
From c7eb7af261214e058f94af4f99eba5a8299d43ce Mon Sep 17 00:00:00 2001
From: Kotresh HR <khiremat@redhat.com>
Date: Thu, 25 Jun 2015 00:18:01 +0530
Subject: [PATCH 161/190] geo-rep: Fix add user in mountbroker user management

The CLI 'gluster system:: execute mountbroker user <USERNAME> <VOLUMES>'
to set volumes associated with a user replaces existing user and associated
volumes upon setting with existing user. This patch fixes it by appending
the volumes if the user already exists.

It also introduces following CLI to remove volume for a corresponding user.

'gluster system:: execute mountbroker volumedel <USERNAME> <VOLUME>'
<USERNAME>: username
<VOLUME>: comman separated list of volumes to delete

If it is the last volume to be deleted associated with the user,
it will delete the user as well as it doesn't make sense to keep
only user without volumes associated.

BUG: 1234869
Change-Id: Ib60ef07b5fc2b4a4010bea6641fe7475b1497244
Reviewed-On: http://review.gluster.org/11385
Reviewed-On: http://review.gluster.org/11386
Signed-off-by: Kotresh HR <khiremat@redhat.com>
Reviewed-on: https://code.engineering.redhat.com/gerrit/51611
Reviewed-by: Venky Shankar <vshankar@redhat.com>
Tested-by: Venky Shankar <vshankar@redhat.com>
---
 geo-replication/src/peer_mountbroker.in |   34 ++++++++++++++++++++++++++++++-
 1 files changed, 33 insertions(+), 1 deletions(-)

diff --git a/geo-replication/src/peer_mountbroker.in b/geo-replication/src/peer_mountbroker.in
index 4c97c69..8573abd 100644
--- a/geo-replication/src/peer_mountbroker.in
+++ b/geo-replication/src/peer_mountbroker.in
@@ -86,8 +86,31 @@ class MountbrokerUserMgmt(object):
             del(self._options[key])
 
     def add_user(self, user, volumes):
+        vols = set()
+        for k, v in self._options.iteritems():
+            if k.startswith("mountbroker-geo-replication.") \
+               and user == k.split(".")[-1]:
+                vols.update(v.split(","))
+
+        vols.update(volumes)
         self.set_opt("mountbroker-geo-replication.%s" % user,
-                     ",".join(volumes))
+                     ",".join(vols))
+
+    def remove_volume(self, user, volumes):
+        vols = set()
+        for k, v in self._options.iteritems():
+            if k.startswith("mountbroker-geo-replication.") \
+               and user == k.split(".")[-1]:
+                vols.update(v.split(","))
+
+        for v1 in volumes:
+            vols.discard(v1)
+
+        if vols:
+            self.set_opt("mountbroker-geo-replication.%s" % user,
+                         ",".join(vols))
+        else:
+            self.remove_opt("mountbroker-geo-replication.%s" % user)
 
     def remove_user(self, user):
         self.remove_opt("mountbroker-geo-replication.%s" % user)
@@ -129,6 +152,7 @@ def _get_args():
     subparsers = parser.add_subparsers(title='subcommands', dest='cmd')
     parser_useradd = subparsers.add_parser('user')
     parser_userdel = subparsers.add_parser('userdel')
+    parser_volumedel = subparsers.add_parser('volumedel')
     subparsers.add_parser('info')
     parser_opt = subparsers.add_parser('opt')
     parser_optdel = subparsers.add_parser('optdel')
@@ -137,6 +161,10 @@ def _get_args():
     parser_useradd.add_argument('volumes', type=str, default='',
                                 help="Volumes list. ',' seperated")
 
+    parser_volumedel.add_argument('username', help="Username", type=str)
+    parser_volumedel.add_argument('volumes', type=str, default='',
+                                help="Volumes list. ',' seperated")
+
     parser_userdel.add_argument('username', help="Username", type=str)
 
     parser_opt.add_argument('opt_name', help="Name", type=str)
@@ -163,6 +191,10 @@ def main():
         volumes = [v.strip() for v in args.volumes.split(",")
                    if v.strip() != ""]
         m.add_user(args.username, volumes)
+    elif args.cmd == "volumedel":
+        volumes = [v.strip() for v in args.volumes.split(",")
+                   if v.strip() != ""]
+        m.remove_volume(args.username, volumes)
     elif args.cmd == "info":
         info = m.info()
         if not args.json:
-- 
1.7.1