package org.ovirt.engine.core.bll.qos;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.ovirt.engine.core.common.action.PersistentHostSetupNetworksParameters;
import org.ovirt.engine.core.common.action.VdcActionParametersBase;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.network.Network;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.VdsDao;
import org.ovirt.engine.core.dao.network.NetworkDao;
import org.ovirt.engine.core.utils.collections.MultiValueMapUtils;
/**
* Factory creates parameters to be used to refresh out of sync networks using
* {@link org.ovirt.engine.core.common.action.VdcActionType#PersistentHostSetupNetworks}.
*
* In contrast of {@link PersistentHostSetupNetworksParametersFactory}, which is called by this factory, this factory
* does not work with given host ID. Parameters are created for all identified networks on all found hosts.
*/
public class RefreshNetworksParametersFactory {
private final PersistentHostSetupNetworksParametersFactory persistentHostSetupNetworksParametersFactory;
private final NetworkDao networkDao;
private final VdsDao vdsDao;
@Inject
private RefreshNetworksParametersFactory(NetworkDao networkDao,
VdsDao vdsDao,
PersistentHostSetupNetworksParametersFactory persistentHostSetupNetworksParametersFactory) {
this.persistentHostSetupNetworksParametersFactory = persistentHostSetupNetworksParametersFactory;
this.networkDao = networkDao;
this.vdsDao = vdsDao;
}
/**
* @param qosId id of qos.
* @return list of PersistentHostSetupNetworksParameters instances, to update all networks having given qosId,
* on every host where they are used.
*/
public ArrayList<VdcActionParametersBase> create(Guid qosId) {
List<Network> networksHavingAlteredQos = networkDao.getAllForQos(qosId);
return create(networksHavingAlteredQos);
}
/**
* @param networks networks to be refreshed.
* @return list of PersistentHostSetupNetworksParameters instances to update all given networks on all hosts where
* they are used.
*/
public ArrayList<VdcActionParametersBase> create(List<Network> networks) {
Map<Guid, List<Network>> vdsIdToNetworksOfAlteredQos = mapNetworksByAttachedHosts(networks);
ArrayList<VdcActionParametersBase> parameters = new ArrayList<>();
for (Map.Entry<Guid, List<Network>> entry : vdsIdToNetworksOfAlteredQos.entrySet()) {
Guid hostId = entry.getKey();
List<Network> networksOfAlteredQos = entry.getValue();
PersistentHostSetupNetworksParameters setupNetworkParams =
persistentHostSetupNetworksParametersFactory.create(hostId, networksOfAlteredQos);
parameters.add(setupNetworkParams);
}
return parameters;
}
/**
* method finds all VDS records having any of given networks and creates VdsID->NetworksIDs mapping for all such VDS
* and Network records.
* @param networks networks to search for
*
* @return mapping of VDS ID to list of network ids, where given network ids are only those of networks specified in
* parameters.
*/
private Map<Guid, List<Network>> mapNetworksByAttachedHosts(List<Network> networks) {
Map<Guid, List<Network>> networksPerHostId = new HashMap<>();
for (Network network : networks) {
List<VDS> hostRecordsForNetwork = vdsDao.getAllForNetwork(network.getId());
for (VDS host : hostRecordsForNetwork) {
MultiValueMapUtils.addToMap(host.getId(), network, networksPerHostId);
}
}
return networksPerHostId;
}
}