package org.ovirt.engine.core.bll.storage.disk.cinder; import java.util.Collection; import java.util.Collections; import org.ovirt.engine.core.bll.InternalCommandAttribute; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.storage.disk.image.RemoveImageCommand; import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallback; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.RemoveCinderDiskVolumeParameters; import org.ovirt.engine.core.common.businessentities.SubjectEntity; import org.ovirt.engine.core.common.businessentities.storage.CinderDisk; import org.ovirt.engine.core.compat.CommandStatus; import org.ovirt.engine.core.compat.Guid; @InternalCommandAttribute public class RemoveCinderDiskVolumeCommand<T extends RemoveCinderDiskVolumeParameters> extends RemoveImageCommand<T> { private Guid storageDomainId; public RemoveCinderDiskVolumeCommand(T parameters, CommandContext cmdContext) { super(parameters, cmdContext); } @Override public void executeCommand() { CinderDisk volumeToDelete = getParameters().getRemovedVolume(); if (!deleteVolumeFromCinder(volumeToDelete)) { setCommandStatus(CommandStatus.FAILED); } persistCommand(getParameters().getParentCommand(), true); setSucceeded(true); } private boolean deleteVolumeFromCinder(CinderDisk lastCinderVolume) { try { getCinderBroker().deleteVolumeByClassificationType(lastCinderVolume); } catch (Exception e) { log.error("Failed to remove volume '{}' of cider disk id '{}'. Exception: {}", lastCinderVolume.getImageId(), lastCinderVolume.getId(), e); return false; } return true; } @Override public Guid getStorageDomainId() { if (storageDomainId == null) { storageDomainId = getParameters().getRemovedVolume().getStorageIds().get(0); } return storageDomainId; } @Override protected void endWithFailure() { super.endWithFailure(); CinderDisk cinderVolume = getParameters().getRemovedVolume(); log.error("Could not remove Cinder volume id '{}' of disk id '{}'.", cinderVolume.getImageId(), cinderVolume.getId()); } @Override public CommandCallback getCallback() { return new RemoveCinderDiskVolumeCommandCallback(); } @Override protected Collection<SubjectEntity> getSubjectEntities() { return Collections.singleton(new SubjectEntity(VdcObjectType.Storage, getParameters().getRemovedVolume().getStorageIds().get(0))); } }