X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fswitchmanager%2Fimplementation%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fswitchmanager%2Finternal%2FSwitchManager.java;h=49cdabfeb3055a3f8a3a35237ec1e6168f84d09e;hb=efa48be30a4054e7cfce114e66c5b5667b1c4a5c;hp=78c78f55429980466e42d5074e07e133c9cfa0bb;hpb=8c9a1cf398348546e6e5ba74a2012ed942a2fddb;p=controller.git 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 78c78f5542..49cdabfeb3 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 @@ -193,7 +193,6 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa public void shutDown() { } - @SuppressWarnings("deprecation") private void allocateCaches() { if (this.clusterContainerService == null) { this.nonClusterObjectCreate(); @@ -211,9 +210,6 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); clusterContainerService.createCache("switchmanager.subnets", EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); - clusterContainerService.createCache( - "switchmanager.configSaveEvent", - EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); clusterContainerService.createCache("switchmanager.nodeProps", EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); clusterContainerService.createCache( @@ -232,7 +228,7 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa } } - @SuppressWarnings({ "unchecked", "deprecation" }) + @SuppressWarnings({ "unchecked" }) private void retrieveCaches() { if (this.clusterContainerService == null) { log.info("un-initialized clusterContainerService, can't create cache"); @@ -378,7 +374,7 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa private Status updateDatabase(SubnetConfig conf, boolean add) { if (add) { - Subnet subnetCurr = subnets.get(conf.getIPnum()); + Subnet subnetCurr = subnets.get(conf.getIPAddress()); Subnet subnet; if (subnetCurr == null) { subnet = new Subnet(conf); @@ -388,25 +384,24 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa // In case of API3 call we may receive the ports along with the // subnet creation if (!conf.isGlobal()) { - Set sp = conf.getSubnetNodeConnectors(); - subnet.addNodeConnectors(sp); + subnet.addNodeConnectors(conf.getNodeConnectors()); } boolean putNewSubnet = false; if(subnetCurr == null) { - if(subnets.putIfAbsent(conf.getIPnum(), subnet) == null) { + if(subnets.putIfAbsent(conf.getIPAddress(), subnet) == null) { putNewSubnet = true; } } else { - putNewSubnet = subnets.replace(conf.getIPnum(), subnetCurr, subnet); + putNewSubnet = subnets.replace(conf.getIPAddress(), subnetCurr, subnet); } if(!putNewSubnet) { - String msg = "Cluster conflict: Conflict while adding the subnet " + conf.getIPnum(); + String msg = "Cluster conflict: Conflict while adding the subnet " + conf.getIPAddress(); return new Status(StatusCode.CONFLICT, msg); } // Subnet removal case } else { - subnets.remove(conf.getIPnum()); + subnets.remove(conf.getIPAddress()); } return new Status(StatusCode.SUCCESS); } @@ -428,11 +423,11 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa } private Status addRemoveSubnet(SubnetConfig conf, boolean isAdding) { - // Valid config check - if (!conf.isValidConfig()) { - String msg = "Invalid Subnet configuration"; - log.warn(msg); - return new Status(StatusCode.BADREQUEST, msg); + // Valid configuration check + Status status = conf.validate(); + if (!status.isSuccess()) { + log.warn(status.getDescription()); + return status; } if (isAdding) { @@ -442,24 +437,24 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa "Subnet with the specified name already configured."); } // Semantic check - Status rc = semanticCheck(conf); - if (!rc.isSuccess()) { - return rc; + status = semanticCheck(conf); + if (!status.isSuccess()) { + return status; } } // Update Database - Status rc = updateDatabase(conf, isAdding); + status = updateDatabase(conf, isAdding); - if (rc.isSuccess()) { + if (status.isSuccess()) { // Update Configuration - rc = updateConfig(conf, isAdding); - if(!rc.isSuccess()) { + status = updateConfig(conf, isAdding); + if(!status.isSuccess()) { updateDatabase(conf, (!isAdding)); } } - return rc; + return status; } /** @@ -485,26 +480,100 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa } @Override - public Status addPortsToSubnet(String name, String switchPorts) { + public Status modifySubnet(SubnetConfig conf) { + // Sanity check + if (conf == null) { + return new Status(StatusCode.BADREQUEST, "Invalid Subnet configuration: null"); + } + + // Valid configuration check + Status status = conf.validate(); + if (!status.isSuccess()) { + log.warn(status.getDescription()); + return status; + } + + // If a subnet configuration with this name does not exist, consider this is a creation + SubnetConfig target = subnetsConfigList.get(conf.getName()); + if (target == null) { + return this.addSubnet(conf); + } + + // No change + if (target.equals(conf)) { + return new Status(StatusCode.SUCCESS); + } + + // Check not allowed modifications + if (!target.getSubnet().equals(conf.getSubnet())) { + return new Status(StatusCode.BADREQUEST, "IP address change is not allowed"); + } + + // Derive the set of node connectors that are being removed + Set toRemove = target.getNodeConnectors(); + toRemove.removeAll(conf.getNodeConnectors()); + List nodeConnectorStrings = null; + if (!toRemove.isEmpty()) { + nodeConnectorStrings = new ArrayList(); + for (NodeConnector nc : toRemove) { + nodeConnectorStrings.add(nc.toString()); + } + status = this.removePortsFromSubnet(conf.getName(), nodeConnectorStrings); + if (!status.isSuccess()) { + return status; + } + } + + // Derive the set of node connectors that are being added + Set toAdd = conf.getNodeConnectors(); + toAdd.removeAll(target.getNodeConnectors()); + if (!toAdd.isEmpty()) { + List nodeConnectorStringRemoved = nodeConnectorStrings; + nodeConnectorStrings = new ArrayList(); + for (NodeConnector nc : toAdd) { + nodeConnectorStrings.add(nc.toString()); + } + status = this.addPortsToSubnet(conf.getName(), nodeConnectorStrings); + if (!status.isSuccess()) { + // If any port was removed, add it back as a best recovery effort + if (!toRemove.isEmpty()) { + this.addPortsToSubnet(conf.getName(), nodeConnectorStringRemoved); + } + return status; + } + } + + // Update Configuration + subnetsConfigList.put(conf.getName(), conf); + + return new Status(StatusCode.SUCCESS); + } + + @Override + public Status addPortsToSubnet(String name, List switchPorts) { + if (name == null) { + return new Status(StatusCode.BADREQUEST, "Null subnet name"); + } SubnetConfig confCurr = subnetsConfigList.get(name); if (confCurr == null) { return new Status(StatusCode.NOTFOUND, "Subnet does not exist"); } - if (!confCurr.isValidSwitchPort(switchPorts)) { - return new Status(StatusCode.BADREQUEST, "Invalid switchports"); + + if (switchPorts == null || switchPorts.isEmpty()) { + return new Status(StatusCode.BADREQUEST, "Null or empty port set"); } - Subnet subCurr = subnets.get(confCurr.getIPnum()); + Subnet subCurr = subnets.get(confCurr.getIPAddress()); if (subCurr == null) { - log.debug("Cluster conflict: Subnet entry {} is not present in the subnets cache.", confCurr.getIPnum()); + log.debug("Cluster conflict: Subnet entry {} is not present in the subnets cache.", confCurr.getIPAddress()); return new Status(StatusCode.NOTFOUND, "Subnet does not exist"); } // Update Database Subnet sub = subCurr.clone(); - Set sp = confCurr.getNodeConnectors(switchPorts); + Set sp = NodeConnector.fromString(switchPorts); sub.addNodeConnectors(sp); - boolean subnetsReplaced = subnets.replace(confCurr.getIPnum(), subCurr, sub); + boolean subnetsReplaced = subnets.replace(confCurr.getIPAddress(), subCurr, sub); if (!subnetsReplaced) { String msg = "Cluster conflict: Conflict while adding ports to the subnet " + name; return new Status(StatusCode.CONFLICT, msg); @@ -524,23 +593,35 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa } @Override - public Status removePortsFromSubnet(String name, String switchPorts) { + public Status removePortsFromSubnet(String name, List switchPorts) { + if (name == null) { + return new Status(StatusCode.BADREQUEST, "Null subnet name"); + } SubnetConfig confCurr = subnetsConfigList.get(name); if (confCurr == null) { return new Status(StatusCode.NOTFOUND, "Subnet does not exist"); } - Subnet subCurr = subnets.get(confCurr.getIPnum()); + if (switchPorts == null || switchPorts.isEmpty()) { + return new Status(StatusCode.BADREQUEST, "Null or empty port set"); + } + + Subnet subCurr = subnets.get(confCurr.getIPAddress()); if (subCurr == null) { - log.debug("Cluster conflict: Subnet entry {} is not present in the subnets cache.", confCurr.getIPnum()); + log.debug("Cluster conflict: Subnet entry {} is not present in the subnets cache.", confCurr.getIPAddress()); return new Status(StatusCode.NOTFOUND, "Subnet does not exist"); } + // Validation check + Status status = SubnetConfig.validatePorts(switchPorts); + if (!status.isSuccess()) { + return status; + } // Update Database Subnet sub = subCurr.clone(); - Set sp = confCurr.getNodeConnectors(switchPorts); + Set sp = NodeConnector.fromString(switchPorts); sub.deleteNodeConnectors(sp); - boolean subnetsReplace = subnets.replace(confCurr.getIPnum(), subCurr, sub); + boolean subnetsReplace = subnets.replace(confCurr.getIPAddress(), subCurr, sub); if (!subnetsReplace) { String msg = "Cluster conflict: Conflict while removing ports from the subnet " + name; return new Status(StatusCode.CONFLICT, msg); @@ -632,6 +713,7 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa } } + @SuppressWarnings("deprecation") @Override public void updateSwitchConfig(SwitchConfig cfgObject) { // update default container only @@ -772,6 +854,10 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa 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); } @@ -911,8 +997,8 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa } } - // 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); @@ -926,6 +1012,10 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa } } + 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) { @@ -1042,6 +1132,7 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa 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 }); @@ -1052,7 +1143,6 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa switch (type) { case ADDED: - case CHANGED: if (props != null) { for (Property prop : props) { addNodeConnectorProp(nodeConnector, prop); @@ -1064,23 +1154,39 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa 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(); } /* @@ -1358,7 +1464,7 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa try { map.put(s, new NodeConnector(entry.getValue())); } catch (ConstructionException e) { - e.printStackTrace(); + log.error("An error occured",e); } } } @@ -1420,7 +1526,7 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa try { map.put(s, new NodeConnector(entry.getValue())); } catch (ConstructionException e) { - e.printStackTrace(); + log.error("An error occured",e); } } map.remove(name.getValue()); @@ -1457,7 +1563,7 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa try { map.put(s, new NodeConnector(entry.getValue())); } catch (ConstructionException e) { - e.printStackTrace(); + log.error("An error occured",e); } } map.remove(name.getValue()); @@ -1742,8 +1848,6 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa 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"); @@ -1752,37 +1856,6 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa 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) { @@ -1809,43 +1882,6 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa 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) { @@ -1862,9 +1898,7 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa Switch sw = getSwitchByNode(node); ci.println(" NodeConnector Name"); - if (sw == null) { - return; - } + Set nodeConnectorSet = sw.getNodeConnectors(); String nodeConnectorName; if (nodeConnectorSet != null && nodeConnectorSet.size() > 0) { @@ -2102,6 +2136,7 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa return null; } + @SuppressWarnings("deprecation") @Override public String getNodeDescription(Node node) { // Check first if user configured a name