package org.ovirt.engine.core.bll.gluster; import java.util.Map; 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.LockProperties; import org.ovirt.engine.core.common.action.LockProperties.Scope; import org.ovirt.engine.core.common.action.gluster.GlusterVolumeOptionParameters; import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeOptionEntity; import org.ovirt.engine.core.common.constants.gluster.GlusterConstants; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumeOptionVDSParameters; /** * BLL Command to set a Gluster Volume Option */ @NonTransactiveCommandAttribute public class SetGlusterVolumeOptionCommand extends GlusterVolumeCommandBase<GlusterVolumeOptionParameters> { private boolean optionValueExists; public SetGlusterVolumeOptionCommand(GlusterVolumeOptionParameters params, CommandContext commandContext) { super(params, commandContext); } @Override protected LockProperties applyLockProperties(LockProperties lockProperties) { return lockProperties.withScope(Scope.Execution).withWait(true); } @Override public Map<String, String> getCustomValues() { addCustomValue(GlusterConstants.OPTION_KEY, getParameters().getVolumeOption().getKey()); addCustomValue(GlusterConstants.OPTION_VALUE, getParameters().getVolumeOption().getValue()); return super.getCustomValues(); } @Override protected void setActionMessageParameters() { addValidationMessage(EngineMessage.VAR__ACTION__SET); addValidationMessage(EngineMessage.VAR__TYPE__GLUSTER_VOLUME_OPTION); } @Override protected void executeCommand() { VDSReturnValue returnValue = runVdsCommand(VDSCommandType.SetGlusterVolumeOption, new GlusterVolumeOptionVDSParameters(upServer.getId(), getGlusterVolumeName(), getParameters().getVolumeOption())); setSucceeded(returnValue.getSucceeded()); if (getSucceeded()) { updateOptionInDb(getParameters().getVolumeOption()); } else { handleVdsError(AuditLogType.GLUSTER_VOLUME_OPTION_SET_FAILED, returnValue.getVdsError().getMessage()); return; } } /** * Updates the volume option in DB. If the option with given key already exists for the volume, <br> * it will be updated, else inserted. */ private void updateOptionInDb(final GlusterVolumeOptionEntity option) { // update the option value if it exists, else add it GlusterVolumeOptionEntity existingOption = getGlusterVolume().getOption(option.getKey()); if (existingOption != null) { if(option.getValue().equalsIgnoreCase(existingOption.getValue())) { return; } optionValueExists = true; addCustomValue(GlusterConstants.OPTION_OLD_VALUE, existingOption.getValue()); glusterOptionDao.updateVolumeOption(existingOption.getId(), option.getValue()); } else { optionValueExists = false; glusterOptionDao.save(option); } } @Override public AuditLogType getAuditLogTypeValue() { if (getSucceeded()) { return optionValueExists ? AuditLogType.GLUSTER_VOLUME_OPTION_MODIFIED : AuditLogType.GLUSTER_VOLUME_OPTION_ADDED; } else { return errorType == null ? AuditLogType.GLUSTER_VOLUME_OPTION_SET_FAILED : errorType; } } }