anmolbabu has uploaded a new change for review. Change subject: engine, webadmin: Check volume emptyness for geo-rep ......................................................................
engine, webadmin: Check volume emptyness for geo-rep This patch adds VDS command to check emptyness of gluster volume. And also adds a predicate in the GlusterGeoRepUtil to check the same while filtering the volumes list to get list of volumes eligible for geo-rep session create. This patch also adds a UIMessage entry corresponding to the new volume emptyness criteria. Change-Id: Ia86df17975069d4fe7c1740bf609597fde7b08ac Signed-off-by: Anmol Babu <anb...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/GlusterGeoRepUtil.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterGeoRepNonEligibilityReason.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java M backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/AbstractGlusterBrokerCommand.java A backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/CheckEmptyGlusterVolumeVDSCommand.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java A backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/BooleanReturnForXmlRpc.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java M frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/VdsmErrors.java M frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIMessages.java 14 files changed, 102 insertions(+), 1 deletion(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/53/40153/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/GlusterGeoRepUtil.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/GlusterGeoRepUtil.java index c3f03a5..42fe675 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/GlusterGeoRepUtil.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/GlusterGeoRepUtil.java @@ -7,10 +7,14 @@ import javax.inject.Singleton; +import org.ovirt.engine.core.bll.Backend; import org.ovirt.engine.core.common.businessentities.gluster.GlusterGeoRepNonEligibilityReason; 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.vdscommands.VDSCommandType; +import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; +import org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumeVDSParameters; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.Version; import org.ovirt.engine.core.dal.dbbroker.DbFacade; @@ -85,6 +89,17 @@ } }); + eligibilityPredicates.put(GlusterGeoRepNonEligibilityReason.SLAVE_VOLUME_TO_BE_EMPTY, new Predicate<GlusterVolumeEntity>() { + @Override + public boolean eval(GlusterVolumeEntity slaveVolume) { + VDSReturnValue returnValue = Backend.getInstance().getResourceManager().RunVdsCommand(VDSCommandType.CheckEmptyGlusterVolume, new GlusterVolumeVDSParameters(ClusterUtils.getInstance().getRandomUpServer(slaveVolume.getClusterId()).getId(), slaveVolume.getName())); + if(!returnValue.getSucceeded()) { + return false; + } + return (boolean)returnValue.getReturnValue(); + } + + }); return eligibilityPredicates; } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterGeoRepNonEligibilityReason.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterGeoRepNonEligibilityReason.java index b9de0b9..a1b6096 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterGeoRepNonEligibilityReason.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterGeoRepNonEligibilityReason.java @@ -7,5 +7,6 @@ SLAVE_VOLUME_SHOULD_NOT_BE_SLAVE_OF_ANOTHER_GEO_REP_SESSION, SLAVE_VOLUME_SHOULD_BE_UP, SLAVE_VOLUME_SIZE_TO_BE_AVAILABLE, + SLAVE_VOLUME_TO_BE_EMPTY, MASTER_VOLUME_SIZE_TO_BE_AVAILABLE; } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java index bda1f30..f584cd9 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java @@ -426,6 +426,7 @@ GlfsStatvfsException(4571), GlfsInitException(4572), GlfsFiniException(4573), + GlusterVolumeEmptyCheckFailed(4574), GlusterGeoRepSessionDeleteFailedException(4594), GlusterVolumeGeoRepStatusDetailFailed(4600), GlusterVolumeGeoRepSyncFailed(4601), diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java index 0c79414..1eab009 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java @@ -134,6 +134,7 @@ StartRebalanceGlusterVolume("org.ovirt.engine.core.vdsbroker.gluster"), StopRebalanceGlusterVolume("org.ovirt.engine.core.vdsbroker.gluster"), SetupGlusterGeoRepMountBroker("org.ovirt.engine.core.vdsbroker.gluster"), + CheckEmptyGlusterVolume("org.ovirt.engine.core.vdsbroker.gluster"), GetGlusterHostsPubKey("org.ovirt.engine.core.vdsbroker.gluster"), UpdateGlusterGeoRepKeys("org.ovirt.engine.core.vdsbroker.gluster"), CreateGlusterVolumeGeoRepSession("org.ovirt.engine.core.vdsbroker.gluster"), diff --git a/backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties b/backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties index 8756a47..4cb9976 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties @@ -339,6 +339,7 @@ GlusterVolumeSetOptionFailed=Gluster Volume Set Option Failed GlusterVolumeRebalanceStartFailed=Gluster Volume Rebalance Start Failed GlusterVolumeRebalanceStopFailed=Gluster Volume Rebalance Stop Failed +GlusterVolumeEmptyCheckFailed=Failed to check if gluster volume is empty GlusterVolumeGeoRepSessionStartFailed=Failed to start geo-replication session for volume GlusterVolumeGeoRepSessionResumeFailed=Volume Geo-Replication Resume Failed GlusterGeoRepException=Gluster Geo-Replication Exception diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/AbstractGlusterBrokerCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/AbstractGlusterBrokerCommand.java index 3635ab8..bcf3cd7 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/AbstractGlusterBrokerCommand.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/AbstractGlusterBrokerCommand.java @@ -63,6 +63,7 @@ case GlusterVolumeRebalanceStopFailed: case GlusterVolumeStatusAllFailedException: case GlusterVolumeRebalanceStatusFailedException: + case GlusterVolumeEmptyCheckFailed: case GlusterGeoRepPublicKeyFileCreateFailed: case GlusterGeoRepPublicKeyFileReadError: case GlusterGeoRepUserNotFound: diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/CheckEmptyGlusterVolumeVDSCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/CheckEmptyGlusterVolumeVDSCommand.java new file mode 100644 index 0000000..6d76d79 --- /dev/null +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/CheckEmptyGlusterVolumeVDSCommand.java @@ -0,0 +1,28 @@ +package org.ovirt.engine.core.vdsbroker.gluster; + +import org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumeVDSParameters; +import org.ovirt.engine.core.vdsbroker.vdsbroker.BooleanReturnForXmlRpc; +import org.ovirt.engine.core.vdsbroker.vdsbroker.StatusForXmlRpc; + +public class CheckEmptyGlusterVolumeVDSCommand<P extends GlusterVolumeVDSParameters> extends AbstractGlusterBrokerCommand<P> { + + private BooleanReturnForXmlRpc returnValue; + + public CheckEmptyGlusterVolumeVDSCommand(P parameters) { + super(parameters); + } + + @Override + protected StatusForXmlRpc getReturnStatus() { + return returnValue.mStatus; + } + + @Override + protected void executeVdsBrokerCommand() { + String volumeName = getParameters().getVolumeName(); + returnValue = getBroker().glusterVolumeEmptyCheck(volumeName); + proceedProxyReturnValue(); + setReturnValue(returnValue.isVolumeEmpty()); + } + +} diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java index c2c08f6..4034bc6 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java @@ -37,6 +37,7 @@ import org.ovirt.engine.core.vdsbroker.irsbroker.OneUuidReturnForXmlRpc; import org.ovirt.engine.core.vdsbroker.irsbroker.StoragePoolInfoReturnForXmlRpc; import org.ovirt.engine.core.vdsbroker.vdsbroker.AlignmentScanReturnForXmlRpc; +import org.ovirt.engine.core.vdsbroker.vdsbroker.BooleanReturnForXmlRpc; import org.ovirt.engine.core.vdsbroker.vdsbroker.DevicesVisibilityMapReturnForXmlRpc; import org.ovirt.engine.core.vdsbroker.vdsbroker.FenceStatusReturnForXmlRpc; import org.ovirt.engine.core.vdsbroker.vdsbroker.HostDevListReturnForXmlRpc; @@ -1198,6 +1199,13 @@ } @Override + public BooleanReturnForXmlRpc glusterVolumeEmptyCheck(String volumeName) { + JsonRpcRequest request = new RequestBuilder("GlusterVolume.volumeEmptyCheck").build(); + Map<String, Object> response = new FutureMap(this.client, request); + return new BooleanReturnForXmlRpc(response, "volumeEmptyCheck"); + } + + @Override public GlusterHostsPubKeyReturnForXmlRpc glusterGeoRepKeysGet() { JsonRpcRequest request = new RequestBuilder("GlusterVolume.geoRepKeysGet").build(); Map<String, Object> response = new FutureMap(this.client, request); @@ -1827,4 +1835,5 @@ Map<String, Object> response = new FutureMap(this.client, request); return new StatusOnlyReturnForXmlRpc(response); } + } diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/BooleanReturnForXmlRpc.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/BooleanReturnForXmlRpc.java new file mode 100644 index 0000000..f853c78 --- /dev/null +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/BooleanReturnForXmlRpc.java @@ -0,0 +1,25 @@ +package org.ovirt.engine.core.vdsbroker.vdsbroker; + +import java.util.Map; + +import org.ovirt.engine.core.vdsbroker.irsbroker.StatusReturnForXmlRpc; + +public class BooleanReturnForXmlRpc extends StatusReturnForXmlRpc { + + private static final String INFO = "info"; + private boolean isEmpty; + + public BooleanReturnForXmlRpc(Map<String, Object> innerMap, String flagName) { + super(innerMap); + if (innerMap.containsKey(INFO)) { + innerMap = (Map<String, Object>) innerMap.get(INFO); + } + if (innerMap.containsKey(flagName)) { + isEmpty = (boolean) innerMap.get(flagName); + } + } + + public boolean isVolumeEmpty() { + return isEmpty; + } +} diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java index 50686cc..f62dc25 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java @@ -278,6 +278,8 @@ GlusterServersListReturnForXmlRpc glusterServersList(); + BooleanReturnForXmlRpc glusterVolumeEmptyCheck(String volumeName); + GlusterHostsPubKeyReturnForXmlRpc glusterGeoRepKeysGet(); StatusOnlyReturnForXmlRpc glusterGeoRepKeysUpdate(List<String> geoRepPubKeys, String remoteUserName); diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java index b9ca685..1505e3e 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java @@ -235,6 +235,8 @@ public Map<String, Object> glusterVolumeRebalanceStart(String volumeName, Boolean fixLayoutOnly, Boolean force); + public Map<String, Object> glusterVolumeEmptyCheck(String volumeName); + public Map<String, Object> glusterGeoRepKeysGet(); public Map<String, Object> glusterGeoRepKeysUpdate(String remoteUserName, List<String> geoRepPubKeys); diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java index c85c5da..9398030 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java @@ -1122,6 +1122,17 @@ } @Override + public BooleanReturnForXmlRpc glusterVolumeEmptyCheck(String volumeName) { + try { + Map<String, Object> xmlRpcReturnValue = vdsServer.glusterVolumeEmptyCheck(volumeName); + BooleanReturnForXmlRpc wrapper = new BooleanReturnForXmlRpc(xmlRpcReturnValue, "volumeEmptyCheck"); + return wrapper; + } catch (UndeclaredThrowableException ute) { + throw new XmlRpcRunTimeException(ute); + } + } + + @Override public GlusterHostsPubKeyReturnForXmlRpc glusterGeoRepKeysGet() { try { Map<String, Object> xmlRpcReturnValue = vdsServer.glusterGeoRepKeysGet(); diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/VdsmErrors.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/VdsmErrors.java index 20f3232..278cb3d 100644 --- a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/VdsmErrors.java +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/VdsmErrors.java @@ -721,6 +721,9 @@ @DefaultStringValue("Gluster Volume Rebalance Start Failed.") String GlusterVolumeRebalanceStartFailed(); + @DefaultStringValue("Failed to check if gluster volume is empty") + String GlusterVolumeEmptyCheckFailed(); + @DefaultStringValue("Failed to create gluster host public key file.") String GlusterGeoRepPublicKeyFileCreateFailed(); diff --git a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIMessages.java b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIMessages.java index e8cdf29..8205ea1 100644 --- a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIMessages.java +++ b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIMessages.java @@ -474,7 +474,8 @@ "SLAVE_VOLUME_SHOULD_NOT_BE_SLAVE_OF_ANOTHER_GEO_REP_SESSION", "Destination volume is already a part of another geo replication session.", "SLAVE_VOLUME_SHOULD_BE_UP", "Destination volume should be up.", "SLAVE_VOLUME_SIZE_TO_BE_AVAILABLE", "Capacity information of the destination volume is not available.", - "MASTER_VOLUME_SIZE_TO_BE_AVAILABLE", "Capacity information of the master volume is not available." + "MASTER_VOLUME_SIZE_TO_BE_AVAILABLE", "Capacity information of the master volume is not available.", + "SLAVE_VOLUME_TO_BE_EMPTY", "Slave volume should be empty." }) String geoRepEligibilityViolations(@Select GlusterGeoRepNonEligibilityReason reason); -- To view, visit https://gerrit.ovirt.org/40153 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ia86df17975069d4fe7c1740bf609597fde7b08ac Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: anmolbabu <anb...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches