package org.ovirt.engine.core.bll.validator.storage; import static java.util.stream.Collectors.toSet; import java.util.Collection; import java.util.List; import javax.inject.Inject; import javax.inject.Singleton; import org.apache.commons.collections.CollectionUtils; import org.ovirt.engine.core.bll.ValidationResult; import org.ovirt.engine.core.bll.storage.domain.BlockStorageDomainHelper; import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.storage.LUNs; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.dao.LunDao; import org.ovirt.engine.core.utils.ReplacementUtils; @Singleton public class BlockStorageDomainValidator { @Inject private LunDao lunDao; @Inject private BlockStorageDomainHelper helper; private BlockStorageDomainValidator() { } private static final String VAR_LUN_IDS = "lunIds"; /** * This method receives a collection of luns and validates they are part of the storage domain. */ public ValidationResult lunsInDomain(StorageDomain storageDomain, Collection<String> luns) { Collection<String> notInDomain = CollectionUtils.removeAll(luns, lunDao.getAllForVolumeGroup(storageDomain.getStorage()).stream().map(LUNs::getId).collect(toSet())); if (notInDomain.isEmpty()) { return ValidationResult.VALID; } return prepareValidationError(notInDomain, storageDomain, EngineMessage.ACTION_TYPE_FAILED_DEVICE_NOT_IN_STORAGE_DOMAIN); } /** * This method receives a collection of luns and validates that operations can be performed on it. */ public ValidationResult lunsEligibleForOperation(StorageDomain storageDomain, Collection<String> luns) { List<String> metadataLuns = helper.findMetadataDevices(storageDomain, luns); if (!metadataLuns.isEmpty()) { return prepareValidationError(metadataLuns, storageDomain, EngineMessage.ACTION_TYPE_FAILED_OPERATION_ON_METADATA_DEVICES); } return ValidationResult.VALID; } private ValidationResult prepareValidationError(Collection<String> luns, StorageDomain storageDomain, EngineMessage message) { Collection<String> replacements = ReplacementUtils.replaceWith(VAR_LUN_IDS, luns, ","); replacements.add(String.format("$storageDomainName %s", storageDomain.getName())); return new ValidationResult(message, replacements); } }