Shubhendu Tripathi has uploaded a new change for review. Change subject: gluster: BLL command to set volume snapshot config ......................................................................
gluster: BLL command to set volume snapshot config Introduced BLL command to set the volume snapshot configurations Change-Id: I37b6f4dd02ca4258e5e40e7da11f0a657ac6b330 Signed-off-by: Shubhendu Tripathi <[email protected]> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/UpdateGlusterVolumeSnapshotConfigCommand.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 A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/UpdateGlusterVolumeSnapshotConfigParameters.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java 5 files changed, 230 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/94/36294/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/UpdateGlusterVolumeSnapshotConfigCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/UpdateGlusterVolumeSnapshotConfigCommand.java new file mode 100644 index 0000000..c02952a --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/UpdateGlusterVolumeSnapshotConfigCommand.java @@ -0,0 +1,173 @@ +package org.ovirt.engine.core.bll.gluster; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.ovirt.engine.core.bll.LockMessagesMatchUtil; +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.gluster.UpdateGlusterVolumeSnapshotConfigParameters; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotConfigParam; +import org.ovirt.engine.core.common.errors.VdcBllMessages; +import org.ovirt.engine.core.common.locks.LockingGroup; +import org.ovirt.engine.core.common.utils.Pair; +import org.ovirt.engine.core.common.vdscommands.VDSCommandType; +import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; +import org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumeSnapshotSetConfigVDSParameters; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; +import org.ovirt.engine.core.dao.gluster.GlusterVolumeSnapshotConfigDao; + +public class UpdateGlusterVolumeSnapshotConfigCommand extends GlusterCommandBase<UpdateGlusterVolumeSnapshotConfigParameters> { + + public UpdateGlusterVolumeSnapshotConfigCommand(UpdateGlusterVolumeSnapshotConfigParameters params) { + super(params); + setVdsGroupId(params.getClusterId()); + } + + @Override + protected LockProperties applyLockProperties(LockProperties lockProperties) { + return lockProperties.withScope(Scope.Execution); + } + + @Override + protected void setActionMessageParameters() { + addCanDoActionMessage(VdcBllMessages.VAR__ACTION__VOLUME_SNAPSHOT_CONFIG_UPDATE); + } + + @Override + protected boolean canDoAction() { + if (!super.canDoAction()) { + return false; + } + + if (getParameters().getClusterId() == null) { + addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_CLUSTER_IS_NOT_VALID); + return false; + } + + if (getParameters() == null || getParameters().getConfigParams() == null + || getParameters().getConfigParams().size() == 0) { + addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_VOLUME_SNAPSHOT_CONFIG_PARAMS_IS_EMPTY); + return false; + } + + for (GlusterVolumeSnapshotConfigParam param : getParameters().getConfigParams()) { + if (param.getParamValue() == null || param.getParamValue().equals("")) { + addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_VOLUME_SNAPSHOT_CONFIG_PARAM_VALUE_IS_EMPTY); + return false; + } + } + + return true; + } + + @Override + protected void executeCommand() { + Guid clusterId = getParameters().getClusterId(); + Guid volumeId = getParameters().getVolumeId(); + List<GlusterVolumeSnapshotConfigParam> fetchedConfigParams = + getGlusterVolumeSnapshotConfigDao().getGlusterVolumeSnapshotConfigByClusterId(clusterId); + + // segregate the fetched cluster and volume specific config params + Map<String, GlusterVolumeSnapshotConfigParam> fetchedClusterConfigParams = + new HashMap<String, GlusterVolumeSnapshotConfigParam>(); + Map<String, GlusterVolumeSnapshotConfigParam> fetchedVolumeConfigParams = + new HashMap<String, GlusterVolumeSnapshotConfigParam>(); + for (GlusterVolumeSnapshotConfigParam param : fetchedConfigParams) { + if (Guid.isNullOrEmpty(param.getVolumeId())) { + fetchedClusterConfigParams.put(param.getParamName(), param); + } else if (volumeId != null && param.getVolumeId().equals(volumeId)) { + fetchedVolumeConfigParams.put(param.getParamName(), param); + } + } + + List<GlusterVolumeSnapshotConfigParam> configParams = getParameters().getConfigParams(); + + // segregate the cluster and volume specific config params + Map<String, GlusterVolumeSnapshotConfigParam> clusterConfigParams = + new HashMap<String, GlusterVolumeSnapshotConfigParam>(); + Map<String, GlusterVolumeSnapshotConfigParam> volumeConfigParams = + new HashMap<String, GlusterVolumeSnapshotConfigParam>(); + for (GlusterVolumeSnapshotConfigParam param : configParams) { + if (Guid.isNullOrEmpty(param.getVolumeId())) { + clusterConfigParams.put(param.getParamName(), param); + } else { + volumeConfigParams.put(param.getParamName(), param); + } + } + + // form the final list of updated config params + List<GlusterVolumeSnapshotConfigParam> updatedClusterConfigParams = + new ArrayList<GlusterVolumeSnapshotConfigParam>(); + for (GlusterVolumeSnapshotConfigParam cfgParam : clusterConfigParams.values()) { + GlusterVolumeSnapshotConfigParam fetchedCfgParam = fetchedClusterConfigParams.get(cfgParam.getParamName()); + if (!(fetchedCfgParam.getParamValue().equals(cfgParam.getParamValue()))) { + updatedClusterConfigParams.add(cfgParam); + } + } + List<GlusterVolumeSnapshotConfigParam> updatedVolumeConfigParams = + new ArrayList<GlusterVolumeSnapshotConfigParam>(); + for (GlusterVolumeSnapshotConfigParam cfgParam : volumeConfigParams.values()) { + GlusterVolumeSnapshotConfigParam fetchedCfgParam = fetchedVolumeConfigParams.get(cfgParam.getParamName()); + if (!(fetchedCfgParam.getParamValue().equals(cfgParam.getParamValue()))) { + updatedVolumeConfigParams.add(cfgParam); + } + } + + // TODO: execute vds command to set the configurations + List<GlusterVolumeSnapshotConfigParam> vdsParam = new ArrayList<GlusterVolumeSnapshotConfigParam>(); + for (GlusterVolumeSnapshotConfigParam param : updatedClusterConfigParams) + vdsParam.add(param); + for (GlusterVolumeSnapshotConfigParam param : updatedVolumeConfigParams) + vdsParam.add(param); + VDSReturnValue retVal = runVdsCommand(VDSCommandType.SetGlusterVolumeSnapshotConfig, + new GlusterVolumeSnapshotSetConfigVDSParameters(upServer.getId(), vdsParam)); + setSucceeded(retVal.getSucceeded()); + + if (getSucceeded()) { + // persist the configurations + for (GlusterVolumeSnapshotConfigParam param : updatedClusterConfigParams) { + getGlusterVolumeSnapshotConfigDao().updateConfigByClusterIdAndName(param.getClusterId(), + param.getParamName(), + param.getParamValue()); + } + for (GlusterVolumeSnapshotConfigParam param : updatedVolumeConfigParams) { + getGlusterVolumeSnapshotConfigDao().updateConfigByVolumeIdIdAndName(param.getClusterId(), + param.getVolumeId(), + param.getParamName(), + param.getParamValue()); + } + } else { + handleVdsError(AuditLogType.GLUSTER_VOLUME_SNAPSHOT_CONFIG_UPDATE_FAILED, retVal.getVdsError().getMessage()); + } + } + + protected GlusterVolumeSnapshotConfigDao getGlusterVolumeSnapshotConfigDao() { + return DbFacade.getInstance().getGlusterVolumeSnapshotConfigDao(); + } + + @Override + protected Map<String, Pair<String, String>> getExclusiveLocks() { + Guid clusterId = getParameters().getConfigParams().get(0).getClusterId(); + if (!isInternalExecution()) { + return Collections.singletonMap(clusterId.toString(), + LockMessagesMatchUtil.makeLockingPair(LockingGroup.GLUSTER, + VdcBllMessages.ACTION_TYPE_FAILED_OBJECT_LOCKED)); + } + return null; + } + + @Override + public AuditLogType getAuditLogTypeValue() { + if (getSucceeded()) { + return AuditLogType.GLUSTER_VOLUME_SNAPSHOT_CREATED; + } else { + return errorType == null ? AuditLogType.GLUSTER_VOLUME_SNAPSHOT_CONFIG_UPDATE_FAILED : errorType; + } + } +} 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 ab9d7e1..786ef32 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 @@ -386,6 +386,8 @@ GLUSTER_GEOREP_SESSION_DETECTED_FROM_CLI(4098, AuditLogSeverity.WARNING), GLUSTER_VOLUME_SNAPSHOT_CREATED(4099), GLUSTER_VOLUME_SNAPSHOT_CREATE_FAILED(4100, AuditLogSeverity.ERROR), + GLUSTER_VOLUME_SNAPSHOT_CONFIG_UPDATED(4101), + GLUSTER_VOLUME_SNAPSHOT_CONFIG_UPDATE_FAILED(4102, AuditLogSeverity.ERROR), USER_FORCE_SELECTED_SPM(159), USER_VDS_RESTART(41), USER_FAILED_VDS_RESTART(107, AuditLogSeverity.ERROR), 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 411eff2..1c5bdab 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 @@ -300,6 +300,7 @@ CommitRemoveGlusterVolumeBricks(1424, ActionGroup.MANIPULATE_GLUSTER_VOLUME, false, QuotaDependency.NONE), RefreshGlusterVolumeDetails(1425, ActionGroup.MANIPULATE_GLUSTER_VOLUME, QuotaDependency.NONE), CreateGlusterVolumeSnapshot(1426, ActionGroup.MANIPULATE_GLUSTER_VOLUME, QuotaDependency.NONE), + UpdateGlusterVolumeSnapshotConfig(1427, ActionGroup.MANIPULATE_GLUSTER_VOLUME, QuotaDependency.NONE), // Scheduling 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/UpdateGlusterVolumeSnapshotConfigParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/UpdateGlusterVolumeSnapshotConfigParameters.java new file mode 100644 index 0000000..74afb95 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/UpdateGlusterVolumeSnapshotConfigParameters.java @@ -0,0 +1,51 @@ +package org.ovirt.engine.core.common.action.gluster; + +import java.util.List; + +import org.ovirt.engine.core.common.action.VdcActionParametersBase; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotConfigParam; +import org.ovirt.engine.core.compat.Guid; + +public class UpdateGlusterVolumeSnapshotConfigParameters extends VdcActionParametersBase { + private static final long serialVersionUID = 2015321730118872977L; + + private Guid clusterId; + // Nullable, so not extending the class from GlusterVolumeParameters + private Guid volumeId; + private List<GlusterVolumeSnapshotConfigParam> configParams; + + public UpdateGlusterVolumeSnapshotConfigParameters() { + } + + public UpdateGlusterVolumeSnapshotConfigParameters(Guid clusterId, + Guid volumeId, + List<GlusterVolumeSnapshotConfigParam> params) { + this.clusterId = clusterId; + this.volumeId = volumeId; + this.configParams = params; + } + + public Guid getClusterId() { + return this.clusterId; + } + + public void setClusterId(Guid id) { + this.clusterId = id; + } + + public Guid getVolumeId() { + return this.volumeId; + } + + public void setVolumeId(Guid id) { + this.volumeId = id; + } + + public List<GlusterVolumeSnapshotConfigParam> getConfigParams() { + return this.configParams; + } + + public void setConfigParams(List<GlusterVolumeSnapshotConfigParam> params) { + this.configParams = params; + } +} 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 e9a5693..9299030 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 @@ -110,6 +110,7 @@ VAR__ACTION__UPDATE_SLA_POLICY, VAR__ACTION__UPDATE_VM_VERSION, VAR__ACTION__VOLUME_SNAPSHOT_CREATE, + VAR__ACTION__VOLUME_SNAPSHOT_CONFIG_UPDATE, // Host statuses replacements VAR__HOST_STATUS__UP, @@ -897,6 +898,8 @@ ACTION_TYPE_FAILED_GLUSTER_VOLUME_CANNOT_STOP_REMOVE_BRICK_IN_PROGRESS(ErrorType.CONFLICT), ACTION_TYPE_FAILED_GLUSTER_VOLUME_IS_DOWN(ErrorType.CONFLICT), ACTION_TYPE_FAILED_GLUSTER_VOLUME_IS_NOT_THINLY_PROVISIONED(ErrorType.CONFLICT), + ACTION_TYPE_FAILED_GLUSTER_VOLUME_SNAPSHOT_CONFIG_PARAMS_IS_EMPTY(ErrorType.BAD_PARAMETERS), + ACTION_TYPE_FAILED_GLUSTER_VOLUME_SNAPSHOT_CONFIG_PARAM_VALUE_IS_EMPTY(ErrorType.BAD_PARAMETERS), ACTION_TYPE_FAILED_NOT_A_GLUSTER_VOLUME_BRICK(ErrorType.BAD_PARAMETERS), ACTION_TYPE_FAILED_GLUSTER_VOLUME_REMOVE_BRICKS_NOT_STARTED(ErrorType.CONFLICT), ACTION_TYPE_FAILED_GLUSTER_VOLUME_REMOVE_BRICKS_NOT_FINISHED(ErrorType.CONFLICT), -- To view, visit http://gerrit.ovirt.org/36294 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I37b6f4dd02ca4258e5e40e7da11f0a657ac6b330 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Shubhendu Tripathi <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
