anmolbabu has uploaded a new change for review.

Change subject: engine : Bll Command for Create Geo Rep session
......................................................................

engine : Bll Command for Create Geo Rep session

Bll Command to Create Geo Rep session.

Change-Id: Iccc92235deea42d7818336b2402476193cbe789c
Signed-off-by: Anmol Babu <anb...@redhat.com>
---
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CreateGlusterVolumeGeoRepSessionCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GeoRepSessionCommandBase.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterHostPublicKeysQuery.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterQueriesCommandBase.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/SetupGlusterGeoRepMountBrokerInternalCommand.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/UpdateGlusterHostPubKeyToSlaveInternalCommand.java
A 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/CreateGlusterVolumeGeoRepSessionCommandTest.java
A 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/SetupGlusterGeoRepMountBrokerInternalCommandTest.java
A 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/UpdateGlusterHostPubKeyToSlaveInternalCommandTest.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/GlusterVolumeGeoRepSessionParameters.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/SetUpMountBrokerParameters.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/UpdateGlusterHostPubKeyToSlaveParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/constants/gluster/GlusterConstants.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDaoDbFacadeImpl.java
M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
M 
backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties
M 
backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDaoTest.java
M 
frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
M 
frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/LocalizedEnums.java
M 
frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/LocalizedEnums.properties
M packaging/dbscripts/gluster_georep_sp.sql
25 files changed, 997 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/21/40121/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CreateGlusterVolumeGeoRepSessionCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CreateGlusterVolumeGeoRepSessionCommand.java
new file mode 100644
index 0000000..cf13eba
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CreateGlusterVolumeGeoRepSessionCommand.java
@@ -0,0 +1,233 @@
+package org.ovirt.engine.core.bll.gluster;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.Callable;
+
+import org.ovirt.engine.core.bll.context.CommandContext;
+import org.ovirt.engine.core.common.AuditLogType;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import 
org.ovirt.engine.core.common.action.gluster.GlusterVolumeGeoRepSessionParameters;
+import org.ovirt.engine.core.common.action.gluster.SetUpMountBrokerParameters;
+import 
org.ovirt.engine.core.common.action.gluster.UpdateGlusterHostPubKeyToSlaveParameters;
+import org.ovirt.engine.core.common.businessentities.VDS;
+import org.ovirt.engine.core.common.businessentities.VDSStatus;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterGeoRepSession;
+import org.ovirt.engine.core.common.businessentities.gluster.GlusterStatus;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
+import org.ovirt.engine.core.common.businessentities.gluster.ServiceType;
+import org.ovirt.engine.core.common.constants.gluster.GlusterConstants;
+import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import org.ovirt.engine.core.common.gluster.GlusterFeatureSupported;
+import org.ovirt.engine.core.common.queries.IdQueryParameters;
+import org.ovirt.engine.core.common.queries.VdcQueryReturnValue;
+import org.ovirt.engine.core.common.queries.VdcQueryType;
+import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
+import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
+import 
org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumeGeoRepSessionVDSParameters;
+import org.ovirt.engine.core.dao.gluster.GlusterGeoRepDao;
+import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil;
+
+public class CreateGlusterVolumeGeoRepSessionCommand extends 
GlusterVolumeCommandBase<GlusterVolumeGeoRepSessionParameters> {
+
+    private GlusterVolumeEntity slaveVolume;
+    private Set<VDS> remoteServersSet;
+    private VDS slaveHost;
+
+    public 
CreateGlusterVolumeGeoRepSessionCommand(GlusterVolumeGeoRepSessionParameters 
params) {
+        this(params, null);
+    }
+
+    public 
CreateGlusterVolumeGeoRepSessionCommand(GlusterVolumeGeoRepSessionParameters 
params, CommandContext context) {
+        super(params, context);
+    }
+
+    @Override
+    protected boolean canDoAction() {
+        if 
(!GlusterFeatureSupported.glusterGeoReplication(getVdsGroup().getcompatibility_version()))
 {
+            return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_GEO_REP_NOT_SUPPORTED);
+        }
+        slaveHost = getSlaveHost();
+        if (slaveHost == null) {
+            return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_HOST_NOT_EXIST);
+        }
+        if (slaveHost.getStatus() != VDSStatus.Up) {
+            return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_SERVER_STATUS_NOT_UP,
+                    String.format("$%1$s %2$s", "VdsName", 
slaveHost.getName()));
+        }
+        slaveVolume = getSlaveVolume();
+        if (slaveVolume == null) {
+            return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_VOLUME_INVALID);
+        }
+        if (slaveVolume.getStatus() != GlusterStatus.UP) {
+            return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_VOLUME_SHOULD_BE_STARTED);
+        }
+        if (!areAllRemoteServersUp()) {
+            return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_ONE_OR_MORE_REMOTE_HOSTS_ARE_NOT_ACCESSIBLE);
+        }
+        GlusterGeoRepSession geoRepSession =
+                getGeoRepDao().getGeoRepSession(getGlusterVolumeId(),
+                        getParameters().getSlaveHost(),
+                        getParameters().getSlaveVolumeName());
+        if (geoRepSession != null) {
+            return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_GEOREP_SESSION_ALREADY_CREATED);
+        }
+        return super.canDoAction();
+    }
+
+    protected GlusterGeoRepDao getGeoRepDao() {
+        return getDbFacade().getGlusterGeoRepDao();
+    }
+
+    protected GlusterVolumeEntity getSlaveVolume() {
+        return getGlusterVolumeDao().getByName(slaveHost.getVdsGroupId(),
+                getParameters().getSlaveVolumeName());
+    }
+
+    protected VDS getSlaveHost() {
+        return getVdsDAO().getByName(getParameters().getSlaveHost());
+    }
+
+    private boolean areAllRemoteServersUp() {
+        remoteServersSet = fetchRemoteServers();
+        for (VDS currentRemoteServer : remoteServersSet) {
+            if (currentRemoteServer.getStatus() != VDSStatus.Up) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public Map<String, String> getCustomValues() {
+        addCustomValue(GlusterConstants.VOLUME_NAME, getGlusterVolumeName());
+        addCustomValue(GlusterConstants.GEO_REP_USER, 
getParameters().getUserName());
+        addCustomValue(GlusterConstants.GEO_REP_USER_GROUP, 
getParameters().getUserGroup());
+        addCustomValue(GlusterConstants.GEO_REP_SLAVE_VOLUME_NAME, 
getParameters().getSlaveVolumeName());
+        addCustomValue(GlusterConstants.SERVICE_TYPE, 
ServiceType.GLUSTER.name());
+        return super.getCustomValues();
+    }
+
+    @Override
+    protected void setActionMessageParameters() {
+        addCanDoActionMessage(VdcBllMessages.VAR__ACTION__CREATE);
+        
addCanDoActionMessage(VdcBllMessages.VAR__TYPE__GLUSTER_GEOREP_SESSION);
+    }
+
+    @Override
+    protected void executeCommand() {
+        boolean rootSession = 
getParameters().getUserName().equalsIgnoreCase("root");
+        boolean succeeded = true;
+        if (!rootSession) {
+            succeeded = setUpMountBrokerOnSlaves();
+        }
+        if (succeeded) {
+            succeeded = setUpPasswordlessSSHAndCreateSession();
+            if (succeeded) {
+                
GlusterGeoRepSyncJob.getInstance().refreshGeoRepDataForVolume(getGlusterVolume());
+            }
+        }
+    }
+
+    private boolean setUpMountBrokerOnSlaves() {
+        List<Callable<Boolean>> mountBrokerSetupReturnStatuses = new 
ArrayList<>();
+        for (final VDS currentSlaveServer : remoteServersSet) {
+            mountBrokerSetupReturnStatuses.add(new Callable<Boolean>() {
+                @Override
+                public Boolean call() throws Exception {
+                    return 
getBackend().runInternalAction(VdcActionType.SetupGlusterGeoRepMountBrokerInternal,
+                            new 
SetUpMountBrokerParameters(currentSlaveServer.getId(),
+                    getParameters().getSlaveVolumeName(),
+                    getParameters().getUserName(),
+                                    
getParameters().getUserGroup())).getSucceeded();
+                }
+            });
+        }
+        List<Boolean> returnStatuses = 
ThreadPoolUtil.invokeAll(mountBrokerSetupReturnStatuses);
+        for (Boolean currentReturnStatus : returnStatuses) {
+            if (!currentReturnStatus) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private boolean setUpPasswordlessSSHAndCreateSession() {
+        List<String> pubKeys = readPubKey();
+        boolean canProceed = pubKeys != null && pubKeys.size() > 0;
+        if (canProceed) {
+            canProceed = updatePubKeysToRemoteHosts(pubKeys);
+            if (canProceed) {
+                canProceed = createGeoRepSession();
+            }
+        }
+        return canProceed;
+    }
+
+    private boolean updatePubKeysToRemoteHosts(final List<String> pubKeys) {
+        List<Callable<Boolean>> slaveWritePubKeyList = new ArrayList<>();
+        for (final VDS currentRemoteHost : remoteServersSet) {
+            slaveWritePubKeyList.add(new Callable<Boolean>() {
+                @Override
+                public Boolean call() throws Exception {
+                    return 
getBackend().runInternalAction(VdcActionType.UpdateGlusterHostPubKeyToSlaveInternal,
+                            new 
UpdateGlusterHostPubKeyToSlaveParameters(currentRemoteHost.getId(),
+                                    pubKeys, 
getParameters().getUserName())).getSucceeded();
+                }
+            });
+        }
+        List<Boolean> returnStatuses = 
ThreadPoolUtil.invokeAll(slaveWritePubKeyList);
+        for (Boolean currentReturnStatus : returnStatuses) {
+            if (!currentReturnStatus) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    @SuppressWarnings("unchecked")
+    private List<String> readPubKey() {
+        VdcQueryReturnValue readPubKeyReturnvalue =
+                runInternalQuery(VdcQueryType.GetGlusterHostPublicKeys, new 
IdQueryParameters(upServer.getId()));
+        if (readPubKeyReturnvalue.getSucceeded()) {
+            return (List<String>) readPubKeyReturnvalue.getReturnValue();
+        } else {
+            handleVdsError(AuditLogType.GLUSTER_GEO_REP_PUB_KEY_FETCH_FAILED, 
readPubKeyReturnvalue.getExceptionString());
+            return null;
+        }
+    }
+
+    private boolean createGeoRepSession() {
+        GlusterVolumeGeoRepSessionVDSParameters params =
+                new GlusterVolumeGeoRepSessionVDSParameters(upServer.getId(),
+                        getGlusterVolumeName(),
+                        getParameters().getSlaveHost(),
+                        getParameters().getSlaveVolumeName(),
+                        getParameters().getUserName(),
+                        getParameters().isForce());
+        VDSReturnValue createSessionReturnValue =
+                runVdsCommand(VDSCommandType.CreateGlusterVolumeGeoRepSession, 
params);
+        if (createSessionReturnValue.getSucceeded()) {
+            setSucceeded(true);
+            return true;
+        } else {
+            setSucceeded(false);
+            handleVdsError(AuditLogType.GLUSTER_GEOREP_SESSION_CREATE_FAILED, 
createSessionReturnValue.getVdsError()
+                    .getMessage());
+            return false;
+        }
+    }
+
+    private Set<VDS> fetchRemoteServers() {
+        Set<VDS> remoteServers = new HashSet<>();
+        List<GlusterBrickEntity> slaveBricks = slaveVolume.getBricks();
+        for (GlusterBrickEntity currentBrick : slaveBricks) {
+            remoteServers.add(getVdsDAO().get(currentBrick.getServerId()));
+        }
+        return remoteServers;
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GeoRepSessionCommandBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GeoRepSessionCommandBase.java
index 6926827..e9b91d2 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GeoRepSessionCommandBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GeoRepSessionCommandBase.java
@@ -54,7 +54,14 @@
 
     protected GlusterGeoRepSession getGeoRepSession() {
         if (geoRepSession == null) {
-            geoRepSession = 
getGlusterGeoRepDao().getById(getParameters().getGeoRepSessionId());
+            if(getParameters().getGeoRepSessionId() != null) {
+                geoRepSession = 
getGlusterGeoRepDao().getById(getParameters().getGeoRepSessionId());
+            } else {
+                geoRepSession =
+                        
getGlusterGeoRepDao().getGeoRepSession(getGlusterVolumeId(),
+                                getParameters().getSlaveHost(),
+                                getParameters().getSlaveVolumeName());
+            }
         }
         return geoRepSession;
     }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterHostPublicKeysQuery.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterHostPublicKeysQuery.java
new file mode 100644
index 0000000..906fff2
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterHostPublicKeysQuery.java
@@ -0,0 +1,30 @@
+package org.ovirt.engine.core.bll.gluster;
+
+import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute;
+import org.ovirt.engine.core.bll.context.EngineContext;
+import org.ovirt.engine.core.common.queries.IdQueryParameters;
+import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
+import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
+import org.ovirt.engine.core.common.vdscommands.VdsIdVDSCommandParametersBase;
+
+@NonTransactiveCommandAttribute
+public class GetGlusterHostPublicKeysQuery<P extends IdQueryParameters> 
extends GlusterQueriesCommandBase<P> {
+
+    protected GetGlusterHostPublicKeysQuery(P parameters) {
+        super(parameters);
+    }
+
+    public GetGlusterHostPublicKeysQuery(P params, EngineContext 
engineContext) {
+        super(params, engineContext);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    protected void executeQueryCommand() {
+        VDSReturnValue readPubKeyReturnValue =
+                runVdsCommand(VDSCommandType.GetGlusterHostsPubKey,
+                        new 
VdsIdVDSCommandParametersBase(getParameters().getId()));
+        
getQueryReturnValue().setReturnValue(readPubKeyReturnValue.getReturnValue());
+    }
+
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterQueriesCommandBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterQueriesCommandBase.java
index bcb600c..6db1682 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterQueriesCommandBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterQueriesCommandBase.java
@@ -2,6 +2,7 @@
 
 import org.ovirt.engine.core.bll.Backend;
 import org.ovirt.engine.core.bll.QueriesCommandBase;
+import org.ovirt.engine.core.bll.context.EngineContext;
 import org.ovirt.engine.core.bll.utils.ClusterUtils;
 import org.ovirt.engine.core.common.businessentities.VDS;
 import org.ovirt.engine.core.common.errors.VdcBLLException;
@@ -27,6 +28,10 @@
         super(parameters);
     }
 
+    public GlusterQueriesCommandBase(P parameters, EngineContext 
engineContext) {
+        super(parameters, engineContext);
+    }
+
     protected GlusterVolumeDao getGlusterVolumeDao() {
         return DbFacade.getInstance()
                 .getGlusterVolumeDao();
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/SetupGlusterGeoRepMountBrokerInternalCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/SetupGlusterGeoRepMountBrokerInternalCommand.java
new file mode 100644
index 0000000..514f439
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/SetupGlusterGeoRepMountBrokerInternalCommand.java
@@ -0,0 +1,115 @@
+package org.ovirt.engine.core.bll.gluster;
+
+import java.util.Collections;
+import java.util.Map;
+
+import org.ovirt.engine.core.bll.InternalCommandAttribute;
+import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute;
+import org.ovirt.engine.core.bll.context.CommandContext;
+import org.ovirt.engine.core.common.AuditLogType;
+import org.ovirt.engine.core.common.action.gluster.SetUpMountBrokerParameters;
+import org.ovirt.engine.core.common.businessentities.gluster.GlusterStatus;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
+import org.ovirt.engine.core.common.businessentities.gluster.ServiceType;
+import org.ovirt.engine.core.common.constants.gluster.GlusterConstants;
+import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
+import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
+import 
org.ovirt.engine.core.common.vdscommands.gluster.GlusterServiceVDSParameters;
+import 
org.ovirt.engine.core.common.vdscommands.gluster.SetUpGlusterGeoRepMountBrokerVDSParameters;
+import org.ovirt.engine.core.compat.Guid;
+
+@InternalCommandAttribute
+@NonTransactiveCommandAttribute
+public class SetupGlusterGeoRepMountBrokerInternalCommand extends 
GlusterCommandBase<SetUpMountBrokerParameters> {
+
+    GlusterVolumeEntity slaveVolume;
+
+    public 
SetupGlusterGeoRepMountBrokerInternalCommand(SetUpMountBrokerParameters params) 
{
+        this(params, null);
+    }
+
+    public 
SetupGlusterGeoRepMountBrokerInternalCommand(SetUpMountBrokerParameters params, 
CommandContext commandContext) {
+        super(params, commandContext);
+    }
+
+    protected GlusterVolumeEntity getSlaveVolume() {
+        return 
getGlusterVolumeDao().getByName(getVdsDAO().get(getParameters().getId()).getVdsGroupId(),
+                getParameters().getRemoteVolumeName());
+    }
+
+    @Override
+    protected boolean canDoAction() {
+        slaveVolume =
+                getSlaveVolume();
+        if (slaveVolume != null) {
+            setGlusterVolumeId(slaveVolume.getId());
+            setVdsGroupId(slaveVolume.getClusterId());
+        } else {
+            return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_VOLUME_INVALID);
+        }
+        if (slaveVolume.getStatus() != GlusterStatus.UP) {
+            return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_VOLUME_SHOULD_BE_STARTED);
+        }
+        return super.canDoAction();
+    }
+
+    @Override
+    protected void setActionMessageParameters() {
+        addCanDoActionMessage(VdcBllMessages.VAR__ACTION__SETUP);
+        addCanDoActionMessage(VdcBllMessages.VAR__TYPE__GEOREP_MOUNT_BROKER);
+    }
+
+    @Override
+    public AuditLogType getAuditLogTypeValue() {
+        if (getSucceeded()) {
+            return AuditLogType.GLUSTER_SETUP_GEOREP_MOUNT_BROKER;
+        } else {
+            return errorType == null ? 
AuditLogType.GLUSTER_GEOREP_SETUP_MOUNT_BROKER_FAILED : errorType;
+        }
+    }
+
+    @Override
+    public Map<String, String> getCustomValues() {
+        addCustomValue(GlusterConstants.GEO_REP_USER, 
getParameters().getRemoteUserName());
+        addCustomValue(GlusterConstants.GEO_REP_USER_GROUP, 
getParameters().getRemoteUserGroup());
+        addCustomValue(GlusterConstants.GEO_REP_SLAVE_VOLUME_NAME, 
getParameters().getRemoteVolumeName());
+        addCustomValue(GlusterConstants.SERVICE_TYPE, 
ServiceType.GLUSTER.name());
+        return super.getCustomValues();
+    }
+
+    private VDSReturnValue restartGlusterd(Guid serverId) {
+        getCustomValues().put(GlusterConstants.VDS_NAME, 
getVdsDAO().get(serverId).getName());
+        GlusterServiceVDSParameters params =
+                new GlusterServiceVDSParameters(serverId,
+                        Collections.singletonList("glusterd"),
+                        
GlusterConstants.MANAGE_GLUSTER_SERVICE_ACTION_TYPE_RESTART);
+        VDSReturnValue restartGlusterdReturnValue = 
runVdsCommand(VDSCommandType.ManageGlusterService, params);
+        return restartGlusterdReturnValue;
+    }
+
+    @Override
+    protected void executeCommand() {
+        SetUpMountBrokerParameters parameters = getParameters();
+        VDSReturnValue mountBrokerReturnValue =
+                runVdsCommand(VDSCommandType.SetupGlusterGeoRepMountBroker,
+                        new 
SetUpGlusterGeoRepMountBrokerVDSParameters(getParameters().getId(),
+                                parameters.getRemoteUserName(),
+                                parameters.getRemoteUserGroup(),
+                                parameters.getRemoteVolumeName()));
+        if (mountBrokerReturnValue.getSucceeded()) {
+            VDSReturnValue restartGlusterdReturnValue = 
restartGlusterd(getParameters().getId());
+            if (!restartGlusterdReturnValue.getSucceeded()) {
+                
handleVdsError(AuditLogType.GLUSTER_GEOREP_SETUP_MOUNT_BROKER_FAILED,
+                        restartGlusterdReturnValue.getVdsError().getMessage());
+                return;
+            } else {
+                setSucceeded(restartGlusterdReturnValue.getSucceeded());
+            }
+        } else {
+            
handleVdsError(AuditLogType.GLUSTER_GEOREP_SETUP_MOUNT_BROKER_FAILED, 
mountBrokerReturnValue.getVdsError()
+                    .getMessage());
+            return;
+        }
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/UpdateGlusterHostPubKeyToSlaveInternalCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/UpdateGlusterHostPubKeyToSlaveInternalCommand.java
new file mode 100644
index 0000000..de94d85
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/UpdateGlusterHostPubKeyToSlaveInternalCommand.java
@@ -0,0 +1,72 @@
+package org.ovirt.engine.core.bll.gluster;
+
+import org.ovirt.engine.core.bll.InternalCommandAttribute;
+import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute;
+import org.ovirt.engine.core.bll.context.CommandContext;
+import org.ovirt.engine.core.common.AuditLogType;
+import 
org.ovirt.engine.core.common.action.gluster.UpdateGlusterHostPubKeyToSlaveParameters;
+import org.ovirt.engine.core.common.businessentities.VDS;
+import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
+import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
+import 
org.ovirt.engine.core.common.vdscommands.gluster.UpdateGlusterGeoRepKeysVDSParameters;
+
+@InternalCommandAttribute
+@NonTransactiveCommandAttribute
+public class UpdateGlusterHostPubKeyToSlaveInternalCommand extends 
GlusterCommandBase<UpdateGlusterHostPubKeyToSlaveParameters> {
+
+    public 
UpdateGlusterHostPubKeyToSlaveInternalCommand(UpdateGlusterHostPubKeyToSlaveParameters
 params) {
+        this(params, null);
+    }
+
+    public 
UpdateGlusterHostPubKeyToSlaveInternalCommand(UpdateGlusterHostPubKeyToSlaveParameters
 params, CommandContext commandContext) {
+        super(params, commandContext);
+        setVdsId(getParameters().getId());
+    }
+
+    @Override
+    protected VDS getUpServer() {
+        return getVdsDAO().get(getParameters().getId());
+    }
+
+    @Override
+    protected boolean canDoAction() {
+        if (getParameters().getPubKeys().isEmpty()) {
+            return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_NO_PUB_KEYS_PASSED);
+        }
+        if (getParameters().getId() == null) {
+            return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_HOST_NOT_EXIST);
+        }
+        return super.canDoAction();
+    }
+
+    @Override
+    protected void setActionMessageParameters() {
+        addCanDoActionMessage(VdcBllMessages.VAR__ACTION__WRITE_PUB_KEYS);
+    }
+
+    @Override
+    public AuditLogType getAuditLogTypeValue() {
+        if (getSucceeded()) {
+            return AuditLogType.GLUSTER_WRITE_PUB_KEYS;
+        } else {
+            return errorType == null ? 
AuditLogType.GLUSTER_GEOREP_PUBLIC_KEY_WRITE_FAILED : errorType;
+        }
+    }
+
+    @Override
+    protected void executeCommand() {
+        VDSReturnValue writePubKeysReturnValue =
+                runVdsCommand(VDSCommandType.UpdateGlusterGeoRepKeys,
+                        new 
UpdateGlusterGeoRepKeysVDSParameters(getParameters().getId(),
+                                getParameters().getPubKeys(),
+                                getParameters().getRemoteUserName()));
+        setSucceeded(writePubKeysReturnValue.getSucceeded());
+        if (!writePubKeysReturnValue.getSucceeded()) {
+            
handleVdsError(AuditLogType.GLUSTER_GEOREP_PUBLIC_KEY_WRITE_FAILED, 
writePubKeysReturnValue.getVdsError()
+                    .getMessage());
+            return;
+        }
+    }
+
+}
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/CreateGlusterVolumeGeoRepSessionCommandTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/CreateGlusterVolumeGeoRepSessionCommandTest.java
new file mode 100644
index 0000000..ae72513
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/CreateGlusterVolumeGeoRepSessionCommandTest.java
@@ -0,0 +1,169 @@
+package org.ovirt.engine.core.bll.gluster;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.ovirt.engine.core.utils.MockConfigRule.mockConfig;
+
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import 
org.ovirt.engine.core.common.action.gluster.GlusterVolumeGeoRepSessionParameters;
+import org.ovirt.engine.core.common.businessentities.VDS;
+import org.ovirt.engine.core.common.businessentities.VDSGroup;
+import org.ovirt.engine.core.common.businessentities.VDSStatus;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterGeoRepSession;
+import org.ovirt.engine.core.common.businessentities.gluster.GlusterStatus;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
+import org.ovirt.engine.core.common.config.ConfigValues;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.compat.Version;
+import org.ovirt.engine.core.dao.VdsDAO;
+import org.ovirt.engine.core.dao.VdsGroupDAO;
+import org.ovirt.engine.core.dao.gluster.GlusterGeoRepDao;
+import org.ovirt.engine.core.dao.gluster.GlusterVolumeDao;
+import org.ovirt.engine.core.utils.MockConfigRule;
+
+@RunWith(MockitoJUnitRunner.class)
+public class CreateGlusterVolumeGeoRepSessionCommandTest {
+    private static final Version NOT_SUPPORTED_VERSION = Version.v3_4;
+
+    private static final Object SUPPORTED_VERSION = Version.v3_5;
+
+    CreateGlusterVolumeGeoRepSessionCommand command;
+
+    private final String slaveVolumeName = "slaveVol";
+    private final String slaveHost = "localhost.localdomain";
+    private final Guid masterVolumeId = Guid.newGuid();
+
+    @ClassRule
+    public static MockConfigRule mcr = new MockConfigRule(
+            mockConfig(ConfigValues.GlusterGeoReplicationEnabled, 
Version.v3_5.toString(), true),
+            mockConfig(ConfigValues.GlusterGeoReplicationEnabled, 
NOT_SUPPORTED_VERSION.toString(), false)
+            );
+
+    @Mock
+    GlusterVolumeDao volumeDao;
+
+    @Mock
+    VdsDAO vdsDao;
+
+    @Mock
+    VdsGroupDAO vdsGroupDao;
+
+    @Mock
+    GlusterGeoRepDao geoRepDao;
+
+    @Mock
+    protected VDSGroup vdsGroup;
+
+    @Mock
+    protected GlusterVolumeEntity volume;
+
+    @Mock
+    protected VDS vds;
+
+    @Test
+    public void commandSucceeds() {
+        command =
+                spy(new CreateGlusterVolumeGeoRepSessionCommand(new 
GlusterVolumeGeoRepSessionParameters(masterVolumeId,
+                        slaveVolumeName,
+                        slaveHost,
+                        null,
+                        null,
+                        false)));
+        prepareMocks();
+        doReturn(SUPPORTED_VERSION).when(vdsGroup).getcompatibility_version();
+        doReturn(volume).when(command).getSlaveVolume();
+        doReturn(null).when(geoRepDao).getGeoRepSession(any(Guid.class), 
any(String.class), any(String.class));
+        doReturn(vds).when(command).getSlaveHost();
+        assertTrue(command.canDoAction());
+    }
+
+    private void prepareMocks() {
+        doReturn(volume).when(volumeDao).getById(masterVolumeId);
+        doReturn(GlusterStatus.UP).when(volume).getStatus();
+        doReturn(vdsGroup).when(command).getVdsGroup();
+        doReturn(vdsGroupDao).when(command).getVdsGroupDAO();
+        doReturn(vdsDao).when(command).getVdsDAO();
+        doReturn(volumeDao).when(command).getGlusterVolumeDao();
+        doReturn(geoRepDao).when(command).getGeoRepDao();
+        doReturn(vds).when(command).getUpServer();
+        doReturn(VDSStatus.Up).when(vds).getStatus();
+    }
+
+    @Test
+    public void commandFailsSlaveVolumeNotMonitoredByOvirt() {
+        command =
+                spy(new CreateGlusterVolumeGeoRepSessionCommand(new 
GlusterVolumeGeoRepSessionParameters(masterVolumeId,
+                        slaveVolumeName,
+                        slaveHost,
+                        null,
+                        null,
+                        false)));
+        prepareMocks();
+        doReturn(null).when(command).getSlaveVolume();
+        doReturn(SUPPORTED_VERSION).when(vdsGroup).getcompatibility_version();
+        doReturn(vds).when(command).getSlaveHost();
+        doReturn(null).when(geoRepDao).getGeoRepSession(any(Guid.class), 
any(String.class), any(String.class));
+        assertFalse(command.canDoAction());
+    }
+
+    @Test
+    public void commandFailsSessionExists() {
+        command =
+                spy(new CreateGlusterVolumeGeoRepSessionCommand(new 
GlusterVolumeGeoRepSessionParameters(masterVolumeId,
+                        slaveVolumeName,
+                        slaveHost,
+                        null,
+                        null,
+                        false)));
+        prepareMocks();
+        doReturn(volume).when(command).getSlaveVolume();
+        doReturn(vds).when(command).getSlaveHost();
+        doReturn(SUPPORTED_VERSION).when(vdsGroup).getcompatibility_version();
+        doReturn(new 
GlusterGeoRepSession()).when(geoRepDao).getGeoRepSession(any(Guid.class),
+                any(String.class),
+                any(String.class));
+        assertFalse(command.canDoAction());
+    }
+
+    @Test
+    public void commandFailsVersionNotSupported() {
+        command =
+                spy(new CreateGlusterVolumeGeoRepSessionCommand(new 
GlusterVolumeGeoRepSessionParameters(Guid.newGuid(),
+                        slaveVolumeName,
+                        slaveHost,
+                        null,
+                        null,
+                        false)));
+        prepareMocks();
+        doReturn(vds).when(command).getUpServer();
+        doReturn(vds).when(command).getSlaveHost();
+        
doReturn(NOT_SUPPORTED_VERSION).when(vdsGroup).getcompatibility_version();
+        doReturn(volume).when(command).getSlaveVolume();
+        doReturn(null).when(geoRepDao).getGeoRepSession(any(Guid.class), 
any(String.class), any(String.class));
+        assertFalse(command.canDoAction());
+    }
+
+    @Test
+    public void commandFailsSlaveHostInvalid() {
+        command =
+                spy(new CreateGlusterVolumeGeoRepSessionCommand(new 
GlusterVolumeGeoRepSessionParameters(masterVolumeId,
+                        slaveVolumeName,
+                        slaveHost,
+                        null,
+                        null,
+                        false)));
+        prepareMocks();
+        doReturn(vds).when(command).getUpServer();
+        doReturn(SUPPORTED_VERSION).when(vdsGroup).getcompatibility_version();
+        doReturn(volume).when(command).getSlaveVolume();
+        doReturn(null).when(geoRepDao).getGeoRepSession(any(Guid.class), 
any(String.class), any(String.class));
+        doReturn(null).when(command).getSlaveHost();
+        assertFalse(command.canDoAction());
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/SetupGlusterGeoRepMountBrokerInternalCommandTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/SetupGlusterGeoRepMountBrokerInternalCommandTest.java
new file mode 100644
index 0000000..7e8943c
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/SetupGlusterGeoRepMountBrokerInternalCommandTest.java
@@ -0,0 +1,74 @@
+package org.ovirt.engine.core.bll.gluster;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.ovirt.engine.core.common.action.gluster.SetUpMountBrokerParameters;
+import org.ovirt.engine.core.common.businessentities.VDS;
+import org.ovirt.engine.core.common.businessentities.gluster.GlusterStatus;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dao.VdsDAO;
+import org.ovirt.engine.core.dao.gluster.GlusterVolumeDao;
+
+@RunWith(MockitoJUnitRunner.class)
+public class SetupGlusterGeoRepMountBrokerInternalCommandTest {
+
+    @Mock
+    GlusterVolumeDao volumeDao;
+
+    @Mock
+    VdsDAO vdsDao;
+
+    private SetupGlusterGeoRepMountBrokerInternalCommand command;
+
+    @Mock
+    GlusterVolumeEntity volume;
+
+    @Mock
+    VDS vds;
+
+    @Test
+    public void commandSucceeds() {
+        command =
+                spy(new SetupGlusterGeoRepMountBrokerInternalCommand(new 
SetUpMountBrokerParameters(Guid.newGuid(),
+                        "",
+                        null,
+                        null)));
+        doReturn(vds).when(command).getUpServer();
+        doReturn(volume).when(command).getSlaveVolume();
+        doReturn(GlusterStatus.UP).when(volume).getStatus();
+        assertTrue(command.canDoAction());
+    }
+
+    @Test
+    public void commandFailsSlaveNotOvirtMonitored() {
+        command =
+                spy(new SetupGlusterGeoRepMountBrokerInternalCommand(new 
SetUpMountBrokerParameters(Guid.newGuid(),
+                        "",
+                        null,
+                        null)));
+        doReturn(vds).when(command).getUpServer();
+        doReturn(null).when(command).getSlaveVolume();
+        assertFalse(command.canDoAction());
+    }
+
+    @Test
+    public void commandFailsSlaveVolumeNotUp() {
+        command =
+                spy(new SetupGlusterGeoRepMountBrokerInternalCommand(new 
SetUpMountBrokerParameters(Guid.newGuid(),
+                        "",
+                        null,
+                        null)));
+        doReturn(vds).when(command).getUpServer();
+        doReturn(volume).when(command).getSlaveVolume();
+        doReturn(GlusterStatus.DOWN).when(volume).getStatus();
+        assertFalse(command.canDoAction());
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/UpdateGlusterHostPubKeyToSlaveInternalCommandTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/UpdateGlusterHostPubKeyToSlaveInternalCommandTest.java
new file mode 100644
index 0000000..4339f03
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/UpdateGlusterHostPubKeyToSlaveInternalCommandTest.java
@@ -0,0 +1,65 @@
+package org.ovirt.engine.core.bll.gluster;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import 
org.ovirt.engine.core.common.action.gluster.UpdateGlusterHostPubKeyToSlaveParameters;
+import org.ovirt.engine.core.common.businessentities.VDS;
+import org.ovirt.engine.core.common.businessentities.VDSGroup;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dao.gluster.GlusterVolumeDao;
+
+@RunWith(MockitoJUnitRunner.class)
+public class UpdateGlusterHostPubKeyToSlaveInternalCommandTest {
+
+    @Mock
+    GlusterVolumeDao volumeDao;
+
+    private UpdateGlusterHostPubKeyToSlaveInternalCommand command;
+
+    @Mock
+    protected VDS vds;
+
+    @Test
+    public void commandSucceeds() {
+        List<String> pubKeys = new ArrayList<>();
+        pubKeys.add("");
+        command =
+                spy(new UpdateGlusterHostPubKeyToSlaveInternalCommand(new 
UpdateGlusterHostPubKeyToSlaveParameters(Guid.newGuid(),
+                        pubKeys)));
+        doReturn(vds).when(command).getUpServer();
+        assertTrue(command.canDoAction());
+    }
+
+    @Test
+    public void commandFailsNoPubKeys() {
+        List<String> pubKeys = new ArrayList<>();
+        command =
+                spy(new UpdateGlusterHostPubKeyToSlaveInternalCommand(new 
UpdateGlusterHostPubKeyToSlaveParameters(Guid.newGuid(),
+                        pubKeys)));
+        doReturn(vds).when(command).getUpServer();
+        assertFalse(command.canDoAction());
+    }
+
+    @Test
+    public void commandFailsNoUpServer() {
+        List<String> pubKeys = new ArrayList<>();
+        pubKeys.add("");
+        command =
+                spy(new UpdateGlusterHostPubKeyToSlaveInternalCommand(new 
UpdateGlusterHostPubKeyToSlaveParameters(Guid.newGuid(),
+                        pubKeys)));
+        doReturn(null).when(command).getUpServer();
+        command.setVdsGroupId(Guid.newGuid());
+        doReturn(new VDSGroup()).when(command).getVdsGroup();
+        assertFalse(command.canDoAction());
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
index e7ae7c8..35e4ac8 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
@@ -431,6 +431,14 @@
     GLUSTER_VOLUME_SNAPSHOT_RESCHEDULE_FAILED(4137, AuditLogSeverity.ERROR),
     CREATE_GLUSTER_BRICK(4138),
     CREATE_GLUSTER_BRICK_FAILED(4139),
+    GLUSTER_GEO_REP_PUB_KEY_FETCH_FAILED(4140, AuditLogSeverity.ERROR),
+    GLUSTER_GET_PUB_KEY(4141),
+    GLUSTER_GEOREP_PUBLIC_KEY_WRITE_FAILED(4142, AuditLogSeverity.ERROR),
+    GLUSTER_WRITE_PUB_KEYS(4143),
+    GLUSTER_GEOREP_SETUP_MOUNT_BROKER_FAILED(4144, AuditLogSeverity.ERROR),
+    GLUSTER_SETUP_GEOREP_MOUNT_BROKER(4145),
+    GLUSTER_GEOREP_SESSION_CREATE_FAILED(4146, AuditLogSeverity.ERROR),
+    CREATE_GLUSTER_VOLUME_GEOREP_SESSION(4147),
 
     USER_FORCE_SELECTED_SPM(159),
     USER_VDS_RESTART(41),
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
index f9c9cb6..4920cf7 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
@@ -323,6 +323,9 @@
     ScheduleGlusterVolumeSnapshot(1442, ActionGroup.MANIPULATE_GLUSTER_VOLUME, 
QuotaDependency.NONE),
     RescheduleGlusterVolumeSnapshot(1443, 
ActionGroup.MANIPULATE_GLUSTER_VOLUME, QuotaDependency.NONE),
     CreateBrick(1444, ActionGroup.MANIPULATE_HOST, QuotaDependency.NONE),
+    CreateGlusterVolumeGeoRepSession(1445, 
ActionGroup.MANIPULATE_GLUSTER_VOLUME, QuotaDependency.NONE),
+    SetupGlusterGeoRepMountBrokerInternal(1446, 
ActionGroup.MANIPULATE_GLUSTER_VOLUME, QuotaDependency.NONE),
+    UpdateGlusterHostPubKeyToSlaveInternal(1447, 
ActionGroup.MANIPULATE_GLUSTER_VOLUME, QuotaDependency.NONE),
 
     // Cluster Policy
     AddClusterPolicy(1450, ActionGroup.EDIT_STORAGE_POOL_CONFIGURATION, false, 
QuotaDependency.NONE),
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/GlusterVolumeGeoRepSessionParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/GlusterVolumeGeoRepSessionParameters.java
index 92ab2c8..eced882 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/GlusterVolumeGeoRepSessionParameters.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/GlusterVolumeGeoRepSessionParameters.java
@@ -9,6 +9,8 @@
     private Guid geoRepSessionId;
     private String slaveVolumeName;
     private String slaveHost;
+    private String userName;
+    private String userGroup;
     private boolean force;
 
     public GlusterVolumeGeoRepSessionParameters() {
@@ -21,9 +23,28 @@
     }
 
     public GlusterVolumeGeoRepSessionParameters(Guid volumeId, String 
slaveVolumeName, String slaveHost) {
+        this(volumeId, slaveVolumeName, slaveHost, "root", null, false);
+    }
+
+    public GlusterVolumeGeoRepSessionParameters(Guid volumeId,
+            String slaveVolumeName,
+            String slaveHost,
+            String userName,
+            String userGroup,
+            boolean force) {
         super(volumeId);
         this.slaveVolumeName = slaveVolumeName;
         this.slaveHost = slaveHost;
+        this.userName = userName;
+        this.userGroup = userGroup;
+        this.force = force;
+    }
+
+    public GlusterVolumeGeoRepSessionParameters(Guid volumeId, String 
slaveVolumeName,
+            String slaveHost,
+            String userName,
+            String userGroup) {
+        this(volumeId, slaveVolumeName, slaveHost, userName, userGroup, false);
     }
 
     public String getSlaveVolumeName() {
@@ -58,4 +79,19 @@
         this.geoRepSessionId = geoRepSessionId;
     }
 
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getUserGroup() {
+        return userGroup;
+    }
+
+    public void setUserGroup(String userGroup) {
+        this.userGroup = userGroup;
+    }
 }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/SetUpMountBrokerParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/SetUpMountBrokerParameters.java
new file mode 100644
index 0000000..d3a655a
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/SetUpMountBrokerParameters.java
@@ -0,0 +1,48 @@
+package org.ovirt.engine.core.common.action.gluster;
+
+import org.ovirt.engine.core.common.action.IdParameters;
+import org.ovirt.engine.core.compat.Guid;
+
+public class SetUpMountBrokerParameters extends IdParameters {
+
+    private static final long serialVersionUID = 1L;
+
+    private String remoteVolumeName;
+    private String remoteUserName;
+    private String remoteUserGroup;
+
+    public SetUpMountBrokerParameters() {
+        super();
+    }
+
+    public SetUpMountBrokerParameters(Guid remoteHostId, String 
remoteVolumeName, String remoteUserName, String remoteUserGroup) {
+        super(remoteHostId);
+        this.remoteUserName = remoteUserName;
+        this.remoteUserGroup = remoteUserGroup;
+        this.setRemoteVolumeName(remoteVolumeName);
+    }
+
+    public String getRemoteUserName() {
+        return remoteUserName;
+    }
+
+    public void setRemoteUserName(String remoteUserName) {
+        this.remoteUserName = remoteUserName;
+    }
+
+    public String getRemoteUserGroup() {
+        return remoteUserGroup;
+    }
+
+    public void setRemoteUserGroup(String remoteUserGroup) {
+        this.remoteUserGroup = remoteUserGroup;
+    }
+
+    public String getRemoteVolumeName() {
+        return remoteVolumeName;
+    }
+
+    public void setRemoteVolumeName(String remoteVolumeName) {
+        this.remoteVolumeName = remoteVolumeName;
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/UpdateGlusterHostPubKeyToSlaveParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/UpdateGlusterHostPubKeyToSlaveParameters.java
new file mode 100644
index 0000000..87163cf
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/UpdateGlusterHostPubKeyToSlaveParameters.java
@@ -0,0 +1,45 @@
+package org.ovirt.engine.core.common.action.gluster;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.ovirt.engine.core.common.action.IdParameters;
+import org.ovirt.engine.core.compat.Guid;
+
+public class UpdateGlusterHostPubKeyToSlaveParameters extends IdParameters {
+
+    private static final long serialVersionUID = 1L;
+
+    private String remoteUserName;
+    private List<String> pubKeys = new ArrayList<String>();
+
+    public UpdateGlusterHostPubKeyToSlaveParameters() {
+        super();
+    }
+
+    public UpdateGlusterHostPubKeyToSlaveParameters(Guid vdsId, List<String> 
pubKeys) {
+        this(vdsId, pubKeys, null);
+    }
+
+    public UpdateGlusterHostPubKeyToSlaveParameters(Guid vdsId, List<String> 
pubKeys, String remoteUserName) {
+        super(vdsId);
+        this.remoteUserName = remoteUserName;
+        this.pubKeys = pubKeys;
+    }
+
+    public String getRemoteUserName() {
+        return remoteUserName;
+    }
+
+    public void setRemoteUserName(String remoteUserName) {
+        this.remoteUserName = remoteUserName;
+    }
+
+    public List<String> getPubKeys() {
+        return pubKeys;
+    }
+
+    public void setPubKeys(List<String> pubKeys) {
+        this.pubKeys = pubKeys;
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/constants/gluster/GlusterConstants.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/constants/gluster/GlusterConstants.java
index f6bdcb3..5a1bcd5 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/constants/gluster/GlusterConstants.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/constants/gluster/GlusterConstants.java
@@ -18,6 +18,7 @@
     public static final String BRICK_NAME = "brickName";
     public static final String SERVER_NAME = "servername";
     public static final String VOLUME_NAME = "glustervolumename";
+    public static final String VDS_NAME = "VdsName";
 
     public static final String FS_TYPE_XFS = "xfs";
 
@@ -39,6 +40,9 @@
     public static final String MANAGE_GLUSTER_SERVICE_ACTION_TYPE_RESTART = 
"restart";
     public static final String COMMAND = "command";
     public static final String GEO_REP_SESSION_KEY = "geoRepSessionKey";
+    public static final String GEO_REP_SLAVE_VOLUME_NAME = 
"geoRepSlaveVolumeName";
+    public static final String GEO_REP_USER = "geoRepUserName";
+    public static final String GEO_REP_USER_GROUP = "geoRepGroupName";
 
     public static final String HOOK_NAME = "glusterhookname";
     public static final String FAILURE_MESSAGE = "failuremessage";
@@ -46,4 +50,5 @@
     public static final String JOB_INFO = "info";
     public static final String VOLUME_SNAPSHOT_MAX_HARD_LIMIT = 
"snap-max-hard-limit";
     public static final String VOLUME_SNAPSHOT_NAME = "snapname";
+    public static final String VDS_GROUP_NAME = "VdsGroupName";
 }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
index bd756b5..7d257ff 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
@@ -52,6 +52,7 @@
     VAR__TYPE__GLUSTER_GEOREP_CONFIG,
     VAR__TYPE__GLUSTER_VOLUME_SNAPSHOT,
     VAR__TYPE__STORAGE_DEVICE,
+    VAR__TYPE__GEOREP_MOUNT_BROKER,
 
     // External Event
     VAR__TYPE__EXTERNAL_EVENT,
@@ -115,6 +116,8 @@
     VAR__ACTION__UPDATE_VM_VERSION,
     VAR__ACTION__VOLUME_SNAPSHOT_CONFIG_UPDATE,
     VAR__ACTION__SYNC,
+    VAR__ACTION__GET_PUB_KEY,
+    VAR__ACTION__WRITE_PUB_KEYS,
 
     // Host statuses replacements
     VAR__HOST_STATUS__UP,
@@ -947,6 +950,8 @@
     ACTION_TYPE_FAILED_VOLUME_OPERATION_IN_PROGRESS(ErrorType.CONFLICT),
     ACTION_TYPE_FAILED_GLUSTER_OPERATION_INPROGRESS(ErrorType.CONFLICT),
     ACTION_TYPE_FAILED_GEOREP_SESSION_INVALID(ErrorType.BAD_PARAMETERS),
+    
ACTION_TYPE_FAILED_ONE_OR_MORE_REMOTE_HOSTS_ARE_NOT_ACCESSIBLE(ErrorType.CONSTRAINT_VIOLATION),
+    
ACTION_TYPE_FAILED_GLUSTER_GEOREP_SESSION_ALREADY_CREATED(ErrorType.CONFLICT),
     ACTION_TYPE_FAILED_GEOREP_SESSION_ALREADY_STARTED(ErrorType.CONFLICT),
     ACTION_TYPE_FAILED_GEOREP_SESSION_ALREADY_PAUSED(ErrorType.CONFLICT),
     ACTION_TYPE_FAILED_GEOREP_SESSION_LOCKED(ErrorType.CONFLICT),
@@ -955,6 +960,7 @@
     ACTION_TYPE_FAILED_VOLUME_SNAPSHOT_NOT_SUPPORTED(ErrorType.CONFLICT),
     
ACTION_TYPE_FAILED_REMOTE_CLUSTER_NOT_MAINTAINED_BY_ENGINE(ErrorType.CONFLICT),
     ACTION_TYPE_FAILED_VOLUME_SNAPSHOT_LOCKED(ErrorType.CONFLICT),
+    ACTION_TYPE_FAILED_GEO_REP_NOT_SUPPORTED(ErrorType.CONFLICT),
     ACTION_TYPE_FAILED_GLUSTER_GEOREP_CONFIG_SET(ErrorType.CONFLICT),
     ACTION_TYPE_FAILED_GLUSTER_GEOREP_CONFIG_DEFAULT_SET(ErrorType.CONFLICT),
     
ACTION_TYPE_FAILED_GLUSTER_VOLUME_SNAPSHOT_NAME_IS_EMPTY(ErrorType.BAD_PARAMETERS),
@@ -971,6 +977,8 @@
     ACTION_TYPE_FAILED_STORAGE_DEVICE_REQUIRED(ErrorType.BAD_PARAMETERS),
     
ACTION_TYPE_FAILED_DIFFERENT_STORAGE_DEVICE_TYPES_SELECTED(ErrorType.BAD_PARAMETERS),
     ACTION_TYPE_FAILED_DEVICE_IS_ALREADY_IN_USE(ErrorType.BAD_PARAMETERS),
+    GLUSTER_NETWORK_NOT_SUPPORTED_FOR_POOL_LEVEL(ErrorType.NOT_SUPPORTED),
+    ACTION_TYPE_FAILED_GLUSTER_NO_PUB_KEYS_PASSED(ErrorType.BAD_PARAMETERS),
 
     // OpenStack Glance
     ACTION_TYPE_FAILED_IMAGE_DOWNLOAD_ERROR(ErrorType.BAD_PARAMETERS),
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
index 6dde1bf..8410bc3 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
@@ -334,6 +334,7 @@
     GetGlusterClusterServiceByClusterId,
     GetGlusterVolumeRebalanceStatus,
     GetGlusterVolumeGeoRepSessions,
+    GetGlusterHostPublicKeys,
     GetGlusterVolumeRemoveBricksStatus,
     GetGlusterVolumeByTaskId,
     GetNonEligibilityReasonsOfVolumeForGeoRepSession,
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDaoDbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDaoDbFacadeImpl.java
index 400be02..dda1e49 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDaoDbFacadeImpl.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDaoDbFacadeImpl.java
@@ -218,6 +218,11 @@
                         .addValue("slave_volume_id", 
geoRepSession.getSlaveVolumeId()));
     }
 
+    @Override
+    public void remove(Guid sessonId) {
+        getCallsHandler().executeModification("DeleteGlusterGeoRepSession", 
getCustomMapSqlParameterSource().addValue("session_id", sessonId));
+    }
+
     public void updateSessionStatus(GlusterGeoRepSession geoRepSession) {
         
getCallsHandler().executeModification("UpdateGlusterGeoRepSessionStatus",
                 createIdParameterMapper(geoRepSession.getId())
diff --git 
a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties 
b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
index 714f570..abd7142 100644
--- 
a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
+++ 
b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
@@ -1149,6 +1149,10 @@
 ACTION_TYPE_FAILED_GLUSTER_VOLUME_REBALANCE_NOT_STARTED=Cannot ${action} 
${type}. Rebalance is not running on the volume ${volumeName} in cluster 
${vdsGroup}.
 ACTION_TYPE_FAILED_GLUSTER_VOLUME_CANNOT_STOP_REBALANCE_IN_PROGRESS= Cannot 
${action} ${type}. Rebalance is running on the volume ${volumeName} in cluster 
${vdsGroup}.
 ACTION_TYPE_FAILED_GLUSTER_VOLUME_CANNOT_STOP_REMOVE_BRICK_IN_PROGRESS= Cannot 
${action} ${type}. Remove brick operation is running on the volume 
${volumeName} in cluster ${vdsGroup}.
+ACTION_TYPE_FAILED_GLUSTER_GEOREP_SESSION_ALREADY_CREATED=Cannot ${action} 
${type}. Geo-replication session between the requested master and slave volumes 
and for the required user already created.
+ACTION_TYPE_FAILED_GLUSTER_NO_PUB_KEYS_PASSED=Cannot ${action} ${type}. No Pub 
keys to update to slave.
+ACTION_TYPE_FAILED_GEO_REP_NOT_SUPPORTED=Cannot ${action} ${type}. 
Geo-replication is not supported.
+ACTION_TYPE_FAILED_ONE_OR_MORE_REMOTE_HOSTS_ARE_NOT_ACCESSIBLE=Cannot 
${action} ${type}. One or more remote hosts are inaccessible.
 ACTION_TYPE_FAILED_GLUSTER_OPERATION_INPROGRESS=Cannot ${action} ${type}. 
Gluster operation is in progress in cluster. Please try again.
 ACTION_TYPE_FAILED_GEOREP_SESSION_INVALID=Cannot ${action} ${type}. 
Geo-replication session not found.
 ACTION_TYPE_FAILED_GEOREP_SESSION_LOCKED=Cannot ${action} ${type}. Another 
operation is in progress on this geo-replication session. Please try again.
diff --git 
a/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties
 
b/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties
index 7d87b46..76097f4 100644
--- 
a/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties
+++ 
b/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties
@@ -724,6 +724,14 @@
 GLUSTER_VOLUME_ADD_BRICK_FAILED=Gluster Volume ${glusterVolumeName} add brick 
failed.
 GLUSTER_VOLUME_REBALANCE_START=Gluster Volume ${glusterVolumeName} rebalance 
started.
 GLUSTER_VOLUME_REBALANCE_START_FAILED=Could not start Gluster Volume 
${glusterVolumeName} rebalance.
+GLUSTER_GEO_REP_PUB_KEY_FETCH_FAILED=Failed to fetch public keys.
+GLUSTER_GET_PUB_KEY=Public key fetched.
+GLUSTER_GEOREP_PUBLIC_KEY_WRITE_FAILED=Failed to write public keys to 
${VdsName}
+GLUSTER_WRITE_PUB_KEYS=Public keys written to ${VdsName}
+GLUSTER_GEOREP_SETUP_MOUNT_BROKER_FAILED=Failed to setup geo-replication mount 
broker for user ${geoRepUserName} group ${geoRepGroupName} on the slave volume 
${geoRepSlaveVolumeName}.
+GLUSTER_SETUP_GEOREP_MOUNT_BROKER=Geo-replication mount brocker has been setup 
for user ${geoRepUserName} group ${geoRepGroupName} on the slave volume 
${geoRepSlaveVolumeName}.
+GLUSTER_GEOREP_SESSION_CREATE_FAILED=Failed to create geo-replication session 
between master volume : ${glusterVolumeName} and slave volume : 
${geoRepSlaveVolumeName} for the user ${geoRepUserName}.
+CREATE_GLUSTER_VOLUME_GEOREP_SESSION=Created geo-replication session between 
master volume : ${glusterVolumeName} and slave volume : 
${geoRepSlaveVolumeName} for the user ${geoRepUserName}.
 GLUSTER_VOLUME_GEO_REP_RESUME=Geo-replication session on volume 
${glusterVolumeName} has been resumed.
 GLUSTER_VOLUME_GEO_REP_RESUME_FAILED=Failed to resume geo-replication session 
on volume ${glusterVolumeName}
 GLUSTER_VOLUME_REBALANCE_STOP=Gluster Volume ${glusterVolumeName} rebalance 
stopped.
diff --git 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDaoTest.java
 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDaoTest.java
index 0726a6d..5d0c6eb 100644
--- 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDaoTest.java
+++ 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDaoTest.java
@@ -156,6 +156,13 @@
     }
 
     @Test
+    public void testRemove() {
+        dao.remove(FixturesTool.GLUSTER_GEOREP_SESSION_ID);
+        List<GlusterGeoRepSession> fetchedSessions = 
dao.getGeoRepSessionsInCluster(FixturesTool.GLUSTER_CLUSTER_ID);
+        assertEquals(0, fetchedSessions.size());
+    }
+
+    @Test
     public void testGetBySlaveHostAndVolume() {
         GlusterGeoRepSession session = 
dao.getGeoRepSession(FixturesTool.GLUSTER_VOLUME_UUID1,
                 "192.168.122.17", "slave-replica");
diff --git 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
index 3716a8f..bfed253 100644
--- 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
+++ 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
@@ -3111,6 +3111,18 @@
     @DefaultStringValue("Cannot ${action} ${type}. Geo-replication session not 
found.")
     String ACTION_TYPE_FAILED_GEOREP_SESSION_INVALID();
 
+    @DefaultStringValue("Cannot ${action} ${type}. Geo-replication is not 
supported.")
+    String ACTION_TYPE_FAILED_GEO_REP_NOT_SUPPORTED();
+
+    @DefaultStringValue("Cannot ${action} ${type}. One or more remote hosts 
are inaccessible.")
+    String ACTION_TYPE_FAILED_ONE_OR_MORE_REMOTE_HOSTS_ARE_NOT_ACCESSIBLE();
+
+    @DefaultStringValue("Cannot ${action} ${type}. No Pub keys to update to 
slave.")
+    String ACTION_TYPE_FAILED_GLUSTER_NO_PUB_KEYS_PASSED();
+
+    @DefaultStringValue("Cannot ${action} ${type}. Geo-replication session 
between the requested master and slave volumes and for the required user 
already created.")
+    String ACTION_TYPE_FAILED_GLUSTER_GEOREP_SESSION_ALREADY_CREATED();
+
     @DefaultStringValue("Cannot ${action} ${type}. Geo-replication session is 
already started.")
     String ACTION_TYPE_FAILED_GEOREP_SESSION_ALREADY_STARTED();
 
diff --git 
a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/LocalizedEnums.java
 
b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/LocalizedEnums.java
index 05a80f0..abf3f5f 100644
--- 
a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/LocalizedEnums.java
+++ 
b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/LocalizedEnums.java
@@ -341,6 +341,22 @@
 
     String AuditLogType___GLUSTER_VOLUME_REBALANCE_START_FAILED();
 
+    String AuditLogType___GLUSTER_GEO_REP_PUB_KEY_FETCH_FAILED();
+
+    String AuditLogType___GLUSTER_GET_PUB_KEY();
+
+    String AuditLogType___GLUSTER_GEOREP_PUBLIC_KEY_WRITE_FAILED();
+
+    String AuditLogType___GLUSTER_WRITE_PUB_KEYS();
+
+    String AuditLogType___GLUSTER_GEOREP_SETUP_MOUNT_BROKER_FAILED();
+
+    String AuditLogType___GLUSTER_SETUP_GEOREP_MOUNT_BROKER();
+
+    String AuditLogType___GLUSTER_GEOREP_SESSION_CREATE_FAILED();
+
+    String AuditLogType___CREATE_GLUSTER_VOLUME_GEOREP_SESSION();
+
     String AuditLogType___GLUSTER_VOLUME_GEO_REP_RESUME_FAILED();
 
     String AuditLogType___GLUSTER_VOLUME_GEO_REP_RESUME();
@@ -806,6 +822,8 @@
 
     String VdcActionType___RefreshGeoRepSessions();
 
+    String VdcActionType___CreateGlusterVolumeGeoRepSession();
+
     String VdcActionType___StopGeoRepSession();
 
     String VdcActionType___DeleteGeoRepSession();
diff --git 
a/frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/LocalizedEnums.properties
 
b/frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/LocalizedEnums.properties
index 4b9ee4b..c8b59bc 100644
--- 
a/frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/LocalizedEnums.properties
+++ 
b/frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/LocalizedEnums.properties
@@ -216,6 +216,14 @@
 AuditLogType___REMOVE_GLUSTER_VOLUME_BRICKS_NOT_FOUND_FROM_CLI=Could not find 
information for remove brick on volume from CLI. Marking it as unknown.
 AuditLogType___GLUSTER_GEOREP_SESSION_REFRESH=Refreshed geo-replication 
sessions for volume.
 AuditLogType___GLUSTER_GEOREP_SESSION_REFRESH_FAILED=Failed to refresh 
geo-replication sessions for volume.
+AuditLogType___GLUSTER_GEO_REP_PUB_KEY_FETCH_FAILED=Failed to fetch public 
keys.
+AuditLogType___GLUSTER_GET_PUB_KEY=Public key fetched.
+AuditLogType___GLUSTER_GEOREP_PUBLIC_KEY_WRITE_FAILED=Failed to write public 
keys
+AuditLogType___GLUSTER_WRITE_PUB_KEYS=Public keys written
+AuditLogType___GLUSTER_GEOREP_SETUP_MOUNT_BROKER_FAILED=Failed to setup 
geo-replication mount broker for user ${geoRepUserName} group 
${geoRepGroupName} on the slave volume ${geoRepSlaveVolumeName}.
+AuditLogType___GLUSTER_SETUP_GEOREP_MOUNT_BROKER=Geo-replication mount brocker 
has been setup
+AuditLogType___GLUSTER_GEOREP_SESSION_CREATE_FAILED=Failed to create 
geo-replication session
+AuditLogType___CREATE_GLUSTER_VOLUME_GEOREP_SESSION=Created geo-replication 
session
 AuditLogType___GEOREP_SESSION_STOP=Geo-replication session stopped on volume
 AuditLogType___GEOREP_SESSION_STOP_FAILED=Failed to stop geo-replication 
session on volume
 AuditLogType___GEOREP_SESSION_DELETED=Geo-replication session deleted on volume
@@ -375,6 +383,7 @@
 VdcActionType___RefreshGlusterHook=Refresh Gluster Hook
 VdcActionType___ManageGlusterService=Manage Service
 VdcActionType___RefreshGeoRepSessions=Refresh Geo-replication Sessions
+VdcActionType___CreateGlusterVolumeGeoRepSession=Created geo-replication 
session
 VdcActionType___StopGeoRepSession=Stop Geo-replication session
 VdcActionType___StartGlusterVolumeGeoRep=Start Geo-Replication Session
 VdcActionType___PauseGlusterVolumeGeoRepSession=Pause Geo-Replication Session
diff --git a/packaging/dbscripts/gluster_georep_sp.sql 
b/packaging/dbscripts/gluster_georep_sp.sql
index 0a91991..592c125 100644
--- a/packaging/dbscripts/gluster_georep_sp.sql
+++ b/packaging/dbscripts/gluster_georep_sp.sql
@@ -244,3 +244,12 @@
 END; $procedure$
 LANGUAGE plpgsql;
 
+Create or replace FUNCTION DeleteGlusterGeoRepSession(v_session_id UUID)
+RETURNS VOID
+AS $procedure$
+BEGIN
+   DELETE FROM gluster_georep_session
+   WHERE session_id=v_session_id;
+END; $procedure$
+LANGUAGE plpgsql;
+


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Iccc92235deea42d7818336b2402476193cbe789c
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.5-gluster
Gerrit-Owner: anmolbabu <anb...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to