X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fswitchmanager%2Fimplementation%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fswitchmanager%2Finternal%2FSwitchManager.java;h=d82c9967425839dcc1fbd10efe74120c03efd03f;hp=6bd89a806e3174b13c074038a2fecef86859bf97;hb=74c92401812b8e77e8ceade6e8714d0fc1c35d3a;hpb=abe7cd0f3412d447cf054e618ce1c7c7fa096745 diff --git a/opendaylight/switchmanager/implementation/src/main/java/org/opendaylight/controller/switchmanager/internal/SwitchManager.java b/opendaylight/switchmanager/implementation/src/main/java/org/opendaylight/controller/switchmanager/internal/SwitchManager.java index 6bd89a806e..d82c996742 100644 --- a/opendaylight/switchmanager/implementation/src/main/java/org/opendaylight/controller/switchmanager/internal/SwitchManager.java +++ b/opendaylight/switchmanager/implementation/src/main/java/org/opendaylight/controller/switchmanager/internal/SwitchManager.java @@ -16,7 +16,6 @@ import java.net.NetworkInterface; import java.net.SocketException; import java.util.ArrayList; import java.util.Collections; -import java.util.Date; import java.util.Dictionary; import java.util.EnumSet; import java.util.Enumeration; @@ -34,7 +33,6 @@ import org.eclipse.osgi.framework.console.CommandInterpreter; import org.eclipse.osgi.framework.console.CommandProvider; import org.opendaylight.controller.clustering.services.CacheConfigException; import org.opendaylight.controller.clustering.services.CacheExistException; -import org.opendaylight.controller.clustering.services.ICacheUpdateAware; import org.opendaylight.controller.clustering.services.IClusterContainerServices; import org.opendaylight.controller.clustering.services.IClusterServices; import org.opendaylight.controller.configuration.IConfigurationContainerAware; @@ -85,13 +83,10 @@ import org.slf4j.LoggerFactory; * instance per container of the network. All the node/nodeConnector properties * are maintained in the default container only. */ -public class SwitchManager implements ISwitchManager, -IConfigurationContainerAware, IObjectReader, -ICacheUpdateAware, IListenInventoryUpdates, -CommandProvider { +public class SwitchManager implements ISwitchManager, IConfigurationContainerAware, + IObjectReader, IListenInventoryUpdates, CommandProvider { private static Logger log = LoggerFactory.getLogger(SwitchManager.class); private static String ROOT = GlobalConstants.STARTUPHOME.toString(); - private static final String SAVE = "Save"; private String subnetFileName, spanFileName, switchConfigFileName; private final List spanNodeConnectors = new CopyOnWriteArrayList(); // Collection of Subnets keyed by the InetAddress @@ -100,7 +95,6 @@ CommandProvider { private ConcurrentMap spanConfigList; // manually configured parameters for the node such as name, tier, mode private ConcurrentMap nodeConfigList; - private ConcurrentMap configSaveEvent; private ConcurrentMap> nodeProps; private ConcurrentMap> nodeConnectorProps; private ConcurrentMap> nodeConnectorNames; @@ -210,27 +204,27 @@ CommandProvider { try { clusterContainerService.createCache( "switchmanager.subnetsConfigList", - EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL)); + EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); clusterContainerService.createCache("switchmanager.spanConfigList", - EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL)); + EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); clusterContainerService.createCache("switchmanager.nodeConfigList", - EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL)); + EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); clusterContainerService.createCache("switchmanager.subnets", - EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL)); + EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); clusterContainerService.createCache( "switchmanager.configSaveEvent", - EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL)); + EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); clusterContainerService.createCache("switchmanager.nodeProps", - EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL)); + EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); clusterContainerService.createCache( "switchmanager.nodeConnectorProps", - EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL)); + EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); clusterContainerService.createCache( "switchmanager.nodeConnectorNames", - EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL)); + EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); clusterContainerService.createCache( "switchmanager.controllerProps", - EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL)); + EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); } catch (CacheConfigException cce) { log.error("\nCache configuration invalid - check cache mode"); } catch (CacheExistException ce) { @@ -269,12 +263,6 @@ CommandProvider { log.error("\nFailed to get cache for subnets"); } - configSaveEvent = (ConcurrentMap) clusterContainerService - .getCache("switchmanager.configSaveEvent"); - if (configSaveEvent == null) { - log.error("\nFailed to get cache for configSaveEvent"); - } - nodeProps = (ConcurrentMap>) clusterContainerService .getCache("switchmanager.nodeProps"); if (nodeProps == null) { @@ -305,7 +293,6 @@ CommandProvider { spanConfigList = new ConcurrentHashMap(); nodeConfigList = new ConcurrentHashMap(); subnets = new ConcurrentHashMap(); - configSaveEvent = new ConcurrentHashMap(); nodeProps = new ConcurrentHashMap>(); nodeConnectorProps = new ConcurrentHashMap>(); nodeConnectorNames = new ConcurrentHashMap>(); @@ -725,7 +712,8 @@ CommandProvider { switchConfig = new SwitchConfig(nodeId, updateProperties); } else { // check if description is configured or was published by any other node - for (Node n : nodeProps.keySet()) { + for (Map.Entry> entry : nodeProps.entrySet()) { + Node n = entry.getKey(); Description desc = (Description) getNodeProp(n, Description.propertyName); NodeDescription nDesc = (this.statisticsManager == null) ? null : this.statisticsManager .getNodeDescription(n); @@ -775,7 +763,8 @@ CommandProvider { return new Status(StatusCode.SUCCESS); } Map propMap = new HashMap(propMapCurr); - for (String prop : prevNodeProperties.keySet()) { + for (Map.Entry entry : prevNodeProperties.entrySet()) { + String prop = entry.getKey(); if (!updateProperties.containsKey(prop)) { if (prop.equals(Description.propertyName)) { if (!advertisedDesc.isEmpty()) { @@ -783,6 +772,10 @@ CommandProvider { propMap.put(Description.propertyName, desc); } continue; + } else if (prop.equals(ForwardingMode.name)) { + Property defaultMode = new ForwardingMode(ForwardingMode.REACTIVE_FORWARDING); + propMap.put(ForwardingMode.name, defaultMode); + continue; } propMap.remove(prop); } @@ -808,7 +801,8 @@ CommandProvider { Map propMapCurr = nodeProps.get(node); if ((propMapCurr != null) && (nodeProperties != null) && (!nodeProperties.isEmpty())) { Map propMap = new HashMap(propMapCurr); - for (String prop : nodeProperties.keySet()) { + for (Map.Entry entry : nodeProperties.entrySet()) { + String prop = entry.getKey(); if (prop.equals(Description.propertyName)) { Map> nodeProp = this.inventoryService.getNodeProps(); if (nodeProp.get(node) != null) { @@ -830,8 +824,6 @@ CommandProvider { @Override public Status saveSwitchConfig() { - // Publish the save config event to the cluster nodes - configSaveEvent.put(new Date().getTime(), SAVE); return saveSwitchConfigInternal(); } @@ -906,20 +898,6 @@ CommandProvider { return ncList; } - @Override - public void entryCreated(Long key, String cacheName, boolean local) { - } - - @Override - public void entryUpdated(Long key, String newValue, String cacheName, - boolean originLocal) { - saveSwitchConfigInternal(); - } - - @Override - public void entryDeleted(Long key, String cacheName, boolean originLocal) { - } - private void addNode(Node node, Set props) { log.trace("{} added, props: {}", node, props); if (nodeProps == null) { @@ -937,8 +915,8 @@ CommandProvider { } } - // copy node properties from config boolean proactiveForwarding = false; + // copy node properties from config if (nodeConfigList != null) { String nodeId = node.toString(); SwitchConfig conf = nodeConfigList.get(nodeId); @@ -952,6 +930,10 @@ CommandProvider { } } + if (!propMap.containsKey(ForwardingMode.name)) { + Property defaultMode = new ForwardingMode(ForwardingMode.REACTIVE_FORWARDING); + propMap.put(ForwardingMode.name, defaultMode); + } boolean result = false; if (propMapCurr == null) { if (nodeProps.putIfAbsent(node, propMap) == null) { @@ -984,6 +966,17 @@ CommandProvider { return; } nodeProps.remove(node); + nodeConnectorNames.remove(node); + Set removeNodeConnectorSet = new HashSet(); + for (Map.Entry> entry : nodeConnectorProps.entrySet()) { + NodeConnector nodeConnector = entry.getKey(); + if (nodeConnector.getNode().equals(node)) { + removeNodeConnectorSet.add(nodeConnector); + } + } + for (NodeConnector nc : removeNodeConnectorSet) { + nodeConnectorProps.remove(nc); + } // check if span ports need to be cleaned up removeSpanPorts(node); @@ -1057,6 +1050,7 @@ CommandProvider { public void updateNodeConnector(NodeConnector nodeConnector, UpdateType type, Set props) { Map propMap = new HashMap(); + boolean update = true; log.debug("updateNodeConnector: {} type {} props {} for container {}", new Object[] { nodeConnector, type, props, containerName }); @@ -1067,7 +1061,6 @@ CommandProvider { switch (type) { case ADDED: - case CHANGED: if (props != null) { for (Property prop : props) { addNodeConnectorProp(nodeConnector, prop); @@ -1079,23 +1072,39 @@ CommandProvider { addSpanPort(nodeConnector); break; + case CHANGED: + if (!nodeConnectorProps.containsKey(nodeConnector) || (props == null)) { + update = false; + } else { + for (Property prop : props) { + addNodeConnectorProp(nodeConnector, prop); + propMap.put(prop.getName(), prop); + } + } + break; case REMOVED: + if (!nodeConnectorProps.containsKey(nodeConnector)) { + update = false; + } removeNodeConnectorAllProps(nodeConnector); // clean up span config removeSpanPort(nodeConnector); break; default: + update = false; break; } - notifyNodeConnector(nodeConnector, type, propMap); + if (update) { + notifyNodeConnector(nodeConnector, type, propMap); + } } @Override public Set getNodes() { return (nodeProps != null) ? new HashSet(nodeProps.keySet()) - : null; + : new HashSet(); } /* @@ -1190,7 +1199,8 @@ CommandProvider { } Set nodeConnectorSet = new HashSet(); - for (NodeConnector nodeConnector : nodeConnectorProps.keySet()) { + for (Map.Entry> entry : nodeConnectorProps.entrySet()) { + NodeConnector nodeConnector = entry.getKey(); if (!nodeConnector.getNode().equals(node)) { continue; } @@ -1209,7 +1219,8 @@ CommandProvider { } Set nodeConnectorSet = new HashSet(); - for (NodeConnector nodeConnector : nodeConnectorProps.keySet()) { + for (Map.Entry> entry : nodeConnectorProps.entrySet()) { + NodeConnector nodeConnector = entry.getKey(); if (!nodeConnector.getNode().equals(node)) { continue; } @@ -1226,7 +1237,8 @@ CommandProvider { } Set nodeConnectorSet = new HashSet(); - for (NodeConnector nodeConnector : nodeConnectorProps.keySet()) { + for (Map.Entry> entry : nodeConnectorProps.entrySet()) { + NodeConnector nodeConnector = entry.getKey(); if (!nodeConnector.getNode().equals(node) || isSpecial(nodeConnector)) { continue; @@ -1365,11 +1377,12 @@ CommandProvider { Map mapCurr = nodeConnectorNames.get(node); Map map = new HashMap(); if (mapCurr != null) { - for (String s : mapCurr.keySet()) { + for (Map.Entry entry : mapCurr.entrySet()) { + String s = entry.getKey(); try { - map.put(s, new NodeConnector(mapCurr.get(s))); + map.put(s, new NodeConnector(entry.getValue())); } catch (ConstructionException e) { - e.printStackTrace(); + log.error("An error occured",e); } } } @@ -1426,11 +1439,12 @@ CommandProvider { Map mapCurr = nodeConnectorNames.get(node); if (mapCurr != null) { Map map = new HashMap(); - for (String s : mapCurr.keySet()) { + for (Map.Entry entry : mapCurr.entrySet()) { + String s = entry.getKey(); try { - map.put(s, new NodeConnector(mapCurr.get(s))); + map.put(s, new NodeConnector(entry.getValue())); } catch (ConstructionException e) { - e.printStackTrace(); + log.error("An error occured",e); } } map.remove(name.getValue()); @@ -1462,11 +1476,12 @@ CommandProvider { Map mapCurr = nodeConnectorNames.get(node); if (mapCurr != null) { Map map = new HashMap(); - for (String s : mapCurr.keySet()) { + for (Map.Entry entry : mapCurr.entrySet()) { + String s = entry.getKey(); try { - map.put(s, new NodeConnector(mapCurr.get(s))); + map.put(s, new NodeConnector(entry.getValue())); } catch (ConstructionException e) { - e.printStackTrace(); + log.error("An error occured",e); } } map.remove(name.getValue()); @@ -1711,7 +1726,8 @@ CommandProvider { service.notifyNode(node, type, propMap); } - for (NodeConnector nodeConnector : nodeConnectorProps.keySet()) { + for (Map.Entry> entry : nodeConnectorProps.entrySet()) { + NodeConnector nodeConnector = entry.getKey(); propMap = nodeConnectorProps.get(nodeConnector); service.notifyNodeConnector(nodeConnector, type, propMap); } @@ -1750,8 +1766,6 @@ CommandProvider { public String getHelp() { StringBuffer help = new StringBuffer(); help.append("---Switch Manager---\n"); - help.append("\t pns - Print connected nodes\n"); - help.append("\t pncs - Print node connectors for a given node\n"); help.append("\t pencs - Print enabled node connectors for a given node\n"); help.append("\t pdm - Print switch ports in device map\n"); help.append("\t snt - Set node tier number\n"); @@ -1760,37 +1774,6 @@ CommandProvider { return help.toString(); } - public void _pns(CommandInterpreter ci) { - ci.println(" Node Type MAC Name Tier"); - if (nodeProps == null) { - return; - } - Set nodeSet = nodeProps.keySet(); - if (nodeSet == null) { - return; - } - List nodeArray = new ArrayList(); - for (Node node : nodeSet) { - nodeArray.add(node.toString()); - } - Collections.sort(nodeArray); - for (String str: nodeArray) { - Node node = Node.fromString(str); - Description desc = ((Description) getNodeProp(node, - Description.propertyName)); - Tier tier = ((Tier) getNodeProp(node, Tier.TierPropName)); - String nodeName = (desc == null) ? "" : desc.getValue(); - MacAddress mac = (MacAddress) getNodeProp(node, - MacAddress.name); - String macAddr = (mac == null) ? "" : HexEncode - .bytesToHexStringFormat(mac.getMacAddress()); - int tierNum = (tier == null) ? 0 : tier.getValue(); - ci.println(node + " " + node.getType() + " " + macAddr - + " " + nodeName + " " + tierNum); - } - ci.println("Total number of Nodes: " + nodeSet.size()); - } - public void _pencs(CommandInterpreter ci) { String st = ci.nextArgument(); if (st == null) { @@ -1817,43 +1800,6 @@ CommandProvider { ci.println("Total number of NodeConnectors: " + nodeConnectorSet.size()); } - public void _pncs(CommandInterpreter ci) { - String st = ci.nextArgument(); - if (st == null) { - ci.println("Please enter node id"); - return; - } - - Node node = Node.fromString(st); - if (node == null) { - ci.println("Please enter node id"); - return; - } - - ci.println(" NodeConnector BandWidth(Gbps) Admin State"); - Set nodeConnectorSet = getNodeConnectors(node); - if (nodeConnectorSet == null) { - return; - } - for (NodeConnector nodeConnector : nodeConnectorSet) { - if (nodeConnector == null) { - continue; - } - Map propMap = getNodeConnectorProps(nodeConnector); - Bandwidth bw = (Bandwidth) propMap.get(Bandwidth.BandwidthPropName); - Config config = (Config) propMap.get(Config.ConfigPropName); - State state = (State) propMap.get(State.StatePropName); - String out = nodeConnector + " "; - out += (bw != null) ? bw.getValue() / Math.pow(10, 9) : " "; - out += " "; - out += (config != null) ? config.getValue() : " "; - out += " "; - out += (state != null) ? state.getValue() : " "; - ci.println(out); - } - ci.println("Total number of NodeConnectors: " + nodeConnectorSet.size()); - } - public void _pdm(CommandInterpreter ci) { String st = ci.nextArgument(); if (st == null) {