Change in vdsm[master]: gluster: Adds new verb to setup geo-rep mount broker.

dnarayan at redhat.com dnarayan at redhat.com
Fri Mar 6 09:24:05 UTC 2015


Darshan N has uploaded a new change for review.

Change subject: gluster: Adds new verb to setup geo-rep mount broker.
......................................................................

gluster: Adds new verb to setup geo-rep mount broker.

This patch adds a new verb to setup mount broker for
gluster geo-replication:

geoRepMountBrokerSetup: This verb takes user name,
group name and remote volume name as argument. and
sets the mount broker need for non-root geo-replication.

Change-Id: I9498c937bdf44b7747253e9bc203cb9eca1e671f
Signed-off-by: Darshan N <dnarayan at redhat.com>
---
M client/vdsClientGluster.py
M vdsm/gluster/api.py
M vdsm/gluster/apiwrapper.py
M vdsm/gluster/cli.py
M vdsm/gluster/exception.py
M vdsm/rpc/vdsmapi-gluster-schema.json
6 files changed, 105 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/44/38444/1

diff --git a/client/vdsClientGluster.py b/client/vdsClientGluster.py
index 746a5be..5e8fd18 100644
--- a/client/vdsClientGluster.py
+++ b/client/vdsClientGluster.py
@@ -627,6 +627,18 @@
         pp.pprint(status)
         return status['status']['code'], status['status']['message']
 
+    def do_glusterGeoRepMountBrokerSetup(self, args):
+        params = self._eqSplit(args)
+        userName = params.get('userName', '')
+        remoteVolumeName = params.get('remoteVolumeName', '')
+        groupName = params.get('groupName', '')
+
+        status = self.s.glusterGeoRepMountBrokerSetup(userName,
+                                                      groupName,
+                                                      remoteVolumeName)
+        pp.pprint(status)
+        return status['status']['code'], status['status']['message']
+
 
 def getGlusterCmdDict(serv):
     return \
@@ -1067,5 +1079,12 @@
               'geoRepPubKeys=geo_replication_pub_keys',
               'update geo replication public keys to authorized'
               ' keys file of user'
+              )),
+         'glusterGeoRepMountBrokerSetup': (
+             serv.do_glusterGeoRepMountBrokerSetup,
+             ('userName=user_name'
+              'remoteVolumeName=remote_volume_name'
+              'groupName=group_name',
+              'setup mount broker for geo replication'
               ))
          }
diff --git a/vdsm/gluster/api.py b/vdsm/gluster/api.py
index ff2556e..66a42af 100644
--- a/vdsm/gluster/api.py
+++ b/vdsm/gluster/api.py
@@ -29,6 +29,7 @@
 
 _SUCCESS = {'status': doneCode}
 GEOREP_PUB_KEY_PATH = "/var/lib/glusterd/geo-replication/common_secret.pem.pub"
+MOUNT_BROKER_ROOT = "/var/mountbroker-root"
 
 
 GLUSTER_RPM_PACKAGES = (
@@ -109,6 +110,21 @@
         return
     except IOError as e:
         raise ge.GlusterGeoRepPublicKeyWriteFailedException(err=e)
+
+
+ at makePublic
+def createMountBrokerRoot(userName):
+    try:
+        getpwnam(userName)
+    except KeyError as e:
+        raise ge.GlusterGeoRepUserNotFoundException(err=e)
+    try:
+        os.makedirs(MOUNT_BROKER_ROOT)
+        os.chmod(MOUNT_BROKER_ROOT, 0711)
+    except OSError:
+        if not os.path.isdir(MOUNT_BROKER_ROOT):
+            raise
+    return
 
 
 class GlusterApi(object):
@@ -504,6 +520,19 @@
     def geoRepKeysUpdate(self, userName, geoRepPubKeys, options=None):
         self.svdsmProxy.glusterUpdateGeoRepKeys(userName, geoRepPubKeys)
 
+    @exportAsVerb
+    def geoRepMountBrokerSetup(self, userName, groupName,
+                               remoteVolumeName, options=None):
+        self.svdsmProxy.glusterCreateMountBrokerRoot(userName)
+        mountBrokerOptions = {'mountbroker-root': MOUNT_BROKER_ROOT,
+                              'geo-replication-log-group': groupName,
+                              'rpc-auth-allow-insecure': 'on'}
+        for optionName, optionValue in mountBrokerOptions.iteritems():
+            self.svdsmProxy.glusterExecuteMountBrokerOpt(optionName,
+                                                         optionValue)
+        self.svdsmProxy.glusterExecuteMountBrokerUserAdd(userName,
+                                                         remoteVolumeName)
+
 
 def getGlusterMethods(gluster):
     l = []
diff --git a/vdsm/gluster/apiwrapper.py b/vdsm/gluster/apiwrapper.py
index 1c749b5..c507c40 100644
--- a/vdsm/gluster/apiwrapper.py
+++ b/vdsm/gluster/apiwrapper.py
@@ -254,6 +254,10 @@
     def geoRepKeysUpdate(self, userName, geoRepPubKeys):
         return self._gluster.geoRepKeysUpdate(userName, geoRepPubKeys)
 
+    def geoRepMountBrokerSetup(self, userName, groupName, remoteVolumeName):
+        return self._gluster.geoRepMountBrokerSetup(userName, groupName,
+                                                    remoteVolumeName)
+
 
 class GlusterSnapshot(GlusterApiBase):
     def __init__(self):
diff --git a/vdsm/gluster/cli.py b/vdsm/gluster/cli.py
index cd4e433..d10d215 100644
--- a/vdsm/gluster/cli.py
+++ b/vdsm/gluster/cli.py
@@ -1345,3 +1345,28 @@
         raise ge.GlusterGeoRepPublicKeyFileCreateFailedException(rc,
                                                                  out, err)
     return True
+
+
+ at makePublic
+def executeMountBrokerUserAdd(userName, remoteVolumeName):
+    command = _getGlusterSystemCmd() + ["execute", "mountbroker",
+                                        "user", userName,
+                                        remoteVolumeName]
+    rc, out, err = _execGluster(command)
+    if rc:
+        raise ge.GlusterGeoRepExecuteMountBrokerUserAddFailedException(rc,
+                                                                       out,
+                                                                       err)
+    return True
+
+
+ at makePublic
+def executeMountBrokerOpt(optionName, optionValue):
+    command = _getGlusterSystemCmd() + ["execute", "mountbroker",
+                                        "opt", optionName,
+                                        optionValue]
+    rc, out, err = _execGluster(command)
+    if rc:
+        raise ge.GlusterGeoRepExecuteMountBrokerOptFailedException(rc,
+                                                                   out, err)
+    return True
diff --git a/vdsm/gluster/exception.py b/vdsm/gluster/exception.py
index 91d478b..53e4b4e 100644
--- a/vdsm/gluster/exception.py
+++ b/vdsm/gluster/exception.py
@@ -565,6 +565,18 @@
     message = "geo rep public keys write failed"
 
 
+class GlusterGeoRepExecuteMountBrokerOptFailedException(
+        GlusterGeoRepException):
+    code = 4211
+    message = "geo rep mount broker option set failed"
+
+
+class GlusterGeoRepExecuteMountBrokerUserAddFailedException(
+        GlusterGeoRepException):
+    code = 4212
+    message = "geo rep mount broker user add failed"
+
+
 # Volume Snapshot
 class GlusterSnapshotException(GlusterException):
     code = 4700
diff --git a/vdsm/rpc/vdsmapi-gluster-schema.json b/vdsm/rpc/vdsmapi-gluster-schema.json
index c52627b..2a31094 100644
--- a/vdsm/rpc/vdsmapi-gluster-schema.json
+++ b/vdsm/rpc/vdsmapi-gluster-schema.json
@@ -1756,3 +1756,19 @@
 ##
 {'command': {'class': 'GlusterVolume', 'name': 'geoRepKeysUpdate'},
  'data': {'userName': 'str', 'geoRepPubKeys': 'str'}}
+
+##
+# @GlusterVolume.geoRepMountBrokerSetup:
+#
+# set up gluster mount broker needed for non-root geo-rep
+#
+# @userName:         Name of user
+#
+# @groupName :       Name of the users group
+#
+# @remoteVolumeName: Name of the remote volume
+#
+# Since: 4.17.0
+##
+{'command': {'class': 'GlusterVolume', 'name': 'geoRepMountBrokerSetup'},
+ 'data': {'userName': 'str', 'groupName': 'str', 'remoteVolumeName': 'str'}}


-- 
To view, visit https://gerrit.ovirt.org/38444
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I9498c937bdf44b7747253e9bc203cb9eca1e671f
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Darshan N <dnarayan at redhat.com>


More information about the vdsm-patches mailing list