package org.ovirt.engine.core.bll; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import javax.inject.Inject; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.AddVmParameters; import org.ovirt.engine.core.common.action.LockProperties; import org.ovirt.engine.core.common.action.LockProperties.Scope; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; import org.ovirt.engine.core.common.businessentities.storage.DiskVmElement; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.StorageDomainDao; /** * This class adds a thinly provisioned VM based on disks list. */ @DisableInPrepareMode @NonTransactiveCommandAttribute public class AddVmFromScratchCommand<T extends AddVmParameters> extends AddVmCommand<T> { @Inject private StorageDomainDao storageDomainDao; public AddVmFromScratchCommand(T parameters, CommandContext commandContext) { super(parameters, commandContext); } protected AddVmFromScratchCommand(Guid commandId) { super(commandId); } @Override protected LockProperties applyLockProperties(LockProperties lockProperties) { return lockProperties.withScope(Scope.Execution); } @Override protected Map<String, Pair<String, String>> getSharedLocks() { return null; } @Override public Guid getStorageDomainId() { Guid storageDomainId = super.getStorageDomainId(); if (Guid.Empty.equals(storageDomainId) || storageDomainId == null) { storageDomainId = storageDomainDao.getAllForStoragePool(getStoragePoolId()).stream().filter( a -> !a.getStorageDomainType().isIsoOrImportExportDomain() && (a.getStatus() == StorageDomainStatus.Active)) .map(StorageDomain::getId).findFirst().orElse(Guid.Empty); getParameters().setStorageDomainId(storageDomainId); setStorageDomainId(storageDomainId); } return storageDomainId; } @Override protected boolean checkTemplateImages(List<String> reasons) { return true; } @Override protected boolean addVmImages() { return true; } @Override protected boolean validate() { if (getCluster() == null && Guid.Empty.equals(super.getStorageDomainId())) { return failValidation(EngineMessage.VM_CLUSTER_IS_NOT_VALID); } return super.validate(); } @Override protected boolean isDisksVolumeFormatValid() { return true; } @Override protected List<DiskVmElement> getDiskVmElements() { return Collections.emptyList(); } @Override protected VdcActionType getChildActionType() { return VdcActionType.AddImageFromScratch; } @Override public List<PermissionSubject> getPermissionCheckSubjects() { List<PermissionSubject> permissionList = new ArrayList<>(); permissionList.add(new PermissionSubject(getClusterId(), VdcObjectType.Cluster, getActionType().getActionGroup())); addPermissionSubjectForAdminLevelProperties(permissionList); return permissionList; } }