anmolbabu has uploaded a new change for review.

Change subject: engine : add brick to geo-rep slave volume
......................................................................

engine : add brick to geo-rep slave volume

This patch handles brick addition to geo-rep slave
volume.

Change-Id: Id85cb7c3eb35ee84b4eb298cd20d9c657ed608d3
Signed-off-by: Anmol Babu <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/AddBricksToGlusterVolumeCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CreateGlusterVolumeGeoRepSessionCommand.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterGeoRepSession.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDao.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDaoDbFacadeImpl.java
M packaging/dbscripts/gluster_georep_sp.sql
6 files changed, 140 insertions(+), 24 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/15/39315/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/AddBricksToGlusterVolumeCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/AddBricksToGlusterVolumeCommand.java
index d13a90c..f201dc8 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/AddBricksToGlusterVolumeCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/AddBricksToGlusterVolumeCommand.java
@@ -2,14 +2,21 @@
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
+import java.util.concurrent.Callable;
 
 import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute;
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.action.LockProperties;
 import org.ovirt.engine.core.common.action.LockProperties.Scope;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.action.VdcReturnValueBase;
 import 
org.ovirt.engine.core.common.action.gluster.GlusterVolumeBricksActionParameters;
+import 
org.ovirt.engine.core.common.action.gluster.GlusterVolumeGeoRepSessionParameters;
 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.GlusterVolumeType;
@@ -21,6 +28,7 @@
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.compat.TransactionScopeOption;
 import 
org.ovirt.engine.core.dal.dbbroker.auditloghandling.gluster.GlusterAuditLogUtil;
+import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil;
 import org.ovirt.engine.core.utils.transaction.TransactionMethod;
 import org.ovirt.engine.core.utils.transaction.TransactionSupport;
 
@@ -103,6 +111,67 @@
                         }
                     });
         }
+        postAddBrickHandleGeoRepCase(bricksList);
+    }
+
+    private void postAddBrickHandleGeoRepCase(final List<GlusterBrickEntity> 
bricksList) {
+        GlusterVolumeEntity volume = getGlusterVolume();
+        Set<Guid> newServerIds = findNewServers(bricksList, volume);
+        List<GlusterGeoRepSession> sessions = 
getDbFacade().getGlusterGeoRepDao().getGeoRepSessionsForSlaveVolume(volume.getId());
+        CreateGlusterVolumeGeoRepSessionCommand command = new 
CreateGlusterVolumeGeoRepSessionCommand(new 
GlusterVolumeGeoRepSessionParameters());
+        for(GlusterGeoRepSession currentSession : sessions) {
+            if (prepareNewHostsForGeoRepSession(command, currentSession, 
newServerIds)) {
+                runInternalAction(VdcActionType.StartGlusterVolumeGeoRep, new 
GlusterVolumeGeoRepSessionParameters(currentSession.getMasterVolumeId(), 
currentSession.getId()));
+            }
+        }
+    }
+
+    private boolean prepareNewHostsForGeoRepSession(final 
CreateGlusterVolumeGeoRepSessionCommand command, final GlusterGeoRepSession 
session, final Set<Guid> newSerVerIds) {
+        List<Callable<Boolean>> setUpPasswordLessSSHCallables = new 
ArrayList<>();
+        final GlusterVolumeEntity masterVolume = 
getGlusterVolumeDao().getById(session.getMasterVolumeId());
+        setUpPasswordLessSSHCallables.add(new Callable<Boolean>() {
+            @Override
+            public Boolean call() throws Exception {
+                boolean succeeded = true;
+                String userName = session.getUserName();
+                String userGroup = session.getUserGroup();
+                if(userName  != null || !userName.isEmpty() || 
!userName.equals("root")) {
+                    succeeded = command.setUpMountBrokerOnSlaves(newSerVerIds, 
getGlusterVolume().getName(), userName, userGroup);
+                }
+                if(succeeded) {
+                    succeeded = 
command.setUpPasswordlessSSH(masterVolume.getBricks().get(0).getServerId(), 
newSerVerIds, userName);
+                }
+                return succeeded;
+            }
+        });
+        List<Boolean> returnValues = 
ThreadPoolUtil.invokeAll(setUpPasswordLessSSHCallables);
+        boolean succeeded = false;
+        for(Boolean currentReturnValue : returnValues) {
+            succeeded = succeeded && currentReturnValue;
+        }
+        return succeeded;
+    }
+
+    private Set<Guid> findNewServers(final List<GlusterBrickEntity> 
bricksList, GlusterVolumeEntity volume) {
+        final Set<Guid> newServerIds = new HashSet<Guid>();
+        if (volume.getIsGeoRepSlave()) {
+            for(GlusterBrickEntity currentBrick : bricksList) {
+                if(isNewServer(currentBrick.getServerName(), volume)) {
+                    newServerIds.add(currentBrick.getServerId());
+                }
+            }
+        }
+        return newServerIds;
+    }
+
+    private boolean isNewServer(String serverName, GlusterVolumeEntity volume) 
{
+        List<GlusterBrickEntity> bricks = volume.getBricks();
+        for(GlusterBrickEntity currentBrick : bricks) {
+            if(currentBrick.getServerName().equals(serverName)) {
+                return false;
+            }
+        }
+        return true;
     }
 
     private void addGlusterVolumeBricks(List<GlusterBrickEntity> bricksList,
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
index c59a2f7..5b632fe 100644
--- 
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
@@ -29,6 +29,7 @@
 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.compat.Guid;
 import org.ovirt.engine.core.dao.gluster.GlusterGeoRepDao;
 import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil;
 
@@ -122,28 +123,37 @@
     protected void executeCommand() {
         boolean rootSession = 
getParameters().getUserName().equalsIgnoreCase("root");
         boolean succeeded = true;
+        Set<Guid> remoteServerIds = getServerIds(remoteServersSet);
         if (!rootSession) {
-            succeeded = setUpMountBrokerOnSlaves();
+            succeeded = setUpMountBrokerOnSlaves(remoteServerIds, 
getParameters().getSlaveVolumeName(), getParameters().getUserName(), 
getParameters().getUserGroup());
         }
         if (succeeded) {
-            succeeded = setUpPasswordlessSSHAndCreateSession();
-            if (succeeded) {
-                
GlusterGeoRepSyncJob.getInstance().refreshGeoRepDataForVolume(getGlusterVolume());
+            succeeded = setUpPasswordlessSSH(upServer.getId(), 
remoteServerIds, getParameters().getUserName());
+            if(succeeded) {
+                succeeded = createGeoRepSession();
+                if (succeeded) {
+                    
GlusterGeoRepSyncJob.getInstance().refreshGeoRepDataForVolume(getGlusterVolume());
+                }
             }
         }
     }
 
-    private boolean setUpMountBrokerOnSlaves() {
+    private Set<Guid> getServerIds(Set<VDS> remoteServersSet) {
+        Set<Guid> remoteServerIds = new HashSet<Guid>();
+        for(VDS currentVds : remoteServersSet) {
+            remoteServerIds.add(currentVds.getId());
+        }
+        return remoteServerIds;
+    }
+
+    protected boolean setUpMountBrokerOnSlaves(Set<Guid> remoteServersSet, 
final String volumeName, final String userName, final String userGroup) {
         List<Callable<Boolean>> mountBrokerSetupReturnStatuses = new 
ArrayList<>();
-        for (final VDS currentSlaveServer : remoteServersSet) {
+        for (final Guid 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();
+                            new SetUpMountBrokerParameters(currentSlaveServer, 
volumeName, userName, userGroup)).getSucceeded();
                 }
             });
         }
@@ -156,27 +166,24 @@
         return true;
     }
 
-    private boolean setUpPasswordlessSSHAndCreateSession() {
-        List<String> pubKeys = readPubKey();
+    protected boolean setUpPasswordlessSSH(Guid masterUpServerId, Set<Guid> 
resmoteServerSet, String userName) {
+        List<String> pubKeys = readPubKey(masterUpServerId);
         boolean canProceed = pubKeys != null && pubKeys.size() > 0;
-        if (canProceed) {
-            canProceed = updatePubKeysToRemoteHosts(pubKeys);
-            if (canProceed) {
-                canProceed = createGeoRepSession();
-            }
+        if(canProceed) {
+            canProceed = updatePubKeysToRemoteHosts(pubKeys, resmoteServerSet, 
userName);
         }
         return canProceed;
     }
 
-    private boolean updatePubKeysToRemoteHosts(final List<String> pubKeys) {
+    private boolean updatePubKeysToRemoteHosts(final List<String> pubKeys, 
Set<Guid> remoteServersSet, final String userName) {
         List<Callable<Boolean>> slaveWritePubKeyList = new ArrayList<>();
-        for (final VDS currentRemoteHost : remoteServersSet) {
+        for (final Guid 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();
+                            new 
UpdateGlusterHostPubKeyToSlaveParameters(currentRemoteHost,
+                                    pubKeys, userName)).getSucceeded();
                 }
             });
         }
@@ -190,9 +197,9 @@
     }
 
     @SuppressWarnings("unchecked")
-    private List<String> readPubKey() {
+    private List<String> readPubKey(Guid upServerId) {
         VdcQueryReturnValue readPubKeyReturnvalue =
-                runInternalQuery(VdcQueryType.GetGlusterHostPublicKeys, new 
IdQueryParameters(upServer.getId()));
+                runInternalQuery(VdcQueryType.GetGlusterHostPublicKeys, new 
IdQueryParameters(upServerId));
         if (readPubKeyReturnvalue.getSucceeded()) {
             return (List<String>) readPubKeyReturnvalue.getReturnValue();
         } else {
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterGeoRepSession.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterGeoRepSession.java
index acdb6d4..82fcd4c 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterGeoRepSession.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterGeoRepSession.java
@@ -20,6 +20,8 @@
     private Guid sessionId;
     private Guid slaveVolumeId;
     private GeoRepSessionStatus status;
+    private String userName;
+    private String userGroup;
     private ArrayList<GlusterGeoRepSessionDetails> sessionDetails;
 
     public Guid getMasterVolumeId() {
@@ -111,6 +113,22 @@
         return sessionId;
     }
 
+    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;
+    }
+
     @Override
     public int hashCode() {
         final int prime = 31;
@@ -123,6 +141,8 @@
         result = prime * result + ((slaveVolumeId == null) ? 0 : 
slaveVolumeId.hashCode());
         result = prime * result + ((slaveVolumeName == null) ? 0 : 
slaveVolumeName.hashCode());
         result = prime * result + ((status == null) ? 0 : status.hashCode());
+        result = prime * result + ((userName == null) ? 0 : 
userName.hashCode());
+        result = prime * result + ((userGroup == null) ? 0 : 
userGroup.hashCode());
         return result;
     }
 
@@ -137,7 +157,9 @@
                     && (ObjectUtils.objectsEqual(getSlaveNodeUuid(), 
session.getSlaveNodeUuid()))
                     && (ObjectUtils.objectsEqual(getSlaveVolumeId(), 
session.getSlaveVolumeId()))
                     && (ObjectUtils.objectsEqual(getSlaveVolumeName(), 
session.getSlaveVolumeName()))
-                    && (ObjectUtils.objectsEqual(getStatus(), 
session.getStatus()))) {
+                    && (ObjectUtils.objectsEqual(getStatus(), 
session.getStatus()))
+                    && (ObjectUtils.objectsEqual(getUserName(), 
session.getUserName()))
+                    && (ObjectUtils.objectsEqual(getUserGroup(), 
session.getUserGroup()))) {
                 return true;
             }
         }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDao.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDao.java
index 153fd1d..19ff8ad 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDao.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDao.java
@@ -36,6 +36,8 @@
 
     public List<GlusterGeoRepSession> getGeoRepSessionsInCluster(Guid 
clusterId);
 
+    public List<GlusterGeoRepSession> getGeoRepSessionsForSlaveVolume(Guid 
slaveVolumeId);
+
     public void remove(Guid id);
 
     public void updateSession(GlusterGeoRepSession geoRepSession);
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 b8552f4..f4bf98b 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
@@ -140,6 +140,13 @@
     }
 
     @Override
+    public List<GlusterGeoRepSession> getGeoRepSessionsForSlaveVolume(Guid 
slaveVolumeId) {
+        return 
getCallsHandler().executeReadList("GetGeoRepSessionsForSlaveVolume",
+                georepSessionRowMapper,
+                getCustomMapSqlParameterSource().addValue("slave_volume_id", 
slaveVolumeId));
+    }
+
+    @Override
     public List<GlusterGeoRepSessionDetails> getGeoRepSessionDetails(Guid 
sessionId) {
         return 
getCallsHandler().executeReadList("GetGlusterGeoRepSessionDetails", 
georepSessionDetailsRowMapper,
                 createIdParameterMapper(sessionId));
diff --git a/packaging/dbscripts/gluster_georep_sp.sql 
b/packaging/dbscripts/gluster_georep_sp.sql
index 592c125..7692152 100644
--- a/packaging/dbscripts/gluster_georep_sp.sql
+++ b/packaging/dbscripts/gluster_georep_sp.sql
@@ -253,3 +253,12 @@
 END; $procedure$
 LANGUAGE plpgsql;
 
+Create or replace FUNCTION GetGeoRepSessionsForSlaveVolume(v_slave_volume_id 
UUID)
+RETURNS SETOF gluster_georep_sessions_view STABLE
+AS $procedure$
+BEGIN
+    RETURN QUERY SELECT *
+    FROM  gluster_georep_sessions_view
+    WHERE slave_volume_id = v_slave_volume_id;
+END; $procedure$
+LANGUAGE plpgsql;


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Id85cb7c3eb35ee84b4eb298cd20d9c657ed608d3
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: anmolbabu <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to