X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Ftopologymanager%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Ftopologymanager%2Finternal%2FTopologyManagerImpl.java;h=ce39fed5fcc4960efff1d8959335ced6be066893;hp=0eb7bdbc5c3ac57bc44f8168189456614e8eff98;hb=934490635d3a1c4ebd27703d33f382ae7d676a4f;hpb=ab59b3b28b16f1a87d07b37cdc6dbe882d255bb5 diff --git a/opendaylight/topologymanager/src/main/java/org/opendaylight/controller/topologymanager/internal/TopologyManagerImpl.java b/opendaylight/topologymanager/src/main/java/org/opendaylight/controller/topologymanager/internal/TopologyManagerImpl.java index 0eb7bdbc5c..ce39fed5fc 100644 --- a/opendaylight/topologymanager/src/main/java/org/opendaylight/controller/topologymanager/internal/TopologyManagerImpl.java +++ b/opendaylight/topologymanager/src/main/java/org/opendaylight/controller/topologymanager/internal/TopologyManagerImpl.java @@ -1,4 +1,3 @@ - /* * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * @@ -12,12 +11,14 @@ package org.opendaylight.controller.topologymanager.internal; import java.io.FileNotFoundException; import java.io.IOException; import java.io.ObjectInputStream; +import java.util.ArrayList; import java.util.Collections; import java.util.Dictionary; import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -32,24 +33,22 @@ import org.opendaylight.controller.clustering.services.CacheExistException; import org.opendaylight.controller.clustering.services.IClusterContainerServices; import org.opendaylight.controller.clustering.services.IClusterServices; import org.opendaylight.controller.configuration.IConfigurationContainerAware; -import org.opendaylight.controller.sal.core.ConstructionException; import org.opendaylight.controller.sal.core.Edge; import org.opendaylight.controller.sal.core.Host; import org.opendaylight.controller.sal.core.Node; import org.opendaylight.controller.sal.core.NodeConnector; -import org.opendaylight.controller.sal.core.NodeConnector.NodeConnectorIDType; import org.opendaylight.controller.sal.core.Property; import org.opendaylight.controller.sal.core.TimeStamp; import org.opendaylight.controller.sal.core.UpdateType; -import org.opendaylight.controller.sal.core.Node.NodeIDType; import org.opendaylight.controller.sal.topology.IListenTopoUpdates; import org.opendaylight.controller.sal.topology.ITopologyService; -import org.opendaylight.controller.sal.utils.StatusCode; +import org.opendaylight.controller.sal.topology.TopoEdgeUpdate; import org.opendaylight.controller.sal.utils.GlobalConstants; import org.opendaylight.controller.sal.utils.IObjectReader; import org.opendaylight.controller.sal.utils.ObjectReader; import org.opendaylight.controller.sal.utils.ObjectWriter; import org.opendaylight.controller.sal.utils.Status; +import org.opendaylight.controller.sal.utils.StatusCode; import org.opendaylight.controller.topologymanager.ITopologyManager; import org.opendaylight.controller.topologymanager.ITopologyManagerAware; import org.opendaylight.controller.topologymanager.TopologyUserLinkConfig; @@ -64,16 +63,17 @@ import org.slf4j.LoggerFactory; * topology database and notifies all the listeners of topology changes. */ public class TopologyManagerImpl implements ITopologyManager, - IConfigurationContainerAware, IListenTopoUpdates, IObjectReader, - CommandProvider { +IConfigurationContainerAware, IListenTopoUpdates, IObjectReader, +CommandProvider { private static final Logger log = LoggerFactory .getLogger(TopologyManagerImpl.class); private ITopologyService topoService = null; private IClusterContainerServices clusterContainerService = null; // DB of all the Edges with properties which constitute our topology private ConcurrentMap> edgesDB = null; - // DB of all NodeConnector which are part of Edges, meaning they - // are connected to another NodeConnector on the other side + // DB of all NodeConnector which are part of ISL Edges, meaning they + // are connected to another NodeConnector on the other side of an ISL link. + // NodeConnector of a Production Edge is not part of this DB. private ConcurrentMap> nodeConnectorsDB = null; // DB of all the NodeConnectors with an Host attached to it private ConcurrentMap>> hostsDB = null; @@ -84,37 +84,36 @@ public class TopologyManagerImpl implements ITopologyManager, private static String ROOT = GlobalConstants.STARTUPHOME.toString(); private String userLinksFileName = null; private ConcurrentMap userLinks; - + void nonClusterObjectCreate() { - edgesDB = new ConcurrentHashMap>(); - hostsDB = new ConcurrentHashMap>>(); - userLinks = new ConcurrentHashMap(); - nodeConnectorsDB = new ConcurrentHashMap>(); + edgesDB = new ConcurrentHashMap>(); + hostsDB = new ConcurrentHashMap>>(); + userLinks = new ConcurrentHashMap(); + nodeConnectorsDB = new ConcurrentHashMap>(); } - void setTopologyManagerAware(ITopologyManagerAware s) { if (this.topologyManagerAware != null) { - log.debug("Adding ITopologyManagerAware: {}", s); + log.debug("Adding ITopologyManagerAware: {}", s); this.topologyManagerAware.add(s); } } void unsetTopologyManagerAware(ITopologyManagerAware s) { if (this.topologyManagerAware != null) { - log.debug("Removing ITopologyManagerAware: {}", s); + log.debug("Removing ITopologyManagerAware: {}", s); this.topologyManagerAware.remove(s); } } void setTopoService(ITopologyService s) { - log.debug("Adding ITopologyService: {}", s); + log.debug("Adding ITopologyService: {}", s); this.topoService = s; } void unsetTopoService(ITopologyService s) { if (this.topoService == s) { - log.debug("Removing ITopologyService: {}", s); + log.debug("Removing ITopologyService: {}", s); this.topoService = null; } } @@ -200,8 +199,8 @@ public class TopologyManagerImpl implements ITopologyManager, } /** - * Function called after the topology manager has registered the - * service in OSGi service registry. + * Function called after the topology manager has registered the service in + * OSGi service registry. * */ void started() { @@ -212,9 +211,9 @@ public class TopologyManagerImpl implements ITopologyManager, } /** - * Function called by the dependency manager when at least one - * dependency become unsatisfied or when the component is shutting - * down because for example bundle is being stopped. + * Function called by the dependency manager when at least one dependency + * become unsatisfied or when the component is shutting down because for + * example bundle is being stopped. * */ void destroy() { @@ -230,7 +229,7 @@ public class TopologyManagerImpl implements ITopologyManager, this.clusterContainerService.destroyCache("topologymanager.hostsDB"); this.hostsDB = null; this.clusterContainerService - .destroyCache("topologymanager.nodeConnectorDB"); + .destroyCache("topologymanager.nodeConnectorDB"); this.nodeConnectorsDB = null; log.debug("Topology Manager DB Deallocated"); } @@ -255,18 +254,18 @@ public class TopologyManagerImpl implements ITopologyManager, // Publish the save config event to the cluster nodes /** * Get the CLUSTERING SERVICES WORKING BEFORE TRYING THIS - - configSaveEvent.put(new Date().getTime(), SAVE); + * + * configSaveEvent.put(new Date().getTime(), SAVE); */ return saveConfigInternal(); } public Status saveConfigInternal() { - Status retS; + Status retS; ObjectWriter objWriter = new ObjectWriter(); - retS = objWriter.write( - new ConcurrentHashMap( + retS = objWriter + .write(new ConcurrentHashMap( userLinks), userLinksFileName); if (retS.isSuccess()) { @@ -324,11 +323,36 @@ public class TopologyManagerImpl implements ITopologyManager, } /** - * The Map returned is a copy of the current topology hence if the - * topology changes the copy doesn't + * This method returns true if the edge is an ISL link. + * + * @param e + * The edge + * @return true if it is an ISL link + */ + public boolean isISLink(Edge e) { + return (!isProductionLink(e)); + } + + /** + * This method returns true if the edge is a production link. + * + * @param e + * The edge + * @return true if it is a production link + */ + public boolean isProductionLink(Edge e) { + return (e.getHeadNodeConnector().getType() + .equals(NodeConnector.NodeConnectorIDType.PRODUCTION) || e + .getTailNodeConnector().getType() + .equals(NodeConnector.NodeConnectorIDType.PRODUCTION)); + } + + /** + * The Map returned is a copy of the current topology hence if the topology + * changes the copy doesn't * - * @return A Map representing the current topology expressed as - * edges of the network + * @return A Map representing the current topology expressed as edges of the + * network */ @Override public Map> getEdges() { @@ -340,8 +364,8 @@ public class TopologyManagerImpl implements ITopologyManager, for (Edge key : this.edgesDB.keySet()) { // Sets of props are copied because the composition of // those properties could change with time - HashSet prop = new HashSet(this.edgesDB - .get(key)); + HashSet prop = new HashSet( + this.edgesDB.get(key)); // We can simply reuse the key because the object is // immutable so doesn't really matter that we are // referencing the only owned by a different table, the @@ -354,7 +378,8 @@ public class TopologyManagerImpl implements ITopologyManager, // TODO remove with spring-dm removal /** - * @param set the topologyAware to set + * @param set + * the topologyAware to set */ public void setTopologyAware(Set set) { for (Object s : set) { @@ -401,6 +426,8 @@ public class TopologyManagerImpl implements ITopologyManager, if (this.hostsDB == null) { return null; } + if (this.hostsDB.get(p) == null) + return null; return (this.hostsDB.get(p).getLeft()); } @@ -411,7 +438,7 @@ public class TopologyManagerImpl implements ITopologyManager, if (this.hostsDB == null) { return; } - + switch (t) { case ADDED: case CHANGED: @@ -432,8 +459,8 @@ public class TopologyManagerImpl implements ITopologyManager, } } - @Override - public void edgeUpdate(Edge e, UpdateType type, Set props) { + private TopoEdgeUpdate edgeUpdate(Edge e, UpdateType type, + Set props) { switch (type) { case ADDED: // Make sure the props are non-null @@ -444,7 +471,7 @@ public class TopologyManagerImpl implements ITopologyManager, props = (Set) new HashSet(props); } - // Now make sure thre is the creation timestamp for the + // Now make sure there is the creation timestamp for the // edge, if not there timestamp with the first update boolean found_create = false; for (Property prop : props) { @@ -467,12 +494,15 @@ public class TopologyManagerImpl implements ITopologyManager, this.edgesDB.put(e, props); // Now populate the DB of NodeConnectors - // NOTE WELL: properties are empy sets, not really needed + // NOTE WELL: properties are empty sets, not really needed // for now. - this.nodeConnectorsDB.put(e.getHeadNodeConnector(), - new HashSet()); - this.nodeConnectorsDB.put(e.getTailNodeConnector(), - new HashSet()); + // The DB only contains ISL ports + if (isISLink(e)) { + this.nodeConnectorsDB.put(e.getHeadNodeConnector(), + new HashSet()); + this.nodeConnectorsDB.put(e.getTailNodeConnector(), + new HashSet()); + } log.trace("Edge {} {}", e.toString(), type.name()); break; case REMOVED: @@ -507,7 +537,7 @@ public class TopologyManagerImpl implements ITopologyManager, } } - // Now lest make sure new properties are non-null + // Now lets make sure new properties are non-null // Make sure the props are non-null if (props == null) { props = (Set) new HashSet(); @@ -538,94 +568,48 @@ public class TopologyManagerImpl implements ITopologyManager, log.trace("Edge {} {}", e.toString(), type.name()); break; } + return new TopoEdgeUpdate(e, props, type); + } + + @Override + public void edgeUpdate(List topoedgeupdateList) { + List teuList = new ArrayList(); + for (int i = 0; i < topoedgeupdateList.size(); i++) { + Edge e = topoedgeupdateList.get(i).getEdge(); + Set p = topoedgeupdateList.get(i).getProperty(); + UpdateType type = topoedgeupdateList.get(i).getUpdateType(); + TopoEdgeUpdate teu = edgeUpdate(e, type, p); + teuList.add(teu); + } // Now update the listeners for (ITopologyManagerAware s : this.topologyManagerAware) { try { - s.edgeUpdate(e, type, props); + s.edgeUpdate(teuList); } catch (Exception exc) { log.error("Exception on callback", exc); } } + } private Edge getReverseLinkTuple(TopologyUserLinkConfig link) { - TopologyUserLinkConfig rLink = new TopologyUserLinkConfig( - link.getName(), link.getDstNodeIDType(), link.getDstSwitchId(), - link.getDstNodeConnectorIDType(), link.getDstPort(), - link.getSrcNodeIDType(), link.getSrcSwitchId(), - link.getSrcNodeConnectorIDType(), link.getSrcPort()); + TopologyUserLinkConfig rLink = new TopologyUserLinkConfig( + link.getName(), link.getDstNodeConnector(), link.getSrcNodeConnector()); return getLinkTuple(rLink); } + private Edge getLinkTuple(TopologyUserLinkConfig link) { Edge linkTuple = null; - - // if atleast 1 link exists for the srcPort and atleast 1 link exists for the dstPort - // that makes it ineligible for the Manual link addition - // This is just an extra protection to avoid mis-programming. - boolean srcLinkExists = false; - boolean dstLinkExists = false; - //TODO check a way to validate the port with inventory services - //if (srcSw.getPorts().contains(srcPort) && - //dstSw.getPorts().contains(srcPort) && - if (!srcLinkExists && !dstLinkExists) { - Node sNode = null; - Node dNode = null; - NodeConnector sPort = null; - NodeConnector dPort = null; - linkTuple = null; - String srcNodeIDType = link.getSrcNodeIDType(); - String srcNodeConnectorIDType = link.getSrcNodeConnectorIDType(); - String dstNodeIDType = link.getDstNodeIDType(); - String dstNodeConnectorIDType = link.getDstNodeConnectorIDType(); - try { - if (srcNodeIDType.equals(NodeIDType.OPENFLOW)) { - sNode = new Node(srcNodeIDType, link.getSrcSwitchIDLong()); - } else { - sNode = new Node(srcNodeIDType, link.getSrcSwitchId()); - } - - if (dstNodeIDType.equals(NodeIDType.OPENFLOW)) { - dNode = new Node(dstNodeIDType, link.getDstSwitchIDLong()); - } else { - dNode = new Node(dstNodeIDType, link.getDstSwitchId()); - } - - if (srcNodeConnectorIDType.equals(NodeConnectorIDType.OPENFLOW)) { - Short srcPort = Short.valueOf((short) 0); - if (!link.isSrcPortByName()) { - srcPort = Short.parseShort(link.getSrcPort()); - } - sPort = new NodeConnector(srcNodeConnectorIDType, - srcPort, sNode); - } else { - sPort = new NodeConnector(srcNodeConnectorIDType, - link.getSrcPort(), sNode); - } - - if (dstNodeConnectorIDType.equals(NodeConnectorIDType.OPENFLOW)) { - Short dstPort = Short.valueOf((short) 0); - if (!link.isDstPortByName()) { - dstPort = Short.parseShort(link.getDstPort()); - } - dPort = new NodeConnector(dstNodeConnectorIDType, - dstPort, dNode); - } else { - dPort = new NodeConnector(dstNodeConnectorIDType, - link.getDstPort(), dNode); - } - linkTuple = new Edge(sPort, dPort); - } catch (ConstructionException cex) { - log.warn("Caught exception ", cex); - } - return linkTuple; - } - - if (srcLinkExists && dstLinkExists) { - link.setStatus(TopologyUserLinkConfig.STATUS.INCORRECT); + NodeConnector srcNodeConnector = NodeConnector.fromString(link.getSrcNodeConnector()); + NodeConnector dstNodeConnector = NodeConnector.fromString(link.getDstNodeConnector()); + if (srcNodeConnector == null || dstNodeConnector == null) return null; + try { + linkTuple = new Edge(srcNodeConnector, dstNodeConnector); + } catch (Exception e) { } - return null; + return linkTuple; } @Override @@ -636,12 +620,12 @@ public class TopologyManagerImpl implements ITopologyManager, @Override public Status addUserLink(TopologyUserLinkConfig link) { if (!link.isValid()) { - return new Status(StatusCode.BADREQUEST, - "Configuration Invalid. Please check the parameters"); + return new Status(StatusCode.BADREQUEST, + "Configuration Invalid. Please check the parameters"); } if (userLinks.get(link.getName()) != null) { - return new Status(StatusCode.CONFLICT, - "Link with name : " + link.getName() + return new Status(StatusCode.CONFLICT, "Link with name : " + + link.getName() + " already exists. Please use another name"); } if (userLinks.containsValue(link)) { @@ -653,13 +637,16 @@ public class TopologyManagerImpl implements ITopologyManager, Edge linkTuple = getLinkTuple(link); if (linkTuple != null) { - try { - linkTuple = getReverseLinkTuple(link); + if (!isProductionLink(linkTuple)) { + edgeUpdate(linkTuple, UpdateType.ADDED, new HashSet()); + } + + linkTuple = getReverseLinkTuple(link); + if (linkTuple != null) { link.setStatus(TopologyUserLinkConfig.STATUS.SUCCESS); - } catch (Exception e) { - return new Status(StatusCode.INTERNALERROR, - "Exception while adding custom link : " + - e.getMessage()); + if (!isProductionLink(linkTuple)) { + edgeUpdate(linkTuple, UpdateType.ADDED, new HashSet()); + } } } return new Status(StatusCode.SUCCESS, null); @@ -668,8 +655,8 @@ public class TopologyManagerImpl implements ITopologyManager, @Override public Status deleteUserLink(String linkName) { if (linkName == null) { - return new Status(StatusCode.BADREQUEST, - "A valid linkName is required to Delete a link"); + return new Status(StatusCode.BADREQUEST, + "A valid linkName is required to Delete a link"); } TopologyUserLinkConfig link = userLinks.get(linkName); @@ -677,20 +664,13 @@ public class TopologyManagerImpl implements ITopologyManager, Edge linkTuple = getLinkTuple(link); userLinks.remove(linkName); if (linkTuple != null) { - try { - //oneTopology.deleteUserConfiguredLink(linkTuple); - } catch (Exception e) { - log - .warn("Harmless : Exception while Deleting User Configured link {} {}", - link, e.toString()); + if (!isProductionLink(linkTuple)) { + edgeUpdate(linkTuple, UpdateType.REMOVED, null); } + linkTuple = getReverseLinkTuple(link); - try { - //oneTopology.deleteUserConfiguredLink(linkTuple); - } catch (Exception e) { - log - .warn("Harmless : Exception while Deleting User Configured Reverse link {} {}", - link, e.toString()); + if ((linkTuple != null) && !isProductionLink(linkTuple)) { + edgeUpdate(linkTuple, UpdateType.REMOVED, null); } } return new Status(StatusCode.SUCCESS, null); @@ -707,84 +687,57 @@ public class TopologyManagerImpl implements ITopologyManager, public String getHelp() { StringBuffer help = new StringBuffer(); help.append("---Topology Manager---\n"); - help.append("\t addTopo name \n"); - help.append("\t delTopo name\n"); - help.append("\t printTopo\n"); + help.append("\t addUserLink \n"); + help.append("\t deleteUserLink \n"); + help.append("\t printUserLink\n"); help.append("\t printNodeEdges\n"); return help.toString(); } - public void _printTopo(CommandInterpreter ci) { + public void _printUserLink(CommandInterpreter ci) { for (String name : this.userLinks.keySet()) { - TopologyUserLinkConfig linkConfig = userLinks.get(name); + TopologyUserLinkConfig linkConfig = userLinks.get(name); ci.println("Name : " + name); ci.println(linkConfig); - ci.println("Edge " + getLinkTuple(linkConfig)); - ci.println("Reverse Edge " + getReverseLinkTuple(linkConfig)); + ci.println("Edge " + getLinkTuple(linkConfig)); + ci.println("Reverse Edge " + getReverseLinkTuple(linkConfig)); } } - public void _addTopo(CommandInterpreter ci) { + public void _addUserLink(CommandInterpreter ci) { String name = ci.nextArgument(); if ((name == null)) { ci.println("Please enter a valid Name"); return; } - String srcNodeIDType = ci.nextArgument(); - if (srcNodeIDType == null) { - ci.println("Null source node ID Type. Example: OF or PR"); - return; - } - - String dpid = ci.nextArgument(); - if (dpid == null) { - ci.println("Null source node id"); - return; - } - - String srcNodeConnectorIDType = ci.nextArgument(); - if (srcNodeConnectorIDType == null) { - ci.println("Null source node connector ID Type. Example: OF or PR"); - return; - } - - String port = ci.nextArgument(); - if (port == null) { - ci.println("Null source port number"); + String ncStr1 = ci.nextArgument(); + if (ncStr1 == null) { + ci.println("Please enter two node connector strings"); return; } - - String dstNodeIDType = ci.nextArgument(); - if (dstNodeIDType == null) { - ci.println("Null destination node ID Type. Example: OF or PR"); + String ncStr2 = ci.nextArgument(); + if (ncStr2 == null) { + ci.println("Please enter second node connector string"); return; } - String ddpid = ci.nextArgument(); - if (ddpid == null) { - ci.println("Null destination node ID"); + NodeConnector nc1 = NodeConnector.fromString(ncStr1); + if (nc1 == null) { + ci.println("Invalid input node connector 1 string: " + ncStr1); return; } - - String dstNodeConnectorIDType = ci.nextArgument(); - if (dstNodeConnectorIDType == null) { - ci.println("Null destination node connector ID Type. Example: OF or PR"); + NodeConnector nc2 = NodeConnector.fromString(ncStr2); + if (nc2 == null) { + ci.println("Invalid input node connector 2 string: " + ncStr2); return; } - String dport = ci.nextArgument(); - if (dport == null) { - ci.println("Null destination port number"); - return; - } - TopologyUserLinkConfig config = new TopologyUserLinkConfig(name, - srcNodeIDType, dpid, srcNodeConnectorIDType, port, - dstNodeIDType, ddpid, dstNodeConnectorIDType, dport); + TopologyUserLinkConfig config = new TopologyUserLinkConfig(name, ncStr1, ncStr2); ci.println(this.addUserLink(config)); } - public void _delTopo(CommandInterpreter ci) { + public void _deleteUserLink(CommandInterpreter ci) { String name = ci.nextArgument(); if ((name == null)) { ci.println("Please enter a valid Name"); @@ -794,23 +747,23 @@ public class TopologyManagerImpl implements ITopologyManager, } public void _printNodeEdges(CommandInterpreter ci) { - Map> nodeEdges = getNodeEdges(); - if (nodeEdges == null) { - return; - } - Set nodeSet = nodeEdges.keySet(); - if (nodeSet == null) { - return; - } + Map> nodeEdges = getNodeEdges(); + if (nodeEdges == null) { + return; + } + Set nodeSet = nodeEdges.keySet(); + if (nodeSet == null) { + return; + } ci.println(" Node Edge"); - for (Node node : nodeSet) { - Set edgeSet = nodeEdges.get(node); - if (edgeSet == null) { - continue; - } - for (Edge edge : edgeSet) { - ci.println(node + " " + edge); - } + for (Node node : nodeSet) { + Set edgeSet = nodeEdges.get(node); + if (edgeSet == null) { + continue; + } + for (Edge edge : edgeSet) { + ci.println(node + " " + edge); + } } }