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 javax.inject.Inject; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.bll.LockMessagesMatchUtil; import org.ovirt.engine.core.bll.context.CommandContext; 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.GlusterVolumeSnapshotConfig; import org.ovirt.engine.core.common.errors.EngineMessage; 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.dao.gluster.GlusterVolumeSnapshotConfigDao; public class UpdateGlusterVolumeSnapshotConfigCommand extends GlusterCommandBase<UpdateGlusterVolumeSnapshotConfigParameters> { private boolean updatesSuccessful; private List<String> failedCfgs; @Inject private GlusterVolumeSnapshotConfigDao glusterVolumeSnapshotConfigDao; public UpdateGlusterVolumeSnapshotConfigCommand(UpdateGlusterVolumeSnapshotConfigParameters params, CommandContext commandContext) { super(params, commandContext); setClusterId(params.getClusterId()); failedCfgs = new ArrayList<>(); } @Override protected LockProperties applyLockProperties(LockProperties lockProperties) { return lockProperties.withScope(Scope.Execution); } @Override protected void setActionMessageParameters() { addValidationMessage(EngineMessage.VAR__TYPE__GLUSTER_VOLUME_SNAPSHOT_CONFIG); addValidationMessage(EngineMessage.VAR__ACTION__VOLUME_SNAPSHOT_CONFIG_UPDATE); } @Override protected boolean validate() { if (!super.validate()) { return false; } if (getParameters().getClusterId() == null) { addValidationMessage(EngineMessage.ACTION_TYPE_FAILED_CLUSTER_IS_NOT_VALID); return false; } if (getParameters().getConfigParams() == null) { addValidationMessage(EngineMessage.ACTION_TYPE_FAILED_GLUSTER_VOLUME_SNAPSHOT_CONFIG_PARAMS_IS_EMPTY); return false; } for (GlusterVolumeSnapshotConfig param : getParameters().getConfigParams()) { if (StringUtils.isEmpty(param.getParamValue())) { addCustomValue("snapshotConfigParam", param.getParamName()); addValidationMessage(EngineMessage.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<GlusterVolumeSnapshotConfig> fetchedConfigParams = glusterVolumeSnapshotConfigDao.getConfigByClusterId(clusterId); // segregate the fetched cluster and volume specific config params Map<String, GlusterVolumeSnapshotConfig> fetchedClusterConfigParams = new HashMap<>(); Map<String, GlusterVolumeSnapshotConfig> fetchedVolumeConfigParams = new HashMap<>(); for (GlusterVolumeSnapshotConfig 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<GlusterVolumeSnapshotConfig> configParams = getParameters().getConfigParams(); // segregate the cluster and volume specific config params Map<String, GlusterVolumeSnapshotConfig> clusterConfigParams = new HashMap<>(); Map<String, GlusterVolumeSnapshotConfig> volumeConfigParams = new HashMap<>(); for (GlusterVolumeSnapshotConfig 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<GlusterVolumeSnapshotConfig> updatedClusterConfigParams = new ArrayList<>(); for (GlusterVolumeSnapshotConfig cfgParam : clusterConfigParams.values()) { GlusterVolumeSnapshotConfig fetchedCfgParam = fetchedClusterConfigParams.get(cfgParam.getParamName()); if (fetchedCfgParam != null && !fetchedCfgParam.getParamValue().equals(cfgParam.getParamValue())) { updatedClusterConfigParams.add(cfgParam); } } List<GlusterVolumeSnapshotConfig> updatedVolumeConfigParams = new ArrayList<>(); for (GlusterVolumeSnapshotConfig cfgParam : volumeConfigParams.values()) { GlusterVolumeSnapshotConfig fetchedCfgParam = fetchedVolumeConfigParams.get(cfgParam.getParamName()); if (fetchedCfgParam != null && !fetchedCfgParam.getParamValue().equals(cfgParam.getParamValue())) { updatedVolumeConfigParams.add(cfgParam); } } List<GlusterVolumeSnapshotConfig> updatedConfigs = new ArrayList<>(); for (GlusterVolumeSnapshotConfig param : updatedClusterConfigParams) { updatedConfigs.add(param); } for (GlusterVolumeSnapshotConfig param : updatedVolumeConfigParams) { updatedConfigs.add(param); } for (GlusterVolumeSnapshotConfig config : updatedConfigs) { VDSReturnValue retVal = runVdsCommand(VDSCommandType.SetGlusterVolumeSnapshotConfig, new GlusterVolumeSnapshotSetConfigVDSParameters(upServer.getId(), config)); if (!retVal.getSucceeded()) { failedCfgs.add(config.getParamName()); updatesSuccessful = false; } else { if (config.getVolumeId() != null) { glusterVolumeSnapshotConfigDao.updateConfigByVolumeIdAndName(config.getClusterId(), config.getVolumeId(), config.getParamName(), config.getParamValue()); } else { glusterVolumeSnapshotConfigDao.updateConfigByClusterIdAndName(config.getClusterId(), config.getParamName(), config.getParamValue()); } updatesSuccessful = true; } } if (!updatesSuccessful) { addCustomValue("failedSnapshotConfigs", failedCfgs.toString()); } setSucceeded(true); } @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_SNAPSHOT, EngineMessage.ACTION_TYPE_FAILED_OBJECT_LOCKED)); } return null; } @Override public AuditLogType getAuditLogTypeValue() { if (getSucceeded()) { if (updatesSuccessful) { return AuditLogType.GLUSTER_VOLUME_SNAPSHOT_CONFIG_UPDATED; } else { return AuditLogType.GLUSTER_VOLUME_SNAPSHOT_CONFIG_UPDATE_FAILED_PARTIALLY; } } else { return errorType == null ? AuditLogType.GLUSTER_VOLUME_SNAPSHOT_CONFIG_UPDATE_FAILED : errorType; } } }