package org.ovirt.engine.core.bll.validator.storage; import java.util.Collection; import java.util.Collections; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; import org.ovirt.engine.core.bll.ValidationResult; import org.ovirt.engine.core.common.businessentities.storage.Disk; import org.ovirt.engine.core.common.businessentities.storage.DiskVmElement; import org.ovirt.engine.core.compat.Guid; public class MultipleDiskVmElementValidator { protected Map<Disk, Collection<DiskVmElement>> diskToDiskVmElements; /** * For a single disk with one or more disk vm elements. */ public MultipleDiskVmElementValidator(Disk disk, Collection<DiskVmElement> diskVmElements) { diskToDiskVmElements = Collections.singletonMap(disk, diskVmElements); } /** * For a few disks, each with its corresponding vm element. */ public MultipleDiskVmElementValidator(Map<Disk, DiskVmElement> diskToDiskVmElement) { diskToDiskVmElements = diskToDiskVmElement.entrySet().stream() .collect(Collectors.toMap(Map.Entry::getKey, diskImageDiskVmElementEntry -> Collections.singleton(diskImageDiskVmElementEntry.getValue()))); } /** * For testing purposes. */ protected MultipleDiskVmElementValidator() { } public ValidationResult isPassDiscardSupportedForDestSd(Guid destSdId) { return isPassDiscardSupportedForDestSds(diskToDiskVmElements.keySet().stream() .collect(Collectors.toMap(Disk::getId, disk -> destSdId))); } public ValidationResult isPassDiscardSupportedForDestSds(Map<Guid, Guid> diskIdToDestSdId) { return getDisksValidators().stream() .map(diskVmElementValidator -> diskVmElementValidator.isPassDiscardSupported( diskIdToDestSdId.get(diskVmElementValidator.getDiskId()))) .filter(validationResult -> !validationResult.isValid()) .findAny().orElse(ValidationResult.VALID); } public Collection<Guid> getDisksWithoutSupportForPassDiscard(Map<Guid, Guid> diskIdToDestSdId) { return getDisksValidators().stream() .filter(diskVmElementValidator -> !diskVmElementValidator.isPassDiscardSupported( diskIdToDestSdId.get(diskVmElementValidator.getDiskId())).isValid()) .map(DiskVmElementValidator::getDiskId) .collect(Collectors.toList()); } protected DiskVmElementValidator createDiskVmElementValidator(Disk disk, DiskVmElement diskVmElement) { return new DiskVmElementValidator(disk, diskVmElement); } private Collection<DiskVmElementValidator> getDisksValidators() { return diskToDiskVmElements.entrySet().stream() .map(diskCollectionEntry -> diskCollectionEntry.getValue().stream() .map(diskVmElement -> createDiskVmElementValidator( diskCollectionEntry.getKey(), diskVmElement))) .flatMap(Function.identity()) .collect(Collectors.toList()); } }