package org.ovirt.engine.core.bll.network.cluster;
import java.util.List;
import java.util.function.Predicate;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import org.apache.commons.lang.Validate;
import org.ovirt.engine.core.common.businessentities.network.Network;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.network.NetworkDao;
@Singleton
final class DefaultManagementNetworkFinderImpl implements DefaultManagementNetworkFinder {
private final NetworkDao networkDao;
private final ManagementNetworkUtil managementNetworkUtil;
private final Predicate<Network> managementNetworkCandidatePredicate;
@Inject
DefaultManagementNetworkFinderImpl(NetworkDao networkDao,
ManagementNetworkUtil managementNetworkUtil,
@Named("managementNetworkCandidatePredicate") Predicate<Network> managementNetworkCandidatePredicate) {
Validate.notNull(networkDao, "networkDao cannot be null");
Validate.notNull(managementNetworkUtil, "managementNetworkUtil cannot be null");
Validate.notNull(managementNetworkCandidatePredicate, "managementNetworkCandidatePredicate cannot be null");
this.networkDao = networkDao;
this.managementNetworkUtil = managementNetworkUtil;
this.managementNetworkCandidatePredicate = managementNetworkCandidatePredicate;
}
/**
* The algorithm for finding the default management network is:
* <ol>
* <li>Use the default management network defined by the default name (according to
* <code>ConfigValues.DefaultManagementNetwork</code>), if exists in the given data center (for backward
* compatibility).</li>
* <li>If the data center has a single network and that suitable to serve as themangement one use that.</li>
* <li>If the data center has a single management network use that.</li>
* <li>Otherwise return <code>null</code></li>
* </ol>
*
* @see DefaultManagementNetworkFinder#findDefaultManagementNetwork(Guid)
*/
@Override
public Network findDefaultManagementNetwork(Guid dataCenterId) {
final Network defaultEngineManagementNetwork = findConfigDefaultEngineManagementNetwork(dataCenterId);
if (defaultEngineManagementNetwork != null) {
return defaultEngineManagementNetwork;
}
final List<Network> dcNetworks = networkDao.getAllForDataCenter(dataCenterId);
if (dcNetworks.size() == 1) {
final Network singleDcNetwork = dcNetworks.get(0);
if (managementNetworkCandidatePredicate.test(singleDcNetwork)) {
return singleDcNetwork;
}
} else {
final List<Network> managementNetworks = networkDao.getManagementNetworks(dataCenterId);
if (managementNetworks.size() == 1) {
return managementNetworks.get(0);
}
}
return null;
}
private Network findConfigDefaultEngineManagementNetwork(Guid dataCenterId) {
return networkDao.getByNameAndDataCenter(
managementNetworkUtil.getDefaultManagementNetworkName(),
dataCenterId);
}
}