package org.ovirt.engine.core.bll.network.cluster.transformer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.bll.network.ManageLabeledNetworksParametersBuilder;
import org.ovirt.engine.core.bll.network.ManageLabeledNetworksParametersBuilderFactory;
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.NetworkCluster;
import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface;
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.dao.network.NetworkDao;
final class NetworkClustersToSetupNetworksParametersTransformerImpl
implements NetworkClustersToSetupNetworksParametersTransformer {
private final NetworkDao networkDao;
private final InterfaceDao interfaceDao;
private final VdsStaticDao vdsStaticDao;
private final NetworkClusterDao networkClusterDao;
private final NetworkAttachmentDao networkAttachmentDao;
private final ManageLabeledNetworksParametersBuilderFactory manageLabeledNetworksParametersBuilderFactory;
private final CommandContext commandContext;
NetworkClustersToSetupNetworksParametersTransformerImpl(
NetworkDao networkDao,
InterfaceDao interfaceDao,
VdsStaticDao vdsStaticDao,
NetworkClusterDao networkClusterDao,
NetworkAttachmentDao networkAttachmentDao,
ManageLabeledNetworksParametersBuilderFactory manageLabeledNetworksParametersBuilderFactory,
CommandContext commandContext) {
Objects.requireNonNull(networkDao, "networkDao cannot be null");
Objects.requireNonNull(interfaceDao, "interfaceDao cannot be null");
Objects.requireNonNull(vdsStaticDao, "vdsStaticDao cannot be null");
Objects.requireNonNull(networkClusterDao, "networkClusterDao cannot be null");
Objects.requireNonNull(networkAttachmentDao, "networkAttachmentDao cannot be null");
Objects.requireNonNull(manageLabeledNetworksParametersBuilderFactory,
"manageLabeledNetworksParametersBuilderFactory cannot be null");
this.networkDao = networkDao;
this.interfaceDao = interfaceDao;
this.vdsStaticDao = vdsStaticDao;
this.networkClusterDao = networkClusterDao;
this.networkAttachmentDao = networkAttachmentDao;
this.manageLabeledNetworksParametersBuilderFactory = manageLabeledNetworksParametersBuilderFactory;
this.commandContext = commandContext;
}
@Override
public List<PersistentHostSetupNetworksParameters> transform(
Collection<NetworkCluster> attachments,
Collection<NetworkCluster> detachments) {
final Map<Guid, List<Network>> attachNetworksByHost = new HashMap<>();
final Map<Guid, Map<String, VdsNetworkInterface>> labelsToNicsByHost = new HashMap<>();
for (NetworkCluster networkCluster : attachments) {
final Network network = networkDao.get(networkCluster.getNetworkId());
final List<VdsNetworkInterface> nics = interfaceDao.getAllInterfacesByLabelForCluster(
networkCluster.getClusterId(),
network.getLabel());
for (VdsNetworkInterface nic : nics) {
if (!attachNetworksByHost.containsKey(nic.getVdsId())) {
attachNetworksByHost.put(nic.getVdsId(), new ArrayList<>());
labelsToNicsByHost.put(nic.getVdsId(), new HashMap<>());
}
labelsToNicsByHost.get(nic.getVdsId()).put(network.getLabel(), nic);
attachNetworksByHost.get(nic.getVdsId()).add(network);
}
}
Map<Guid, List<Network>> detachNetworksByHost = new HashMap<>();
for (NetworkCluster networkCluster : detachments) {
final Network network = networkDao.get(networkCluster.getNetworkId());
final List<VdsNetworkInterface> nics = interfaceDao.getAllInterfacesByLabelForCluster(
networkCluster.getClusterId(),
network.getLabel());
for (VdsNetworkInterface nic : nics) {
if (!detachNetworksByHost.containsKey(nic.getVdsId())) {
detachNetworksByHost.put(nic.getVdsId(), new ArrayList<>());
}
detachNetworksByHost.get(nic.getVdsId()).add(network);
}
}
return createSetupNetworksParameters(attachNetworksByHost,
labelsToNicsByHost,
detachNetworksByHost);
}
private List<PersistentHostSetupNetworksParameters> createSetupNetworksParameters(
Map<Guid, List<Network>> attachNetworksByHost,
Map<Guid, Map<String, VdsNetworkInterface>> labelsToNicsByHost,
Map<Guid, List<Network>> detachNetworksByHost) {
final List<PersistentHostSetupNetworksParameters> parameters = new ArrayList<>(attachNetworksByHost.size());
final ManageLabeledNetworksParametersBuilder builder =
manageLabeledNetworksParametersBuilderFactory.create(commandContext,
interfaceDao,
vdsStaticDao,
networkClusterDao,
networkAttachmentDao);
for (Entry<Guid, List<Network>> entry : attachNetworksByHost.entrySet()) {
final Guid hostId = entry.getKey();
final List<Network> attachHostNetworks = entry.getValue();
final List<Network> detachHostNetworks;
if (detachNetworksByHost.containsKey(hostId)) {
detachHostNetworks = detachNetworksByHost.get(hostId);
} else {
detachHostNetworks = Collections.emptyList();
}
final Map<String, VdsNetworkInterface> nicsByLabel = labelsToNicsByHost.get(hostId);
parameters.add(builder.buildParameters(
hostId,
attachHostNetworks,
detachHostNetworks,
nicsByLabel));
}
for (Entry<Guid, List<Network>> entry : detachNetworksByHost.entrySet()) {
final Guid hostId = entry.getKey();
if (!attachNetworksByHost.containsKey(hostId)) {
final List<Network> detachHostNetworks = entry.getValue();
parameters.add(builder.buildParameters(
hostId,
Collections.emptyList(),
detachHostNetworks,
Collections.emptyMap()));
}
}
return parameters;
}
}