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