package org.opennaas.extensions.quantum.model; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.opennaas.extensions.quantum.QuantumException; /** * * @author Adrian Rosello (i2CAT) * */ public class QuantumModelController { private Log log = LogFactory.getLog(QuantumModelController.class); /** * Adds a network to the quantum resource model. * * @param quantumModel * @param network * @throws QuantumException */ public void addNetwork(QuantumModel quantumModel, Network network) throws QuantumException { log.debug("Adding network " + network.getName() + " to Quantum model."); List<Network> networks = quantumModel.getNetworks(); if (networks.contains(network)) throw new QuantumException("Network " + network.getName() + " already exists in Quantum Model."); quantumModel.getNetworks().add(network); log.debug("Network " + network.getName() + " added to Quantum model."); } /** * Removes a network from the quantum resource model, and also its ports and subnetworks. * * @param quantumModel * @param netModel * @throws QuantumException */ public void removeNetwork(QuantumModel quantumModel, NetworkModel netModel) throws QuantumException { log.debug("Trying to remove network " + netModel.getQuantumNetworkId() + " from Quantum model."); Network network = getNetwork(quantumModel, netModel.getQuantumNetworkId()); if (network == null) throw new QuantumException("Network " + netModel + " does not exist in Quantum model"); quantumModel.getNetworks().remove(network); log.debug("Network " + netModel + " successfully removed from Quantum model."); } public void updateNetwork(String networkId, QuantumModel quantumModel, Network updatedNetwork) throws QuantumException { log.debug("Trying to update network " + networkId + " from Quantum model."); Network originalNetwork = getNetwork(quantumModel, networkId); if (originalNetwork == null) throw new QuantumException("Network " + networkId + " does not exist in Quantum model"); quantumModel.getNetworks().remove(originalNetwork); quantumModel.getNetworks().add(updatedNetwork); log.debug("Network " + networkId + " successfully removed from Quantum model."); } public void createPort(QuantumModel quantumModel, String networkId, Port newPort) throws QuantumException { log.debug("Trying to create port " + newPort.getId() + " from network " + networkId); Network network = getNetwork(quantumModel, networkId); if (network == null) throw new QuantumException("Network " + networkId + " does not exist in Quantum model"); network.getPorts().add(newPort); log.debug("Port " + newPort.getId() + " from network " + networkId + " updated."); } /** * Update or create a new port instance in network's port list. * * @FIXME Even though this method is called by the client with a PUT method, we create a new port here because BigSwitch plugin tries to update a * new port without using the POST method. * * @param quantumModel * @param networkId * @param updatedPort * @throws QuantumException */ public void updatePort(QuantumModel quantumModel, String networkId, Port updatedPort) throws QuantumException { log.debug("Trying to update port " + updatedPort.getId() + " from network " + networkId); Network network = getNetwork(quantumModel, networkId); if (network == null) throw new QuantumException("Network " + networkId + " does not exist in Quantum model"); Port originalPort = getNetworkPortFromId(network, updatedPort.getId()); if (originalPort != null) network.getPorts().remove(originalPort); network.getPorts().add(updatedPort); log.debug("Port " + updatedPort.getId() + " from network " + networkId + " updated."); } public void removePort(QuantumModel quantumModel, String networkId, String portId) throws QuantumException { log.debug("Trying to remove port " + portId + " from network " + networkId); Network network = getNetwork(quantumModel, networkId); if (network == null) log.warn("Network " + networkId + " does not exist in Quantum model. Ignoring removePort request"); else { Port portToRemove = getNetworkPortFromId(network, portId); if (portToRemove == null) throw new QuantumException("Network " + networkId + " does not contain port " + portId); network.getPorts().remove(portToRemove); log.debug("Port " + portId + " from network " + networkId + " removed."); } } public void updateAttachment(QuantumModel quantumModel, String networkId, String portId, Attachment attachment) throws QuantumException { log.debug("Creating attachment for port " + portId + " in network " + networkId); Network network = getNetwork(quantumModel, networkId); if (network == null) throw new QuantumException("Network " + networkId + " does not exist in Quantum model"); Port port = getNetworkPortFromId(network, portId); if (port == null) throw new QuantumException("Port " + portId + " does not exist in Quantum model"); port.setAttachment(attachment); log.debug("Created attachment for port " + portId + " in network " + networkId); } public void addNetworkModelToQuantumModel(QuantumModel model, NetworkModel netModel) throws QuantumException { for (NetworkModel quantumNetworkModels : model.getNetworksModel()) if (quantumNetworkModels.getQuantumNetworkId().equals(netModel.getQuantumNetworkId())) throw new QuantumException("There's already a networkModel for Quantum network " + netModel.getQuantumNetworkId()); model.addNetworkModel(netModel); } public void removeNetworkModelFromQuantumModel(QuantumModel model, NetworkModel netModel) throws QuantumException { if (!model.getNetworksModel().contains(netModel)) throw new QuantumException("There's no networkModel for Quantum network " + netModel.getQuantumNetworkId()); model.removeNetworkModel(netModel); } private Port getNetworkPortFromId(Network network, String portId) { for (Port port : network.getPorts()) if (port.getId().equals(portId)) return port; return null; } private void removeNetworkSubnets(QuantumModel quantumModel, Network network) { log.debug("Removing network " + network.getId() + " subnets from Quantum Model."); for (Subnet net : network.getSubnets()) quantumModel.getSubnets().remove(net); log.debug("Network " + network.getId() + " subnets removed from Quantum Model."); } private void removeNetworkPorts(QuantumModel quantumModel, Network network) { log.debug("Removing network " + network.getId() + " ports from Quantum Model."); for (Port port : network.getPorts()) quantumModel.getPorts().remove(port); log.debug("Network " + network.getId() + " ports removed from Quantum Model."); } private Network getNetwork(QuantumModel quantumModel, String networkId) { for (Network network : quantumModel.getNetworks()) if (network.getId().equals(networkId)) return network; return null; } }