package org.ovirt.engine.core.bll.gluster; import java.util.List; 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.GlusterVolumeSnapshotActionParameters; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.gluster.GlusterGeoRepSession; import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; import org.ovirt.engine.core.common.errors.EngineError; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.common.locks.LockingGroup; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumeSnapshotActionVDSParameters; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.utils.lock.EngineLock; @NonTransactiveCommandAttribute public class DeleteGlusterVolumeSnapshotCommand extends GlusterVolumeSnapshotCommandBase<GlusterVolumeSnapshotActionParameters> { private List<GlusterGeoRepSession> georepSessions; public DeleteGlusterVolumeSnapshotCommand(GlusterVolumeSnapshotActionParameters params, CommandContext commandContext) { super(params, commandContext); } @Override protected void init() { super.init(); georepSessions = glusterGeoRepDao.getGeoRepSessions(getGlusterVolumeId()); } @Override protected void setActionMessageParameters() { addValidationMessage(EngineMessage.VAR__ACTION__REMOVE); super.setActionMessageParameters(); } private boolean deleteGlusterVolumeSnapshot(Guid serverId, String volumeName, String snapshotName) { VDSReturnValue retVal = runVdsCommand(VDSCommandType.DeleteGlusterVolumeSnapshot, new GlusterVolumeSnapshotActionVDSParameters(serverId, volumeName, snapshotName)); setSucceeded(retVal.getSucceeded()); if (!getSucceeded()) { handleVdsError(AuditLogType.GLUSTER_VOLUME_SNAPSHOT_DELETE_FAILED, retVal.getVdsError().getMessage()); return false; } else { glusterVolumeSnapshotDao.remove(getSnapshot().getId()); } return true; } @Override public void executeCommand() { if (georepSessions != null) { for (GlusterGeoRepSession session : georepSessions) { GlusterVolumeEntity slaveVolume = glusterVolumeDao.getById(session.getSlaveVolumeId()); if (slaveVolume == null) { // continue with other sessions and try to pause continue; } VDS slaveUpServer = glusterUtil.getRandomUpServer(slaveVolume.getClusterId()); if (slaveUpServer == null) { handleVdsError(AuditLogType.GLUSTER_VOLUME_SNAPSHOT_DELETE_FAILED, EngineError.NoUpServerFoundInRemoteCluster.name()); setSucceeded(false); return; } try (EngineLock lock = acquireEngineLock(session.getSlaveVolumeId(), LockingGroup.GLUSTER_SNAPSHOT)) { if (!deleteGlusterVolumeSnapshot(slaveUpServer.getId(), slaveVolume.getName(), getSnapshot().getSnapshotName())) { return; } // Check and remove soft limit alert for the volume glusterUtil.checkAndRemoveVolumeSnapshotLimitsAlert(slaveVolume); } } } deleteGlusterVolumeSnapshot(getUpServer().getId(), getGlusterVolumeName(), getSnapshot().getSnapshotName()); // Check and remove soft limit alert for the volume glusterUtil.checkAndRemoveVolumeSnapshotLimitsAlert(getGlusterVolume()); } @Override protected boolean validate() { if (!super.validate()) { return false; } for (GlusterGeoRepSession session : georepSessions) { if (session.getSlaveVolumeId() == null || session.getSlaveNodeUuid() == null) { return failValidation(EngineMessage.ACTION_TYPE_FAILED_REMOTE_CLUSTER_NOT_MAINTAINED_BY_ENGINE); } } return true; } @Override public AuditLogType getAuditLogTypeValue() { if (getSucceeded()) { return AuditLogType.GLUSTER_VOLUME_SNAPSHOT_DELETED; } else { return AuditLogType.GLUSTER_VOLUME_SNAPSHOT_DELETE_FAILED; } } }