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
