package org.ovirt.engine.core.bll.network;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import javax.inject.Inject;
import org.ovirt.engine.core.common.action.PersistentHostSetupNetworksParameters;
import org.ovirt.engine.core.common.businessentities.network.Network;
import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface;
import org.ovirt.engine.core.common.errors.EngineError;
import org.ovirt.engine.core.common.errors.EngineException;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.VdsStaticDao;
import org.ovirt.engine.core.dao.network.InterfaceDao;
import org.ovirt.engine.core.dao.network.NetworkAttachmentDao;
import org.ovirt.engine.core.dao.network.NetworkClusterDao;
import org.ovirt.engine.core.utils.NetworkUtils;
public class AddNetworksByLabelParametersBuilder extends HostSetupNetworksParametersBuilder {
@Inject
public AddNetworksByLabelParametersBuilder(InterfaceDao interfaceDao,
VdsStaticDao vdsStaticDao,
NetworkClusterDao networkClusterDao,
NetworkAttachmentDao networkAttachmentDao) {
super(interfaceDao, vdsStaticDao, networkClusterDao, networkAttachmentDao);
}
/**
* Adds a list of labeled networks to a host
*/
public PersistentHostSetupNetworksParameters buildParameters(Guid hostId,
List<Network> labeledNetworks,
Map<String, VdsNetworkInterface> nicsByLabel) {
PersistentHostSetupNetworksParameters parameters = createHostSetupNetworksParameters(hostId);
Set<Network> networksToAdd = getNetworksToConfigure(getNics(hostId), labeledNetworks);
for (Network network : networksToAdd) {
VdsNetworkInterface labeledNic = nicsByLabel.get(network.getLabel());
VdsNetworkInterface nicToConfigure = getNicToConfigure(getNics(hostId), labeledNic.getId());
if (nicToConfigure == null) {
throw new EngineException(EngineError.LABELED_NETWORK_INTERFACE_NOT_FOUND);
}
// configure the network on the nic
addAttachmentToParameters(nicToConfigure, network, parameters);
}
parameters.setNetworkNames(networksToAdd.stream().map(Network::getName).collect(Collectors.joining(", ")));
return parameters;
}
private Set<Network> getNetworksToConfigure(List<VdsNetworkInterface> nics, List<Network> labeledNetworks) {
Map<String, VdsNetworkInterface> nicsByNetworkName = NetworkUtils.hostInterfacesByNetworkName(nics);
Set<Network> networkToAdd = new HashSet<>();
for (Network network : labeledNetworks) {
if (!nicsByNetworkName.containsKey(network.getName())) {
networkToAdd.add(network);
}
}
return networkToAdd;
}
}