package org.ovirt.engine.core.bll;
import static org.ovirt.engine.core.bll.storage.disk.image.DisksFilter.ONLY_ACTIVE;
import java.util.Collection;
import java.util.List;
import javax.inject.Inject;
import org.apache.commons.collections.CollectionUtils;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.bll.storage.disk.image.DisksFilter;
import org.ovirt.engine.core.common.action.ImagesContainterParametersBase;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VdcReturnValueBase;
import org.ovirt.engine.core.common.action.VmTemplateManagementParameters;
import org.ovirt.engine.core.common.businessentities.VmDeviceId;
import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
import org.ovirt.engine.core.common.businessentities.storage.ImageStorageDomainMapId;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.compat.TransactionScopeOption;
import org.ovirt.engine.core.dao.BaseDiskDao;
import org.ovirt.engine.core.dao.DiskDao;
import org.ovirt.engine.core.dao.DiskImageDao;
import org.ovirt.engine.core.dao.ImageDao;
import org.ovirt.engine.core.dao.ImageStorageDomainMapDao;
import org.ovirt.engine.core.dao.VmDeviceDao;
/**
* This command responsible to removing all Image Templates, of a VmTemplate
* on all domains specified in the parameters
*/
@InternalCommandAttribute
public class RemoveAllVmTemplateImageTemplatesCommand<T extends VmTemplateManagementParameters> extends VmTemplateManagementCommand<T> {
@Inject
private DiskDao diskDao;
@Inject
private ImageStorageDomainMapDao imageStorageDomainMapDao;
@Inject
private DiskImageDao diskImageDao;
@Inject
private BaseDiskDao baseDiskDao;
@Inject
private VmDeviceDao vmDeviceDao;
@Inject
private ImageDao imageDao;
public RemoveAllVmTemplateImageTemplatesCommand(T parameters, CommandContext cmdContext) {
super(parameters, cmdContext);
super.setVmTemplateId(parameters.getVmTemplateId());
}
@SuppressWarnings("unchecked")
@Override
protected void executeCommand() {
List<DiskImage> imageTemplates = DisksFilter.filterImageDisks(diskDao.getAllForVm(getVmTemplateId()),
ONLY_ACTIVE);
for (DiskImage template : imageTemplates) {
// remove this disk in all domain that were sent
for (Guid domain : (Collection<Guid>)CollectionUtils.intersection(getParameters().getStorageDomainsList(), template.getStorageIds())) {
ImagesContainterParametersBase tempVar = new ImagesContainterParametersBase(template.getImageId(),
getVmTemplateId());
tempVar.setStorageDomainId(domain);
tempVar.setStoragePoolId(template.getStoragePoolId());
tempVar.setImageGroupID(template.getId());
tempVar.setEntityInfo(getParameters().getEntityInfo());
tempVar.setWipeAfterDelete(template.isWipeAfterDelete());
tempVar.setTransactionScopeOption(TransactionScopeOption.RequiresNew);
tempVar.setParentCommand(getActionType());
tempVar.setParentParameters(getParameters());
VdcReturnValueBase vdcReturnValue = runInternalActionWithTasksContext(
VdcActionType.RemoveTemplateSnapshot,
tempVar);
if (vdcReturnValue.getSucceeded()) {
getReturnValue().getInternalVdsmTaskIdList().addAll(vdcReturnValue.getInternalVdsmTaskIdList());
} else {
log.error("Can't remove image id '{}' for template id '{}' from domain id '{}' due to: {}.",
template.getImageId(), getVmTemplateId(), domain,
vdcReturnValue.getFault().getMessage());
}
imageStorageDomainMapDao.remove(new ImageStorageDomainMapId(template.getImageId(), domain));
}
DiskImage diskImage = diskImageDao.get(template.getImageId());
if (diskImage != null) {
baseDiskDao.remove(template.getId());
vmDeviceDao.remove(new VmDeviceId(diskImage.getImageId(), getVmTemplateId()));
imageStorageDomainMapDao.remove(diskImage.getImageId());
imageDao.remove(template.getImageId());
}
}
setSucceeded(true);
}
}