package org.ovirt.engine.core.bll.qos; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; 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.NetworkAttachment; import org.ovirt.engine.core.common.utils.MapNetworkAttachments; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.network.NetworkAttachmentDao; /** * Factory creates parameters to be used to refresh out of sync networks using * {@link org.ovirt.engine.core.common.action.VdcActionType#PersistentHostSetupNetworks} */ public class PersistentHostSetupNetworksParametersFactory { private final NetworkAttachmentDao networkAttachmentDao; @Inject private PersistentHostSetupNetworksParametersFactory(NetworkAttachmentDao networkAttachmentDao) { this.networkAttachmentDao = networkAttachmentDao; } /** * @param hostId host on which networks to be updated reside * @param networks networks to be updated; it is assumed, that all those networks belongs to given host. * * @return PersistentHostSetupNetworksParameters to refresh all given networks. */ public PersistentHostSetupNetworksParameters create(Guid hostId, List<Network> networks) { Map<Network, NetworkAttachment> networksToSync = getNetworksToSync(hostId, networks); PersistentHostSetupNetworksParameters parameters = new PersistentHostSetupNetworksParameters(hostId); parameters.setRollbackOnFailure(true); parameters.setShouldBeLogged(false); parameters.setNetworkNames(getNetworkNames(networksToSync.keySet())); parameters.setNetworkAttachments(new ArrayList<>(networksToSync.values())); return parameters; } /** * @param networks networks to be transformed to comma separated list of its names. * @return comma separated list of network names. */ private String getNetworkNames(Collection<Network> networks) { return networks.stream().map(Network::getName).collect(Collectors.joining(", ")); } /** * For given host and it's networks, return network attachments representing those networks on this host. * @param hostId host ID * @param networks networks to transform * @return network attachments representing given networks on this host. */ private Map<Network, NetworkAttachment> getNetworksToSync(Guid hostId, List<Network> networks) { List<NetworkAttachment> allAttachmentsOfHost = networkAttachmentDao.getAllForHost(hostId); Map<Guid, NetworkAttachment> attachmentsByNetworkId = new MapNetworkAttachments(allAttachmentsOfHost).byNetworkId(); Map<Network, NetworkAttachment> networksToSync = new HashMap<>(); for (Network network : networks) { Guid networkId = network.getId(); NetworkAttachment attachmentToSync = attachmentsByNetworkId.get(networkId); if (attachmentToSync != null && !attachmentToSync.isQosOverridden()) { attachmentToSync.setOverrideConfiguration(true); networksToSync.put(network, attachmentToSync); } } return networksToSync; } }