package org.ovirt.engine.core.bll.validator; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.bll.ValidationResult; import org.ovirt.engine.core.common.businessentities.IscsiBond; import org.ovirt.engine.core.common.businessentities.StorageServerConnections; import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.businessentities.network.NetworkCluster; import org.ovirt.engine.core.common.businessentities.storage.StorageType; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.DbFacade; public class IscsiBondValidator { public ValidationResult iscsiBondWithTheSameNameExistInDataCenter(IscsiBond iscsiBond) { List<IscsiBond> iscsiBonds = getDBFacade().getIscsiBondDao().getAllByStoragePoolId(iscsiBond.getStoragePoolId()); for (IscsiBond bond : iscsiBonds) { if (bond.getName().equals(iscsiBond.getName()) && !bond.getId().equals(iscsiBond.getId())) { return new ValidationResult(EngineMessage.ISCSI_BOND_WITH_SAME_NAME_EXIST_IN_DATA_CENTER); } } return ValidationResult.VALID; } public ValidationResult isIscsiBondExist(IscsiBond iscsiBond) { return (iscsiBond == null) ? new ValidationResult(EngineMessage.ISCSI_BOND_NOT_EXIST) : ValidationResult.VALID; } public ValidationResult validateAddedLogicalNetworks(IscsiBond iscsiBond) { return validateAddedLogicalNetworks(iscsiBond.getNetworkIds(), iscsiBond.getStoragePoolId()); } public ValidationResult validateAddedLogicalNetworks(IscsiBond after, IscsiBond before) { Collection<Guid> addedLogicalNetworks = CollectionUtils.subtract(after.getNetworkIds(), before.getNetworkIds()); return validateAddedLogicalNetworks(addedLogicalNetworks, after.getStoragePoolId()); } public ValidationResult validateAddedStorageConnections(IscsiBond iscsiBond) { return validateAddedStorageConnections(iscsiBond.getStorageConnectionIds(), iscsiBond.getStoragePoolId()); } public ValidationResult validateAddedStorageConnections(IscsiBond after, IscsiBond before) { Collection<String> addedStorageConnections = CollectionUtils.subtract(after.getStorageConnectionIds(), before.getStorageConnectionIds()); return validateAddedStorageConnections(addedStorageConnections, after.getStoragePoolId()); } private ValidationResult validateAddedLogicalNetworks(Collection<Guid> addedLogicalNetworks, Guid dataCenterId) { if (!addedLogicalNetworks.isEmpty()) { List<Guid> existingNetworks = getDataCenterLogicalNetworks(dataCenterId); Collection<Guid> missingNetworks = CollectionUtils.subtract(addedLogicalNetworks, existingNetworks); if (!missingNetworks.isEmpty()) { return new ValidationResult(EngineMessage.NETWORKS_DONT_EXIST_IN_DATA_CENTER, String.format("$networkIds %s", StringUtils.join(missingNetworks, ",")), String.format("$dataCenterId %s", dataCenterId)); } Collection<Guid> requiredNetworks = getRequiredNetworks(addedLogicalNetworks); if (!requiredNetworks.isEmpty()) { return new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_ISCSI_BOND_NETWORK_CANNOT_BE_REQUIRED); } } return ValidationResult.VALID; } private List<Guid> getDataCenterLogicalNetworks(Guid dataCenterId) { List<Guid> res = new LinkedList<>(); List<Network> dcLogicalNetworks = getDBFacade().getNetworkDao().getAllForDataCenter(dataCenterId); for (Network network : dcLogicalNetworks) { res.add(network.getId()); } return res; } private List<Guid> getRequiredNetworks(Collection<Guid> addedLogicalNetworks) { List<Guid> res = new ArrayList<>(); for (Guid networkId : addedLogicalNetworks) { if (isRequiredNetwork(networkId)) { res.add(networkId); } } return res; } private boolean isRequiredNetwork(Guid networkId) { List<NetworkCluster> clusters = getDBFacade().getNetworkClusterDao().getAllForNetwork(networkId); for (NetworkCluster cluster : clusters) { if (cluster.isRequired()) { return true; } } return false; } private List<Guid> getNetworksMissingInDataCenter(Collection<Guid> networks, Guid dataCenterId) { Set<Guid> existingNetworkIds = new HashSet<>(); List<Guid> res = new LinkedList<>(); List<Network> dcLogicalNetworks = getDBFacade().getNetworkDao().getAllForDataCenter(dataCenterId); for (Network network : dcLogicalNetworks) { existingNetworkIds.add(network.getId()); } for (Guid id : networks) { if (!existingNetworkIds.contains(id)) { res.add(id); } } return res; } private ValidationResult validateAddedStorageConnections(Collection<String> addedStorageConnections, Guid dataCenterId) { if (!addedStorageConnections.isEmpty()) { List<String> connectionsNotInDataCenter = getStorageConnectionsMissingInDataCenter(addedStorageConnections, dataCenterId); if (!connectionsNotInDataCenter.isEmpty()) { return new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_STORAGE_CONNECTIONS_CANNOT_BE_ADDED_TO_ISCSI_BOND, String.format("$connectionIds %s", StringUtils.join(connectionsNotInDataCenter, ","))); } } return ValidationResult.VALID; } private List<String> getStorageConnectionsMissingInDataCenter(Collection<String> storageConnections, Guid dataCenterId) { Set<String> existingConnIds = new HashSet<>(); List<String> res = new LinkedList<>(); List<StorageServerConnections> dcStorageConnections = getDBFacade().getStorageServerConnectionDao().getConnectableStorageConnectionsByStorageType(dataCenterId, StorageType.ISCSI); for (StorageServerConnections conn : dcStorageConnections) { existingConnIds.add(conn.getId()); } for (String id : storageConnections) { if (!existingConnIds.contains(id)) { res.add(id); } } return res; } protected DbFacade getDBFacade() { return DbFacade.getInstance(); } }