package org.ovirt.engine.core.bll.storage; import java.util.List; import org.ovirt.engine.core.bll.Backend; import org.ovirt.engine.core.bll.ImportVmCommand; import org.ovirt.engine.core.bll.QueriesCommandBase; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.businessentities.StorageDomainType; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.storage_domain_static; import org.ovirt.engine.core.common.businessentities.storage_domains; import org.ovirt.engine.core.common.queries.GetAllFromExportDomainQueryParamenters; import org.ovirt.engine.core.common.vdscommands.GetVmsInfoVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.RefObject; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBase; import org.ovirt.engine.core.utils.ovf.OvfManager; import org.ovirt.engine.core.utils.ovf.OvfReaderException; public class GetVmsFromExportDomainQuery<P extends GetAllFromExportDomainQueryParamenters> extends QueriesCommandBase<P> { public GetVmsFromExportDomainQuery(P parameters) { super(parameters); } @Override protected void executeQueryCommand() { storage_domain_static storage = DbFacade.getInstance().getStorageDomainStaticDAO().get( getParameters().getStorageDomainId()); if (storage.getstorage_domain_type() == StorageDomainType.ImportExport) { VDSReturnValue retVal = ExecuteVerb(); BuildOvfReturnValue(retVal.getReturnValue()); } else { getQueryReturnValue().setReturnValue(new java.util.ArrayList<VM>()); } } protected VDSReturnValue ExecuteVerb() { GetVmsInfoVDSCommandParameters tempVar = new GetVmsInfoVDSCommandParameters( getParameters().getStoragePoolId()); tempVar.setStorageDomainId(getParameters().getStorageDomainId()); tempVar.setVmIdList(getParameters().getIds()); VDSReturnValue retVal = Backend.getInstance().getResourceManager() .RunVdsCommand(VDSCommandType.GetVmsInfo, tempVar); return retVal; } protected boolean IsValidExportDomain() { storage_domains domain = DbFacade.getInstance().getStorageDomainDAO().getForStoragePool( getParameters().getStorageDomainId(), getParameters().getStoragePoolId()); if (domain != null && domain.getstorage_domain_type() == StorageDomainType.ImportExport) { return true; } return false; } protected void BuildOvfReturnValue(Object obj) { boolean shouldAdd = true; java.util.ArrayList<String> ovfList = (java.util.ArrayList<String>) obj; OvfManager ovfManager = new OvfManager(); java.util.ArrayList<VM> vms = new java.util.ArrayList<VM>(); List<VM> existsVms = DbFacade.getInstance().getVmDAO().getAll(); java.util.HashMap<Guid, VM> existsVmDictionary = new java.util.HashMap<Guid, VM>(); for (VM vm : existsVms) { existsVmDictionary.put(vm.getvm_guid(), vm); } if (IsValidExportDomain()) { VM vm = null; for (String ovf : ovfList) { try { if (!ovfManager.IsOvfTemplate(ovf)) { java.util.ArrayList<DiskImage> diskImages = null; RefObject<VM> tempRefObject = new RefObject<VM>(vm); RefObject<java.util.ArrayList<DiskImage>> tempRefObject2 = new RefObject<java.util.ArrayList<DiskImage>>( diskImages); ovfManager.ImportVm(ovf, tempRefObject, tempRefObject2); vm = tempRefObject.argvalue; diskImages = tempRefObject2.argvalue; shouldAdd = getParameters().getGetAll() ? shouldAdd : !existsVmDictionary .containsKey(vm.getvm_guid()); if (shouldAdd) { // add images vm.setImages(diskImages); // add disk map java.util.HashMap<String, java.util.ArrayList<DiskImage>> images = ImportVmCommand .GetImagesLeaf(diskImages); for (String drive : images.keySet()) { java.util.ArrayList<DiskImage> list = images.get(drive); vm.getDiskMap().put(drive, list.get(list.size() - 1)); } vms.add(vm); } } } catch (OvfReaderException ex) { AuditLogableBase logable = new AuditLogableBase(); logable.AddCustomValue("ImportedVmName", ex.getName()); AuditLogDirector.log(logable, AuditLogType.IMPORTEXPORT_FAILED_TO_IMPORT_VM); } catch (RuntimeException ex) { AuditLogableBase logable = new AuditLogableBase(); logable.AddCustomValue("ImportedVmName", "[Unknown name]"); AuditLogDirector.log(logable, AuditLogType.IMPORTEXPORT_FAILED_TO_IMPORT_VM); } } } getQueryReturnValue().setReturnValue(vms); } }