package org.ovirt.engine.core.bll.exportimport; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.inject.Inject; import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute; import org.ovirt.engine.core.bll.RemoveVmTemplateCommand; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.bll.validator.storage.StorageDomainValidator; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.LockProperties; import org.ovirt.engine.core.common.action.RemoveAllVmImagesParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.common.action.VmTemplateImportExportParameters; import org.ovirt.engine.core.common.asynctasks.EntityInfo; import org.ovirt.engine.core.common.businessentities.StorageDomainType; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.VmTemplateStatus; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.common.queries.GetAllFromExportDomainQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.common.vdscommands.RemoveVMVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.VmTemplateDao; @NonTransactiveCommandAttribute public class RemoveVmTemplateFromImportExportCommand<T extends VmTemplateImportExportParameters> extends RemoveVmTemplateCommand<T> { @Inject private VmTemplateDao vmTemplateDao; private Map<VmTemplate, List<DiskImage>> templatesFromExport; // this is needed since overriding getVmTemplate() private VmTemplate exportTemplate; public RemoveVmTemplateFromImportExportCommand(T parameters, CommandContext cmdContext) { super(parameters, cmdContext); setStorageDomainId(parameters.getStorageDomainId()); } @Override protected LockProperties applyLockProperties(LockProperties lockProperties) { return lockProperties; } @Override public void init() { } @Override protected boolean validate() { boolean retVal = validate(templateExists()); if (retVal) { List<DiskImage> images = templatesFromExport.get(templatesFromExport.keySet().stream().filter( t -> t.getId().equals(getParameters().getVmTemplateId())).findFirst().orElse(null)); if (images != null) { getParameters().setImages(images); } else { retVal = false; addValidationMessage(EngineMessage.ACTION_TYPE_FAILED_TEMPLATE_DOES_NOT_EXIST); } } if (retVal) { StorageDomainValidator validator = new StorageDomainValidator(getStorageDomain()); retVal = validate(validator.isDomainExistAndActive()); } if (retVal && getStorageDomain().getStorageDomainType() != StorageDomainType.ImportExport) { addValidationMessage(EngineMessage.ACTION_TYPE_FAILED_STORAGE_DOMAIN_TYPE_ILLEGAL); retVal = false; } if (retVal) { // we fectch from db and not using VmTmplate property becase // VmTemplate is the one from export domain and not from database VmTemplate tmpl = vmTemplateDao.get(getVmTemplateId()); if (tmpl != null) { retVal = tmpl.getStatus() != VmTemplateStatus.Locked; if (!retVal) { getReturnValue().getValidationMessages() .add(EngineMessage.VM_TEMPLATE_IMAGE_IS_LOCKED.toString()); } } } return retVal; } @Override protected void setActionMessageParameters() { addValidationMessage(EngineMessage.VAR__ACTION__REMOVE); addValidationMessage(EngineMessage.VAR__TYPE__VM_TEMPLATE); } @Override protected void executeCommand() { getParameters().setEntityInfo(new EntityInfo(VdcObjectType.VmTemplate, getVmTemplateId())); RemoveVMVDSCommandParameters tempVar = new RemoveVMVDSCommandParameters(getParameters().getStoragePoolId(), getVmTemplateId()); tempVar.setStorageDomainId(getParameters().getStorageDomainId()); runVdsCommand(VDSCommandType.RemoveVM, tempVar); List<DiskImage> images = getParameters().getImages(); setSucceeded(true); if (!images.isEmpty()) { for (DiskImage image : images) { ArrayList<Guid> storageIds = new ArrayList<>(); storageIds.add(getParameters().getStorageDomainId()); image.setStorageIds(storageIds); image.setStoragePoolId(getParameters().getStoragePoolId()); } RemoveAllVmImagesParameters tempVar2 = new RemoveAllVmImagesParameters(getVmId(), images); tempVar2.setParentCommand(getActionType()); tempVar2.setEntityInfo(getParameters().getEntityInfo()); tempVar2.setForceDelete(true); tempVar2.setParentParameters(getParameters()); VdcReturnValueBase vdcRetValue = runInternalActionWithTasksContext(VdcActionType.RemoveAllVmImages, tempVar2); if (vdcRetValue.getSucceeded()) { getReturnValue().getVdsmTaskIdList().addAll(vdcRetValue.getInternalVdsmTaskIdList()); } else { getReturnValue().setFault(vdcRetValue.getFault()); setSucceeded(false); } } } @Override public AuditLogType getAuditLogTypeValue() { return getSucceeded() ? AuditLogType.IMPORTEXPORT_REMOVE_TEMPLATE : AuditLogType.IMPORTEXPORT_REMOVE_TEMPLATE_FAILED; } @Override protected void endSuccessfully() { endRemoveTemplate(); } @Override protected void endWithFailure() { endRemoveTemplate(); } protected void endRemoveTemplate() { setCommandShouldBeLogged(false); setSucceeded(true); } /* * get template from export domain */ @Override public VmTemplate getVmTemplate() { if (exportTemplate == null) { GetAllFromExportDomainQueryParameters tempVar = new GetAllFromExportDomainQueryParameters(getParameters() .getStoragePoolId(), getParameters().getStorageDomainId()); VdcQueryReturnValue qretVal = runInternalQuery( VdcQueryType.GetTemplatesFromExportDomain, tempVar); if (qretVal.getSucceeded()) { templatesFromExport = qretVal.getReturnValue(); exportTemplate = templatesFromExport.keySet().stream().filter( t -> t.getId().equals(getParameters().getVmTemplateId())).findFirst().orElse(null); setVmTemplate(exportTemplate); } } return exportTemplate; } @Override public Map<String, String> getJobMessageProperties() { if (jobProperties == null) { jobProperties = new HashMap<>(); jobProperties.put(VdcObjectType.VmTemplate.name().toLowerCase(), (getVmTemplateName() == null) ? "" : getVmTemplateName()); jobProperties.put(VdcObjectType.Storage.name().toLowerCase(), getStorageDomainName()); } return jobProperties; } @Override public List<PermissionSubject> getPermissionCheckSubjects() { return Collections.singletonList(new PermissionSubject( getParameters().getStorageDomainId(), VdcObjectType.Storage, getActionType().getActionGroup())); } }