package org.ovirt.engine.core.bll.network.cluster; import java.util.List; import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; import org.apache.commons.lang.Validate; 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.network.NetworkClusterId; import org.ovirt.engine.core.common.config.Config; import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.network.NetworkClusterDao; import org.ovirt.engine.core.dao.network.NetworkDao; @Singleton final class ManagementNetworkUtilImpl implements ManagementNetworkUtil { private final NetworkDao networkDao; private final NetworkClusterDao networkClusterDao; @Inject ManagementNetworkUtilImpl(NetworkDao networkDao, NetworkClusterDao networkClustrerDao) { Validate.notNull(networkDao, "networkDao cannot be null"); Validate.notNull(networkClustrerDao, "networkClustrerDao cannot be null"); this.networkDao = networkDao; this.networkClusterDao = networkClustrerDao; } @Override public Network getManagementNetwork(Guid clusterId) { return networkDao.getManagementNetwork(clusterId); } @Override public boolean isManagementNetwork(Guid networkId) { final List<NetworkCluster> networkClusters = networkClusterDao.getAllForNetwork(networkId); return networkClusters.stream().anyMatch(NetworkCluster::isManagement); } @Override public boolean isManagementNetwork(Guid networkId, Guid clusterId) { final NetworkCluster networkCluster = networkClusterDao.get(new NetworkClusterId(clusterId, networkId)); return networkCluster != null && networkCluster.isManagement(); } @Override public boolean isManagementNetwork(String networkName, Guid clusterId) { final Network managementNetwork = getManagementNetwork(clusterId); return managementNetwork != null && managementNetwork.getName().equals(networkName); } /** * Retrieves the default management network name from the {@link Config}. * <p/>Should be used in very rare cases. {@link #getManagementNetwork(Guid)} provides more appropriate solution * for vast majority of the cases. * * @return the default management network name. */ @Override public String getDefaultManagementNetworkName() { return Config.getValue(ConfigValues.DefaultManagementNetwork); } @Override public Network getManagementNetwork(List<Network> networks, Guid clusterId) { return networks .stream() .filter(e -> e.getCluster().isManagement()) .collect(Collectors.collectingAndThen(Collectors.toList(), list -> { if (list.size() != 1) { throw new IllegalStateException(createFailureMessage(clusterId, networks)); } return list.get(0); })); } String createFailureMessage(Guid clusterId, List<Network> networks) { return String.format("There isn't unique management network for cluster %s among networks (%s).", clusterId, networks.stream().map(Network::getName).collect(Collectors.joining(","))); } }