package org.ovirt.engine.core.bll; import java.util.List; 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.VmTemplateParametersBase; import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.businessentities.DiskImageTemplate; import org.ovirt.engine.core.common.businessentities.image_group_storage_domain_map; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.LogCompat; import org.ovirt.engine.core.compat.LogFactoryCompat; import org.ovirt.engine.core.compat.TransactionScopeOption; import org.ovirt.engine.core.dal.dbbroker.DbFacade; /** * This command responsible to removing all Image Templates, of a VmTemplate * on all domains specified in the parameters */ @InternalCommandAttribute public class RemoveAllVmTemplateImageTemplatesCommand<T extends VmTemplateParametersBase> extends VmTemplateCommand<T> { public RemoveAllVmTemplateImageTemplatesCommand(T parameters) { super(parameters); super.setVmTemplateId(parameters.getVmTemplateId()); } @Override protected void executeCommand() { List<DiskImageTemplate> imageTemplates = DbFacade.getInstance().getDiskImageTemplateDAO().getAllByVmTemplate( getVmTemplateId()); boolean noImagesRemovedYet = true; boolean changeStorageInImagesTable = false; for (DiskImageTemplate template : imageTemplates) { // get disk DiskImage disk = DbFacade.getInstance().getDiskImageDAO().getSnapshotById(template.getId()); // remove this disk in all domain that were sent for (Guid domain : getParameters().getStorageDomainsList()) { ImagesContainterParametersBase tempVar = new ImagesContainterParametersBase(template.getit_guid(), disk.getinternal_drive_mapping(), getVmTemplateId()); tempVar.setStorageDomainId(domain); tempVar.setStoragePoolId(disk.getstorage_pool_id().getValue()); tempVar.setImageGroupID(disk.getimage_group_id().getValue()); tempVar.setEntityId(getParameters().getEntityId()); tempVar.setWipeAfterDelete(disk.getwipe_after_delete()); tempVar.setTransactionScopeOption(TransactionScopeOption.RequiresNew); VdcReturnValueBase vdcReturnValue = Backend.getInstance().runInternalAction( VdcActionType.RemoveTemplateSnapshot, tempVar); if (vdcReturnValue.getSucceeded()) { getReturnValue().getInternalTaskIdList().addAll(vdcReturnValue.getInternalTaskIdList()); } else { if (noImagesRemovedYet) { setSucceeded(false); getReturnValue().setFault(vdcReturnValue.getFault()); return; } log.errorFormat("Can't remove image id: {0} for template id: {1} from domain id: {2} due to: {3}.", template.getId(), getVmTemplateId(), domain, vdcReturnValue.getFault().getMessage()); } // if removing from the domain saved in images table, set value to change it to another domain if (!changeStorageInImagesTable) { changeStorageInImagesTable = domain.equals(disk.getstorage_id()); } DbFacade.getInstance().getStorageDomainDAO().removeImageGroupStorageDomainMap( new image_group_storage_domain_map(disk.getimage_group_id().getValue(), domain)); noImagesRemovedYet = false; } // remove images from db only if removing template completely if (getParameters().isRemoveTemplateFromDb()) { DbFacade.getInstance().getDiskImageDAO().remove(template.getId()); DbFacade.getInstance().getDiskImageTemplateDAO().remove(template.getit_guid()); } else { // change the domain saved in images table to another one // assuming there is one since isRemoveTemplateFromDb = false if (changeStorageInImagesTable) { // get all other domains that still has this images List<image_group_storage_domain_map> imageDomainsMap = DbFacade.getInstance().getStorageDomainDAO().getAllImageGroupStorageDomainMapsForImage(disk.getimage_group_id().getValue()); image_group_storage_domain_map domainForImages = imageDomainsMap.get(0); disk.setstorage_id(domainForImages.getstorage_domain_id()); // update images table DbFacade.getInstance().getDiskImageDAO().update(disk); // remove from map DbFacade.getInstance().getStorageDomainDAO().removeImageGroupStorageDomainMap(domainForImages); } } } setSucceeded(true); } private static LogCompat log = LogFactoryCompat.getLog(RemoveAllVmTemplateImageTemplatesCommand.class); }