package org.ovirt.engine.core.bll; import java.util.Collections; import java.util.List; import java.util.Map; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.AddImageFromScratchParameters; import org.ovirt.engine.core.common.action.AddVmFromScratchParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.common.businessentities.DiskImageBase; import org.ovirt.engine.core.common.businessentities.DiskImageTemplate; import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; import org.ovirt.engine.core.common.businessentities.StorageDomainType; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.storage_domains; import org.ovirt.engine.core.common.errors.VdcBLLException; import org.ovirt.engine.core.common.errors.VdcBllErrors; 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.NGuid; import org.ovirt.engine.core.dal.VdcBllMessages; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.utils.linq.LinqUtils; import org.ovirt.engine.core.utils.linq.Predicate; public class AddVmFromScratchCommand<T extends AddVmFromScratchParameters> extends AddVmCommand<T> { public AddVmFromScratchCommand(T parameters) { super(parameters); getParameters().setDontCheckTemplateImages(true); } protected AddVmFromScratchCommand(Guid commandId) { super(commandId); } @Override public NGuid getStorageDomainId() { if (super.getStorageDomainId().equals(Guid.Empty)) { List<storage_domains> storagesInPool = LinqUtils.filter(DbFacade.getInstance() .getStorageDomainDAO().getAllForStoragePool(getStoragePoolId().getValue()), new Predicate<storage_domains>() { @Override public boolean eval(storage_domains a) { return (a.getstorage_domain_type() != StorageDomainType.ISO && a.getstorage_domain_type() != StorageDomainType.ImportExport) && (a.getstatus() != null) && (a.getstatus() == StorageDomainStatus.Active); } }); // LINQ // DbFacade.Instance.GetStorageDomainsByStoragePoolId(StoragePoolId.Value). // LINQ Where(a => ((a.storage_domain_type != StorageDomainType.ISO // && a.storage_domain_type != StorageDomainType.ImportExport) && // LINQ (a.status.HasValue) && (a.status.Value == // StorageDomainStatus.Active)) // LINQ ).ToList(); getParameters() .setStorageDomainId((storagesInPool.size() > 0) ? storagesInPool.get(0).getid() : Guid.Empty); // LINQ 32934 VmManagementParameters.StorageDomainId = // (storagesInPool.Count > 0) ? storagesInPool[0].id : Guid.Empty; } return getParameters().getStorageDomainId(); } @Override protected boolean AddVmImages() { List<DiskImageTemplate> disks = DbFacade.getInstance().getDiskImageTemplateDAO().getAllByVmTemplate( getParameters().getVmStaticData().getvmt_guid()); if (disks.isEmpty()) { throw new VdcBLLException(VdcBllErrors.VM_TEMPLATE_CANT_LOCATE_DISKS_IN_DB); } // only one (first) disk can be boot disk, make all other disks not boot // LINQ 29456 // DiskImageBase defBootDisk = VmDisks.FirstOrDefault(a => a.boot); // if (defBootDisk != null) // { // VmDisks.ForEach(disk => // { // if (disk != defBootDisk) // { // disk.boot = false; // } // }); // } DiskImageBase defBootDisk = LinqUtils.firstOrNull(getVmDisks(), new Predicate<DiskImageBase>() { @Override public boolean eval(DiskImageBase diskImageBase) { return diskImageBase.getboot(); } }); if (defBootDisk != null) { for (DiskImageBase diskImageBase : getVmDisks()) { if (diskImageBase != defBootDisk) diskImageBase.setboot(false); } } return ConcreteAddVmImages(disks.get(0).getit_guid()); } protected boolean ConcreteAddVmImages(Guid itGuid) { boolean ret = true; if (getVmDisks().size() > 0) { int drivesCount = 1; for (DiskImageBase diskInfo : getVmDisks()) { diskInfo.setinternal_drive_mapping((Integer.toString(drivesCount))); AddImageFromScratchParameters tempVar = new AddImageFromScratchParameters(itGuid, getParameters() .getVmStaticData().getId(), diskInfo); tempVar.setStorageDomainId(this.getStorageDomainId().getValue()); tempVar.setVmSnapshotId(getVmSnapshotId()); tempVar.setParentCommand(VdcActionType.AddVmFromScratch); tempVar.setEntityId(getParameters().getEntityId()); tempVar.setParentParemeters(getParameters()); VdcReturnValueBase tmpRetValue = Backend.getInstance().runInternalAction( VdcActionType.AddImageFromScratch, tempVar); drivesCount++; if (!tmpRetValue.getSucceeded()) { log.error("AddVmFromScratchCommand::ConcreteAddVmImages: AddImageFromScratch Command failed."); ret = false; } else // the AddImageFromScratch task created ended successfully: { getReturnValue().getTaskIdList().addAll(tmpRetValue.getInternalTaskIdList()); } } VmHandler.LockVm(getParameters().getVmStaticData().getId()); } else { // if no disks send update vm here UpdateVmInSpm(getVm().getstorage_pool_id(), new java.util.ArrayList<VM>(java.util.Arrays.asList(new VM[] { getVm() }))); } return ret; } @Override protected boolean canDoAction() { boolean result = (getVdsGroup() != null || !Guid.Empty.equals(super.getStorageDomainId())); if (!result) { addCanDoActionMessage(VdcBllMessages.VM_CLUSTER_IS_NOT_VALID); } else { result = ImagesHandler.CheckImagesConfiguration(getStorageDomainId().getValue(), getParameters() .getDiskInfoList(), getReturnValue().getCanDoActionMessages()); } if (!result) { addCanDoActionMessage(VdcBllMessages.VAR__ACTION__ADD); addCanDoActionMessage(VdcBllMessages.VAR__TYPE__VM); } else { result = super.canDoAction(); } return result; } // protected override List<Interface> VmInterfaces // { // get // { // if (_vmInterfaces == null) // { // _vmInterfaces = AddVmFromScratchParametersData.Interfaces ?? new // List<Interface>(); // } // return _vmInterfaces; // } // } @Override protected List<DiskImageBase> getVmDisks() { if (_vmDisks == null) { _vmDisks = ((getParameters().getDiskInfoList()) != null) ? getParameters().getDiskInfoList() : new java.util.ArrayList<DiskImageBase>(); } return _vmDisks; } @Override protected VdcActionType getChildActionType() { return VdcActionType.AddImageFromScratch; } private static LogCompat log = LogFactoryCompat.getLog(AddVmFromScratchCommand.class); @Override public Map<Guid, VdcObjectType> getPermissionCheckSubjects() { return Collections.singletonMap(getVdsGroupId(), VdcObjectType.VdsGroups); } }