From: Alessandro Boch Date: Fri, 3 May 2013 13:59:01 +0000 (+0000) Subject: Merge "Bug fix for ForwardingRulesManager: addFlow and addFlowAsync are reversed." X-Git-Tag: releasepom-0.1.0~497 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=fbfab4661220d56543ceabbcba5a40b335be1e07;hp=077392a1ab706962b0da04b78a9cae5422e70e6c Merge "Bug fix for ForwardingRulesManager: addFlow and addFlowAsync are reversed." --- diff --git a/opendaylight/arphandler/pom.xml b/opendaylight/arphandler/pom.xml index cf3aff744f..80d8598d45 100644 --- a/opendaylight/arphandler/pom.xml +++ b/opendaylight/arphandler/pom.xml @@ -56,7 +56,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT diff --git a/opendaylight/clustering/services_implementation/pom.xml b/opendaylight/clustering/services_implementation/pom.xml index 82a97b666f..80fc1c4099 100644 --- a/opendaylight/clustering/services_implementation/pom.xml +++ b/opendaylight/clustering/services_implementation/pom.xml @@ -70,7 +70,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT diff --git a/opendaylight/clustering/stub/pom.xml b/opendaylight/clustering/stub/pom.xml index 2670c723f4..ab4ef5ad86 100644 --- a/opendaylight/clustering/stub/pom.xml +++ b/opendaylight/clustering/stub/pom.xml @@ -46,7 +46,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT diff --git a/opendaylight/configuration/api/pom.xml b/opendaylight/configuration/api/pom.xml index 0af960d962..3993b5e71f 100644 --- a/opendaylight/configuration/api/pom.xml +++ b/opendaylight/configuration/api/pom.xml @@ -39,7 +39,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT diff --git a/opendaylight/configuration/implementation/pom.xml b/opendaylight/configuration/implementation/pom.xml index bac0184092..467e9ca1ed 100644 --- a/opendaylight/configuration/implementation/pom.xml +++ b/opendaylight/configuration/implementation/pom.xml @@ -56,7 +56,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT diff --git a/opendaylight/containermanager/api/pom.xml b/opendaylight/containermanager/api/pom.xml index 8b5ccdf780..2b354752b3 100644 --- a/opendaylight/containermanager/api/pom.xml +++ b/opendaylight/containermanager/api/pom.xml @@ -45,7 +45,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT diff --git a/opendaylight/containermanager/implementation/pom.xml b/opendaylight/containermanager/implementation/pom.xml index 1ead516adc..9e2f5662ef 100644 --- a/opendaylight/containermanager/implementation/pom.xml +++ b/opendaylight/containermanager/implementation/pom.xml @@ -62,7 +62,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT diff --git a/opendaylight/distribution/opendaylight/src/main/resources/configuration/config.ini b/opendaylight/distribution/opendaylight/src/main/resources/configuration/config.ini index 6a7d68c8d0..33789ee2d2 100644 --- a/opendaylight/distribution/opendaylight/src/main/resources/configuration/config.ini +++ b/opendaylight/distribution/opendaylight/src/main/resources/configuration/config.ini @@ -50,6 +50,12 @@ org.eclipse.gemini.web.tomcat.config.path=configuration/tomcat-server.xml # of.messageResponseTimer=2000 # The switch liveness timeout value (default 60500 msec) # of.switchLivenessTimeout=60500 +# The flow statistics polling interval in second (default 10 sec) +# of.flowStatsPollInterval=10 +# The port statistics polling interval in second (default 5 sec) +# of.portStatsPollInterval=5 +# The description statistics polling interval in second (default 60 sec) +# of.descStatsPollInterval=60 # The maximum number of asynchronous messages can be sent before sending a Barrier Request (default 100) # of.barrierMessagePriorCount=100 # The interval which determines how often the discovery packets should be sent (default 300 sec) diff --git a/opendaylight/forwarding/staticrouting/pom.xml b/opendaylight/forwarding/staticrouting/pom.xml index 38f18bf67c..28f3e25d41 100644 --- a/opendaylight/forwarding/staticrouting/pom.xml +++ b/opendaylight/forwarding/staticrouting/pom.xml @@ -80,7 +80,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT diff --git a/opendaylight/forwardingrulesmanager/api/pom.xml b/opendaylight/forwardingrulesmanager/api/pom.xml index 6b639e3c63..382b11d4a3 100644 --- a/opendaylight/forwardingrulesmanager/api/pom.xml +++ b/opendaylight/forwardingrulesmanager/api/pom.xml @@ -83,7 +83,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT junit diff --git a/opendaylight/forwardingrulesmanager/implementation/pom.xml b/opendaylight/forwardingrulesmanager/implementation/pom.xml index 0031773029..d9faed36b9 100644 --- a/opendaylight/forwardingrulesmanager/implementation/pom.xml +++ b/opendaylight/forwardingrulesmanager/implementation/pom.xml @@ -126,7 +126,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/forwardingrulesmanager/integrationtest/src/test/java/org/opendaylight/controller/forwardingrulesmanager/internal/FRMIntegrationTest.java b/opendaylight/forwardingrulesmanager/integrationtest/src/test/java/org/opendaylight/controller/forwardingrulesmanager/internal/FRMIntegrationTest.java index 73c6d79d6a..8fa37b5471 100644 --- a/opendaylight/forwardingrulesmanager/integrationtest/src/test/java/org/opendaylight/controller/forwardingrulesmanager/internal/FRMIntegrationTest.java +++ b/opendaylight/forwardingrulesmanager/integrationtest/src/test/java/org/opendaylight/controller/forwardingrulesmanager/internal/FRMIntegrationTest.java @@ -83,7 +83,7 @@ public class FRMIntegrationTest { mavenBundle("ch.qos.logback", "logback-classic", "1.0.9"), // List all the bundles on which the test case depends mavenBundle("org.opendaylight.controller", "sal", - "0.4.0-SNAPSHOT"), + "0.5.0-SNAPSHOT"), mavenBundle("org.opendaylight.controller", "sal.implementation", "0.4.0-SNAPSHOT"), @@ -201,4 +201,4 @@ public class FRMIntegrationTest { Assert.assertTrue(stat.getCode().equals(StatusCode.NOTACCEPTABLE)); } -} \ No newline at end of file +} diff --git a/opendaylight/hosttracker/api/pom.xml b/opendaylight/hosttracker/api/pom.xml index 59290efbd5..f60b386baf 100644 --- a/opendaylight/hosttracker/api/pom.xml +++ b/opendaylight/hosttracker/api/pom.xml @@ -66,7 +66,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT diff --git a/opendaylight/hosttracker/implementation/pom.xml b/opendaylight/hosttracker/implementation/pom.xml index 1f24e06bad..402dfe32e3 100644 --- a/opendaylight/hosttracker/implementation/pom.xml +++ b/opendaylight/hosttracker/implementation/pom.xml @@ -46,6 +46,7 @@ org.opendaylight.controller.sal.core, org.opendaylight.controller.sal.utils, + org.opendaylight.controller.sal.topology, org.opendaylight.controller.hosttracker, org.opendaylight.controller.topologymanager, org.opendaylight.controller.sal.packet.address, @@ -112,7 +113,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/hosttracker/implementation/src/main/java/org/opendaylight/controller/hosttracker/internal/HostTracker.java b/opendaylight/hosttracker/implementation/src/main/java/org/opendaylight/controller/hosttracker/internal/HostTracker.java index d0f8bb5736..7c312e1577 100644 --- a/opendaylight/hosttracker/implementation/src/main/java/org/opendaylight/controller/hosttracker/internal/HostTracker.java +++ b/opendaylight/hosttracker/implementation/src/main/java/org/opendaylight/controller/hosttracker/internal/HostTracker.java @@ -1,4 +1,3 @@ - /* * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * @@ -30,7 +29,6 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; import org.apache.felix.dm.Component; -import org.apache.taglibs.standard.lang.jstl.DivideOperator; import org.opendaylight.controller.clustering.services.CacheConfigException; import org.opendaylight.controller.clustering.services.CacheExistException; import org.opendaylight.controller.clustering.services.IClusterContainerServices; @@ -51,6 +49,7 @@ import org.opendaylight.controller.sal.core.Tier; import org.opendaylight.controller.sal.core.UpdateType; import org.opendaylight.controller.sal.packet.address.DataLinkAddress; import org.opendaylight.controller.sal.packet.address.EthernetAddress; +import org.opendaylight.controller.sal.topology.TopoEdgeUpdate; import org.opendaylight.controller.sal.utils.GlobalConstants; import org.opendaylight.controller.sal.utils.HexEncode; import org.opendaylight.controller.sal.utils.NodeCreator; @@ -66,16 +65,16 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * @file HostTracker.java - * This class tracks the location of IP Hosts as to which Switch, Port, VLAN, they are - * connected to, as well as their MAC address. This is done dynamically as well as statically. - * The dynamic mechanism consists of listening to ARP messages as well sending ARP requests. - * Static mechanism consists of Northbound APIs to add or remove the hosts from the local - * database. ARP aging is also implemented to age out dynamically learned hosts. Interface - * methods are provided for other applications to - * 1. Query the local database for a single host - * 2. Get a list of all hosts - * 3. Get notification if a host is learned/added or removed the database + * @file HostTracker.java This class tracks the location of IP Hosts as to which + * Switch, Port, VLAN, they are connected to, as well as their MAC + * address. This is done dynamically as well as statically. The dynamic + * mechanism consists of listening to ARP messages as well sending ARP + * requests. Static mechanism consists of Northbound APIs to add or remove + * the hosts from the local database. ARP aging is also implemented to age + * out dynamically learned hosts. Interface methods are provided for other + * applications to 1. Query the local database for a single host 2. Get a + * list of all hosts 3. Get notification if a host is learned/added or + * removed the database */ public class HostTracker implements IfIptoHost, IfHostListener, @@ -84,9 +83,10 @@ public class HostTracker implements IfIptoHost, IfHostListener, .getLogger(HostTracker.class); private IHostFinder hostFinder; private ConcurrentMap hostsDB; - /* Following is a list of hosts which have been requested by NB APIs to be added, - * but either the switch or the port is not sup, so they will be added here until - * both come up + /* + * Following is a list of hosts which have been requested by NB APIs to be + * added, but either the switch or the port is not sup, so they will be + * added here until both come up */ private ConcurrentMap inactiveStaticHosts; private Set newHostNotify = Collections @@ -129,22 +129,23 @@ public class HostTracker implements IfIptoHost, IfHostListener, } } - //This list contains the hosts for which ARP requests are being sent periodically + // This list contains the hosts for which ARP requests are being sent + // periodically private List ARPPendingList = new ArrayList(); /* - * This list below contains the hosts which were initially in ARPPendingList above, - * but ARP response didn't come from there hosts after multiple attempts over 8 - * seconds. The assumption is that the response didn't come back due to one of the - * following possibilities: - * 1. The L3 interface wasn't created for this host in the controller. This would - * cause arphandler not to know where to send the ARP - * 2. The host facing port is down - * 3. The IP host doesn't exist or is not responding to ARP requests - * - * Conditions 1 and 2 above can be recovered if ARP is sent when the relevant L3 - * interface is added or the port facing host comes up. Whenever L3 interface is - * added or host facing port comes up, ARP will be sent to hosts in this list. - * + * This list below contains the hosts which were initially in ARPPendingList + * above, but ARP response didn't come from there hosts after multiple + * attempts over 8 seconds. The assumption is that the response didn't come + * back due to one of the following possibilities: 1. The L3 interface + * wasn't created for this host in the controller. This would cause + * arphandler not to know where to send the ARP 2. The host facing port is + * down 3. The IP host doesn't exist or is not responding to ARP requests + * + * Conditions 1 and 2 above can be recovered if ARP is sent when the + * relevant L3 interface is added or the port facing host comes up. Whenever + * L3 interface is added or host facing port comes up, ARP will be sent to + * hosts in this list. + * * We can't recover from condition 3 above */ private ArrayList failedARPReqList = new ArrayList(); @@ -166,24 +167,21 @@ public class HostTracker implements IfIptoHost, IfHostListener, } @SuppressWarnings("deprecation") - private void allocateCache() { + private void allocateCache() { if (this.clusterContainerService == null) { - logger - .error("un-initialized clusterContainerService, can't create cache"); + logger.error("un-initialized clusterContainerService, can't create cache"); return; } logger.debug("Creating Cache for HostTracker"); try { - this.clusterContainerService.createCache("hostTrackerAH", EnumSet - .of(IClusterServices.cacheMode.NON_TRANSACTIONAL)); - this.clusterContainerService.createCache("hostTrackerIH", EnumSet - .of(IClusterServices.cacheMode.NON_TRANSACTIONAL)); + this.clusterContainerService.createCache("hostTrackerAH", + EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL)); + this.clusterContainerService.createCache("hostTrackerIH", + EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL)); } catch (CacheConfigException cce) { - logger - .error("Cache couldn't be created for HostTracker - check cache mode"); + logger.error("Cache couldn't be created for HostTracker - check cache mode"); } catch (CacheExistException cce) { - logger - .error("Cache for HostTracker already exists, destroy and recreate"); + logger.error("Cache for HostTracker already exists, destroy and recreate"); } logger.debug("Cache successfully created for HostTracker"); } @@ -191,8 +189,7 @@ public class HostTracker implements IfIptoHost, IfHostListener, @SuppressWarnings({ "unchecked", "deprecation" }) private void retrieveCache() { if (this.clusterContainerService == null) { - logger - .error("un-initialized clusterContainerService, can't retrieve cache"); + logger.error("un-initialized clusterContainerService, can't retrieve cache"); return; } logger.debug("Retrieving cache for HostTrackerAH"); @@ -217,7 +214,7 @@ public class HostTracker implements IfIptoHost, IfHostListener, } @SuppressWarnings("deprecation") - private void destroyCache() { + private void destroyCache() { if (this.clusterContainerService == null) { logger.error("un-initialized clusterMger, can't destroy cache"); return; @@ -275,10 +272,9 @@ public class HostTracker implements IfIptoHost, IfHostListener, for (Entry entry : inactiveStaticHosts .entrySet()) { if (entry.getValue().equalsByIP(networkAddress)) { - logger - .debug( - "getHostFromInactiveDB(): Inactive Host found for IP:{} ", - networkAddress.getHostAddress()); + logger.debug( + "getHostFromInactiveDB(): Inactive Host found for IP:{} ", + networkAddress.getHostAddress()); return entry; } } @@ -332,9 +328,9 @@ public class HostTracker implements IfIptoHost, IfHostListener, public HostNodeConnector hostFind(InetAddress networkAddress) { /* - * Sometimes at boot with containers configured in the startup - * we hit this path (from TIF) when hostFinder has not been set yet - * Caller already handles the null return + * Sometimes at boot with containers configured in the startup we hit + * this path (from TIF) when hostFinder has not been set yet Caller + * already handles the null return */ if (hostFinder == null) { @@ -344,18 +340,17 @@ public class HostTracker implements IfIptoHost, IfHostListener, HostNodeConnector host = hostQuery(networkAddress); if (host != null) { - logger.debug("hostFind(): Host found for IP: {}", networkAddress - .getHostAddress()); + logger.debug("hostFind(): Host found for IP: {}", + networkAddress.getHostAddress()); return host; } /* host is not found, initiate a discovery */ hostFinder.find(networkAddress); /* Also add this host to ARPPending List for any potential retries */ AddtoARPPendingList(networkAddress); - logger - .debug( - "hostFind(): Host Not Found for IP: {}, Inititated Host Discovery ...", - networkAddress.getHostAddress()); + logger.debug( + "hostFind(): Host Not Found for IP: {}, Inititated Host Discovery ...", + networkAddress.getHostAddress()); return null; } @@ -399,16 +394,15 @@ public class HostTracker implements IfIptoHost, IfHostListener, arphost.setHostIP(networkAddr); arphost.setSent_count((short) 1); ARPPendingList.add(arphost); - logger.debug("Host Added to ARPPending List, IP: {}", networkAddr - .toString()); + logger.debug("Host Added to ARPPending List, IP: {}", + networkAddr.toString()); } private void removePendingARPFromList(int index) { if (index >= ARPPendingList.size()) { - logger - .warn( - "removePendingARPFromList(): index greater than the List. Size:{}, Index:{}", - ARPPendingList.size(), index); + logger.warn( + "removePendingARPFromList(): index greater than the List. Size:{}, Index:{}", + ARPPendingList.size(), index); return; } ARPPending arphost = ARPPendingList.remove(index); @@ -434,8 +428,9 @@ public class HostTracker implements IfIptoHost, IfHostListener, for (int i = 0; i < ARPPendingList.size(); i++) { arphost = ARPPendingList.get(i); if (arphost.getHostIP().equals(networkAddr)) { - /* An ARP was sent for this host. The address is learned, - * remove the request + /* + * An ARP was sent for this host. The address is learned, remove + * the request */ removePendingARPFromList(i); logger.debug("Host Removed from ARPPending List, IP: {}", @@ -451,8 +446,9 @@ public class HostTracker implements IfIptoHost, IfHostListener, for (int i = 0; i < failedARPReqList.size(); i++) { arphost = failedARPReqList.get(i); if (arphost.getHostIP().equals(networkAddr)) { - /* An ARP was sent for this host. The address is learned, - * remove the request + /* + * An ARP was sent for this host. The address is learned, remove + * the request */ failedARPReqList.remove(i); logger.debug("Host Removed from FailedARPReqList List, IP: {}", @@ -466,9 +462,9 @@ public class HostTracker implements IfIptoHost, IfHostListener, private void learnNewHost(HostNodeConnector host) { host.initArpSendCountDown(); hostsDB.put(host.getNetworkAddress(), host); - logger.debug("New Host Learned: MAC: {} IP: {}", HexEncode - .bytesToHexString(host.getDataLayerAddressBytes()), host - .getNetworkAddress().getHostAddress()); + logger.debug("New Host Learned: MAC: {} IP: {}", + HexEncode.bytesToHexString(host.getDataLayerAddressBytes()), + host.getNetworkAddress().getHostAddress()); } // Remove known Host @@ -479,10 +475,9 @@ public class HostTracker implements IfIptoHost, IfHostListener, .getHostAddress()); hostsDB.remove(key); } else { - logger - .error( - "removeKnownHost(): Host for IP address {} not found in hostsDB", - key.getHostAddress()); + logger.error( + "removeKnownHost(): Host for IP address {} not found in hostsDB", + key.getHostAddress()); } } @@ -498,9 +493,9 @@ public class HostTracker implements IfIptoHost, IfHostListener, /* Check for Host Move case */ if (hostMoved(host)) { /* - * Host has been moved from one location (switch,port, MAC, or VLAN). - * Remove the existing host with its previous location parameters, - * inform the applications, and add it as a new Host + * Host has been moved from one location (switch,port, MAC, or + * VLAN). Remove the existing host with its previous location + * parameters, inform the applications, and add it as a new Host */ HostNodeConnector removedHost = hostsDB.get(host .getNetworkAddress()); @@ -539,7 +534,8 @@ public class HostTracker implements IfIptoHost, IfHostListener, new NotifyHostThread(host).start(); } - // Notify whoever is interested that a new host was learned (dynamically or statically) + // Notify whoever is interested that a new host was learned (dynamically or + // statically) private void notifyHostLearnedOrRemoved(HostNodeConnector host, boolean add) { // Update listeners if any if (newHostNotify != null) { @@ -557,19 +553,19 @@ public class HostTracker implements IfIptoHost, IfHostListener, } } } else { - logger - .error("notifyHostLearnedOrRemoved(): New host notify is null"); + logger.error("notifyHostLearnedOrRemoved(): New host notify is null"); } - // Topology update is for some reason outside of listeners registry logic + // Topology update is for some reason outside of listeners registry + // logic Node node = host.getnodeconnectorNode(); Host h = null; NodeConnector p = host.getnodeConnector(); try { - DataLinkAddress dla = new EthernetAddress(host - .getDataLayerAddressBytes()); - h = new org.opendaylight.controller.sal.core.Host(dla, host - .getNetworkAddress()); + DataLinkAddress dla = new EthernetAddress( + host.getDataLayerAddressBytes()); + h = new org.opendaylight.controller.sal.core.Host(dla, + host.getNetworkAddress()); } catch (ConstructionException ce) { p = null; h = null; @@ -581,23 +577,29 @@ public class HostTracker implements IfIptoHost, IfHostListener, switchManager.setNodeProp(node, tier); topologyManager.updateHostLink(p, h, UpdateType.ADDED, null); /* - * This is a temporary fix for Cisco Live's Hadoop Demonstration. - * The concept of Tiering must be revisited based on other application requirements - * and the design might warrant a separate module (as it involves tracking the topology/ - * host changes & updating the Tiering numbers in an effective manner). + * This is a temporary fix for Cisco Live's Hadoop + * Demonstration. The concept of Tiering must be revisited based + * on other application requirements and the design might + * warrant a separate module (as it involves tracking the + * topology/ host changes & updating the Tiering numbers in an + * effective manner). */ updateSwitchTiers(node, 1); /* - * The following 2 lines are added for testing purposes. - * We can remove it once the North-Bound APIs are available for testing. - - ArrayList> hierarchies = getHostNetworkHierarchy(host.getNetworkAddress()); - logHierarchies(hierarchies); + * The following 2 lines are added for testing purposes. We can + * remove it once the North-Bound APIs are available for + * testing. + * + * ArrayList> hierarchies = + * getHostNetworkHierarchy(host.getNetworkAddress()); + * logHierarchies(hierarchies); */ } else { - // No need to reset the tiering if no other hosts are currently connected - // If this switch was discovered to be an access switch, it still is even if the host is down + // No need to reset the tiering if no other hosts are currently + // connected + // If this switch was discovered to be an access switch, it + // still is even if the host is down Tier tier = new Tier(0); switchManager.setNodeProp(node, tier); topologyManager.updateHostLink(p, h, UpdateType.REMOVED, null); @@ -606,15 +608,17 @@ public class HostTracker implements IfIptoHost, IfHostListener, } /** - * When a new Host is learnt by the hosttracker module, it places the directly connected Node - * in Tier-1 & using this function, updates the Tier value for all other Nodes in the network - * hierarchy. - * - * This is a recursive function and it takes care of updating the Tier value for all the connected - * and eligible Nodes. - * - * @param n Node that represents one of the Vertex in the Topology Graph. - * @param currentTier The Tier on which n belongs + * When a new Host is learnt by the hosttracker module, it places the + * directly connected Node in Tier-1 & using this function, updates the Tier + * value for all other Nodes in the network hierarchy. + * + * This is a recursive function and it takes care of updating the Tier value + * for all the connected and eligible Nodes. + * + * @param n + * Node that represents one of the Vertex in the Topology Graph. + * @param currentTier + * The Tier on which n belongs */ private void updateSwitchTiers(Node n, int currentTier) { Map> ndlinks = topologyManager.getNodeEdges(); @@ -632,8 +636,8 @@ public class HostTracker implements IfIptoHost, IfHostListener, } ArrayList needsVisiting = new ArrayList(); for (Edge lt : links) { - if (!lt.getHeadNodeConnector().getType().equals( - NodeConnector.NodeConnectorIDType.OPENFLOW)) { + if (!lt.getHeadNodeConnector().getType() + .equals(NodeConnector.NodeConnectorIDType.OPENFLOW)) { // We don't want to work on Node that are not openflow // for now continue; @@ -656,12 +660,14 @@ public class HostTracker implements IfIptoHost, IfHostListener, } /** - * Internal convenience routine to check the eligibility of a Switch for a Tier update. - * Any Node with Tier=0 or a Tier value that is greater than the new Tier Value is eligible - * for the update. - * - * @param n Node for which the Tier update eligibility is checked - * @param tier new Tier Value + * Internal convenience routine to check the eligibility of a Switch for a + * Tier update. Any Node with Tier=0 or a Tier value that is greater than + * the new Tier Value is eligible for the update. + * + * @param n + * Node for which the Tier update eligibility is checked + * @param tier + * new Tier Value * @return true if the Node is eligible for Tier Update * false otherwise */ @@ -690,9 +696,9 @@ public class HostTracker implements IfIptoHost, IfHostListener, } /** - * Internal convenience routine to clear all the Tier values to 0. - * This cleanup is performed during cases such as Topology Change where the existing Tier values - * might become incorrect + * Internal convenience routine to clear all the Tier values to 0. This + * cleanup is performed during cases such as Topology Change where the + * existing Tier values might become incorrect */ private void clearTiers() { Set nodes = null; @@ -727,12 +733,15 @@ public class HostTracker implements IfIptoHost, IfHostListener, } /** - * getHostNetworkHierarchy is the Back-end routine for the North-Bound API that returns - * the Network Hierarchy for a given Host. This API is typically used by applications like - * Hadoop for Rack Awareness functionality. - * - * @param hostAddress IP-Address of the host/node. - * @return Network Hierarchies represented by an Array of Array (of Switch-Ids as String). + * getHostNetworkHierarchy is the Back-end routine for the North-Bound API + * that returns the Network Hierarchy for a given Host. This API is + * typically used by applications like Hadoop for Rack Awareness + * functionality. + * + * @param hostAddress + * IP-Address of the host/node. + * @return Network Hierarchies represented by an Array of Array (of + * Switch-Ids as String). */ public List> getHostNetworkHierarchy(InetAddress hostAddress) { HostNodeConnector host = hostQuery(hostAddress); @@ -749,12 +758,13 @@ public class HostTracker implements IfIptoHost, IfHostListener, } /** - * dpidToHostNameHack is a hack function for Cisco Live Hadoop Demo. - * Mininet is used as the network for Hadoop Demos & in order to give a meaningful - * rack-awareness switch names, the DPID is organized in ASCII Characters and - * retrieved as string. - * - * @param dpid Switch DataPath Id + * dpidToHostNameHack is a hack function for Cisco Live Hadoop Demo. Mininet + * is used as the network for Hadoop Demos & in order to give a meaningful + * rack-awareness switch names, the DPID is organized in ASCII Characters + * and retrieved as string. + * + * @param dpid + * Switch DataPath Id * @return Ascii String represented by the DPID. */ private String dpidToHostNameHack(long dpid) { @@ -775,25 +785,28 @@ public class HostTracker implements IfIptoHost, IfHostListener, /** * A convenient recursive routine to obtain the Hierarchy of Switches. - * - * @param node Current Node in the Recursive routine. - * @param currHierarchy Array of Nodes that make this hierarchy on which the Current Switch belong - * @param fullHierarchy Array of multiple Hierarchies that represent a given host. + * + * @param node + * Current Node in the Recursive routine. + * @param currHierarchy + * Array of Nodes that make this hierarchy on which the Current + * Switch belong + * @param fullHierarchy + * Array of multiple Hierarchies that represent a given host. */ @SuppressWarnings("unchecked") private void updateCurrentHierarchy(Node node, ArrayList currHierarchy, List> fullHierarchy) { - //currHierarchy.add(String.format("%x", currSw.getId())); + // currHierarchy.add(String.format("%x", currSw.getId())); currHierarchy.add(dpidToHostNameHack((Long) node.getID())); ArrayList currHierarchyClone = (ArrayList) currHierarchy - .clone(); //Shallow copy as required + .clone(); // Shallow copy as required Map> ndlinks = topologyManager.getNodeEdges(); if (ndlinks == null) { - logger - .debug( - "updateCurrentHierarchy(): topologyManager returned null ndlinks for node: {}", - node); + logger.debug( + "updateCurrentHierarchy(): topologyManager returned null ndlinks for node: {}", + node); return; } Node n = NodeCreator.createOFNode((Long) node.getID()); @@ -803,8 +816,8 @@ public class HostTracker implements IfIptoHost, IfHostListener, return; } for (Edge lt : links) { - if (!lt.getHeadNodeConnector().getType().equals( - NodeConnector.NodeConnectorIDType.OPENFLOW)) { + if (!lt.getHeadNodeConnector().getType() + .equals(NodeConnector.NodeConnectorIDType.OPENFLOW)) { // We don't want to work on Node that are not openflow // for now continue; @@ -819,7 +832,7 @@ public class HostTracker implements IfIptoHost, IfHostListener, ArrayList buildHierarchy = currHierarchy; if (currHierarchy.size() > currHierarchyClone.size()) { buildHierarchy = (ArrayList) currHierarchyClone - .clone(); //Shallow copy as required + .clone(); // Shallow copy as required fullHierarchy.add(buildHierarchy); } updateCurrentHierarchy(dstNode, buildHierarchy, fullHierarchy); @@ -827,8 +840,7 @@ public class HostTracker implements IfIptoHost, IfHostListener, } } - @Override - public void edgeUpdate(Edge e, UpdateType type, Set props) { + private void edgeUpdate(Edge e, UpdateType type, Set props) { Long srcNid = null; Short srcPort = null; Long dstNid = null; @@ -868,11 +880,9 @@ public class HostTracker implements IfIptoHost, IfHostListener, // At this point we know we got an openflow update, so // lets fill everything accordingly. - srcNid = (Long) e.getTailNodeConnector().getNode() - .getID(); + srcNid = (Long) e.getTailNodeConnector().getNode().getID(); srcPort = (Short) e.getTailNodeConnector().getID(); - dstNid = (Long) e.getHeadNodeConnector().getNode() - .getID(); + dstNid = (Long) e.getHeadNodeConnector().getNode().getID(); dstPort = (Short) e.getHeadNodeConnector().getID(); // Now lets update the added flag @@ -886,8 +896,9 @@ public class HostTracker implements IfIptoHost, IfHostListener, } } - logger.debug("HostTracker Topology linkUpdate handling src:{}[port {}] dst:{}[port {}] added: {}", - new Object[] { srcNid, srcPort, dstNid, dstPort, added }); + logger.debug( + "HostTracker Topology linkUpdate handling src:{}[port {}] dst:{}[port {}] added: {}", + new Object[] { srcNid, srcPort, dstNid, dstPort, added }); clearTiers(); for (Entry entry : hostsDB.entrySet()) { HostNodeConnector host = entry.getValue(); @@ -900,6 +911,16 @@ public class HostTracker implements IfIptoHost, IfHostListener, } } + @Override + public void edgeUpdate(List topoedgeupdateList) { + 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(); + edgeUpdate(e, type, p); + } + } + public void subnetNotify(Subnet sub, boolean add) { logger.debug("Received subnet notification: {} add={}", sub, add); if (add) { @@ -922,35 +943,35 @@ public class HostTracker implements IfIptoHost, IfHostListener, for (int i = 0; i < ARPPendingList.size(); i++) { arphost = ARPPendingList.get(i); if (arphost.getSent_count() < switchManager.getHostRetryCount()) { - /* No reply has been received of first ARP Req, send the next one */ + /* + * No reply has been received of first ARP Req, send the + * next one + */ hostFinder.find(arphost.getHostIP()); arphost.sent_count++; logger.debug("ARP Sent from ARPPending List, IP: {}", arphost.getHostIP().getHostAddress()); } else if (arphost.getSent_count() >= switchManager .getHostRetryCount()) { - /* Two ARP requests have been sent without - * receiving a reply, remove this from the - * pending list + /* + * Two ARP requests have been sent without receiving a + * reply, remove this from the pending list */ removePendingARPFromList(i); - logger - .debug( - "ARP reply not received after two attempts, removing from Pending List IP: {}", - arphost.getHostIP().getHostAddress()); + logger.debug( + "ARP reply not received after two attempts, removing from Pending List IP: {}", + arphost.getHostIP().getHostAddress()); /* - * Add this host to a different list which will be processed on link - * up events + * Add this host to a different list which will be processed + * on link up events */ logger.debug("Adding the host to FailedARPReqList IP: {}", arphost.getHostIP().getHostAddress()); failedARPReqList.add(arphost); } else { - logger - .error( - "Inavlid arp_sent count for entery at index: {}", - i); + logger.error( + "Inavlid arp_sent count for entery at index: {}", i); } } } @@ -972,8 +993,7 @@ public class HostTracker implements IfIptoHost, IfHostListener, } if (hostsDB == null) { /* hostsDB is not allocated yet */ - logger - .error("ARPRefreshHandler(): hostsDB is not allocated yet:"); + logger.error("ARPRefreshHandler(): hostsDB is not allocated yet:"); return; } for (Entry entry : hostsDB @@ -989,16 +1009,24 @@ public class HostTracker implements IfIptoHost, IfHostListener, if (arp_cntdown > switchManager.getHostRetryCount()) { host.setArpSendCountDown(arp_cntdown); } else if (arp_cntdown <= 0) { - /* No ARP Reply received in last 2 minutes, remove this host and inform applications*/ + /* + * No ARP Reply received in last 2 minutes, remove this host + * and inform applications + */ removeKnownHost(entry.getKey()); notifyHostLearnedOrRemoved(host, false); } else if (arp_cntdown <= switchManager.getHostRetryCount()) { - /* Use the services of arphandler to check if host is still there */ - logger.trace("ARP Probing ({}) for {}({})", new Object[] { - arp_cntdown, - host.getNetworkAddress().getHostAddress(), - HexEncode.bytesToHexString(host - .getDataLayerAddressBytes()) }); + /* + * Use the services of arphandler to check if host is still + * there + */ + logger.trace( + "ARP Probing ({}) for {}({})", + new Object[] { + arp_cntdown, + host.getNetworkAddress().getHostAddress(), + HexEncode.bytesToHexString(host + .getDataLayerAddressBytes()) }); host.setArpSendCountDown(arp_cntdown); hostFinder.probe(host); } @@ -1007,81 +1035,89 @@ public class HostTracker implements IfIptoHost, IfHostListener, } /** - * Inform the controller IP to MAC binding of a host and its - * connectivity to an openflow switch in terms of Node, port, and - * VLAN. - * - * @param networkAddr IP address of the host - * @param dataLayer Address MAC address of the host - * @param nc NodeConnector to which host is connected - * @param port Port of the switch to which host is connected - * @param vlan Vlan of which this host is member of - * - * @return Status The status object as described in {@code Status} - * indicating the result of this action. + * Inform the controller IP to MAC binding of a host and its connectivity to + * an openflow switch in terms of Node, port, and VLAN. + * + * @param networkAddr + * IP address of the host + * @param dataLayer + * Address MAC address of the host + * @param nc + * NodeConnector to which host is connected + * @param port + * Port of the switch to which host is connected + * @param vlan + * Vlan of which this host is member of + * + * @return Status The status object as described in {@code Status} + * indicating the result of this action. */ public Status addStaticHostReq(InetAddress networkAddr, byte[] dataLayerAddress, NodeConnector nc, short vlan) { if (dataLayerAddress.length != 6) { - return new Status(StatusCode.BADREQUEST, "Invalid MAC address"); + return new Status(StatusCode.BADREQUEST, "Invalid MAC address"); } HostNodeConnector host = null; try { host = new HostNodeConnector(dataLayerAddress, networkAddr, nc, - vlan); + vlan); if (hostExists(host)) { - // This host is already learned either via ARP or through a northbound request + // This host is already learned either via ARP or through a + // northbound request HostNodeConnector transHost = hostsDB.get(networkAddr); transHost.setStaticHost(true); return new Status(StatusCode.SUCCESS, null); } host.setStaticHost(true); /* - * Before adding host, Check if the switch and the port have already come up + * Before adding host, Check if the switch and the port have already + * come up */ if (switchManager.isNodeConnectorEnabled(nc)) { learnNewHost(host); notifyHostLearnedOrRemoved(host, true); } else { inactiveStaticHosts.put(nc, host); - logger - .debug( - "Switch or switchport is not up, adding host {} to inactive list", - networkAddr.getHostName()); + logger.debug( + "Switch or switchport is not up, adding host {} to inactive list", + networkAddr.getHostName()); } return new Status(StatusCode.SUCCESS, null); } catch (ConstructionException e) { - return new Status(StatusCode.INTERNALERROR, "Host could not be created"); + return new Status(StatusCode.INTERNALERROR, + "Host could not be created"); } } /** - * Update the controller IP to MAC binding of a host and its - * connectivity to an openflow switch in terms of - * switch id, switch port, and VLAN. - * - * @param networkAddr IP address of the host - * @param dataLayer Address MAC address of the host - * @param nc NodeConnector to which host is connected - * @param port Port of the switch to which host is connected - * @param vlan Vlan of which this host is member of - * - * @return boolean true if the host was added successfully, - * false otherwise + * Update the controller IP to MAC binding of a host and its connectivity to + * an openflow switch in terms of switch id, switch port, and VLAN. + * + * @param networkAddr + * IP address of the host + * @param dataLayer + * Address MAC address of the host + * @param nc + * NodeConnector to which host is connected + * @param port + * Port of the switch to which host is connected + * @param vlan + * Vlan of which this host is member of + * + * @return boolean true if the host was added successfully, false otherwise */ public boolean updateHostReq(InetAddress networkAddr, - byte[] dataLayerAddress, NodeConnector nc, - short vlan) { + byte[] dataLayerAddress, NodeConnector nc, short vlan) { if (nc == null) { return false; } HostNodeConnector host = null; try { host = new HostNodeConnector(dataLayerAddress, networkAddr, nc, - vlan); + vlan); if (!hostExists(host)) { if ((inactiveStaticHosts.get(nc)) != null) { inactiveStaticHosts.replace(nc, host); @@ -1099,11 +1135,12 @@ public class HostTracker implements IfIptoHost, IfHostListener, /** * Remove from the controller IP to MAC binding of a host and its * connectivity to an openflow switch - * - * @param networkAddr IP address of the host - * - * @return boolean true if the host was removed successfully, - * false otherwise + * + * @param networkAddr + * IP address of the host + * + * @return boolean true if the host was removed successfully, false + * otherwise */ public Status removeStaticHostReq(InetAddress networkAddress) { @@ -1112,9 +1149,8 @@ public class HostTracker implements IfIptoHost, IfHostListener, if (host != null) { // Validation check if (!host.isStaticHost()) { - return new Status(StatusCode.FORBIDDEN, - "Host " + networkAddress.getHostName() + - " is not static"); + return new Status(StatusCode.FORBIDDEN, "Host " + + networkAddress.getHostName() + " is not static"); } // Remove and notify notifyHostLearnedOrRemoved(host, false); @@ -1128,9 +1164,8 @@ public class HostTracker implements IfIptoHost, IfHostListener, host = entry.getValue(); // Validation check if (!host.isStaticHost()) { - return new Status(StatusCode.FORBIDDEN, - "Host " + networkAddress.getHostName() + - " is not static"); + return new Status(StatusCode.FORBIDDEN, "Host " + + networkAddress.getHostName() + " is not static"); } this.removeHostFromInactiveDB(networkAddress); return new Status(StatusCode.SUCCESS, null); @@ -1154,8 +1189,8 @@ public class HostTracker implements IfIptoHost, IfHostListener, switch (type) { case REMOVED: long sid = (Long) node.getID(); - logger.debug("Received removedSwitch for sw id {}", HexEncode - .longToHexString(sid)); + logger.debug("Received removedSwitch for sw id {}", + HexEncode.longToHexString(sid)); for (Entry entry : hostsDB .entrySet()) { HostNodeConnector host = entry.getValue(); @@ -1204,19 +1239,17 @@ public class HostTracker implements IfIptoHost, IfHostListener, @Override public Status addStaticHost(String networkAddress, String dataLayerAddress, - NodeConnector nc, String vlan) { + NodeConnector nc, String vlan) { try { InetAddress ip = InetAddress.getByName(networkAddress); if (nc == null) { - return new Status(StatusCode.BADREQUEST, "Invalid NodeId"); + return new Status(StatusCode.BADREQUEST, "Invalid NodeId"); } return addStaticHostReq(ip, - HexEncode - .bytesFromHexString(dataLayerAddress), - nc, + HexEncode.bytesFromHexString(dataLayerAddress), nc, Short.valueOf(vlan)); } catch (UnknownHostException e) { - logger.error("",e); + logger.error("", e); return new Status(StatusCode.BADREQUEST, "Invalid Address"); } } @@ -1228,7 +1261,7 @@ public class HostTracker implements IfIptoHost, IfHostListener, address = InetAddress.getByName(networkAddress); return removeStaticHostReq(address); } catch (UnknownHostException e) { - logger.error("",e); + logger.error("", e); return new Status(StatusCode.BADREQUEST, "Invalid Address"); } } @@ -1304,7 +1337,7 @@ public class HostTracker implements IfIptoHost, IfHostListener, /** * Function called by the dependency manager when all the required * dependencies are satisfied - * + * */ void init(Component c) { Dictionary props = c.getServiceProperties(); @@ -1319,29 +1352,28 @@ public class HostTracker implements IfIptoHost, IfHostListener, } /** - * 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() { destroyCache(); } /** - * Function called by dependency manager after "init ()" is called - * and after the services provided by the class are registered in - * the service registry - * + * Function called by dependency manager after "init ()" is called and after + * the services provided by the class are registered in the service registry + * */ void start() { } /** - * Function called by the dependency manager before the services - * exported by the component are unregistered, this will be - * followed by a "destroy ()" calls - * + * Function called by the dependency manager before the services exported by + * the component are unregistered, this will be followed by a "destroy ()" + * calls + * */ void stop() { } diff --git a/opendaylight/hosttracker/integrationtest/pom.xml b/opendaylight/hosttracker/integrationtest/pom.xml index ff08cf334c..0d2d18ca27 100644 --- a/opendaylight/hosttracker/integrationtest/pom.xml +++ b/opendaylight/hosttracker/integrationtest/pom.xml @@ -27,7 +27,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/hosttracker/integrationtest/src/test/java/org/opendaylight/controller/hosttracker/internal/HostTrackerIntegrationTest.java b/opendaylight/hosttracker/integrationtest/src/test/java/org/opendaylight/controller/hosttracker/internal/HostTrackerIntegrationTest.java index f351d1afcb..fb5367c528 100644 --- a/opendaylight/hosttracker/integrationtest/src/test/java/org/opendaylight/controller/hosttracker/internal/HostTrackerIntegrationTest.java +++ b/opendaylight/hosttracker/integrationtest/src/test/java/org/opendaylight/controller/hosttracker/internal/HostTrackerIntegrationTest.java @@ -108,7 +108,7 @@ public class HostTrackerIntegrationTest { // List all the bundles on which the test case depends mavenBundle("org.opendaylight.controller", "sal", - "0.4.0-SNAPSHOT"), + "0.5.0-SNAPSHOT"), mavenBundle("org.opendaylight.controller", "sal.implementation", "0.4.0-SNAPSHOT"), diff --git a/opendaylight/northbound/commons/pom.xml b/opendaylight/northbound/commons/pom.xml index d52bedf819..d80d669edf 100644 --- a/opendaylight/northbound/commons/pom.xml +++ b/opendaylight/northbound/commons/pom.xml @@ -43,7 +43,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/northbound/flowprogrammer/pom.xml b/opendaylight/northbound/flowprogrammer/pom.xml index 1bfd4ebf12..a4ebfa2b64 100644 --- a/opendaylight/northbound/flowprogrammer/pom.xml +++ b/opendaylight/northbound/flowprogrammer/pom.xml @@ -22,7 +22,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT @@ -76,7 +76,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.codehaus.enunciate diff --git a/opendaylight/northbound/hosttracker/pom.xml b/opendaylight/northbound/hosttracker/pom.xml index eab9fcb0c7..5ddab37ff3 100644 --- a/opendaylight/northbound/hosttracker/pom.xml +++ b/opendaylight/northbound/hosttracker/pom.xml @@ -22,7 +22,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT @@ -81,7 +81,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/northbound/staticrouting/pom.xml b/opendaylight/northbound/staticrouting/pom.xml index eeaf550e6b..f0fd323710 100644 --- a/opendaylight/northbound/staticrouting/pom.xml +++ b/opendaylight/northbound/staticrouting/pom.xml @@ -22,7 +22,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT @@ -62,7 +62,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/northbound/statistics/pom.xml b/opendaylight/northbound/statistics/pom.xml index e10a5b1e1f..84c4020369 100644 --- a/opendaylight/northbound/statistics/pom.xml +++ b/opendaylight/northbound/statistics/pom.xml @@ -22,7 +22,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT @@ -80,7 +80,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT diff --git a/opendaylight/northbound/subnets/pom.xml b/opendaylight/northbound/subnets/pom.xml index cfba4ffce9..22c9a97458 100644 --- a/opendaylight/northbound/subnets/pom.xml +++ b/opendaylight/northbound/subnets/pom.xml @@ -22,7 +22,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller @@ -76,7 +76,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/northbound/switchmanager/pom.xml b/opendaylight/northbound/switchmanager/pom.xml index e4c73ac743..25757e66c4 100644 --- a/opendaylight/northbound/switchmanager/pom.xml +++ b/opendaylight/northbound/switchmanager/pom.xml @@ -22,7 +22,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT @@ -78,7 +78,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT diff --git a/opendaylight/northbound/topology/pom.xml b/opendaylight/northbound/topology/pom.xml index c31b478fb5..0cfa487f1c 100644 --- a/opendaylight/northbound/topology/pom.xml +++ b/opendaylight/northbound/topology/pom.xml @@ -23,7 +23,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT @@ -79,7 +79,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/protocol_plugins/openflow/pom.xml b/opendaylight/protocol_plugins/openflow/pom.xml index 614b0ff818..23c0d9d90e 100644 --- a/opendaylight/protocol_plugins/openflow/pom.xml +++ b/opendaylight/protocol_plugins/openflow/pom.xml @@ -62,7 +62,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller.thirdparty diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/IInventoryShimExternalListener.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/IInventoryShimExternalListener.java index 24e63df30a..df03a04384 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/IInventoryShimExternalListener.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/IInventoryShimExternalListener.java @@ -10,10 +10,8 @@ package org.opendaylight.controller.protocol_plugin.openflow; /** - * Wrapper of Interface class that provides inventory updates locally in the - * protocol plugin - * - * + * Wrapper of Interface that provides inventory updates locally in the protocol + * plugin. */ public interface IInventoryShimExternalListener extends IInventoryShimInternalListener { diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/IInventoryShimInternalListener.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/IInventoryShimInternalListener.java index e7c11a6eea..6b328961fc 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/IInventoryShimInternalListener.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/IInventoryShimInternalListener.java @@ -17,10 +17,8 @@ import org.opendaylight.controller.sal.core.Property; import org.opendaylight.controller.sal.core.UpdateType; /** - * Interface class that provides inventory updates to inventory listeners - * within the protocol plugin - * - * + * The Interface provides inventory updates to inventory listeners within the + * protocol plugin */ public interface IInventoryShimInternalListener { /** diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/ITopologyServiceShimListener.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/ITopologyServiceShimListener.java index 23b40a3e30..0c30c80f0d 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/ITopologyServiceShimListener.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/ITopologyServiceShimListener.java @@ -16,9 +16,7 @@ import org.opendaylight.controller.sal.core.Property; import org.opendaylight.controller.sal.core.UpdateType; /** - * Interface class that provides Edge updates to the topology listeners - * - * + * The Interface provides Edge updates to the topology listeners */ public interface ITopologyServiceShimListener { /** diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/Activator.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/Activator.java index 9bccbd1d68..9b7d1e3bc2 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/Activator.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/Activator.java @@ -358,8 +358,9 @@ public class Activator extends ComponentActivatorAbstractBase { if (imp.equals(TopologyServiceShim.class)) { c.setInterface(new String[] { IDiscoveryService.class.getName(), IContainerListener.class.getName(), - IRefreshInternalProvider.class.getName() }, null); - c.add(createServiceDependency() + IRefreshInternalProvider.class.getName(), + IInventoryShimExternalListener.class.getName() }, null); + c.add(createServiceDependency() .setService(ITopologyServiceShimListener.class) .setCallbacks("setTopologyServiceShimListener", "unsetTopologyServiceShimListener") diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/OFStatisticsManager.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/OFStatisticsManager.java index 98a2962606..9dc8b3b6aa 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/OFStatisticsManager.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/OFStatisticsManager.java @@ -175,6 +175,8 @@ public class OFStatisticsManager implements IOFStatisticsManager, txRates = new HashMap>(initialSize); descriptionListeners = new HashSet(); + configStatsPollIntervals(); + // Initialize managed timers statisticsTimer = new Timer(); statisticsTimerTask = new TimerTask() { @@ -876,6 +878,8 @@ public class OFStatisticsManager implements IOFStatisticsManager, help.append("---OF Statistics Manager utilities---\n"); help.append("\t ofdumpstatsmgr - " + "Print Internal Stats Mgr db\n"); + help.append("\t ofstatsmgrintervals (in seconds) - " + + "Set/Show flow/port/dedscription stats poll intervals\n"); return help.toString(); } @@ -1001,33 +1005,76 @@ public class OFStatisticsManager implements IOFStatisticsManager, public void _ofstatsmgrintervals(CommandInterpreter ci) { String flowStatsInterv = ci.nextArgument(); String portStatsInterv = ci.nextArgument(); + String descStatsInterv = ci.nextArgument(); - if (flowStatsInterv == null || portStatsInterv == null) { - - ci.println("Usage: ostatsmgrintervals (in seconds)"); + if (flowStatsInterv == null || portStatsInterv == null + || descStatsInterv == null) { + ci.println("Usage: ostatsmgrintervals (in seconds)"); ci.println("Current Values: fP=" + statisticsTickNumber + "s pP=" - + portTickNumber + "s"); + + portTickNumber + "s dP=" + descriptionTickNumber + "s"); return; } - Short fP, pP; + Short fP, pP, dP; try { fP = Short.parseShort(flowStatsInterv); pP = Short.parseShort(portStatsInterv); + dP = Short.parseShort(descStatsInterv); } catch (Exception e) { ci.println("Invalid format values: " + e.getMessage()); return; } - if (pP <= 1 || fP <= 1) { - ci.println("Invalid values. fP and pP have to be greater than 1."); + if (pP <= 1 || fP <= 1 || dP <= 1) { + ci.println("Invalid values. fP, pP, dP have to be greater than 1."); return; } statisticsTickNumber = fP; portTickNumber = pP; + descriptionTickNumber = dP; ci.println("New Values: fP=" + statisticsTickNumber + "s pP=" - + portTickNumber + "s"); + + portTickNumber + "s dP=" + descriptionTickNumber + "s"); } + /** + * This method retrieves user configurations from config.ini and updates + * statisticsTickNumber/portTickNumber/descriptionTickNumber accordingly. + */ + private void configStatsPollIntervals() { + String fsStr = System.getProperty("of.flowStatsPollInterval"); + String psStr = System.getProperty("of.portStatsPollInterval"); + String dsStr = System.getProperty("of.descStatsPollInterval"); + Short fs, ps, ds; + + if (fsStr != null) { + try { + fs = Short.parseShort(fsStr); + if (fs > 0) { + statisticsTickNumber = fs; + } + } catch (Exception e) { + } + } + + if (psStr != null) { + try { + ps = Short.parseShort(psStr); + if (ps > 0) { + portTickNumber = ps; + } + } catch (Exception e) { + } + } + + if (dsStr != null) { + try { + ds = Short.parseShort(dsStr); + if (ds > 0) { + descriptionTickNumber = ds; + } + } catch (Exception e) { + } + } + } } diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/TopologyServiceShim.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/TopologyServiceShim.java index 424af8d4f4..af502a2177 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/TopologyServiceShim.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/TopologyServiceShim.java @@ -24,6 +24,7 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import org.eclipse.osgi.framework.console.CommandInterpreter; import org.eclipse.osgi.framework.console.CommandProvider; +import org.opendaylight.controller.protocol_plugin.openflow.IInventoryShimExternalListener; import org.opendaylight.controller.protocol_plugin.openflow.IOFStatisticsManager; import org.opendaylight.controller.protocol_plugin.openflow.IRefreshInternalProvider; import org.opendaylight.controller.protocol_plugin.openflow.ITopologyServiceShimListener; @@ -33,12 +34,14 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.opendaylight.controller.sal.core.Bandwidth; +import org.opendaylight.controller.sal.core.Config; import org.opendaylight.controller.sal.core.ContainerFlow; import org.opendaylight.controller.sal.core.Edge; import org.opendaylight.controller.sal.core.IContainerListener; import org.opendaylight.controller.sal.core.Node; import org.opendaylight.controller.sal.core.NodeConnector; import org.opendaylight.controller.sal.core.Property; +import org.opendaylight.controller.sal.core.State; import org.opendaylight.controller.sal.core.UpdateType; import org.opendaylight.controller.sal.discovery.IDiscoveryService; import org.opendaylight.controller.sal.utils.GlobalConstants; @@ -49,7 +52,8 @@ import org.opendaylight.controller.sal.utils.GlobalConstants; * container configurations. */ public class TopologyServiceShim implements IDiscoveryService, - IContainerListener, CommandProvider, IRefreshInternalProvider { + IContainerListener, CommandProvider, IRefreshInternalProvider, + IInventoryShimExternalListener { protected static final Logger logger = LoggerFactory .getLogger(TopologyServiceShim.class); private ConcurrentMap topologyServiceShimListeners = new ConcurrentHashMap(); @@ -645,4 +649,56 @@ public class TopologyServiceShim implements IDiscoveryService, logger.debug("Sent {} updates", i); } + @Override + public void updateNode(Node node, UpdateType type, Set props) { + } + + @Override + public void updateNodeConnector(NodeConnector nodeConnector, + UpdateType type, Set props) { + List containers = new ArrayList(); + List conList = this.containerMap.get(nodeConnector); + + containers.add(GlobalConstants.DEFAULT.toString()); + if (conList != null) { + containers.addAll(conList); + } + + switch (type) { + case ADDED: + break; + case CHANGED: + if (props == null) { + break; + } + + boolean rmEdge = false; + for (Property prop : props) { + if (((prop instanceof Config) && (((Config) prop).getValue() != Config.ADMIN_UP)) + || ((prop instanceof State) && (((State) prop) + .getValue() != State.EDGE_UP))) { + /* + * If port admin down or link down, remove the edges + * associated with the port + */ + rmEdge = true; + break; + } + } + + if (rmEdge) { + for (String cName : containers) { + removeNodeConnector(cName, nodeConnector); + } + } + break; + case REMOVED: + for (String cName : containers) { + removeNodeConnector(cName, nodeConnector); + } + break; + default: + break; + } + } } diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/TopologyServices.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/TopologyServices.java index 64515887c0..c0b296345e 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/TopologyServices.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/TopologyServices.java @@ -9,7 +9,9 @@ package org.opendaylight.controller.protocol_plugin.openflow.internal; import java.util.Dictionary; +import java.util.List; import java.util.Set; +import java.util.ArrayList; import org.apache.felix.dm.Component; import org.opendaylight.controller.protocol_plugin.openflow.IRefreshInternalProvider; @@ -22,6 +24,7 @@ import org.opendaylight.controller.sal.core.Property; import org.opendaylight.controller.sal.core.UpdateType; import org.opendaylight.controller.sal.topology.IPluginInTopologyService; import org.opendaylight.controller.sal.topology.IPluginOutTopologyService; +import org.opendaylight.controller.sal.topology.TopoEdgeUpdate; public class TopologyServices implements ITopologyServiceShimListener, IPluginInTopologyService { @@ -129,7 +132,10 @@ public class TopologyServices implements ITopologyServiceShimListener, @Override public void edgeUpdate(Edge edge, UpdateType type, Set props) { if (this.salTopoService != null) { - this.salTopoService.edgeUpdate(edge, type, props); + List topoedgeupdateList = new ArrayList(); + TopoEdgeUpdate teu = new TopoEdgeUpdate(edge, props, type); + topoedgeupdateList.add(teu); + this.salTopoService.edgeUpdate(topoedgeupdateList); } } diff --git a/opendaylight/protocol_plugins/stub/pom.xml b/opendaylight/protocol_plugins/stub/pom.xml index 36085c9e3b..c257099825 100644 --- a/opendaylight/protocol_plugins/stub/pom.xml +++ b/opendaylight/protocol_plugins/stub/pom.xml @@ -51,7 +51,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT junit diff --git a/opendaylight/routing/dijkstra_implementation/pom.xml b/opendaylight/routing/dijkstra_implementation/pom.xml index e89beb8c36..06a684f265 100644 --- a/opendaylight/routing/dijkstra_implementation/pom.xml +++ b/opendaylight/routing/dijkstra_implementation/pom.xml @@ -26,6 +26,7 @@ org.slf4j, org.opendaylight.controller.sal.routing, org.opendaylight.controller.sal.core, + org.opendaylight.controller.sal.topology, org.opendaylight.controller.sal.utils, org.opendaylight.controller.sal.reader, org.apache.commons.collections15, @@ -54,7 +55,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/routing/dijkstra_implementation/src/main/java/org/opendaylight/controller/routing/dijkstra_implementation/internal/DijkstraImplementation.java b/opendaylight/routing/dijkstra_implementation/src/main/java/org/opendaylight/controller/routing/dijkstra_implementation/internal/DijkstraImplementation.java index 586432d8c0..d878b231bc 100644 --- a/opendaylight/routing/dijkstra_implementation/src/main/java/org/opendaylight/controller/routing/dijkstra_implementation/internal/DijkstraImplementation.java +++ b/opendaylight/routing/dijkstra_implementation/src/main/java/org/opendaylight/controller/routing/dijkstra_implementation/internal/DijkstraImplementation.java @@ -1,4 +1,3 @@ - /* * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * @@ -27,7 +26,9 @@ import org.opendaylight.controller.sal.core.Property; import org.opendaylight.controller.sal.core.UpdateType; import org.opendaylight.controller.sal.reader.IReadService; import org.opendaylight.controller.sal.routing.IListenRoutingUpdates; + import org.opendaylight.controller.sal.routing.IRouting; +import org.opendaylight.controller.sal.topology.TopoEdgeUpdate; import org.opendaylight.controller.switchmanager.ISwitchManager; import org.opendaylight.controller.topologymanager.ITopologyManager; import org.opendaylight.controller.topologymanager.ITopologyManagerAware; @@ -41,6 +42,7 @@ import java.lang.IllegalArgumentException; import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.ArrayList; import java.util.Set; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -54,7 +56,7 @@ public class DijkstraImplementation implements IRouting, ITopologyManagerAware { .getLogger(DijkstraImplementation.class); private ConcurrentMap> topologyBWAware; private ConcurrentMap> sptBWAware; - DijkstraShortestPath mtp; //Max Throughput Path + DijkstraShortestPath mtp; // Max Throughput Path private Set routingAware; private ISwitchManager switchManager; private ITopologyManager topologyManager; @@ -112,13 +114,19 @@ public class DijkstraImplementation implements IRouting, ITopologyManagerAware { Bandwidth.BandwidthPropName); long srcLinkSpeed = 0, dstLinkSpeed = 0; - if ((bwSrc == null) || ((srcLinkSpeed = bwSrc.getValue()) == 0)) { - log.debug("srcNC: {} - Setting srcLinkSpeed to Default!",srcNC); - srcLinkSpeed = DEFAULT_LINK_SPEED; + if ((bwSrc == null) + || ((srcLinkSpeed = bwSrc.getValue()) == 0)) { + log.debug( + "srcNC: {} - Setting srcLinkSpeed to Default!", + srcNC); + srcLinkSpeed = DEFAULT_LINK_SPEED; } - - if ((bwDst == null) || ((dstLinkSpeed = bwDst.getValue()) == 0)) { - log.debug("dstNC: {} - Setting dstLinkSpeed to Default!",dstNC); + + if ((bwDst == null) + || ((dstLinkSpeed = bwDst.getValue()) == 0)) { + log.debug( + "dstNC: {} - Setting dstLinkSpeed to Default!", + dstNC); dstLinkSpeed = DEFAULT_LINK_SPEED; } @@ -127,13 +135,14 @@ public class DijkstraImplementation implements IRouting, ITopologyManagerAware { long avlDstThruPut = dstLinkSpeed - readService.getTransmitRate(dstNC); - //Use lower of the 2 available thruput as the available thruput + // Use lower of the 2 available thruput as the available + // thruput long avlThruPut = avlSrcThruPut < avlDstThruPut ? avlSrcThruPut : avlDstThruPut; if (avlThruPut <= 0) { - log.debug("Edge {}: Available Throughput {} <= 0!", - e, avlThruPut); + log.debug("Edge {}: Available Throughput {} <= 0!", e, + avlThruPut); return (double) -1; } return (double) (Bandwidth.BW1Pbps / avlThruPut); @@ -147,7 +156,7 @@ public class DijkstraImplementation implements IRouting, ITopologyManagerAware { }; } Short baseBW = Short.valueOf((short) 0); - //Initialize mtp also using the default topo + // Initialize mtp also using the default topo Graph g = this.topologyBWAware.get(baseBW); if (g == null) { log.error("Default Topology Graph is null"); @@ -175,16 +184,16 @@ public class DijkstraImplementation implements IRouting, ITopologyManagerAware { try { path = mtp.getMaxThroughputPath(src, dst); } catch (IllegalArgumentException ie) { - log.debug("A vertex is yet not known between {} {}", src.toString(), - dst.toString()); + log.debug("A vertex is yet not known between {} {}", + src.toString(), dst.toString()); return null; } Path res; try { res = new Path(path); } catch (ConstructionException e) { - log.debug("A vertex is yet not known between {} {}", src.toString(), - dst.toString()); + log.debug("A vertex is yet not known between {} {}", + src.toString(), dst.toString()); return null; } return res; @@ -199,16 +208,16 @@ public class DijkstraImplementation implements IRouting, ITopologyManagerAware { try { path = spt.getPath(src, dst); } catch (IllegalArgumentException ie) { - log.debug("A vertex is yet not known between {} {}", src.toString(), - dst.toString()); + log.debug("A vertex is yet not known between {} {}", + src.toString(), dst.toString()); return null; } Path res; try { res = new Path(path); } catch (ConstructionException e) { - log.debug("A vertex is yet not known between {} {}", src.toString(), - dst.toString()); + log.debug("A vertex is yet not known between {} {}", + src.toString(), dst.toString()); return null; } return res; @@ -229,11 +238,11 @@ public class DijkstraImplementation implements IRouting, ITopologyManagerAware { @Override public synchronized void clearMaxThroughput() { if (mtp != null) { - mtp.reset(); //reset maxthruput path + mtp.reset(); // reset maxthruput path } } - @SuppressWarnings( { "rawtypes", "unchecked" }) + @SuppressWarnings({ "rawtypes", "unchecked" }) private synchronized boolean updateTopo(Edge edge, Short bw, boolean added) { Graph topo = this.topologyBWAware.get(bw); DijkstraShortestPath spt = this.sptBWAware.get(bw); @@ -265,20 +274,19 @@ public class DijkstraImplementation implements IRouting, ITopologyManagerAware { edgePresentInGraph = topo.containsEdge(edge); if (edgePresentInGraph == false) { try { - topo.addEdge(new Edge(src, dst), src - .getNode(), dst - .getNode(), EdgeType.DIRECTED); + topo.addEdge(new Edge(src, dst), src.getNode(), + dst.getNode(), EdgeType.DIRECTED); } catch (ConstructionException e) { - log.error("",e); + log.error("", e); return edgePresentInGraph; } } } else { - //Remove the edge + // Remove the edge try { topo.removeEdge(new Edge(src, dst)); } catch (ConstructionException e) { - log.error("",e); + log.error("", e); return edgePresentInGraph; } @@ -308,26 +316,25 @@ public class DijkstraImplementation implements IRouting, ITopologyManagerAware { return edgePresentInGraph; } - @Override - public void edgeUpdate(Edge e, UpdateType type, Set props) { + private boolean edgeUpdate(Edge e, UpdateType type, Set props) { String srcType = null; String dstType = null; if (e == null || type == null) { log.error("Edge or Update type are null!"); - return; + return false; } else { srcType = e.getTailNodeConnector().getType(); dstType = e.getHeadNodeConnector().getType(); if (srcType.equals(NodeConnector.NodeConnectorIDType.PRODUCTION)) { log.debug("Skip updates for {}", e); - return; + return false; } if (dstType.equals(NodeConnector.NodeConnectorIDType.PRODUCTION)) { log.debug("Skip updates for {}", e); - return; + return false; } } @@ -347,13 +354,27 @@ public class DijkstraImplementation implements IRouting, ITopologyManagerAware { // Update BW topo updateTopo(e, (short) bw.getValue(), add); } - if (this.routingAware != null) { - for (IListenRoutingUpdates ra : this.routingAware) { - try { - ra.recalculateDone(); - } catch (Exception ex) { - log.error("Exception on routingAware listener call", e); - } + } + return newEdge; + } + + @Override + public void edgeUpdate(List topoedgeupdateList) { + boolean callListeners = false; + 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(); + if ((edgeUpdate(e, type, p)) && (!callListeners)) { + callListeners = true; + } + } + if ((callListeners) && (this.routingAware != null)) { + for (IListenRoutingUpdates ra : this.routingAware) { + try { + ra.recalculateDone(); + } catch (Exception ex) { + log.error("Exception on routingAware listener call", ex); } } } @@ -362,62 +383,67 @@ public class DijkstraImplementation implements IRouting, ITopologyManagerAware { /** * Function called by the dependency manager when all the required * dependencies are satisfied - * + * */ @SuppressWarnings({ "unchecked", "rawtypes" }) public void init() { - log.debug("Routing init() is called"); - this.topologyBWAware = (ConcurrentMap>) new ConcurrentHashMap(); - this.sptBWAware = (ConcurrentMap>) new ConcurrentHashMap(); - // Now create the default topology, which doesn't consider the - // BW, also create the corresponding Dijkstra calculation - Graph g = new SparseMultigraph(); - Short sZero = Short.valueOf((short) 0); - this.topologyBWAware.put(sZero, g); - this.sptBWAware.put(sZero, new DijkstraShortestPath(g)); - // Topologies for other BW will be added on a needed base + log.debug("Routing init() is called"); + this.topologyBWAware = (ConcurrentMap>) new ConcurrentHashMap(); + this.sptBWAware = (ConcurrentMap>) new ConcurrentHashMap(); + // Now create the default topology, which doesn't consider the + // BW, also create the corresponding Dijkstra calculation + Graph g = new SparseMultigraph(); + Short sZero = Short.valueOf((short) 0); + this.topologyBWAware.put(sZero, g); + this.sptBWAware.put(sZero, new DijkstraShortestPath(g)); + // Topologies for other BW will be added on a needed base } + /** * 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() { - log.debug("Routing destroy() is called"); + log.debug("Routing destroy() is called"); } /** - * Function called by dependency manager after "init ()" is called - * and after the services provided by the class are registered in - * the service registry - * + * Function called by dependency manager after "init ()" is called and after + * the services provided by the class are registered in the service registry + * */ - void start() { - log.debug("Routing start() is called"); - // build the routing database from the topology if it exists. - Map> edges = topologyManager.getEdges(); - if (edges.isEmpty()) { - return; - } - log.debug("Creating routing database from the topology"); - for (Iterator>> i = edges.entrySet().iterator(); i.hasNext();) { - Map.Entry> entry = i.next(); - Edge e = entry.getKey(); - Set props = entry.getValue(); - edgeUpdate(e, UpdateType.ADDED, props); - } - } + void start() { + log.debug("Routing start() is called"); + // build the routing database from the topology if it exists. + Map> edges = topologyManager.getEdges(); + if (edges.isEmpty()) { + return; + } + List topoedgeupdateList = new ArrayList(); + log.debug("Creating routing database from the topology"); + for (Iterator>> i = edges.entrySet() + .iterator(); i.hasNext();) { + Map.Entry> entry = i.next(); + Edge e = entry.getKey(); + Set props = entry.getValue(); + TopoEdgeUpdate topoedgeupdate = new TopoEdgeUpdate(e, props, + UpdateType.ADDED); + topoedgeupdateList.add(topoedgeupdate); + } + edgeUpdate(topoedgeupdateList); + } /** * Function called by the dependency manager before the services exported by * the component are unregistered, this will be followed by a "destroy ()" * calls - * + * */ - public void stop() { - log.debug("Routing stop() is called"); - } + public void stop() { + log.debug("Routing stop() is called"); + } @Override public void edgeOverUtilized(Edge edge) { @@ -450,14 +476,14 @@ public class DijkstraImplementation implements IRouting, ITopologyManagerAware { this.readService = null; } } - + public void setTopologyManager(ITopologyManager tm) { - this.topologyManager = tm; + this.topologyManager = tm; } - + public void unsetTopologyManager(ITopologyManager tm) { - if (this.topologyManager == tm) { - this.topologyManager = null; - } + if (this.topologyManager == tm) { + this.topologyManager = null; + } } } diff --git a/opendaylight/routing/dijkstra_implementation/src/test/java/org/opendaylight/controller/routing/dijkstra_implementation/DijkstraTest.java b/opendaylight/routing/dijkstra_implementation/src/test/java/org/opendaylight/controller/routing/dijkstra_implementation/DijkstraTest.java index fb0a560212..e3ae560d40 100644 --- a/opendaylight/routing/dijkstra_implementation/src/test/java/org/opendaylight/controller/routing/dijkstra_implementation/DijkstraTest.java +++ b/opendaylight/routing/dijkstra_implementation/src/test/java/org/opendaylight/controller/routing/dijkstra_implementation/DijkstraTest.java @@ -1,4 +1,3 @@ - /* * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * @@ -7,7 +6,6 @@ * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.controller.routing.dijkstra_implementation; import org.opendaylight.controller.sal.core.Bandwidth; @@ -18,9 +16,11 @@ import org.opendaylight.controller.sal.core.NodeConnector; import org.opendaylight.controller.sal.core.Path; import org.opendaylight.controller.sal.core.Property; import org.opendaylight.controller.sal.core.UpdateType; +import org.opendaylight.controller.sal.topology.TopoEdgeUpdate; import org.opendaylight.controller.sal.utils.NodeConnectorCreator; import org.opendaylight.controller.sal.utils.NodeCreator; +import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedList; import java.util.List; @@ -34,7 +34,8 @@ import org.slf4j.LoggerFactory; public class DijkstraTest { protected static final Logger logger = LoggerFactory - .getLogger(DijkstraTest.class); + .getLogger(DijkstraTest.class); + @Test public void testSinglePathRouteNoBw() { DijkstraImplementation imp = new DijkstraImplementation(); @@ -42,6 +43,7 @@ public class DijkstraTest { Node node1 = NodeCreator.createOFNode((long) 1); Node node2 = NodeCreator.createOFNode((long) 2); Node node3 = NodeCreator.createOFNode((long) 3); + List topoedgeupdateList = new ArrayList(); NodeConnector nc11 = NodeConnectorCreator.createOFNodeConnector( (short) 1, node1); NodeConnector nc21 = NodeConnectorCreator.createOFNodeConnector( @@ -50,11 +52,13 @@ public class DijkstraTest { try { edge1 = new Edge(nc11, nc21); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } Set props = new HashSet(); props.add(new Bandwidth(0)); - imp.edgeUpdate(edge1, UpdateType.ADDED, props); + TopoEdgeUpdate teu1 = new TopoEdgeUpdate(edge1, props, UpdateType.ADDED); + topoedgeupdateList.add(teu1); + NodeConnector nc22 = NodeConnectorCreator.createOFNodeConnector( (short) 2, node2); NodeConnector nc31 = NodeConnectorCreator.createOFNodeConnector( @@ -63,11 +67,14 @@ public class DijkstraTest { try { edge2 = new Edge(nc22, nc31); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } Set props2 = new HashSet(); - props.add(new Bandwidth(0)); - imp.edgeUpdate(edge2, UpdateType.ADDED, props2); + props2.add(new Bandwidth(0)); + TopoEdgeUpdate teu2 = new TopoEdgeUpdate(edge2, props2, + UpdateType.ADDED); + topoedgeupdateList.add(teu2); + imp.edgeUpdate(topoedgeupdateList); Path res = imp.getRoute(node1, node3); List expectedPath = (List) new LinkedList(); @@ -77,7 +84,7 @@ public class DijkstraTest { try { expectedRes = new Path(expectedPath); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } if (!res.equals(expectedRes)) { System.out.println("Actual Res is " + res); @@ -89,6 +96,7 @@ public class DijkstraTest { @Test public void testShortestPathRouteNoBw() { DijkstraImplementation imp = new DijkstraImplementation(); + List topoedgeupdateList = new ArrayList(); imp.init(); Node node1 = NodeCreator.createOFNode((long) 1); Node node2 = NodeCreator.createOFNode((long) 2); @@ -101,11 +109,12 @@ public class DijkstraTest { try { edge1 = new Edge(nc11, nc21); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } Set props = new HashSet(); props.add(new Bandwidth(0)); - imp.edgeUpdate(edge1, UpdateType.ADDED, props); + TopoEdgeUpdate teu1 = new TopoEdgeUpdate(edge1, props, UpdateType.ADDED); + topoedgeupdateList.add(teu1); NodeConnector nc22 = NodeConnectorCreator.createOFNodeConnector( (short) 2, node2); @@ -115,11 +124,13 @@ public class DijkstraTest { try { edge2 = new Edge(nc22, nc31); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } Set props2 = new HashSet(); - props.add(new Bandwidth(0)); - imp.edgeUpdate(edge2, UpdateType.ADDED, props2); + props2.add(new Bandwidth(0)); + TopoEdgeUpdate teu2 = new TopoEdgeUpdate(edge2, props2, + UpdateType.ADDED); + topoedgeupdateList.add(teu2); NodeConnector nc12 = NodeConnectorCreator.createOFNodeConnector( (short) 2, node1); @@ -129,11 +140,14 @@ public class DijkstraTest { try { edge3 = new Edge(nc12, nc32); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } Set props3 = new HashSet(); - props.add(new Bandwidth(0)); - imp.edgeUpdate(edge3, UpdateType.ADDED, props3); + props3.add(new Bandwidth(0)); + TopoEdgeUpdate teu3 = new TopoEdgeUpdate(edge3, props3, + UpdateType.ADDED); + topoedgeupdateList.add(teu3); + imp.edgeUpdate(topoedgeupdateList); Path res = imp.getRoute(node1, node3); @@ -143,7 +157,7 @@ public class DijkstraTest { try { expectedRes = new Path(expectedPath); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } if (!res.equals(expectedRes)) { System.out.println("Actual Res is " + res); @@ -156,6 +170,7 @@ public class DijkstraTest { public void testShortestPathRouteNoBwAfterLinkDelete() { DijkstraImplementation imp = new DijkstraImplementation(); imp.init(); + List topoedgeupdateList = new ArrayList(); Node node1 = NodeCreator.createOFNode((long) 1); Node node2 = NodeCreator.createOFNode((long) 2); Node node3 = NodeCreator.createOFNode((long) 3); @@ -167,11 +182,12 @@ public class DijkstraTest { try { edge1 = new Edge(nc11, nc21); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } Set props = new HashSet(); props.add(new Bandwidth(0)); - imp.edgeUpdate(edge1, UpdateType.ADDED, props); + TopoEdgeUpdate teu1 = new TopoEdgeUpdate(edge1, props, UpdateType.ADDED); + topoedgeupdateList.add(teu1); NodeConnector nc22 = NodeConnectorCreator.createOFNodeConnector( (short) 2, node2); @@ -181,11 +197,13 @@ public class DijkstraTest { try { edge2 = new Edge(nc22, nc31); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } Set props2 = new HashSet(); - props.add(new Bandwidth(0)); - imp.edgeUpdate(edge2, UpdateType.ADDED, props2); + props2.add(new Bandwidth(0)); + TopoEdgeUpdate teu2 = new TopoEdgeUpdate(edge2, props2, + UpdateType.ADDED); + topoedgeupdateList.add(teu2); NodeConnector nc12 = NodeConnectorCreator.createOFNodeConnector( (short) 2, node1); @@ -195,13 +213,18 @@ public class DijkstraTest { try { edge3 = new Edge(nc12, nc32); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } Set props3 = new HashSet(); - props.add(new Bandwidth(0)); - imp.edgeUpdate(edge3, UpdateType.ADDED, props3); + props3.add(new Bandwidth(0)); + TopoEdgeUpdate teu3 = new TopoEdgeUpdate(edge3, props3, + UpdateType.ADDED); + topoedgeupdateList.add(teu3); + TopoEdgeUpdate teu4 = new TopoEdgeUpdate(edge3, props3, + UpdateType.REMOVED); + topoedgeupdateList.add(teu4); - imp.edgeUpdate(edge3, UpdateType.REMOVED, props3); + imp.edgeUpdate(topoedgeupdateList); Path res = imp.getRoute(node1, node3); List expectedPath = (List) new LinkedList(); @@ -211,7 +234,7 @@ public class DijkstraTest { try { expectedRes = new Path(expectedPath); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } if (!res.equals(expectedRes)) { System.out.println("Actual Res is " + res); diff --git a/opendaylight/routing/dijkstra_implementation/src/test/java/org/opendaylight/controller/routing/dijkstra_implementation/MaxThruputTest.java b/opendaylight/routing/dijkstra_implementation/src/test/java/org/opendaylight/controller/routing/dijkstra_implementation/MaxThruputTest.java index 44cb9d19d8..17952c8037 100644 --- a/opendaylight/routing/dijkstra_implementation/src/test/java/org/opendaylight/controller/routing/dijkstra_implementation/MaxThruputTest.java +++ b/opendaylight/routing/dijkstra_implementation/src/test/java/org/opendaylight/controller/routing/dijkstra_implementation/MaxThruputTest.java @@ -1,4 +1,3 @@ - /* * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * @@ -16,10 +15,13 @@ import org.opendaylight.controller.sal.core.Edge; import org.opendaylight.controller.sal.core.Node; import org.opendaylight.controller.sal.core.NodeConnector; import org.opendaylight.controller.sal.core.Path; +import org.opendaylight.controller.sal.topology.TopoEdgeUpdate; import org.opendaylight.controller.sal.utils.NodeConnectorCreator; import org.opendaylight.controller.sal.utils.NodeCreator; + import java.util.LinkedList; import java.util.List; +import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -32,7 +34,7 @@ import org.slf4j.LoggerFactory; public class MaxThruputTest { protected static final Logger logger = LoggerFactory - .getLogger(MaxThruputTest.class); + .getLogger(MaxThruputTest.class); Map LinkCostMap = new HashMap(); @Test @@ -74,14 +76,14 @@ public class MaxThruputTest { try { edge1 = new Edge(nc11, nc21); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } LinkCostMap.put(edge1, 10); Edge edge2 = null; try { edge2 = new Edge(nc21, nc11); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } LinkCostMap.put(edge2, 10); @@ -89,14 +91,14 @@ public class MaxThruputTest { try { edge3 = new Edge(nc22, nc31); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } LinkCostMap.put(edge3, 30); Edge edge4 = null; try { edge4 = new Edge(nc31, nc22); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } LinkCostMap.put(edge4, 30); @@ -104,14 +106,14 @@ public class MaxThruputTest { try { edge5 = new Edge(nc32, nc41); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } LinkCostMap.put(edge5, 10); Edge edge6 = null; try { edge6 = new Edge(nc41, nc32); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } LinkCostMap.put(edge6, 10); @@ -119,14 +121,14 @@ public class MaxThruputTest { try { edge7 = new Edge(nc12, nc51); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } LinkCostMap.put(edge7, 20); Edge edge8 = null; try { edge8 = new Edge(nc51, nc12); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } LinkCostMap.put(edge8, 20); @@ -134,14 +136,14 @@ public class MaxThruputTest { try { edge9 = new Edge(nc52, nc61); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } LinkCostMap.put(edge9, 20); Edge edge10 = null; try { edge10 = new Edge(nc61, nc52); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } LinkCostMap.put(edge10, 20); @@ -149,29 +151,47 @@ public class MaxThruputTest { try { edge11 = new Edge(nc62, nc42); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } LinkCostMap.put(edge11, 20); Edge edge12 = null; try { edge12 = new Edge(nc42, nc62); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } LinkCostMap.put(edge12, 20); - imp.edgeUpdate(edge1, UpdateType.ADDED, null); - imp.edgeUpdate(edge2, UpdateType.ADDED, null); - imp.edgeUpdate(edge3, UpdateType.ADDED, null); - imp.edgeUpdate(edge4, UpdateType.ADDED, null); - imp.edgeUpdate(edge5, UpdateType.ADDED, null); - imp.edgeUpdate(edge6, UpdateType.ADDED, null); - imp.edgeUpdate(edge7, UpdateType.ADDED, null); - imp.edgeUpdate(edge8, UpdateType.ADDED, null); - imp.edgeUpdate(edge9, UpdateType.ADDED, null); - imp.edgeUpdate(edge10, UpdateType.ADDED, null); - imp.edgeUpdate(edge11, UpdateType.ADDED, null); - imp.edgeUpdate(edge12, UpdateType.ADDED, null); + List topoedgeupdateList = new ArrayList(); + TopoEdgeUpdate teu1 = new TopoEdgeUpdate(edge1, null, UpdateType.ADDED); + topoedgeupdateList.add(teu1); + TopoEdgeUpdate teu2 = new TopoEdgeUpdate(edge2, null, UpdateType.ADDED); + topoedgeupdateList.add(teu2); + TopoEdgeUpdate teu3 = new TopoEdgeUpdate(edge3, null, UpdateType.ADDED); + topoedgeupdateList.add(teu3); + TopoEdgeUpdate teu4 = new TopoEdgeUpdate(edge4, null, UpdateType.ADDED); + topoedgeupdateList.add(teu4); + TopoEdgeUpdate teu5 = new TopoEdgeUpdate(edge5, null, UpdateType.ADDED); + topoedgeupdateList.add(teu5); + TopoEdgeUpdate teu6 = new TopoEdgeUpdate(edge6, null, UpdateType.ADDED); + topoedgeupdateList.add(teu6); + TopoEdgeUpdate teu7 = new TopoEdgeUpdate(edge7, null, UpdateType.ADDED); + topoedgeupdateList.add(teu7); + TopoEdgeUpdate teu8 = new TopoEdgeUpdate(edge8, null, UpdateType.ADDED); + topoedgeupdateList.add(teu8); + TopoEdgeUpdate teu9 = new TopoEdgeUpdate(edge9, null, UpdateType.ADDED); + topoedgeupdateList.add(teu9); + TopoEdgeUpdate teu10 = new TopoEdgeUpdate(edge10, null, + UpdateType.ADDED); + topoedgeupdateList.add(teu10); + TopoEdgeUpdate teu11 = new TopoEdgeUpdate(edge11, null, + UpdateType.ADDED); + topoedgeupdateList.add(teu11); + TopoEdgeUpdate teu12 = new TopoEdgeUpdate(edge12, null, + UpdateType.ADDED); + topoedgeupdateList.add(teu12); + + imp.edgeUpdate(topoedgeupdateList); imp.initMaxThroughput(LinkCostMap); @@ -188,7 +208,7 @@ public class MaxThruputTest { try { expectedRes = new Path(expectedPath); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } if (!res.equals(expectedRes)) { System.out.println("Actual Res is " + res); @@ -206,7 +226,7 @@ public class MaxThruputTest { try { expectedRes = new Path(expectedPath); } catch (ConstructionException e) { - logger.error("",e); + logger.error("", e); } if (!res.equals(expectedRes)) { System.out.println("Actual Res is " + res); diff --git a/opendaylight/sal/api/pom.xml b/opendaylight/sal/api/pom.xml index 9d8c814d6d..e49ae8dbfd 100644 --- a/opendaylight/sal/api/pom.xml +++ b/opendaylight/sal/api/pom.xml @@ -10,7 +10,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT bundle diff --git a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/Config.java b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/Config.java index c585aa2c9f..505cc61816 100644 --- a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/Config.java +++ b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/Config.java @@ -1,4 +1,3 @@ - /* * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * @@ -18,8 +17,8 @@ import javax.xml.bind.annotation.XmlElement; /** * The class represents Admin Config status - * - * + * + * */ @XmlRootElement @SuppressWarnings("serial") @@ -65,6 +64,6 @@ public class Config extends Property { @Override public String toString() { - return "Config[" + ReflectionToStringBuilder.toString(this) + "]"; + return "Config["+ReflectionToStringBuilder.toString(this)+"]"; } } diff --git a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/NodeConnector.java b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/NodeConnector.java index 59a184e573..6245c9be8a 100644 --- a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/NodeConnector.java +++ b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/core/NodeConnector.java @@ -53,26 +53,30 @@ public class NodeConnector implements Serializable { ConcurrentHashMap, String>> compatibleType = new ConcurrentHashMap, String>>(); /** - * Represent a special port pointing toward the controller, - * this is to send data packets toward the controller from - * data plane. + * Represents the OFPP_CONTROLLER reserved port to forward a + * packet to the controller, this is to send data packets + * to the controller from the data plane triggering + * a packet_in event. */ public static String CONTROLLER = "CTRL"; /** - * Special port describing ALL the ports in the system, - * should be used for flooding like mechanism but better - * to be careful with it + * Represents the OFPP_ALL reserved OF port + * to forward to ALL the ports in the system , + * should be used for flooding like mechanism to + * be used cautiously to avoid excessive flooding. */ public static String ALL = "ALL"; /** - * Describe the local networking stack of the node - * on which the packet is destined. Yet another special port + * Represents the OFPP_LOCAL reserved OF port + * to access the local networking stack of the node + * of which the packet is destined. Typically used for + * inband OF communications channel. */ public static String SWSTACK = "SW"; /** - * Describe a special destination that invoke the - * traditional HW forwarding on platforms that has this - * provision. + * Describes OFPP_Normal reserved port destination that invokes + * the traditional native L2/L3 HW normal forwarding functionality + * if supported on the forwarding element. */ public static String HWPATH = "HW"; public static String OPENFLOW = "OF"; @@ -441,7 +445,7 @@ public class NodeConnector implements Serializable { * * @param str String to be parsed in a NodeConnector * - * @return the NodeConnector if parse is succesfull, null otherwise + * @return the NodeConnector if parse is successful, null otherwise */ public static NodeConnector fromString(String str) { if (str == null) { @@ -534,14 +538,14 @@ public class NodeConnector implements Serializable { /** * return a NodeConnector from a pair (type, ID) in string format - * not containing explicitely the Node portion which has to be + * not containing explicitly the Node portion which has to be * supplied as parameter * * @param typeStr type String to be parsed in a NodeConnector * @param IDStr ID String portion to be parsed in a NodeConnector * @param n Node to which the NodeConnector is attached * - * @return the NodeConnector if parse is succesfull, null otherwise + * @return the NodeConnector if parse is successful, null otherwise */ public static NodeConnector fromStringNoNode(String typeStr, String IDStr, Node n) { diff --git a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/discovery/IDiscoveryService.java b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/discovery/IDiscoveryService.java index 3dda38ef56..29094d34f9 100644 --- a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/discovery/IDiscoveryService.java +++ b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/discovery/IDiscoveryService.java @@ -16,8 +16,8 @@ import org.opendaylight.controller.sal.core.Property; import org.opendaylight.controller.sal.core.UpdateType; /** - * The interface class provides the methods to notify the listener when an edge - * is added/deleted/changed + * The interface provides the methods to notify the listener when an edge is + * added/deleted/changed. */ public interface IDiscoveryService { /** diff --git a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/inventory/IInventoryService.java b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/inventory/IInventoryService.java index 2df6053098..3c58ecbfcd 100644 --- a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/inventory/IInventoryService.java +++ b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/inventory/IInventoryService.java @@ -17,8 +17,8 @@ import org.opendaylight.controller.sal.core.NodeConnector; import org.opendaylight.controller.sal.core.Property; /** - * Interface class that describes methods invoked from application toward SAL to - * solicit existing inventory data + * The Interface describes methods invoked from application toward SAL to + * solicit existing inventory data. */ public interface IInventoryService { /** diff --git a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/inventory/IListenInventoryUpdates.java b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/inventory/IListenInventoryUpdates.java index 41b91e1919..ccfb338849 100644 --- a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/inventory/IListenInventoryUpdates.java +++ b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/inventory/IListenInventoryUpdates.java @@ -17,8 +17,8 @@ import org.opendaylight.controller.sal.core.Property; import org.opendaylight.controller.sal.core.UpdateType; /** - * The interface class provides the methods to notify the upper applications - * in regards to any inventory changes. + * The interface provides the methods to notify the upper applications in + * regards to any inventory changes. */ public interface IListenInventoryUpdates { /** diff --git a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/inventory/IPluginInInventoryService.java b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/inventory/IPluginInInventoryService.java index 420f9bb00c..5822731f26 100644 --- a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/inventory/IPluginInInventoryService.java +++ b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/inventory/IPluginInInventoryService.java @@ -17,8 +17,8 @@ import org.opendaylight.controller.sal.core.NodeConnector; import org.opendaylight.controller.sal.core.Property; /** - * The interface class that describes methods invoked from SAL toward the protocol - * plugin to solicit existing inventory data. + * The Interface describes methods invoked from SAL toward the protocol plugin + * to solicit existing inventory data. */ public interface IPluginInInventoryService { /** diff --git a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/inventory/IPluginOutInventoryService.java b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/inventory/IPluginOutInventoryService.java index 124c34ab3e..42c9ab7475 100644 --- a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/inventory/IPluginOutInventoryService.java +++ b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/inventory/IPluginOutInventoryService.java @@ -17,8 +17,8 @@ import org.opendaylight.controller.sal.core.Property; import org.opendaylight.controller.sal.core.UpdateType; /** - * The interface class describes Inventory update methods to be implemented by - * protocol plugin + * The Interface describes Inventory update methods to be implemented by + * protocol plugin. */ public interface IPluginOutInventoryService { /** diff --git a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/topology/IListenTopoUpdates.java b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/topology/IListenTopoUpdates.java index 8a640f1e9b..b4c44c00d9 100644 --- a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/topology/IListenTopoUpdates.java +++ b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/topology/IListenTopoUpdates.java @@ -1,4 +1,3 @@ - /* * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * @@ -9,11 +8,9 @@ package org.opendaylight.controller.sal.topology; -import java.util.Set; +import java.util.List; import org.opendaylight.controller.sal.core.Edge; -import org.opendaylight.controller.sal.core.Property; -import org.opendaylight.controller.sal.core.UpdateType; /** * @file IListenTopoUpdates.java @@ -28,30 +25,31 @@ import org.opendaylight.controller.sal.core.UpdateType; /** * Topology notifications provided by SAL toward the application - * + * */ public interface IListenTopoUpdates { /** * Called to update on Edge in the topology graph - * - * @param e Edge being updated - * @param type Type of update - * @param props Properties of the edge, like BandWidth and/or Latency etc. + * + * @param topoedgeupdateList + * List of topoedgeupdates Each topoedgeupdate includes edge, its + * Properties ( BandWidth and/or Latency etc) and update type. */ - public void edgeUpdate(Edge e, UpdateType type, Set props); + public void edgeUpdate(List topoedgeupdateList); /** - * Called when an Edge utilization is above the safety threshold - * configured on the controller - * - * @param edge The edge which bandwidth usage is above the safety level + * Called when an Edge utilization is above the safety threshold configured + * on the controller + * + * @param edge + * The edge which bandwidth usage is above the safety level */ public void edgeOverUtilized(Edge edge); /** * Called when the Edge utilization is back to normal, below the safety * threshold level configured on the controller - * + * * @param edge */ public void edgeUtilBackToNormal(Edge edge); diff --git a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/topology/IPluginOutTopologyService.java b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/topology/IPluginOutTopologyService.java index b183240d43..b85eec8428 100644 --- a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/topology/IPluginOutTopologyService.java +++ b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/topology/IPluginOutTopologyService.java @@ -1,4 +1,3 @@ - /* * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * @@ -9,6 +8,7 @@ package org.opendaylight.controller.sal.topology; +import java.util.List; import java.util.Set; import org.opendaylight.controller.sal.core.Edge; @@ -27,21 +27,22 @@ import org.opendaylight.controller.sal.core.UpdateType; /** * Methods that are invoked from Protocol Plugin toward SAL - * + * */ public interface IPluginOutTopologyService { + /** * Called to update on Edge in the topology graph - * - * @param e Edge being updated - * @param type Type of update - * @param props Properties of the edge, like BandWidth and/or Latency etc. + * + * @param topoedgeupdateList + * List of topoedgeupdates Each topoedgeupdate includes edge, its + * Properties ( BandWidth and/or Latency etc) and update type. */ - public void edgeUpdate(Edge e, UpdateType type, Set props); + public void edgeUpdate(List topoedgeupdateList); /** - * Called when an Edge utilization is above the safety threshold - * configured on the controller + * Called when an Edge utilization is above the safety threshold configured + * on the controller * * @param edge */ @@ -50,7 +51,7 @@ public interface IPluginOutTopologyService { /** * Called when the Edge utilization is back to normal, below the safety * threshold level configured on the controller - * + * * @param edge */ public void edgeUtilBackToNormal(Edge edge); diff --git a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/topology/TopoEdgeUpdate.java b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/topology/TopoEdgeUpdate.java new file mode 100644 index 0000000000..d8da9c301b --- /dev/null +++ b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/topology/TopoEdgeUpdate.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.controller.sal.topology; + +import java.util.Set; + +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.ReflectionToStringBuilder; +import org.opendaylight.controller.sal.core.Edge; +import org.opendaylight.controller.sal.core.Property; +import org.opendaylight.controller.sal.core.UpdateType; + +/** + * The class represents an Edge, the Edge's Property Set and its UpdateType. + */ + +public class TopoEdgeUpdate { + private Edge edge; + private Set props; + private UpdateType type; + + public TopoEdgeUpdate(Edge e, Set p, UpdateType t) { + edge = e; + props = p; + type = t; + } + + public Edge getEdge() { + return edge; + } + + public Set getProperty() { + return props; + } + + public UpdateType getUpdateType() { + return type; + } + + @Override + public int hashCode() { + return HashCodeBuilder.reflectionHashCode(this); + } + + @Override + public String toString() { + return "TopoEdgeUpdate[" + ReflectionToStringBuilder.toString(this) + + "]"; + } + + @Override + public boolean equals(Object obj) { + return EqualsBuilder.reflectionEquals(this, obj); + } +} diff --git a/opendaylight/sal/implementation/pom.xml b/opendaylight/sal/implementation/pom.xml index 32f0a38157..57ccc4a9d7 100644 --- a/opendaylight/sal/implementation/pom.xml +++ b/opendaylight/sal/implementation/pom.xml @@ -52,7 +52,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT diff --git a/opendaylight/sal/implementation/src/main/java/org/opendaylight/controller/sal/implementation/internal/Topology.java b/opendaylight/sal/implementation/src/main/java/org/opendaylight/controller/sal/implementation/internal/Topology.java index 8df566f728..f965d7f2c4 100644 --- a/opendaylight/sal/implementation/src/main/java/org/opendaylight/controller/sal/implementation/internal/Topology.java +++ b/opendaylight/sal/implementation/src/main/java/org/opendaylight/controller/sal/implementation/internal/Topology.java @@ -1,4 +1,3 @@ - /* * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * @@ -9,7 +8,9 @@ package org.opendaylight.controller.sal.implementation.internal; +import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.Collections; @@ -20,6 +21,7 @@ import org.opendaylight.controller.sal.topology.IListenTopoUpdates; import org.opendaylight.controller.sal.topology.IPluginInTopologyService; import org.opendaylight.controller.sal.topology.IPluginOutTopologyService; import org.opendaylight.controller.sal.topology.ITopologyService; +import org.opendaylight.controller.sal.topology.TopoEdgeUpdate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -58,16 +60,16 @@ public class Topology implements IPluginOutTopologyService, ITopologyService { /** * Function called by the dependency manager when all the required * dependencies are satisfied - * + * */ void init() { } /** - * 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() { // Make sure to clear all the data structure we use to track @@ -90,10 +92,10 @@ public class Topology implements IPluginOutTopologyService, ITopologyService { } @Override - public void edgeUpdate(Edge e, UpdateType type, Set props) { + public void edgeUpdate(List topoedgeupdateList) { synchronized (this.updateService) { for (IListenTopoUpdates s : this.updateService) { - s.edgeUpdate(e, type, props); + s.edgeUpdate(topoedgeupdateList); } } } diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/main/java/org/opendaylight/controller/sal/binding/generator/impl/BindingGeneratorImpl.java b/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/main/java/org/opendaylight/controller/sal/binding/generator/impl/BindingGeneratorImpl.java index dcee5fee33..3c0d9ed35a 100644 --- a/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/main/java/org/opendaylight/controller/sal/binding/generator/impl/BindingGeneratorImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/main/java/org/opendaylight/controller/sal/binding/generator/impl/BindingGeneratorImpl.java @@ -290,28 +290,15 @@ public class BindingGeneratorImpl implements BindingGenerator { } return null; } - - // private String resolveGeneratedTypePackageName(final SchemaPath - // schemaPath) { - // final StringBuilder builder = new StringBuilder(); - // builder.append(basePackageName); - // if ((schemaPath != null) && (schemaPath.getPath() != null)) { - // final List pathToNode = schemaPath.getPath(); - // final int traversalSteps = (pathToNode.size() - 1); - // for (int i = 0; i < traversalSteps; ++i) { - // builder.append("."); - // String nodeLocalName = pathToNode.get(i).getLocalName(); - // - // // TODO: refactor with use of BindingGeneratorUtil class - // nodeLocalName = nodeLocalName.replace(":", "."); - // nodeLocalName = nodeLocalName.replace("-", "."); - // builder.append(nodeLocalName); - // } - // return validatePackage(builder.toString()); - // } - // return null; - // } - + + private List augmentationToGenTypes(final Module module) { + final List augmentGenTypes = new ArrayList(); + + //TODO: add implementation + + return augmentGenTypes; + } + private GeneratedType containerToGenType(ContainerSchemaNode container) { if (container == null) { return null; diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/main/java/org/opendaylight/controller/sal/binding/yang/types/BaseYangTypes.java b/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/main/java/org/opendaylight/controller/sal/binding/yang/types/BaseYangTypes.java index b050ce65f1..a6425df693 100644 --- a/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/main/java/org/opendaylight/controller/sal/binding/yang/types/BaseYangTypes.java +++ b/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/main/java/org/opendaylight/controller/sal/binding/yang/types/BaseYangTypes.java @@ -1,67 +1,66 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.sal.binding.yang.types; - -import java.math.BigDecimal; -import java.math.BigInteger; -import java.util.HashMap; -import java.util.Map; - -import org.opendaylight.controller.binding.generator.util.Types; -import org.opendaylight.controller.sal.binding.generator.spi.TypeProvider; -import org.opendaylight.controller.sal.binding.model.api.Type; -import org.opendaylight.controller.yang.model.api.TypeDefinition; - -public class BaseYangTypes { - - private static Map typeMap = new HashMap(); - - public static final Type BOOLEAN_TYPE = Types.typeForClass(Boolean.class); - public static final Type INT8_TYPE = Types.typeForClass(Byte.class); - public static final Type INT16_TYPE = Types.typeForClass(Short.class); - public static final Type INT32_TYPE = Types.typeForClass(Integer.class); - public static final Type INT64_TYPE = Types.typeForClass(Long.class); - public static final Type STRING_TYPE = Types.typeForClass(String.class); - public static final Type DECIMAL64_TYPE = Types.typeForClass(Double.class); - public static final Type UINT8_TYPE = Types.typeForClass(Short.class); - public static final Type UINT16_TYPE = Types.typeForClass(Integer.class); - public static final Type UINT32_TYPE = Types.typeForClass(Long.class); - public static final Type UINT64_TYPE = Types.typeForClass(BigInteger.class); - - static { - typeMap.put("boolean", BOOLEAN_TYPE); - typeMap.put("int8", INT8_TYPE); - typeMap.put("int16", INT16_TYPE); - typeMap.put("int32", INT32_TYPE); - typeMap.put("int64", INT64_TYPE); - typeMap.put("string", STRING_TYPE); - typeMap.put("decimal64", DECIMAL64_TYPE); - typeMap.put("uint8", UINT8_TYPE); - typeMap.put("uint16", UINT16_TYPE); - typeMap.put("uint32", UINT32_TYPE); - typeMap.put("uint64", UINT64_TYPE); - } - - public static final TypeProvider BASE_YANG_TYPES_PROVIDER = new TypeProvider() { - - @Override - public Type javaTypeForYangType(String type) { - return typeMap.get(type); - } - - @Override - public Type javaTypeForSchemaDefinitionType(TypeDefinition type) { - if (type != null) { - return typeMap.get(type.getQName().getLocalName()); - } - - return null; - } - }; - -} +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.sal.binding.yang.types; + +import java.math.BigInteger; +import java.util.HashMap; +import java.util.Map; + +import org.opendaylight.controller.binding.generator.util.Types; +import org.opendaylight.controller.sal.binding.generator.spi.TypeProvider; +import org.opendaylight.controller.sal.binding.model.api.Type; +import org.opendaylight.controller.yang.model.api.TypeDefinition; + +public class BaseYangTypes { + + private static Map typeMap = new HashMap(); + + public static final Type BOOLEAN_TYPE = Types.typeForClass(Boolean.class); + public static final Type INT8_TYPE = Types.typeForClass(Byte.class); + public static final Type INT16_TYPE = Types.typeForClass(Short.class); + public static final Type INT32_TYPE = Types.typeForClass(Integer.class); + public static final Type INT64_TYPE = Types.typeForClass(Long.class); + public static final Type STRING_TYPE = Types.typeForClass(String.class); + public static final Type DECIMAL64_TYPE = Types.typeForClass(Double.class); + public static final Type UINT8_TYPE = Types.typeForClass(Short.class); + public static final Type UINT16_TYPE = Types.typeForClass(Integer.class); + public static final Type UINT32_TYPE = Types.typeForClass(Long.class); + public static final Type UINT64_TYPE = Types.typeForClass(BigInteger.class); + + static { + typeMap.put("boolean", BOOLEAN_TYPE); + typeMap.put("int8", INT8_TYPE); + typeMap.put("int16", INT16_TYPE); + typeMap.put("int32", INT32_TYPE); + typeMap.put("int64", INT64_TYPE); + typeMap.put("string", STRING_TYPE); + typeMap.put("decimal64", DECIMAL64_TYPE); + typeMap.put("uint8", UINT8_TYPE); + typeMap.put("uint16", UINT16_TYPE); + typeMap.put("uint32", UINT32_TYPE); + typeMap.put("uint64", UINT64_TYPE); + } + + public static final TypeProvider BASE_YANG_TYPES_PROVIDER = new TypeProvider() { + + @Override + public Type javaTypeForYangType(String type) { + return typeMap.get(type); + } + + @Override + public Type javaTypeForSchemaDefinitionType(TypeDefinition type) { + if (type != null) { + return typeMap.get(type.getQName().getLocalName()); + } + + return null; + } + }; + +} diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/BaseTypeProvider.java b/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/BaseTypeProvider.java index c54ac0613f..1ea5d16c02 100644 --- a/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/BaseTypeProvider.java +++ b/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/BaseTypeProvider.java @@ -10,7 +10,6 @@ package org.opendaylight.controller.sal.binding.generator.impl; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import org.junit.Ignore; import org.junit.Test; import org.opendaylight.controller.binding.generator.util.Types; import org.opendaylight.controller.sal.binding.generator.spi.TypeProvider; diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/GeneratorJavaFile.java b/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/GeneratorJavaFile.java index be115c9a45..474e4ad0f9 100644 --- a/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/GeneratorJavaFile.java +++ b/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/GeneratorJavaFile.java @@ -20,18 +20,23 @@ import java.util.Set; import org.opendaylight.controller.sal.binding.model.api.CodeGenerator; import org.opendaylight.controller.sal.binding.model.api.GeneratedTransferObject; import org.opendaylight.controller.sal.binding.model.api.GeneratedType; +import org.opendaylight.controller.sal.binding.model.api.Type; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class GeneratorJavaFile { + private static final Logger log = LoggerFactory + .getLogger(GeneratorJavaFile.class); private final CodeGenerator interfaceGenerator; private final ClassCodeGenerator classGenerator; - private final Set types; + private final Set genTypes; private final Set genTransferObjects; public GeneratorJavaFile(final CodeGenerator codeGenerator, final Set types) { this.interfaceGenerator = codeGenerator; - this.types = types; + this.genTypes = types; this.genTransferObjects = new HashSet(); classGenerator = new ClassCodeGenerator(); } @@ -40,72 +45,87 @@ public class GeneratorJavaFile { final Set genTransferObjects) { this.interfaceGenerator = new InterfaceGenerator(); this.classGenerator = new ClassCodeGenerator(); - this.types = types; + this.genTypes = types; this.genTransferObjects = genTransferObjects; } - public List generateToFile() throws IOException { - return generateToFile(null); - } - + @Deprecated public List generateToFile(String path) throws IOException { final List result = new ArrayList(); - for (GeneratedType type : types) { - String parentPath = generateParentPath(path, - type.getPackageName()); + for (GeneratedType genType : genTypes) { + final String parentPath = generateParentPath(path, + genType.getPackageName()); - File file = new File(parentPath, type.getName() + ".java"); - File parent = file.getParentFile(); - if (!parent.exists()) { - parent.mkdirs(); + final File directory = new File(parentPath); + final File genFile = generateTypeToJavaFile(directory, genType, + interfaceGenerator); + + if (genFile != null) { + result.add(genFile); } + } - if (!file.exists()) { - FileWriter fw = null; - BufferedWriter bw = null; + for (GeneratedTransferObject transferObject : genTransferObjects) { + final String parentPath = generateParentPath(path, + transferObject.getPackageName()); - file.createNewFile(); - fw = new FileWriter(file); - bw = new BufferedWriter(fw); - Writer writer = interfaceGenerator.generate(type); - bw.write(writer.toString()); + final File directory = new File(parentPath); + final File genFile = generateTypeToJavaFile(directory, + transferObject, classGenerator); - if (bw != null) { - bw.close(); - } - result.add(file); + if (genFile != null) { + result.add(genFile); } } + return result; + } + public List generateToFile(final File directory) throws IOException { + final List result = new ArrayList(); + for (GeneratedType type : genTypes) { + final File genFile = generateTypeToJavaFile(directory, type, + interfaceGenerator); + + if (genFile != null) { + result.add(genFile); + } + } for (GeneratedTransferObject transferObject : genTransferObjects) { - String parentPath = generateParentPath(path, - transferObject.getPackageName()); + final File genFile = generateTypeToJavaFile(directory, + transferObject, classGenerator); - File file = new File(parentPath, transferObject.getName() + ".java"); - File parent = file.getParentFile(); - if (!parent.exists()) { - parent.mkdirs(); + if (genFile != null) { + result.add(genFile); } + } + return result; + } - if (!file.exists()) { - FileWriter fw = null; - BufferedWriter bw = null; + private File generateTypeToJavaFile(final File directory, final Type type, + final CodeGenerator generator) throws IOException { + if ((directory != null) && (type != null) && (generator != null)) { + if (!directory.exists()) { + directory.mkdirs(); + } + + final File file = new File(directory, type.getName() + ".java"); + try (final FileWriter fw = new FileWriter(file)) { file.createNewFile(); - fw = new FileWriter(file); - bw = new BufferedWriter(fw); - Writer writer = classGenerator.generate(transferObject); - bw.write(writer.toString()); - if (bw != null) { - bw.close(); + try (final BufferedWriter bw = new BufferedWriter(fw)) { + Writer writer = generator.generate(type); + bw.write(writer.toString()); } - result.add(file); + } catch (IOException e) { + log.error(e.getMessage()); + throw new IOException(e.getMessage()); } - } - return result; + return file; + } + return null; } private String generateParentPath(String path, String pkg) { @@ -142,5 +162,4 @@ public class GeneratorJavaFile { } return fullPath; } - } diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/controller/sal/java/api/generator/test/GeneratorJavaFileTest.java b/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/controller/sal/java/api/generator/test/GeneratorJavaFileTest.java index 4ae8cc1275..90fbb6f605 100644 --- a/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/controller/sal/java/api/generator/test/GeneratorJavaFileTest.java +++ b/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/controller/sal/java/api/generator/test/GeneratorJavaFileTest.java @@ -14,7 +14,6 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -80,7 +79,8 @@ public class GeneratorJavaFileTest { new InterfaceGenerator(), types); generator.generateToFile(PATH); - String[] files = new File(PATH + FS + "org" + FS + "opendaylight" + FS + "controller" + FS + "gen").list(); + String[] files = new File(PATH + FS + "org" + FS + "opendaylight" + FS + + "controller" + FS + "gen").list(); List filesList = Arrays.asList(files); assertEquals(3, files.length); @@ -88,7 +88,7 @@ public class GeneratorJavaFileTest { assertTrue(filesList.contains("Type2.java")); assertTrue(filesList.contains("Type3.java")); } - + @Test public void compilationTest() throws Exception { final YangModelParserImpl parser = new YangModelParserImpl(); @@ -97,17 +97,12 @@ public class GeneratorJavaFileTest { final File sourcesDir = new File("src/test/resources/yang"); final List sourceFiles = new ArrayList(); final File[] fileArray = sourcesDir.listFiles(); - + for (int i = 0; i < fileArray.length; ++i) { sourceFiles.add(fileArray[i]); } -// String[] sourcesDirPaths = new String[sourceFiles.length]; -// for (int i = 0; i < sourceFiles.length; i++) { -// sourcesDirPaths[i] = sourceFiles[i].getAbsolutePath(); -// } - final Set modulesToBuild = parser - .parseYangModels(sourceFiles); + final Set modulesToBuild = parser.parseYangModels(sourceFiles); final SchemaContext context = parser .resolveSchemaContext(modulesToBuild); @@ -115,7 +110,8 @@ public class GeneratorJavaFileTest { final Set typesToGenerate = new HashSet(); final Set tosToGenerate = new HashSet(); for (Type type : types) { - if (type instanceof GeneratedType && !(type instanceof GeneratedTransferObject)) { + if (type instanceof GeneratedType + && !(type instanceof GeneratedTransferObject)) { typesToGenerate.add((GeneratedType) type); } @@ -162,7 +158,7 @@ public class GeneratorJavaFileTest { /** * Search recursively given directory for *.java files. - * + * * @param directory * directory to search * @return List of java files found diff --git a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/Correct/pom.xml b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/Correct/pom.xml index 33d1053f7d..c48f151499 100644 --- a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/Correct/pom.xml +++ b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/Correct/pom.xml @@ -20,7 +20,7 @@ generate-sources - ${basedir} + ${basedir}/../../../../../yang-model-parser-impl/src/test/resources/model diff --git a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/Correct/resources/model/testfile1.yang b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/Correct/resources/model/testfile1.yang deleted file mode 100644 index ba0c15eb4e..0000000000 --- a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/Correct/resources/model/testfile1.yang +++ /dev/null @@ -1,57 +0,0 @@ -module types1 { - yang-version 1; - namespace "urn:simple.container.demo"; - prefix "t1"; - - import types2 { - prefix "data"; - revision-date 2013-02-27; - } - - organization "Cisco"; - contact "WILL-BE-DEFINED-LATER"; - - revision "2013-02-27" { - reference " WILL BE DEFINED LATER"; - } - - container interfaces { - list ifEntry { - key "ifIndex"; - - leaf ifIndex { - type uint32; - units minutes; - } - - leaf ifMtu { - type int32; - } - } - } - - leaf testleaf { - type data:my-base-int32-type { - range "min..max"; - } - } - - leaf test-string-leaf { - type data:my-string-type-ext; - } - - leaf test-int-leaf { - type data:my-int-type-ext; - } - - leaf test-decimal-leaf { - type data:my-decimal-type { - fraction-digits 4; - } - } - - leaf test-decimal-leaf2 { - type data:my-decimal-type-ext; - } - -} diff --git a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/Correct/resources/model/testfile2.yang b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/Correct/resources/model/testfile2.yang deleted file mode 100644 index 3e9da5256b..0000000000 --- a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/Correct/resources/model/testfile2.yang +++ /dev/null @@ -1,100 +0,0 @@ -module types2 { - yang-version 1; - namespace "urn:simple.types.data.demo"; - prefix "t2"; - - import types1 { - prefix "if"; - revision-date 2013-02-27; - } - - organization "Cisco"; - contact "WILL-BE-DEFINED-LATER"; - description "This is types-data test description"; - - revision "2013-02-27" { - reference " WILL BE DEFINED LATER"; - } - - typedef my-base-int32-type { - type int32 { - range "2..20"; - } - } - - typedef my-type1 { - type my-base-int32-type { - range "11..max"; - } - } - - typedef my-string-type { - type string { - pattern "[a-k]*"; - } - } - - typedef my-string-type2 { - type my-string-type { - pattern "[b-u]*"; - } - } - - typedef my-string-type-ext { - type my-string-type2 { - pattern "[e-z]*"; - } - } - - typedef my-int-type { - type int32 { - range "10..20"; - } - } - - typedef my-int-type2 { - type my-int-type { - range "12..18"; - } - } - - typedef my-int-type-ext { - type my-int-type2 { - range "14..16"; - } - } - - typedef my-decimal-type { - type decimal64 { - fraction-digits 6; - } - } - - typedef my-decimal-type-ext { - type decimal64 { - fraction-digits 5; - } - } - - augment "/if:interfaces/if:ifEntry" { - when "if:ifType='ds0'"; - leaf ds0ChannelNumber { - type string; - } - } - - leaf if-name { - type leafref { - path "/interface/name"; - } - } - - leaf name { - type string; - } - - leaf nested-type-leaf { - type my-type1; - } - -} diff --git a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/Correct_combined/pom.xml b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/Correct_combined/pom.xml index 4fd10ea70f..4fbffb6904 100644 --- a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/Correct_combined/pom.xml +++ b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/Correct_combined/pom.xml @@ -21,7 +21,7 @@ generate-resources - ${basedir}/../Correct + ${basedir}/../../../../../yang-model-parser-impl/src/test/resources/model diff --git a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/Correct_resources/pom.xml b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/Correct_resources/pom.xml index acb8e6036a..2a935158c1 100644 --- a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/Correct_resources/pom.xml +++ b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/Correct_resources/pom.xml @@ -20,7 +20,7 @@ generate-resources - ${basedir}/../Correct + ${basedir}/../../../../../yang-model-parser-impl/src/test/resources/model diff --git a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/NoGenerators/pom.xml b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/NoGenerators/pom.xml index 82b2cc5b80..a9ec4893f0 100644 --- a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/NoGenerators/pom.xml +++ b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/NoGenerators/pom.xml @@ -20,7 +20,7 @@ generate-sources - ${basedir}/../Correct + ${basedir}/../../../../../yang-model-parser-impl/src/test/resources/model diff --git a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/NoGenerators_resources/pom.xml b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/NoGenerators_resources/pom.xml index 96aadd2ba0..74f9dc38e3 100644 --- a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/NoGenerators_resources/pom.xml +++ b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/NoGenerators_resources/pom.xml @@ -20,7 +20,7 @@ generate-resources - ${basedir}/../Correct + ${basedir}/../../../../../yang-model-parser-impl/src/test/resources/model diff --git a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/UnknownGenerator/pom.xml b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/UnknownGenerator/pom.xml index 88829dff0c..2c7f922838 100644 --- a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/UnknownGenerator/pom.xml +++ b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/UnknownGenerator/pom.xml @@ -20,7 +20,7 @@ generate-sources - ${basedir}/../Correct + ${basedir}/../../../../../yang-model-parser-impl/src/test/resources/model diff --git a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/UnknownGenerator_resources/pom.xml b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/UnknownGenerator_resources/pom.xml index 9d4175d2df..fb83dc96ec 100644 --- a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/UnknownGenerator_resources/pom.xml +++ b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/resources/UnknownGenerator_resources/pom.xml @@ -20,7 +20,7 @@ generate-resources - ${basedir}/../Correct + ${basedir}/../../../../../yang-model-parser-impl/src/test/resources/model diff --git a/opendaylight/sal/yang-prototype/code-generator/pom.xml b/opendaylight/sal/yang-prototype/code-generator/pom.xml index dafba87168..89e2794fd1 100644 --- a/opendaylight/sal/yang-prototype/code-generator/pom.xml +++ b/opendaylight/sal/yang-prototype/code-generator/pom.xml @@ -1,100 +1,100 @@ - - 4.0.0 - org.opendaylight.controller - binding-generator - 1.0 - pom - binding-generator - - - UTF-8 - - - - ../yang - ../sal/sal-schema-repository-api - code-generator-demo - yang-model-parser-api - yang-model-parser-impl - binding-model-api - binding-generator-api - binding-generator-spi - binding-generator-util - binding-generator-impl - binding-java-api-generator - maven-yang - maven-yang-plugin - maven-yang-plugin-it - maven-sal-api-gen-plugin - - - - - junit - junit - 4.10 - test - true - - - org.slf4j - slf4j-api - 1.7.2 - - - org.slf4j - slf4j-simple - 1.7.2 - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 2.0 - true - - 1.6 - 1.6 - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.8.1 - - maven - - - - - aggregate - - site - - - - - - - - - org.codehaus.mojo - findbugs-maven-plugin - 2.4.0 - - Max - Low - site - - - - org.codehaus.mojo - jdepend-maven-plugin - 2.0-beta-2 - - - - + + 4.0.0 + org.opendaylight.controller + binding-generator + 1.0 + pom + binding-generator + + + UTF-8 + + + + ../yang + ../sal/sal-schema-repository-api + code-generator-demo + yang-model-parser-api + yang-model-parser-impl + binding-model-api + binding-generator-api + binding-generator-spi + binding-generator-util + binding-generator-impl + binding-java-api-generator + maven-yang + maven-yang-plugin + maven-yang-plugin-it + maven-sal-api-gen-plugin + + + + + junit + junit + 4.10 + test + true + + + org.slf4j + slf4j-api + 1.7.2 + + + org.slf4j + slf4j-simple + 1.7.2 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.0 + true + + 1.7 + 1.7 + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.8.1 + + maven + + + + + aggregate + + site + + + + + + + + + org.codehaus.mojo + findbugs-maven-plugin + 2.4.0 + + Max + Low + site + + + + org.codehaus.mojo + jdepend-maven-plugin + 2.0-beta-2 + + + + diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/ChoiceBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/ChoiceBuilder.java index eb8819657b..946ba4ae05 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/ChoiceBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/ChoiceBuilder.java @@ -31,22 +31,26 @@ import org.opendaylight.controller.yang.model.parser.builder.api.UsesNodeBuilder public class ChoiceBuilder implements DataSchemaNodeBuilder, ChildNodeBuilder, AugmentationTargetBuilder { + private final ChoiceNodeImpl instance; + // SchemaNode args private final QName qname; private SchemaPath schemaPath; - private final ConstraintsBuilder constraints; - private final ChoiceNodeImpl instance; private String description; private String reference; private Status status = Status.CURRENT; + private final List addedUnknownNodes = new ArrayList(); + // DataSchemaNode args private boolean augmenting; private boolean configuration; - private String defaultCase; - - private final Set cases = new HashSet(); + private final ConstraintsBuilder constraints; + // DataNodeContainer args private final Set addedTypedefs = new HashSet(); private final Set addedUsesNodes = new HashSet(); + // AugmentationTarget args private final Set addedAugmentations = new HashSet(); - private final List addedUnknownNodes = new ArrayList(); + // ChoiceNode args + private final Set cases = new HashSet(); + private String defaultCase; public ChoiceBuilder(QName qname) { this.qname = qname; @@ -62,6 +66,7 @@ public class ChoiceBuilder implements DataSchemaNodeBuilder, ChildNodeBuilder, instance.setStatus(status); instance.setAugmenting(augmenting); instance.setConfiguration(configuration); + instance.setConstraints(constraints.build()); instance.setDefaultCase(defaultCase); // CASES @@ -85,8 +90,6 @@ public class ChoiceBuilder implements DataSchemaNodeBuilder, ChildNodeBuilder, } instance.setUnknownSchemaNodes(unknownNodes); - instance.setConstraints(constraints.build()); - return instance; } @@ -97,7 +100,8 @@ public class ChoiceBuilder implements DataSchemaNodeBuilder, ChildNodeBuilder, @Override public void addChildNode(DataSchemaNodeBuilder childNode) { if (!(childNode instanceof ChoiceCaseBuilder)) { - ChoiceCaseBuilder caseBuilder = new ChoiceCaseBuilder(childNode.getQName()); + ChoiceCaseBuilder caseBuilder = new ChoiceCaseBuilder( + childNode.getQName()); caseBuilder.addChildNode(childNode); cases.add(caseBuilder); } else { diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/ChoiceCaseBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/ChoiceCaseBuilder.java index 73d7e3dc0c..27cead10f1 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/ChoiceCaseBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/ChoiceCaseBuilder.java @@ -24,18 +24,18 @@ import org.opendaylight.controller.yang.model.parser.builder.api.DataSchemaNodeB import org.opendaylight.controller.yang.model.parser.builder.api.TypeDefinitionBuilder; import org.opendaylight.controller.yang.model.parser.builder.api.UsesNodeBuilder; -public class ChoiceCaseBuilder extends AbstractChildNodeBuilder implements DataSchemaNodeBuilder { - +public final class ChoiceCaseBuilder extends AbstractChildNodeBuilder implements + DataSchemaNodeBuilder { private final ChoiceCaseNodeImpl instance; - private final ConstraintsBuilder constraints; private SchemaPath schemaPath; private String description; private String reference; private Status status = Status.CURRENT; + private final List addedUnknownNodes = new ArrayList(); private boolean augmenting; + private final ConstraintsBuilder constraints; private final Set addedUsesNodes = new HashSet(); private final Set augmentations = new HashSet(); - private final List addedUnknownNodes = new ArrayList(); ChoiceCaseBuilder(QName qname) { super(qname); @@ -110,7 +110,7 @@ public class ChoiceCaseBuilder extends AbstractChildNodeBuilder implements DataS @Override public void setStatus(Status status) { - if(status != null) { + if (status != null) { this.status = status; } } @@ -144,12 +144,14 @@ public class ChoiceCaseBuilder extends AbstractChildNodeBuilder implements DataS @Override public void addTypedef(TypeDefinitionBuilder typedefBuilder) { - throw new UnsupportedOperationException("Can not add type definition to choice case."); + throw new UnsupportedOperationException( + "Can not add type definition to choice case."); } @Override public void setConfiguration(boolean configuration) { - throw new UnsupportedOperationException("Can not add config definition to choice case."); + throw new UnsupportedOperationException( + "Can not add config definition to choice case."); } @Override @@ -161,8 +163,7 @@ public class ChoiceCaseBuilder extends AbstractChildNodeBuilder implements DataS return augmentations; } - - private static class ChoiceCaseNodeImpl implements ChoiceCaseNode { + private class ChoiceCaseNodeImpl implements ChoiceCaseNode { private final QName qname; private SchemaPath path; private String description; @@ -217,7 +218,7 @@ public class ChoiceCaseBuilder extends AbstractChildNodeBuilder implements DataS } private void setStatus(Status status) { - if(status != null) { + if (status != null) { this.status = status; } } @@ -251,7 +252,7 @@ public class ChoiceCaseBuilder extends AbstractChildNodeBuilder implements DataS } private void setUnknownSchemaNodes(List unknownNodes) { - if(unknownNodes != null) { + if (unknownNodes != null) { this.unknownNodes = unknownNodes; } } @@ -317,7 +318,6 @@ public class ChoiceCaseBuilder extends AbstractChildNodeBuilder implements DataS } } - @Override public int hashCode() { final int prime = 31; diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/IdentitySchemaNodeBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/IdentitySchemaNodeBuilder.java index 906afd97a0..5cfde8e7a0 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/IdentitySchemaNodeBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/IdentitySchemaNodeBuilder.java @@ -7,6 +7,7 @@ */ package org.opendaylight.controller.yang.model.parser.builder.impl; +import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -17,13 +18,13 @@ import org.opendaylight.controller.yang.model.api.Status; import org.opendaylight.controller.yang.model.api.UnknownSchemaNode; import org.opendaylight.controller.yang.model.parser.builder.api.SchemaNodeBuilder; -public class IdentitySchemaNodeBuilder implements SchemaNodeBuilder { - +public final class IdentitySchemaNodeBuilder implements SchemaNodeBuilder { + private final IdentitySchemaNodeImpl instance; private final QName qname; private SchemaPath schemaPath; - private final IdentitySchemaNodeImpl instance; private IdentitySchemaNodeBuilder baseIdentity; private String baseIdentityName; + private final List addedUnknownNodes = new ArrayList(); IdentitySchemaNodeBuilder(final QName qname) { this.qname = qname; @@ -33,11 +34,17 @@ public class IdentitySchemaNodeBuilder implements SchemaNodeBuilder { @Override public IdentitySchemaNode build() { instance.setPath(schemaPath); - if (baseIdentity != null) { - final IdentitySchemaNode base = baseIdentity.build(); - instance.setBaseIdentity(base); + instance.setBaseIdentity(baseIdentity.build()); + } + + // UNKNOWN NODES + final List unknownNodes = new ArrayList(); + for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { + unknownNodes.add(b.build()); } + instance.setUnknownSchemaNodes(unknownNodes); + return instance; } @@ -75,8 +82,7 @@ public class IdentitySchemaNodeBuilder implements SchemaNodeBuilder { @Override public void addUnknownSchemaNode(final UnknownSchemaNodeBuilder unknownNode) { - throw new IllegalStateException( - "Can not add schema node to identity statement"); + addedUnknownNodes.add(unknownNode); } public String getBaseIdentityName() { @@ -91,13 +97,14 @@ public class IdentitySchemaNodeBuilder implements SchemaNodeBuilder { this.baseIdentity = baseType; } - private class IdentitySchemaNodeImpl implements IdentitySchemaNode { + private final class IdentitySchemaNodeImpl implements IdentitySchemaNode { private final QName qname; private IdentitySchemaNode baseIdentity; private String description; private String reference; private Status status = Status.CURRENT; private SchemaPath path; + private List unknownNodes = Collections.emptyList(); private IdentitySchemaNodeImpl(final QName qname) { this.qname = qname; @@ -157,7 +164,14 @@ public class IdentitySchemaNodeBuilder implements SchemaNodeBuilder { @Override public List getUnknownSchemaNodes() { - return Collections.emptyList(); + return unknownNodes; + } + + private void setUnknownSchemaNodes( + List unknownSchemaNodes) { + if (unknownSchemaNodes != null) { + this.unknownNodes = unknownSchemaNodes; + } } @Override diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/ModuleBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/ModuleBuilder.java index e0ba03adfb..cca505e985 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/ModuleBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/ModuleBuilder.java @@ -96,6 +96,8 @@ public class ModuleBuilder implements Builder { */ @Override public Module build() { + instance.setPrefix(prefix); + instance.setRevision(revision); instance.setImports(imports); instance.setNamespace(namespace); @@ -247,12 +249,10 @@ public class ModuleBuilder implements Builder { public void setRevision(final Date revision) { this.revision = revision; - instance.setRevision(revision); } public void setPrefix(final String prefix) { this.prefix = prefix; - instance.setPrefix(prefix); } public void setYangVersion(final String yangVersion) { @@ -295,10 +295,8 @@ public class ModuleBuilder implements Builder { public ContainerSchemaNodeBuilder addContainerNode( final QName containerName, final List parentPath) { final List pathToNode = new ArrayList(parentPath); - final ContainerSchemaNodeBuilder containerBuilder = new ContainerSchemaNodeBuilder( containerName); - final ChildNodeBuilder parent = (ChildNodeBuilder) moduleNodes .get(pathToNode); if (parent != null) { @@ -318,10 +316,8 @@ public class ModuleBuilder implements Builder { public ListSchemaNodeBuilder addListNode(final QName listName, final List parentPath) { final List pathToNode = new ArrayList(parentPath); - final ListSchemaNodeBuilder listBuilder = new ListSchemaNodeBuilder( listName); - final ChildNodeBuilder parent = (ChildNodeBuilder) moduleNodes .get(pathToNode); if (parent != null) { @@ -341,10 +337,8 @@ public class ModuleBuilder implements Builder { public LeafSchemaNodeBuilder addLeafNode(final QName leafName, final List parentPath) { final List pathToNode = new ArrayList(parentPath); - final LeafSchemaNodeBuilder leafBuilder = new LeafSchemaNodeBuilder( leafName); - final ChildNodeBuilder parent = (ChildNodeBuilder) moduleNodes .get(pathToNode); if (parent != null) { @@ -364,7 +358,6 @@ public class ModuleBuilder implements Builder { public LeafListSchemaNodeBuilder addLeafListNode(final QName leafListName, final List parentPath) { final List pathToNode = new ArrayList(parentPath); - final LeafListSchemaNodeBuilder leafListBuilder = new LeafListSchemaNodeBuilder( leafListName); final ChildNodeBuilder parent = (ChildNodeBuilder) moduleNodes @@ -386,7 +379,6 @@ public class ModuleBuilder implements Builder { public GroupingBuilder addGrouping(final QName qname, final List parentPath) { final List pathToGroup = new ArrayList(parentPath); - final GroupingBuilder builder = new GroupingBuilderImpl(qname); final ChildNodeBuilder parentNodeBuilder = (ChildNodeBuilder) moduleNodes .get(pathToGroup); @@ -405,7 +397,6 @@ public class ModuleBuilder implements Builder { public AugmentationSchemaBuilder addAugment(final String name, final List parentPath) { final List pathToAugment = new ArrayList(parentPath); - final AugmentationSchemaBuilder builder = new AugmentationSchemaBuilderImpl( name); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/UsesNodeBuilderImpl.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/UsesNodeBuilderImpl.java index 7d3e929357..05d2faa409 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/UsesNodeBuilderImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/UsesNodeBuilderImpl.java @@ -26,8 +26,7 @@ import org.opendaylight.controller.yang.model.parser.builder.api.SchemaNodeBuild import org.opendaylight.controller.yang.model.parser.builder.api.UsesNodeBuilder; import org.opendaylight.controller.yang.model.parser.util.RefineHolder; -public class UsesNodeBuilderImpl implements UsesNodeBuilder, Builder { - +final class UsesNodeBuilderImpl implements UsesNodeBuilder, Builder { private final UsesNodeImpl instance; private final SchemaPath groupingPath; private final Set addedAugments = new HashSet(); @@ -89,8 +88,8 @@ public class UsesNodeBuilderImpl implements UsesNodeBuilder, Builder { refines.add(refine); } - private SchemaPath parseUsesPath(final String augmentPath) { - final String[] splittedPath = augmentPath.split("/"); + private SchemaPath parseUsesPath(final String groupingPathStr) { + final String[] splittedPath = groupingPathStr.split("/"); final List path = new ArrayList(); QName name; for (String pathElement : splittedPath) { @@ -103,11 +102,11 @@ public class UsesNodeBuilderImpl implements UsesNodeBuilder, Builder { } path.add(name); } - final boolean absolute = augmentPath.startsWith("/"); + final boolean absolute = groupingPathStr.startsWith("/"); return new SchemaPath(path, absolute); } - private static class UsesNodeImpl implements UsesNode { + private final class UsesNodeImpl implements UsesNode { private final SchemaPath groupingPath; private Set augmentations = Collections.emptySet(); private boolean augmenting; diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/impl/YangModelParserImpl.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/impl/YangModelParserImpl.java index 50943fa740..35c04a8713 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/impl/YangModelParserImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/impl/YangModelParserImpl.java @@ -71,6 +71,8 @@ import org.opendaylight.controller.yang.model.parser.builder.impl.ModuleBuilder; import org.opendaylight.controller.yang.model.parser.builder.impl.TypedefBuilder; import org.opendaylight.controller.yang.model.parser.builder.impl.UnionTypeBuilder; import org.opendaylight.controller.yang.model.parser.builder.impl.UnknownSchemaNodeBuilder; +import org.opendaylight.controller.yang.model.parser.util.ModuleDependencySort; +import org.opendaylight.controller.yang.model.parser.util.ModuleDependencySort.ModuleSimple; import org.opendaylight.controller.yang.model.parser.util.ParserUtils; import org.opendaylight.controller.yang.model.parser.util.RefineHolder; import org.opendaylight.controller.yang.model.parser.util.TypeConstraints; @@ -91,7 +93,7 @@ public class YangModelParserImpl implements YangModelParser { public Set parseYangModels(final List yangFiles) { if (yangFiles != null) { final List inputStreams = new ArrayList(); - + for (final File yangFile : yangFiles) { try { inputStreams.add(new FileInputStream(yangFile)); @@ -119,7 +121,7 @@ public class YangModelParserImpl implements YangModelParser { } private Map> resolveModuleBuilders( - final List yangFileStreams) { + final List yangFileStreams) { final Map> modules = new HashMap>(); final ParseTreeWalker walker = new ParseTreeWalker(); final List trees = parseStreams(yangFileStreams); @@ -135,6 +137,9 @@ public class YangModelParserImpl implements YangModelParser { builders[i] = yangModelParser.getModuleBuilder(); } + // module dependency graph sorted + List sorted = new ModuleDependencySort(builders).sort(); + for (ModuleBuilder builder : builders) { final String builderName = builder.getName(); Date builderRevision = builder.getRevision(); @@ -377,7 +382,7 @@ public class YangModelParserImpl implements YangModelParser { tdb.setPatterns(old.getPatterns()); tdb.setFractionDigits(old.getFractionDigits()); tdb.setPath(old.getPath()); - + final TypeDefinition oldType = old.getType(); if (oldType == null) { tdb.setType(old.getTypedef()); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/impl/YangModelParserListenerImpl.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/impl/YangModelParserListenerImpl.java index 2023b47de3..98b81bd958 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/impl/YangModelParserListenerImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/impl/YangModelParserListenerImpl.java @@ -652,7 +652,7 @@ public final class YangModelParserListenerImpl extends YangParserBaseListener { final String nodeTypeStr = ctx.getChild(0).getText(); final String[] splittedElement = nodeTypeStr.split(":"); if (splittedElement.length == 1) { - nodeType = new QName(null, null, null, splittedElement[0]); + nodeType = new QName(null, null, yangModelPrefix, splittedElement[0]); } else { nodeType = new QName(null, null, splittedElement[0], splittedElement[1]); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/util/ModuleDependencySort.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/util/ModuleDependencySort.java new file mode 100644 index 0000000000..5c128d25d2 --- /dev/null +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/util/ModuleDependencySort.java @@ -0,0 +1,271 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.yang.model.parser.util; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.opendaylight.controller.yang.model.api.ModuleImport; +import org.opendaylight.controller.yang.model.parser.builder.impl.ModuleBuilder; +import org.opendaylight.controller.yang.model.parser.impl.YangModelParserListenerImpl; +import org.opendaylight.controller.yang.model.parser.util.TopologicalSort.Node; +import org.opendaylight.controller.yang.model.parser.util.TopologicalSort.NodeImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Function; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; + +/** + * Creates a module dependency graph from provided {@link ModuleBuilder}s and + * provides a {@link #sort()} method. It is topological sort and returns modules + * in order in which they should be processed (e.g. if A imports B, sort returns + * {B, A}). + */ +public final class ModuleDependencySort { + + private static final Date DEFAULT_REVISION = new Date(0); + private static final Logger logger = LoggerFactory + .getLogger(ModuleDependencySort.class); + + private final Map> moduleGraph; + + /** + * + * @param builders + * Source for module dependency graph. + * @throws YangValidationException + * if 1. there are module:revision duplicates 2. there is + * imported not existing module 3. module is imported twice + */ + public ModuleDependencySort(ModuleBuilder... builders) { + this.moduleGraph = createModuleGraph(builders); + } + + @VisibleForTesting + Map> getModuleGraph() { + return moduleGraph; + } + + /** + * Topological sort of module dependency graph. + * + * @return Sorted list of modules. Modules can be further processed in + * returned order. + */ + public List sort() { + Set nodes = Sets.newHashSet(); + for (Map map : moduleGraph.values()) { + for (ModuleNodeImpl node : map.values()) { + nodes.add(node); + } + } + + // Cast to ModuleNode from Node + return Lists.transform(TopologicalSort.sort(nodes), + new Function() { + + @Override + public ModuleSimple apply(Node input) { + return (ModuleSimple) input; + } + }); + } + + private Map> createModuleGraph( + ModuleBuilder... builders) { + Map> moduleGraph = Maps.newHashMap(); + + processModules(moduleGraph, builders); + processDependencies(moduleGraph, builders); + + return moduleGraph; + } + + /** + * Extract module:revision from module builders + */ + private void processDependencies( + Map> moduleGraph, + ModuleBuilder... builders) { + Map imported = Maps.newHashMap(); + + // Create edges in graph + for (ModuleBuilder mb : builders) { + String fromName = mb.getName(); + Date fromRevision = mb.getRevision() == null ? DEFAULT_REVISION + : mb.getRevision(); + for (ModuleImport imprt : mb.getModuleImports()) { + String toName = imprt.getModuleName(); + Date toRevision = imprt.getRevision() == null ? DEFAULT_REVISION + : imprt.getRevision(); + + ModuleNodeImpl from = moduleGraph.get(fromName).get( + fromRevision); + + ModuleNodeImpl to = getModuleByNameAndRevision(moduleGraph, + fromName, fromRevision, toName, toRevision); + + /* + * Check imports: If module is imported twice with different + * revisions then throw exception + */ + if (imported.get(toName) != null + && !imported.get(toName).equals(toRevision)) + ex(String + .format("Module:%s imported twice with different revisions:%s, %s", + toName, + formatRevDate(imported.get(toName)), + formatRevDate(toRevision))); + imported.put(toName, toRevision); + + from.addEdge(to); + } + } + } + + /** + * Get imported module by its name and revision from moduleGraph + */ + private ModuleNodeImpl getModuleByNameAndRevision( + Map> moduleGraph, + String fromName, Date fromRevision, String toName, Date toRevision) { + ModuleNodeImpl to = null; + + if (moduleGraph.get(toName) == null + || !moduleGraph.get(toName).containsKey(toRevision)) { + // If revision is not specified in import, but module exists + // with different revisions, take first + if (moduleGraph.get(toName) != null + && !moduleGraph.get(toName).isEmpty() + && toRevision.equals(DEFAULT_REVISION)) { + to = moduleGraph.get(toName).values().iterator().next(); + logger.warn(String + .format("Import:%s:%s by module:%s:%s does not specify revision, using:%s:%s for module dependency sort", + toName, formatRevDate(toRevision), fromName, + formatRevDate(fromRevision), to.getName(), + formatRevDate(to.getRevision()))); + } else + ex(String.format("Not existing module imported:%s:%s by:%s:%s", + toName, formatRevDate(toRevision), fromName, + formatRevDate(fromRevision))); + } else { + to = moduleGraph.get(toName).get(toRevision); + } + return to; + } + + private void ex(String message) { + throw new YangValidationException(message); + } + + /** + * Extract dependencies from module builders to fill dependency graph + */ + private void processModules( + Map> moduleGraph, + ModuleBuilder... builders) { + + // Process nodes + for (ModuleBuilder mb : builders) { + String name = mb.getName(); + + Date rev = mb.getRevision(); + if (rev == null) + rev = DEFAULT_REVISION; + + if (moduleGraph.get(name) == null) + moduleGraph.put(name, Maps. newHashMap()); + + if (moduleGraph.get(name).get(rev) != null) + ex(String.format("Module:%s with revision:%s declared twice", + name, formatRevDate(rev))); + + moduleGraph.get(name).put(rev, new ModuleNodeImpl(name, rev)); + } + } + + private static String formatRevDate(Date rev) { + return rev == DEFAULT_REVISION ? "default" + : YangModelParserListenerImpl.simpleDateFormat.format(rev); + } + + /** + * Simple representation of module. Contains name and revision. + */ + public interface ModuleSimple { + String getName(); + + Date getRevision(); + } + + static class ModuleNodeImpl extends NodeImpl implements ModuleSimple { + private final String name; + private final Date revision; + + public ModuleNodeImpl(String name, Date revision) { + this.name = name; + this.revision = revision; + } + + @Override + public String getName() { + return name; + } + + @Override + public Date getRevision() { + return revision; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + + ((revision == null) ? 0 : revision.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ModuleNodeImpl other = (ModuleNodeImpl) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + if (revision == null) { + if (other.revision != null) + return false; + } else if (!revision.equals(other.revision)) + return false; + return true; + } + + @Override + public String toString() { + return "Module [name=" + name + ", revision=" + + formatRevDate(revision) + "]"; + } + + } + +} diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/util/TopologicalSort.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/util/TopologicalSort.java new file mode 100644 index 0000000000..333137c39a --- /dev/null +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/util/TopologicalSort.java @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.yang.model.parser.util; + +import java.util.List; +import java.util.Set; + +import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; + +/** + * Utility class that provides topological sort + */ +public class TopologicalSort { + + /** + * Topological sort of dependent nodes in acyclic graphs. + * + * @return Sorted {@link List} of {@link Node}s. Order: Nodes with no + * dependencies starting. + * @throws IllegalStateException + * when cycle is present in the graph + */ + public static List sort(Set nodes) { + List sortedNodes = Lists.newArrayList(); + + Set dependentNodes = getDependentNodes(nodes); + + while (!dependentNodes.isEmpty()) { + Node n = dependentNodes.iterator().next(); + dependentNodes.remove(n); + + sortedNodes.add(n); + + for (Edge e : n.getInEdges()) { + Node m = e.getFrom(); + m.getOutEdges().remove(e); + + if (m.getOutEdges().isEmpty()) { + dependentNodes.add(m); + } + } + } + + detectCycles(nodes); + + return sortedNodes; + } + + private static Set getDependentNodes(Set nodes) { + Set S = Sets.newHashSet(); + for (Node n : nodes) { + if (n.getOutEdges().size() == 0) { + S.add(n); + } + } + return S; + } + + private static void detectCycles(Set nodes) { + // Detect cycles + boolean cycle = false; + Node cycledNode = null; + + for (Node n : nodes) { + if (!n.getOutEdges().isEmpty()) { + cycle = true; + cycledNode = n; + break; + } + } + Preconditions.checkState(cycle == false, + "Cycle detected in graph around node: " + cycledNode); + } + + /** + * Interface for nodes in graph that can be sorted topologically + */ + public static interface Node { + Set getInEdges(); + + Set getOutEdges(); + } + + /** + * Interface for edges in graph that can be sorted topologically + */ + public static interface Edge { + Node getFrom(); + + Node getTo(); + } + + /** + * Basic Node implementation. + */ + public static class NodeImpl implements Node { + private final Set inEdges; + private final Set outEdges; + + @Override + public Set getInEdges() { + return inEdges; + } + + @Override + public Set getOutEdges() { + return outEdges; + } + + public void addEdge(Node to) { + Edge e = new EdgeImpl(this, to); + outEdges.add(e); + to.getInEdges().add(e); + } + + public NodeImpl() { + inEdges = Sets.newHashSet(); + outEdges = Sets.newHashSet(); + } + } + + /** + * Basic Edge implementation + */ + public static class EdgeImpl implements Edge { + private final Node from; + private final Node to; + + @Override + public Node getFrom() { + return from; + } + + @Override + public Node getTo() { + return to; + } + + public EdgeImpl(Node from, Node to) { + this.from = from; + this.to = to; + + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((from == null) ? 0 : from.hashCode()); + result = prime * result + ((to == null) ? 0 : to.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + EdgeImpl other = (EdgeImpl) obj; + if (from == null) { + if (other.from != null) + return false; + } else if (!from.equals(other.from)) + return false; + if (to == null) { + if (other.to != null) + return false; + } else if (!to.equals(other.to)) + return false; + return true; + } + } + +} diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/model/parser/impl/TypesResolutionTest.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/model/parser/impl/TypesResolutionTest.java index 7acf7cbbe4..4a48a4e2da 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/model/parser/impl/TypesResolutionTest.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/model/parser/impl/TypesResolutionTest.java @@ -19,7 +19,6 @@ import org.opendaylight.controller.yang.common.QName; import org.opendaylight.controller.yang.model.api.IdentitySchemaNode; import org.opendaylight.controller.yang.model.api.LeafSchemaNode; import org.opendaylight.controller.yang.model.api.Module; -import org.opendaylight.controller.yang.model.api.Status; import org.opendaylight.controller.yang.model.api.TypeDefinition; import org.opendaylight.controller.yang.model.api.type.BitsTypeDefinition.Bit; import org.opendaylight.controller.yang.model.api.type.EnumTypeDefinition.EnumPair; diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/model/parser/util/ModuleDependencySortTest.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/model/parser/util/ModuleDependencySortTest.java new file mode 100644 index 0000000000..216d77854f --- /dev/null +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/model/parser/util/ModuleDependencySortTest.java @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.yang.model.parser.util; + +import static org.hamcrest.core.AnyOf.*; +import static org.hamcrest.core.Is.*; +import static org.junit.Assert.*; +import static org.junit.matchers.JUnitMatchers.*; +import static org.mockito.Mockito.*; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.hamcrest.Matcher; +import org.junit.Test; +import org.opendaylight.controller.yang.model.api.ModuleImport; +import org.opendaylight.controller.yang.model.parser.builder.impl.ModuleBuilder; +import org.opendaylight.controller.yang.model.parser.impl.YangModelParserListenerImpl; +import org.opendaylight.controller.yang.model.parser.util.ModuleDependencySort.ModuleNodeImpl; +import org.opendaylight.controller.yang.model.parser.util.ModuleDependencySort.ModuleSimple; +import org.opendaylight.controller.yang.model.parser.util.TopologicalSort.Edge; + +import com.google.common.collect.Sets; + +public class ModuleDependencySortTest { + + private ModuleBuilder a = mockModule("a", null); + private ModuleBuilder b = mockModule("b", null); + private ModuleBuilder c = mockModule("c", null); + private ModuleBuilder d = mockModule("d", null); + + @Test + public void testValid() throws Exception { + + mockDependency(a, b); + mockDependency(b, c); + mockDependency(b, d); + + ModuleBuilder[] builders = new ModuleBuilder[] { d, b, c, a }; + ModuleDependencySort sort = new ModuleDependencySort(builders); + + assertDependencyGraph(sort.getModuleGraph()); + + List l = sort.sort(); + + @SuppressWarnings("unchecked") + Matcher cOrD = anyOf(is(c.getName()), is(d.getName())); + + assertThat(l.get(0).getName(), cOrD); + assertThat(l.get(1).getName(), cOrD); + assertThat(l.get(2).getName(), is(b.getName())); + assertThat(l.get(3).getName(), is(a.getName())); + } + + @Test(expected = YangValidationException.class) + public void testModuleTwice() throws Exception { + ModuleBuilder a2 = mockModule("a", null); + + ModuleBuilder[] builders = new ModuleBuilder[] { a, a2 }; + try { + new ModuleDependencySort(builders); + } catch (YangValidationException e) { + assertThat(e.getMessage(), + containsString("Module:a with revision:default declared twice")); + throw e; + } + } + + @Test(expected = YangValidationException.class) + public void testImportNotExistingModule() throws Exception { + mockDependency(a, b); + + ModuleBuilder[] builders = new ModuleBuilder[] { a }; + try { + new ModuleDependencySort(builders); + } catch (YangValidationException e) { + assertThat(e.getMessage(), + containsString("Not existing module imported:b:default by:a:default")); + throw e; + } + } + + @Test + public void testImportTwice() throws Exception { + mockDependency(a, b); + mockDependency(c, b); + + ModuleBuilder[] builders = new ModuleBuilder[] { a, b, c }; + new ModuleDependencySort(builders); + } + + @Test(expected = YangValidationException.class) + public void testImportTwiceDifferentRevision() throws Exception { + Date date = new Date(); + ModuleBuilder b2 = mockModule("b", date); + + mockDependency(a, b); + mockDependency(c, b2); + + ModuleBuilder[] builders = new ModuleBuilder[] { a, c, b, b2 }; + try { + ModuleDependencySort aaa = new ModuleDependencySort(builders); + System.out.println(aaa.getModuleGraph()); + } catch (YangValidationException e) { + assertThat(e.getMessage(), + containsString("Module:b imported twice with different revisions:default, " + + YangModelParserListenerImpl.simpleDateFormat + .format(date))); + throw e; + } + } + + @Test + public void testModuleTwiceWithDifferentRevs() throws Exception { + ModuleBuilder a2 = mockModule("a", new Date()); + + ModuleBuilder[] builders = new ModuleBuilder[] { a, a2 }; + new ModuleDependencySort(builders); + } + + @Test(expected = YangValidationException.class) + public void testModuleTwice2() throws Exception { + Date rev = new Date(); + ModuleBuilder a2 = mockModule("a", rev); + ModuleBuilder a3 = mockModule("a", rev); + + ModuleBuilder[] builders = new ModuleBuilder[] { a, a2, a3 }; + try { + new ModuleDependencySort(builders); + } catch (YangValidationException e) { + assertThat(e.getMessage(), containsString("Module:a with revision:" + + YangModelParserListenerImpl.simpleDateFormat.format(rev) + + " declared twice")); + throw e; + } + } + + private void assertDependencyGraph( + Map> moduleGraph) { + for (Entry> node : moduleGraph + .entrySet()) { + String name = node.getKey(); + + // Expects only one module revision + + Set inEdges = node.getValue().values().iterator().next() + .getInEdges(); + Set outEdges = node.getValue().values().iterator().next() + .getOutEdges(); + + if (name.equals("a")) { + assertEdgeCount(inEdges, 0, outEdges, 1); + } else if (name.equals("b")) { + assertEdgeCount(inEdges, 1, outEdges, 2); + } else { + assertEdgeCount(inEdges, 1, outEdges, 0); + } + } + } + + private void assertEdgeCount(Set inEdges, int i, Set outEdges, + int j) { + assertThat(inEdges.size(), is(i)); + assertThat(outEdges.size(), is(j)); + } + + private void mockDependency(ModuleBuilder a, ModuleBuilder b) { + ModuleImport imprt = mock(ModuleImport.class); + doReturn(b.getName()).when(imprt).getModuleName(); + doReturn(b.getRevision()).when(imprt).getRevision(); + a.getModuleImports().add(imprt); + } + + private ModuleBuilder mockModule(String name, Date rev) { + ModuleBuilder a = mock(ModuleBuilder.class); + doReturn(name).when(a).getName(); + Set set = Sets.newHashSet(); + doReturn(set).when(a).getModuleImports(); + if (rev != null) { + doReturn(rev).when(a).getRevision(); + } + return a; + } +} diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/model/parser/util/TopologicalSortTest.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/model/parser/util/TopologicalSortTest.java new file mode 100644 index 0000000000..bfb94e530c --- /dev/null +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/model/parser/util/TopologicalSortTest.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.yang.model.parser.util; + +import static org.hamcrest.core.Is.*; +import static org.junit.Assert.*; + +import java.util.List; +import java.util.Set; + +import org.junit.Test; +import org.opendaylight.controller.yang.model.parser.util.TopologicalSort.Node; +import org.opendaylight.controller.yang.model.parser.util.TopologicalSort.NodeImpl; + +import com.google.common.collect.Sets; + +public class TopologicalSortTest { + + @Test(expected = IllegalStateException.class) + public void test() throws Exception { + Set nodes = Sets.newHashSet(); + + NodeImpl node1 = new NodeImpl(); + nodes.add(node1); + NodeImpl node2 = new NodeImpl(); + nodes.add(node2); + NodeImpl node3 = new NodeImpl(); + nodes.add(node3); + + node1.addEdge(node2); + node2.addEdge(node3); + node3.addEdge(node1); + + try { + TopologicalSort.sort(nodes); + } catch (IllegalStateException e) { + throw e; + } + } + + @Test + public void testValidSimple() throws Exception { + Set nodes = Sets.newHashSet(); + + Node node1 = new NodeImpl(); + nodes.add(node1); + Node node2 = new NodeImpl(); + nodes.add(node2); + Node node3 = new NodeImpl(); + nodes.add(node3); + Node node4 = new NodeImpl(); + nodes.add(node4); + + ((NodeImpl) node1).addEdge(node2); + ((NodeImpl) node1).addEdge(node3); + ((NodeImpl) node2).addEdge(node4); + ((NodeImpl) node3).addEdge(node2); + + List sorted = TopologicalSort.sort(nodes); + + assertThat(sorted.get(0), is(node4)); + assertThat(sorted.get(1), is(node2)); + assertThat(sorted.get(2), is(node3)); + assertThat(sorted.get(3), is(node1)); + } + +} diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/model/testfile2.yang b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/model/testfile2.yang index 4f146f705d..1a7b45ecb1 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/model/testfile2.yang +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/model/testfile2.yang @@ -3,11 +3,6 @@ module types2 { namespace "urn:simple.types.data.demo"; prefix "t2"; - import types1 { - prefix "if"; - revision-date 2013-02-27; - } - organization "opendaylight"; contact "http://www.opendaylight.org/"; diff --git a/opendaylight/sal/yang-prototype/sal/pom.xml b/opendaylight/sal/yang-prototype/sal/pom.xml index 9f77613b89..2604a45acf 100644 --- a/opendaylight/sal/yang-prototype/sal/pom.xml +++ b/opendaylight/sal/yang-prototype/sal/pom.xml @@ -1,107 +1,107 @@ - - 4.0.0 - org.opendaylight.controller - sal - 1.0-SNAPSHOT - pom - - - sal-common - sal-common-util - sal-core-api - sal-data-api - sal-binding-api - sal-binding-spi - sal-binding-broker-impl - sal-schema-repository-api - sal-core-spi - sal-broker-impl - sal-core-demo - - - - - - com.google.guava - guava - 14.0.1 - jar - - - org.slf4j - slf4j-api - 1.7.2 - - - junit - junit - 4.10 - - - - - - - junit - junit - test - true - - - org.mockito - mockito-all - 1.9.5 - test - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 2.0 - true - - 1.6 - 1.6 - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.8.1 - - maven - - - - - aggregate - - site - - - - - - - - - org.codehaus.mojo - findbugs-maven-plugin - 2.4.0 - - Max - Low - site - - - - org.codehaus.mojo - jdepend-maven-plugin - 2.0-beta-2 - - + + 4.0.0 + org.opendaylight.controller + sal + 1.0-SNAPSHOT + pom + + + sal-common + sal-common-util + sal-core-api + sal-data-api + sal-binding-api + sal-binding-spi + sal-binding-broker-impl + sal-schema-repository-api + sal-core-spi + sal-broker-impl + sal-core-demo + + + + + + com.google.guava + guava + 14.0.1 + jar + + + org.slf4j + slf4j-api + 1.7.2 + + + junit + junit + 4.10 + + + + + + + junit + junit + test + true + + + org.mockito + mockito-all + 1.9.5 + test + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.0 + true + + 1.7 + 1.7 + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.8.1 + + maven + + + + + aggregate + + site + + + + + + + + + org.codehaus.mojo + findbugs-maven-plugin + 2.4.0 + + Max + Low + site + + + + org.codehaus.mojo + jdepend-maven-plugin + 2.0-beta-2 + + \ No newline at end of file diff --git a/opendaylight/sal/yang-prototype/yang/pom.xml b/opendaylight/sal/yang-prototype/yang/pom.xml index d10366c2cf..68134d4ac8 100644 --- a/opendaylight/sal/yang-prototype/yang/pom.xml +++ b/opendaylight/sal/yang-prototype/yang/pom.xml @@ -1,84 +1,84 @@ - - 4.0.0 - org.opendaylight.controller - yang - 1.0 - pom - - yang-common - yang-data-api - yang-data-util - yang-model-api - yang-model-util - yang-binding - - - - - junit - junit - 4.10 - test - true - - - org.slf4j - slf4j-api - 1.7.2 - - - org.slf4j - slf4j-simple - 1.7.2 - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 2.0 - true - - 1.6 - 1.6 - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.8.1 - - maven - - - - - aggregate - - site - - - - - - - - - org.codehaus.mojo - findbugs-maven-plugin - 2.4.0 - - Max - Low - site - - - - org.codehaus.mojo - jdepend-maven-plugin - 2.0-beta-2 - - - - + + 4.0.0 + org.opendaylight.controller + yang + 1.0 + pom + + yang-common + yang-data-api + yang-data-util + yang-model-api + yang-model-util + yang-binding + + + + + junit + junit + 4.10 + test + true + + + org.slf4j + slf4j-api + 1.7.2 + + + org.slf4j + slf4j-simple + 1.7.2 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.0 + true + + 1.7 + 1.7 + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.8.1 + + maven + + + + + aggregate + + site + + + + + + + + + org.codehaus.mojo + findbugs-maven-plugin + 2.4.0 + + Max + Low + site + + + + org.codehaus.mojo + jdepend-maven-plugin + 2.0-beta-2 + + + + diff --git a/opendaylight/samples/loadbalancer/pom.xml b/opendaylight/samples/loadbalancer/pom.xml index aaf1a183ca..a7583c8ab3 100644 --- a/opendaylight/samples/loadbalancer/pom.xml +++ b/opendaylight/samples/loadbalancer/pom.xml @@ -91,7 +91,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT diff --git a/opendaylight/samples/northbound/loadbalancer/pom.xml b/opendaylight/samples/northbound/loadbalancer/pom.xml index cabcf8d972..94a6ae16c2 100644 --- a/opendaylight/samples/northbound/loadbalancer/pom.xml +++ b/opendaylight/samples/northbound/loadbalancer/pom.xml @@ -22,7 +22,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT @@ -84,7 +84,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/samples/simpleforwarding/pom.xml b/opendaylight/samples/simpleforwarding/pom.xml index 7201b92b05..342d8df8c4 100644 --- a/opendaylight/samples/simpleforwarding/pom.xml +++ b/opendaylight/samples/simpleforwarding/pom.xml @@ -79,7 +79,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT diff --git a/opendaylight/security/pom.xml b/opendaylight/security/pom.xml index 8b0676ba83..2991afc1a4 100644 --- a/opendaylight/security/pom.xml +++ b/opendaylight/security/pom.xml @@ -54,7 +54,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT diff --git a/opendaylight/statisticsmanager/api/pom.xml b/opendaylight/statisticsmanager/api/pom.xml index 67329ba5e0..5c5b71dfb0 100644 --- a/opendaylight/statisticsmanager/api/pom.xml +++ b/opendaylight/statisticsmanager/api/pom.xml @@ -41,7 +41,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/statisticsmanager/implementation/pom.xml b/opendaylight/statisticsmanager/implementation/pom.xml index 98bf15d274..311204b545 100644 --- a/opendaylight/statisticsmanager/implementation/pom.xml +++ b/opendaylight/statisticsmanager/implementation/pom.xml @@ -88,7 +88,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/statisticsmanager/integrationtest/pom.xml b/opendaylight/statisticsmanager/integrationtest/pom.xml index 397480e1e6..69c686c708 100644 --- a/opendaylight/statisticsmanager/integrationtest/pom.xml +++ b/opendaylight/statisticsmanager/integrationtest/pom.xml @@ -21,7 +21,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/statisticsmanager/integrationtest/src/test/java/org/opendaylight/controller/statisticsmanager/internal/StatisticsManagerIntegrationTest.java b/opendaylight/statisticsmanager/integrationtest/src/test/java/org/opendaylight/controller/statisticsmanager/internal/StatisticsManagerIntegrationTest.java index fa96d5304e..2515173198 100644 --- a/opendaylight/statisticsmanager/integrationtest/src/test/java/org/opendaylight/controller/statisticsmanager/internal/StatisticsManagerIntegrationTest.java +++ b/opendaylight/statisticsmanager/integrationtest/src/test/java/org/opendaylight/controller/statisticsmanager/internal/StatisticsManagerIntegrationTest.java @@ -82,7 +82,7 @@ public class StatisticsManagerIntegrationTest { mavenBundle("ch.qos.logback", "logback-classic", "1.0.9"), // List all the bundles on which the test case depends mavenBundle("org.opendaylight.controller", "sal", - "0.4.0-SNAPSHOT"), + "0.5.0-SNAPSHOT"), mavenBundle("org.opendaylight.controller", "sal.implementation", "0.4.0-SNAPSHOT"), mavenBundle("org.opendaylight.controller", "statisticsmanager", diff --git a/opendaylight/switchmanager/api/pom.xml b/opendaylight/switchmanager/api/pom.xml index d57a2d4a01..44746e5653 100644 --- a/opendaylight/switchmanager/api/pom.xml +++ b/opendaylight/switchmanager/api/pom.xml @@ -98,7 +98,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT diff --git a/opendaylight/switchmanager/api/src/main/java/org/opendaylight/controller/switchmanager/ISwitchManagerAware.java b/opendaylight/switchmanager/api/src/main/java/org/opendaylight/controller/switchmanager/ISwitchManagerAware.java index 1b67e529df..0d6410662a 100644 --- a/opendaylight/switchmanager/api/src/main/java/org/opendaylight/controller/switchmanager/ISwitchManagerAware.java +++ b/opendaylight/switchmanager/api/src/main/java/org/opendaylight/controller/switchmanager/ISwitchManagerAware.java @@ -14,8 +14,8 @@ import org.opendaylight.controller.sal.core.Node; import org.opendaylight.controller.switchmanager.Subnet; /** - * The interface class provides methods to notify listeners about subnet and - * mode changes. + * The interface provides methods to notify listeners about subnet and mode + * changes. */ public interface ISwitchManagerAware { /** diff --git a/opendaylight/switchmanager/implementation/pom.xml b/opendaylight/switchmanager/implementation/pom.xml index 5e9eb5f994..6f7a7ea13c 100644 --- a/opendaylight/switchmanager/implementation/pom.xml +++ b/opendaylight/switchmanager/implementation/pom.xml @@ -101,7 +101,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/topologymanager/pom.xml b/opendaylight/topologymanager/pom.xml index dd7ad2d6f0..29a060f477 100755 --- a/opendaylight/topologymanager/pom.xml +++ b/opendaylight/topologymanager/pom.xml @@ -54,7 +54,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/topologymanager/src/main/java/org/opendaylight/controller/topologymanager/ITopologyManager.java b/opendaylight/topologymanager/src/main/java/org/opendaylight/controller/topologymanager/ITopologyManager.java index 73bbc4a29b..de4f0d5347 100644 --- a/opendaylight/topologymanager/src/main/java/org/opendaylight/controller/topologymanager/ITopologyManager.java +++ b/opendaylight/topologymanager/src/main/java/org/opendaylight/controller/topologymanager/ITopologyManager.java @@ -22,8 +22,7 @@ import org.opendaylight.controller.sal.core.UpdateType; import org.opendaylight.controller.sal.utils.Status; /** - * Interface class that provides methods to interact with - * network topology database + * The Interface provides methods to interact with network topology database. */ public interface ITopologyManager { /** diff --git a/opendaylight/topologymanager/src/main/java/org/opendaylight/controller/topologymanager/TopologyUserLinkConfig.java b/opendaylight/topologymanager/src/main/java/org/opendaylight/controller/topologymanager/TopologyUserLinkConfig.java index fafbd4b3dc..d5b499c42b 100644 --- a/opendaylight/topologymanager/src/main/java/org/opendaylight/controller/topologymanager/TopologyUserLinkConfig.java +++ b/opendaylight/topologymanager/src/main/java/org/opendaylight/controller/topologymanager/TopologyUserLinkConfig.java @@ -27,7 +27,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * Interface class that provides methods to manipulate user configured link + * The Interface provides methods to manipulate user configured link. */ @XmlRootElement @XmlAccessorType(XmlAccessType.NONE) 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..e8d0d416e5 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,6 +11,7 @@ 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; @@ -20,6 +20,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; +import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -44,6 +45,7 @@ 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.topology.TopoEdgeUpdate; import org.opendaylight.controller.sal.utils.StatusCode; import org.opendaylight.controller.sal.utils.GlobalConstants; import org.opendaylight.controller.sal.utils.IObjectReader; @@ -84,37 +86,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; } } @@ -134,7 +135,7 @@ public class TopologyManagerImpl implements ITopologyManager, /** * Function called by the dependency manager when all the required * dependencies are satisfied - * + * */ void init(Component c) { String containerName = null; @@ -200,9 +201,9 @@ 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() { // SollicitRefresh MUST be called here else if called at init @@ -212,10 +213,10 @@ 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() { if (this.clusterContainerService == null) { @@ -255,18 +256,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 +325,11 @@ public class TopologyManagerImpl implements ITopologyManager, } /** - * 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 + * 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 */ @Override public Map> getEdges() { @@ -340,8 +341,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 +355,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) { @@ -411,7 +413,7 @@ public class TopologyManagerImpl implements ITopologyManager, if (this.hostsDB == null) { return; } - + switch (t) { case ADDED: case CHANGED: @@ -432,8 +434,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 +446,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) { @@ -507,7 +509,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,37 +540,52 @@ 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.getDstNodeIDType(), link.getDstSwitchId(), + link.getDstNodeConnectorIDType(), link.getDstPort(), + link.getSrcNodeIDType(), link.getSrcSwitchId(), + link.getSrcNodeConnectorIDType(), link.getSrcPort()); 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 + // 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) && + // 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; @@ -580,44 +597,44 @@ public class TopologyManagerImpl implements ITopologyManager, String dstNodeIDType = link.getDstNodeIDType(); String dstNodeConnectorIDType = link.getDstNodeConnectorIDType(); try { - if (srcNodeIDType.equals(NodeIDType.OPENFLOW)) { + if (srcNodeIDType.equals(NodeIDType.OPENFLOW)) { sNode = new Node(srcNodeIDType, link.getSrcSwitchIDLong()); - } else { - sNode = new Node(srcNodeIDType, link.getSrcSwitchId()); - } + } else { + sNode = new Node(srcNodeIDType, link.getSrcSwitchId()); + } - if (dstNodeIDType.equals(NodeIDType.OPENFLOW)) { + if (dstNodeIDType.equals(NodeIDType.OPENFLOW)) { dNode = new Node(dstNodeIDType, link.getDstSwitchIDLong()); - } else { - dNode = new Node(dstNodeIDType, link.getDstSwitchId()); - } - - if (srcNodeConnectorIDType.equals(NodeConnectorIDType.OPENFLOW)) { + } 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)) { + 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); - } + 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); + log.warn("Caught exception ", cex); } return linkTuple; } @@ -636,12 +653,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)) { @@ -658,8 +675,8 @@ public class TopologyManagerImpl implements ITopologyManager, link.setStatus(TopologyUserLinkConfig.STATUS.SUCCESS); } catch (Exception e) { return new Status(StatusCode.INTERNALERROR, - "Exception while adding custom link : " + - e.getMessage()); + "Exception while adding custom link : " + + e.getMessage()); } } return new Status(StatusCode.SUCCESS, null); @@ -668,8 +685,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); @@ -678,19 +695,19 @@ public class TopologyManagerImpl implements ITopologyManager, userLinks.remove(linkName); if (linkTuple != null) { try { - //oneTopology.deleteUserConfiguredLink(linkTuple); + // oneTopology.deleteUserConfiguredLink(linkTuple); } catch (Exception e) { - log - .warn("Harmless : Exception while Deleting User Configured link {} {}", - link, e.toString()); + log.warn( + "Harmless : Exception while Deleting User Configured link {} {}", + link, e.toString()); } linkTuple = getReverseLinkTuple(link); try { - //oneTopology.deleteUserConfiguredLink(linkTuple); + // oneTopology.deleteUserConfiguredLink(linkTuple); } catch (Exception e) { - log - .warn("Harmless : Exception while Deleting User Configured Reverse link {} {}", - link, e.toString()); + log.warn( + "Harmless : Exception while Deleting User Configured Reverse link {} {}", + link, e.toString()); } } return new Status(StatusCode.SUCCESS, null); @@ -707,7 +724,7 @@ 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 addTopo name \n"); help.append("\t delTopo name\n"); help.append("\t printTopo\n"); help.append("\t printNodeEdges\n"); @@ -716,11 +733,11 @@ public class TopologyManagerImpl implements ITopologyManager, public void _printTopo(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)); } } @@ -778,9 +795,9 @@ public class TopologyManagerImpl implements ITopologyManager, 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, + srcNodeIDType, dpid, srcNodeConnectorIDType, port, + dstNodeIDType, ddpid, dstNodeConnectorIDType, dport); ci.println(this.addUserLink(config)); } @@ -794,23 +811,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); + } } } diff --git a/opendaylight/topologymanager/src/test/java/org/opendaylight/controller/topologymanager/internal/TopologyManagerImplTest.java b/opendaylight/topologymanager/src/test/java/org/opendaylight/controller/topologymanager/internal/TopologyManagerImplTest.java index c2e3df9d00..c176cb2cf3 100644 --- a/opendaylight/topologymanager/src/test/java/org/opendaylight/controller/topologymanager/internal/TopologyManagerImplTest.java +++ b/opendaylight/topologymanager/src/test/java/org/opendaylight/controller/topologymanager/internal/TopologyManagerImplTest.java @@ -1,4 +1,3 @@ - /* * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * @@ -11,8 +10,10 @@ package org.opendaylight.controller.topologymanager.internal; import java.net.InetAddress; import java.net.UnknownHostException; +import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentMap; @@ -31,361 +32,420 @@ import org.opendaylight.controller.sal.core.Property; import org.opendaylight.controller.sal.core.State; import org.opendaylight.controller.sal.core.UpdateType; import org.opendaylight.controller.sal.packet.address.EthernetAddress; +import org.opendaylight.controller.sal.topology.TopoEdgeUpdate; import org.opendaylight.controller.sal.utils.StatusCode; import org.opendaylight.controller.sal.utils.NodeConnectorCreator; import org.opendaylight.controller.sal.utils.NodeCreator; import org.opendaylight.controller.topologymanager.TopologyUserLinkConfig; -public class TopologyManagerImplTest { - - /* - * Sets the node, edges and properties for edges here: - * Edge : - * <1:1>--><11:11>; <1:2>--><11:12>; - * <3:3>--><13:13>; <3:4>--><13:14>; - * <5:5>--><15:15>; <5:6>--><15:16>; - * Method used by two tests: testGetNodeEdges and testGetEdges - * @param topoManagerImpl - * @throws ConstructionException - */ - public void setNodeEdges(TopologyManagerImpl topoManagerImpl) throws ConstructionException { - topoManagerImpl.nonClusterObjectCreate(); - - State state; - Bandwidth bw; - Latency l; - - Set props = new HashSet(); - state = new State(State.EDGE_UP); - bw = new Bandwidth(Bandwidth.BW100Gbps); - l = new Latency(Latency.LATENCY100ns); - props.add(state); - props.add(bw); - props.add(l); - - for (short i = 1; i < 6; i=(short) (i+2)) { - NodeConnector headnc1 = NodeConnectorCreator.createOFNodeConnector(i, NodeCreator.createOFNode((long)i)); - NodeConnector tailnc1 = NodeConnectorCreator.createOFNodeConnector((short)(i+10), NodeCreator.createOFNode((long)(i+10))); - Edge e1 = new Edge(headnc1, tailnc1); - topoManagerImpl.edgeUpdate(e1, UpdateType.ADDED, props); - - NodeConnector headnc2 = NodeConnectorCreator.createOFNodeConnector((short) (i+1), headnc1.getNode()); - NodeConnector tailnc2 = NodeConnectorCreator.createOFNodeConnector((short)(i+11), tailnc1.getNode()); - Edge e2 = new Edge(headnc2, tailnc2); - topoManagerImpl.edgeUpdate(e2, UpdateType.ADDED, props); - } - } - - @Test - public void testGetNodeEdges() throws ConstructionException { - TopologyManagerImpl topoManagerImpl = new TopologyManagerImpl(); - setNodeEdges(topoManagerImpl); - - Map> nodeEdgeMap = topoManagerImpl.getNodeEdges(); - for (Iterator>> i = nodeEdgeMap.entrySet().iterator(); i.hasNext();) { - Map.Entry> entry = i.next(); - Node node = entry.getKey(); - Long nodeId = ((Long) node.getID()).longValue(); - Assert.assertTrue((node.getType().equals(NodeIDType.OPENFLOW))); - - Set edges = entry.getValue(); - for (Edge edge : edges) { - Long headNcId = ((Short)edge.getHeadNodeConnector().getID()).longValue(); - Long tailNcId = ((Short) edge.getTailNodeConnector().getID()).longValue(); - if (nodeId == 1 || nodeId == 3 || nodeId == 5) { - Assert.assertTrue((headNcId.equals(nodeId) && tailNcId.equals(nodeId + 10)) || - (headNcId.equals(nodeId + 10) && tailNcId.equals(nodeId)) || - (headNcId.equals(nodeId + 1) && tailNcId.equals(nodeId + 11)) || - (headNcId.equals(nodeId + 11) && tailNcId.equals(nodeId + 1))); - } else if (nodeId == 11 || nodeId == 13 || nodeId == 15) { - Assert.assertTrue((headNcId.equals(nodeId) && tailNcId.equals(nodeId - 10)) || - (headNcId.equals(nodeId) && tailNcId.equals(nodeId - 10)) || - (headNcId.equals(nodeId - 9) && tailNcId.equals(nodeId + 1)) || - (headNcId.equals(nodeId + 1) && tailNcId.equals(nodeId - 9))); - } - } - i.remove(); - } - Assert.assertTrue(nodeEdgeMap.isEmpty()); - } - - @Test - public void testGetEdges() throws ConstructionException { - TopologyManagerImpl topoManagerImpl = new TopologyManagerImpl(); - setNodeEdges(topoManagerImpl); - - Map> edgeProperty = topoManagerImpl.getEdges(); - - for (Iterator >> i = edgeProperty.entrySet().iterator() ; i.hasNext();) { - Map.Entry> entry = i.next(); - Edge e = entry.getKey(); - NodeConnector headnc = e.getHeadNodeConnector(); - NodeConnector tailnc = e.getTailNodeConnector(); - - Long headNodeId = (Long) headnc.getNode().getID(); - - Long headNcId = ((Short)headnc.getID()).longValue(); - Long tailNcId = ((Short)tailnc.getID()).longValue(); - - if (headNodeId == 1 || headNodeId == 3 || headNodeId == 5) { - Assert.assertTrue((headNcId.equals(headNodeId) && tailNcId.equals(headNodeId + 10)) || - (headNcId.equals(headNodeId + 10) && tailNcId.equals(headNodeId)) || - (headNcId.equals(headNodeId + 1) && tailNcId.equals(headNodeId + 11)) || - (headNcId.equals(headNodeId + 11) && tailNcId.equals(headNodeId + 1))); - } else if (headNodeId == 11 || headNodeId == 13 || headNodeId == 15) { - Assert.assertTrue((headNcId.equals(headNodeId) && tailNcId.equals(headNodeId - 10)) || - (headNcId.equals(headNodeId) && tailNcId.equals(headNodeId - 10)) || - (headNcId.equals(headNodeId - 9) && tailNcId.equals(headNodeId + 1)) || - (headNcId.equals(headNodeId + 1) && tailNcId.equals(headNodeId - 9))); - } - - Set prop = entry.getValue(); - for (Property p : prop) { - String pName; - long pValue; - if (p instanceof Bandwidth) { - Bandwidth b = (Bandwidth)p; - pName = Bandwidth.BandwidthPropName; - pValue = b.getValue(); - Assert.assertTrue(pName.equals(p.getName()) && pValue == Bandwidth.BW100Gbps ); - continue; - } - if (p instanceof Latency) { - Latency l = (Latency)p; - pName = Latency.LatencyPropName; - pValue = l.getValue(); - Assert.assertTrue(pName.equals(p.getName()) && pValue == Latency.LATENCY100ns); - continue; - } - if (p instanceof State) { - State state = (State)p; - pName = State.StatePropName; - pValue = state.getValue(); - Assert.assertTrue(pName.equals(p.getName()) && pValue == State.EDGE_UP); - continue; - } - } - i.remove(); - } - Assert.assertTrue(edgeProperty.isEmpty()); - } - - - @Test - public void testAddDeleteUserLink () { - TopologyUserLinkConfig link1 = new TopologyUserLinkConfig("default1", "OF", "1", "OF", "2", "OF", "1", "OF", "2"); - TopologyUserLinkConfig link2 = new TopologyUserLinkConfig("default1", "OF", "10", "OF", "20", "OF", "10", "OF", "20"); - TopologyUserLinkConfig link3 = new TopologyUserLinkConfig("default2", "OF", "1", "OF", "2", "OF", "1", "OF", "2"); - TopologyUserLinkConfig link4 = new TopologyUserLinkConfig("default20", "OF", "10", "OF", "20", "OF", "10", "OF", "20"); - - TopologyManagerImpl topoManagerImpl = new TopologyManagerImpl(); - topoManagerImpl.nonClusterObjectCreate(); - - Assert.assertTrue (topoManagerImpl.addUserLink(link1).isSuccess()); - Assert.assertTrue (topoManagerImpl.addUserLink(link2).getCode() == StatusCode.CONFLICT); - Assert.assertTrue (topoManagerImpl.addUserLink(link3).getCode() == StatusCode.CONFLICT); - Assert.assertTrue (topoManagerImpl.addUserLink(link4).isSuccess()); - - Assert.assertTrue (topoManagerImpl.deleteUserLink(null).getCode() == StatusCode.BADREQUEST); - Assert.assertTrue (topoManagerImpl.deleteUserLink(link1.getName()).isSuccess()); - Assert.assertTrue (topoManagerImpl.deleteUserLink(link4.getName()).isSuccess()); - Assert.assertTrue (topoManagerImpl.getUserLinks().isEmpty()); - - } - - @Test - public void testGetUserLink () { - TopologyUserLinkConfig[] link = new TopologyUserLinkConfig[5]; - TopologyUserLinkConfig[] reverseLink = new TopologyUserLinkConfig[5]; - TopologyManagerImpl topoManagerImpl = new TopologyManagerImpl(); - topoManagerImpl.nonClusterObjectCreate(); - - String name = null; - String srcNodeIDType = null; - String srcSwitchId = null; - String srcNodeConnectorIDType = null; - String srcPort = null; - String dstNodeIDType = null; - String dstSwitchId = null; - String dstNodeConnectorIDType = null; - String dstPort = null; - - /*Creating userlinks and checking for their validity*/ - link[0] = new TopologyUserLinkConfig(name, srcNodeIDType, srcSwitchId, - srcNodeConnectorIDType, srcPort, dstNodeIDType, dstSwitchId, - dstNodeConnectorIDType, dstPort); - Assert.assertTrue(link[0].isValid() == false); - - srcSwitchId = "1"; - link[0] = new TopologyUserLinkConfig(name, srcNodeIDType, srcSwitchId, - srcNodeConnectorIDType, srcPort, dstNodeIDType, dstSwitchId, - dstNodeConnectorIDType, dstPort); - Assert.assertTrue(link[0].isValid() == false); - - dstSwitchId = "2"; - link[0] = new TopologyUserLinkConfig(name, srcNodeIDType, srcSwitchId, - srcNodeConnectorIDType, srcPort, dstNodeIDType, dstSwitchId, - dstNodeConnectorIDType, dstPort); - Assert.assertTrue(link[0].isValid() == false); - - - Integer i; - - for (i = 0; i < 5; i++) { - link[i] = new TopologyUserLinkConfig(name, srcNodeIDType, - srcSwitchId, srcNodeConnectorIDType, srcPort, - dstNodeIDType, dstSwitchId, dstNodeConnectorIDType, dstPort); - - name = Integer.toString(i + 1); - srcSwitchId = Integer.toString(i + 1); - srcPort = Integer.toString(i + 1); - dstSwitchId = Integer.toString((i + 1)*10); - dstPort = Integer.toString((i + 1)*10); - - link[i].setName(name); - link[i].setSrcSwitchId(srcSwitchId); - link[i].setSrcPort(srcPort); - link[i].setDstSwitchId(dstSwitchId); - link[i].setDstPort(dstPort); - - Assert.assertTrue(link[i].isValid() == false); - - link[i].setSrcNodeIDType("OF"); - link[i].setSrcNodeConnectorIDType("OF"); - - Assert.assertTrue(link[i].isValid() == false); - - link[i].setDstNodeIDType("OF"); - link[i].setDstNodeConnectorIDType("OF"); - - Assert.assertTrue(link[i].isValid() == true); - - reverseLink[i] = new TopologyUserLinkConfig(name, dstNodeIDType, - dstSwitchId, dstNodeConnectorIDType, dstPort, - srcNodeIDType, srcSwitchId, srcNodeConnectorIDType, srcPort); - - topoManagerImpl.addUserLink(link[i]); - } - ConcurrentMap userLinks = topoManagerImpl.getUserLinks(); - TopologyUserLinkConfig resultLink; - - for (i = 0; i < 5; i++) { - resultLink = userLinks.get(((Integer)(i + 1)).toString()); - - Assert.assertTrue(resultLink.getName().equals(reverseLink[i].getName())); - Assert.assertTrue(resultLink.getDstSwitchId().equals(reverseLink[i].getSrcSwitchId())); - Assert.assertTrue(resultLink.getDstPort().equals(reverseLink[i].getSrcPort())); - Assert.assertTrue(resultLink.getSrcSwitchId().equals(reverseLink[i].getDstSwitchId())); - Assert.assertTrue(resultLink.getSrcPort().equals(reverseLink[i].getDstPort())); - } - } - - @Test - public void testHostLinkMethods() throws ConstructionException, UnknownHostException { - TopologyManagerImpl topoManagerImpl = new TopologyManagerImpl(); - topoManagerImpl.nonClusterObjectCreate(); - int hostCounter = 0; - - State state; - Bandwidth bw; - Latency l; - Set props = new HashSet(); - state = new State(State.EDGE_UP); - bw = new Bandwidth(Bandwidth.BW100Gbps); - l = new Latency(Latency.LATENCY100ns); - props.add(state); - props.add(bw); - props.add(l); - - EthernetAddress ea; - InetAddress ip; - Host[] h = new Host[5]; - NodeConnector[] nc = new NodeConnector[5]; - - /* Adding host, nodeConnector to hostsDB for the i = 0,1,2,3. No host - * added for i = 4 - */ - for (int i = 0; i < 5; i++) { - if (hostCounter < 4) { - ea = new EthernetAddress(new byte[]{(byte)0x0, (byte)0x0, - (byte)0x0, (byte)0x0, - (byte)0x0, (byte)i}); - String stringIP = new StringBuilder().append(i + 1).append(".").append(i+10).append(".").append(i+20).append(".").append(i+30).toString(); - ip = InetAddress.getByName(stringIP); - h[hostCounter] = new Host(ea, ip); - } else { - h[hostCounter] = null; - } - hostCounter++; - nc[i] = NodeConnectorCreator.createOFNodeConnector((short)(i + 1), NodeCreator.createOFNode((long)(i + 1))); - topoManagerImpl.updateHostLink(nc[i], h[i], UpdateType.ADDED, props); - } - - for (int i = 0; i < 5; i++) { - Host host = topoManagerImpl.getHostAttachedToNodeConnector(nc[i]); - if (i == 4) - Assert.assertTrue(host == null); - else - Assert.assertTrue(host.equals(h[i])); - } - - Set ncSet = topoManagerImpl.getNodeConnectorWithHost(); - for (int i = 0; i < 5; i++) { - Assert.assertTrue(ncSet.remove(nc[i])); - } - Assert.assertTrue(ncSet.isEmpty()); - } - - @Test - public void testGetNodesWithNodeConnectorHost() throws ConstructionException, UnknownHostException { - TopologyManagerImpl topoManagerImpl = new TopologyManagerImpl(); - topoManagerImpl.nonClusterObjectCreate(); - int hostCounter = 0; - - State state; - Bandwidth bw; - Latency l; - Set props = new HashSet(); - state = new State(State.EDGE_UP); - bw = new Bandwidth(Bandwidth.BW100Gbps); - l = new Latency(Latency.LATENCY100ns); - props.add(state); - props.add(bw); - props.add(l); - - EthernetAddress ea; - InetAddress ip; - Host[] h = new Host[5]; - NodeConnector[] nc = new NodeConnector[5]; - - /*Adding host, nodeconnector, properties of edge to hostsDB for the first three nodes only*/ - for (int i = 1; i < 6; i++) { - if (i < 4) { - ea = new EthernetAddress(new byte[]{(byte)0x0, (byte)0x0, - (byte)0x0, (byte)0x0, - (byte)0x0, (byte)i}); - String stringIP = new StringBuilder().append(i).append(".").append(i+10).append(".").append(i+20).append(".").append(i+30).toString(); - ip = InetAddress.getByName(stringIP); - h[hostCounter] = new Host(ea, ip); - } - else { - h[hostCounter] = null; - } - hostCounter++; - nc[i - 1] = NodeConnectorCreator.createOFNodeConnector((short)i, NodeCreator.createOFNode((long)i)); - topoManagerImpl.updateHostLink(nc[i - 1], h[i - 1], UpdateType.ADDED, props); - } - - /*Get the nodes which have host connected to its nodeConnector*/ - Map> nodeNCmap = topoManagerImpl.getNodesWithNodeConnectorHost(); - for (int i = 1; i < 6; i++) { - Node node = nc[i - 1].getNode(); - Set ncSet = nodeNCmap.get(nc[i - 1].getNode()); - - Assert.assertTrue(ncSet == nodeNCmap.remove(node)); - } - - Assert.assertTrue(nodeNCmap.isEmpty()); - } -} +public class TopologyManagerImplTest { + + /* + * Sets the node, edges and properties for edges here: Edge : <1:1>--><11:11>; <1:2>--><11:12>; <3:3>--><13:13>; + * <3:4>--><13:14>; <5:5>--><15:15>; <5:6>--><15:16>; Method used by two + * tests: testGetNodeEdges and testGetEdges + * + * @param topoManagerImpl + * + * @throws ConstructionException + */ + public void setNodeEdges(TopologyManagerImpl topoManagerImpl) + throws ConstructionException { + topoManagerImpl.nonClusterObjectCreate(); + + State state; + Bandwidth bw; + Latency l; + + Set props = new HashSet(); + state = new State(State.EDGE_UP); + bw = new Bandwidth(Bandwidth.BW100Gbps); + l = new Latency(Latency.LATENCY100ns); + props.add(state); + props.add(bw); + props.add(l); + + for (short i = 1; i < 6; i = (short) (i + 2)) { + List topoedgeupdateList = new ArrayList(); + NodeConnector headnc1 = NodeConnectorCreator.createOFNodeConnector( + i, NodeCreator.createOFNode((long) i)); + NodeConnector tailnc1 = NodeConnectorCreator + .createOFNodeConnector((short) (i + 10), + NodeCreator.createOFNode((long) (i + 10))); + Edge e1 = new Edge(headnc1, tailnc1); + TopoEdgeUpdate teu1 = new TopoEdgeUpdate(e1, props, + UpdateType.ADDED); + topoedgeupdateList.add(teu1); + + NodeConnector headnc2 = NodeConnectorCreator.createOFNodeConnector( + (short) (i + 1), headnc1.getNode()); + NodeConnector tailnc2 = NodeConnectorCreator.createOFNodeConnector( + (short) (i + 11), tailnc1.getNode()); + Edge e2 = new Edge(headnc2, tailnc2); + TopoEdgeUpdate teu2 = new TopoEdgeUpdate(e2, props, + UpdateType.ADDED); + topoedgeupdateList.add(teu2); + topoManagerImpl.edgeUpdate(topoedgeupdateList); + + } + + } + + @Test + public void testGetNodeEdges() throws ConstructionException { + TopologyManagerImpl topoManagerImpl = new TopologyManagerImpl(); + setNodeEdges(topoManagerImpl); + + Map> nodeEdgeMap = topoManagerImpl.getNodeEdges(); + for (Iterator>> i = nodeEdgeMap.entrySet() + .iterator(); i.hasNext();) { + Map.Entry> entry = i.next(); + Node node = entry.getKey(); + Long nodeId = ((Long) node.getID()).longValue(); + Assert.assertTrue((node.getType().equals(NodeIDType.OPENFLOW))); + + Set edges = entry.getValue(); + for (Edge edge : edges) { + Long headNcId = ((Short) edge.getHeadNodeConnector().getID()) + .longValue(); + Long tailNcId = ((Short) edge.getTailNodeConnector().getID()) + .longValue(); + if (nodeId == 1 || nodeId == 3 || nodeId == 5) { + Assert.assertTrue((headNcId.equals(nodeId) && tailNcId + .equals(nodeId + 10)) + || (headNcId.equals(nodeId + 10) && tailNcId + .equals(nodeId)) + || (headNcId.equals(nodeId + 1) && tailNcId + .equals(nodeId + 11)) + || (headNcId.equals(nodeId + 11) && tailNcId + .equals(nodeId + 1))); + } else if (nodeId == 11 || nodeId == 13 || nodeId == 15) { + Assert.assertTrue((headNcId.equals(nodeId) && tailNcId + .equals(nodeId - 10)) + || (headNcId.equals(nodeId) && tailNcId + .equals(nodeId - 10)) + || (headNcId.equals(nodeId - 9) && tailNcId + .equals(nodeId + 1)) + || (headNcId.equals(nodeId + 1) && tailNcId + .equals(nodeId - 9))); + } + } + i.remove(); + } + Assert.assertTrue(nodeEdgeMap.isEmpty()); + } + + @Test + public void testGetEdges() throws ConstructionException { + TopologyManagerImpl topoManagerImpl = new TopologyManagerImpl(); + setNodeEdges(topoManagerImpl); + + Map> edgeProperty = topoManagerImpl.getEdges(); + + for (Iterator>> i = edgeProperty + .entrySet().iterator(); i.hasNext();) { + Map.Entry> entry = i.next(); + Edge e = entry.getKey(); + NodeConnector headnc = e.getHeadNodeConnector(); + NodeConnector tailnc = e.getTailNodeConnector(); + + Long headNodeId = (Long) headnc.getNode().getID(); + + Long headNcId = ((Short) headnc.getID()).longValue(); + Long tailNcId = ((Short) tailnc.getID()).longValue(); + + if (headNodeId == 1 || headNodeId == 3 || headNodeId == 5) { + Assert.assertTrue((headNcId.equals(headNodeId) && tailNcId + .equals(headNodeId + 10)) + || (headNcId.equals(headNodeId + 10) && tailNcId + .equals(headNodeId)) + || (headNcId.equals(headNodeId + 1) && tailNcId + .equals(headNodeId + 11)) + || (headNcId.equals(headNodeId + 11) && tailNcId + .equals(headNodeId + 1))); + } else if (headNodeId == 11 || headNodeId == 13 || headNodeId == 15) { + Assert.assertTrue((headNcId.equals(headNodeId) && tailNcId + .equals(headNodeId - 10)) + || (headNcId.equals(headNodeId) && tailNcId + .equals(headNodeId - 10)) + || (headNcId.equals(headNodeId - 9) && tailNcId + .equals(headNodeId + 1)) + || (headNcId.equals(headNodeId + 1) && tailNcId + .equals(headNodeId - 9))); + } + + Set prop = entry.getValue(); + for (Property p : prop) { + String pName; + long pValue; + if (p instanceof Bandwidth) { + Bandwidth b = (Bandwidth) p; + pName = Bandwidth.BandwidthPropName; + pValue = b.getValue(); + Assert.assertTrue(pName.equals(p.getName()) + && pValue == Bandwidth.BW100Gbps); + continue; + } + if (p instanceof Latency) { + Latency l = (Latency) p; + pName = Latency.LatencyPropName; + pValue = l.getValue(); + Assert.assertTrue(pName.equals(p.getName()) + && pValue == Latency.LATENCY100ns); + continue; + } + if (p instanceof State) { + State state = (State) p; + pName = State.StatePropName; + pValue = state.getValue(); + Assert.assertTrue(pName.equals(p.getName()) + && pValue == State.EDGE_UP); + continue; + } + } + i.remove(); + } + Assert.assertTrue(edgeProperty.isEmpty()); + } + + @Test + public void testAddDeleteUserLink() { + TopologyUserLinkConfig link1 = new TopologyUserLinkConfig("default1", + "OF", "1", "OF", "2", "OF", "1", "OF", "2"); + TopologyUserLinkConfig link2 = new TopologyUserLinkConfig("default1", + "OF", "10", "OF", "20", "OF", "10", "OF", "20"); + TopologyUserLinkConfig link3 = new TopologyUserLinkConfig("default2", + "OF", "1", "OF", "2", "OF", "1", "OF", "2"); + TopologyUserLinkConfig link4 = new TopologyUserLinkConfig("default20", + "OF", "10", "OF", "20", "OF", "10", "OF", "20"); + + TopologyManagerImpl topoManagerImpl = new TopologyManagerImpl(); + topoManagerImpl.nonClusterObjectCreate(); + + Assert.assertTrue(topoManagerImpl.addUserLink(link1).isSuccess()); + Assert.assertTrue(topoManagerImpl.addUserLink(link2).getCode() == StatusCode.CONFLICT); + Assert.assertTrue(topoManagerImpl.addUserLink(link3).getCode() == StatusCode.CONFLICT); + Assert.assertTrue(topoManagerImpl.addUserLink(link4).isSuccess()); + + Assert.assertTrue(topoManagerImpl.deleteUserLink(null).getCode() == StatusCode.BADREQUEST); + Assert.assertTrue(topoManagerImpl.deleteUserLink(link1.getName()) + .isSuccess()); + Assert.assertTrue(topoManagerImpl.deleteUserLink(link4.getName()) + .isSuccess()); + Assert.assertTrue(topoManagerImpl.getUserLinks().isEmpty()); + + } + + @Test + public void testGetUserLink() { + TopologyUserLinkConfig[] link = new TopologyUserLinkConfig[5]; + TopologyUserLinkConfig[] reverseLink = new TopologyUserLinkConfig[5]; + TopologyManagerImpl topoManagerImpl = new TopologyManagerImpl(); + topoManagerImpl.nonClusterObjectCreate(); + + String name = null; + String srcNodeIDType = null; + String srcSwitchId = null; + String srcNodeConnectorIDType = null; + String srcPort = null; + String dstNodeIDType = null; + String dstSwitchId = null; + String dstNodeConnectorIDType = null; + String dstPort = null; + + /* Creating userlinks and checking for their validity */ + link[0] = new TopologyUserLinkConfig(name, srcNodeIDType, srcSwitchId, + srcNodeConnectorIDType, srcPort, dstNodeIDType, dstSwitchId, + dstNodeConnectorIDType, dstPort); + Assert.assertTrue(link[0].isValid() == false); + + srcSwitchId = "1"; + link[0] = new TopologyUserLinkConfig(name, srcNodeIDType, srcSwitchId, + srcNodeConnectorIDType, srcPort, dstNodeIDType, dstSwitchId, + dstNodeConnectorIDType, dstPort); + Assert.assertTrue(link[0].isValid() == false); + dstSwitchId = "2"; + link[0] = new TopologyUserLinkConfig(name, srcNodeIDType, srcSwitchId, + srcNodeConnectorIDType, srcPort, dstNodeIDType, dstSwitchId, + dstNodeConnectorIDType, dstPort); + Assert.assertTrue(link[0].isValid() == false); + + Integer i; + + for (i = 0; i < 5; i++) { + link[i] = new TopologyUserLinkConfig(name, srcNodeIDType, + srcSwitchId, srcNodeConnectorIDType, srcPort, + dstNodeIDType, dstSwitchId, dstNodeConnectorIDType, dstPort); + + name = Integer.toString(i + 1); + srcSwitchId = Integer.toString(i + 1); + srcPort = Integer.toString(i + 1); + dstSwitchId = Integer.toString((i + 1) * 10); + dstPort = Integer.toString((i + 1) * 10); + + link[i].setName(name); + link[i].setSrcSwitchId(srcSwitchId); + link[i].setSrcPort(srcPort); + link[i].setDstSwitchId(dstSwitchId); + link[i].setDstPort(dstPort); + + Assert.assertTrue(link[i].isValid() == false); + + link[i].setSrcNodeIDType("OF"); + link[i].setSrcNodeConnectorIDType("OF"); + + Assert.assertTrue(link[i].isValid() == false); + + link[i].setDstNodeIDType("OF"); + link[i].setDstNodeConnectorIDType("OF"); + + Assert.assertTrue(link[i].isValid() == true); + + reverseLink[i] = new TopologyUserLinkConfig(name, dstNodeIDType, + dstSwitchId, dstNodeConnectorIDType, dstPort, + srcNodeIDType, srcSwitchId, srcNodeConnectorIDType, srcPort); + + topoManagerImpl.addUserLink(link[i]); + } + ConcurrentMap userLinks = topoManagerImpl + .getUserLinks(); + TopologyUserLinkConfig resultLink; + + for (i = 0; i < 5; i++) { + resultLink = userLinks.get(((Integer) (i + 1)).toString()); + + Assert.assertTrue(resultLink.getName().equals( + reverseLink[i].getName())); + Assert.assertTrue(resultLink.getDstSwitchId().equals( + reverseLink[i].getSrcSwitchId())); + Assert.assertTrue(resultLink.getDstPort().equals( + reverseLink[i].getSrcPort())); + Assert.assertTrue(resultLink.getSrcSwitchId().equals( + reverseLink[i].getDstSwitchId())); + Assert.assertTrue(resultLink.getSrcPort().equals( + reverseLink[i].getDstPort())); + } + } + + @Test + public void testHostLinkMethods() throws ConstructionException, + UnknownHostException { + TopologyManagerImpl topoManagerImpl = new TopologyManagerImpl(); + topoManagerImpl.nonClusterObjectCreate(); + int hostCounter = 0; + + State state; + Bandwidth bw; + Latency l; + Set props = new HashSet(); + state = new State(State.EDGE_UP); + bw = new Bandwidth(Bandwidth.BW100Gbps); + l = new Latency(Latency.LATENCY100ns); + props.add(state); + props.add(bw); + props.add(l); + + EthernetAddress ea; + InetAddress ip; + Host[] h = new Host[5]; + NodeConnector[] nc = new NodeConnector[5]; + + /* + * Adding host, nodeConnector to hostsDB for the i = 0,1,2,3. No host + * added for i = 4 + */ + for (int i = 0; i < 5; i++) { + if (hostCounter < 4) { + ea = new EthernetAddress(new byte[] { (byte) 0x0, (byte) 0x0, + (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) i }); + String stringIP = new StringBuilder().append(i + 1).append(".") + .append(i + 10).append(".").append(i + 20).append(".") + .append(i + 30).toString(); + ip = InetAddress.getByName(stringIP); + h[hostCounter] = new Host(ea, ip); + } else { + h[hostCounter] = null; + } + hostCounter++; + nc[i] = NodeConnectorCreator.createOFNodeConnector((short) (i + 1), + NodeCreator.createOFNode((long) (i + 1))); + topoManagerImpl + .updateHostLink(nc[i], h[i], UpdateType.ADDED, props); + } + + for (int i = 0; i < 5; i++) { + Host host = topoManagerImpl.getHostAttachedToNodeConnector(nc[i]); + if (i == 4) + Assert.assertTrue(host == null); + else + Assert.assertTrue(host.equals(h[i])); + } + + Set ncSet = topoManagerImpl.getNodeConnectorWithHost(); + for (int i = 0; i < 5; i++) { + Assert.assertTrue(ncSet.remove(nc[i])); + } + Assert.assertTrue(ncSet.isEmpty()); + } + + @Test + public void testGetNodesWithNodeConnectorHost() + throws ConstructionException, UnknownHostException { + TopologyManagerImpl topoManagerImpl = new TopologyManagerImpl(); + topoManagerImpl.nonClusterObjectCreate(); + int hostCounter = 0; + + State state; + Bandwidth bw; + Latency l; + Set props = new HashSet(); + state = new State(State.EDGE_UP); + bw = new Bandwidth(Bandwidth.BW100Gbps); + l = new Latency(Latency.LATENCY100ns); + props.add(state); + props.add(bw); + props.add(l); + + EthernetAddress ea; + InetAddress ip; + Host[] h = new Host[5]; + NodeConnector[] nc = new NodeConnector[5]; + + /* + * Adding host, nodeconnector, properties of edge to hostsDB for the + * first three nodes only + */ + for (int i = 1; i < 6; i++) { + if (i < 4) { + ea = new EthernetAddress(new byte[] { (byte) 0x0, (byte) 0x0, + (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) i }); + String stringIP = new StringBuilder().append(i).append(".") + .append(i + 10).append(".").append(i + 20).append(".") + .append(i + 30).toString(); + ip = InetAddress.getByName(stringIP); + h[hostCounter] = new Host(ea, ip); + } else { + h[hostCounter] = null; + } + hostCounter++; + nc[i - 1] = NodeConnectorCreator.createOFNodeConnector((short) i, + NodeCreator.createOFNode((long) i)); + topoManagerImpl.updateHostLink(nc[i - 1], h[i - 1], + UpdateType.ADDED, props); + } + + /* Get the nodes which have host connected to its nodeConnector */ + Map> nodeNCmap = topoManagerImpl + .getNodesWithNodeConnectorHost(); + for (int i = 1; i < 6; i++) { + Node node = nc[i - 1].getNode(); + Set ncSet = nodeNCmap.get(nc[i - 1].getNode()); + + Assert.assertTrue(ncSet == nodeNCmap.remove(node)); + } + + Assert.assertTrue(nodeNCmap.isEmpty()); + } +} diff --git a/opendaylight/usermanager/pom.xml b/opendaylight/usermanager/pom.xml index 4c83a3e1ce..eea85e25ea 100644 --- a/opendaylight/usermanager/pom.xml +++ b/opendaylight/usermanager/pom.xml @@ -85,7 +85,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT diff --git a/opendaylight/web/devices/pom.xml b/opendaylight/web/devices/pom.xml index e8a67ac9ed..12cd17c6c3 100644 --- a/opendaylight/web/devices/pom.xml +++ b/opendaylight/web/devices/pom.xml @@ -101,7 +101,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/web/devices/src/main/java/org/opendaylight/controller/devices/web/Devices.java b/opendaylight/web/devices/src/main/java/org/opendaylight/controller/devices/web/Devices.java index f451204d36..4c31dee542 100644 --- a/opendaylight/web/devices/src/main/java/org/opendaylight/controller/devices/web/Devices.java +++ b/opendaylight/web/devices/src/main/java/org/opendaylight/controller/devices/web/Devices.java @@ -30,6 +30,7 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.opendaylight.controller.forwarding.staticrouting.IForwardingStaticRouting; import org.opendaylight.controller.forwarding.staticrouting.StaticRouteConfig; import org.opendaylight.controller.sal.authorization.UserLevel; +import org.opendaylight.controller.sal.core.Config; import org.opendaylight.controller.sal.core.Name; import org.opendaylight.controller.sal.core.Node; import org.opendaylight.controller.sal.core.NodeConnector; @@ -111,23 +112,33 @@ public class Devices implements IDaylightWeb { HexEncode.bytesToHexString(device.getDataLayerAddress())); StringBuffer sb1 = new StringBuffer(); Set nodeConnectorSet = device.getNodeConnectors(); - String nodeConnectorName; - String nodeConnectorNumberToStr; if (nodeConnectorSet != null && nodeConnectorSet.size() > 0) { Map portList = new HashMap(); for (NodeConnector nodeConnector : nodeConnectorSet) { - nodeConnectorNumberToStr = nodeConnector.getID().toString(); + String nodeConnectorNumberToStr = nodeConnector.getID().toString(); Name ncName = ((Name) switchManager.getNodeConnectorProp( nodeConnector, Name.NamePropName)); - nodeConnectorName = (ncName != null) ? ncName.getValue() + Config portStatus = ((Config) switchManager + .getNodeConnectorProp(nodeConnector, + Config.ConfigPropName)); + + String nodeConnectorName = (ncName != null) ? ncName.getValue() : ""; + nodeConnectorName += " ("+nodeConnector.getID()+")"; + if (portStatus.getValue() == Config.ADMIN_UP) { + nodeConnectorName = ""+nodeConnectorName+""; + } else if (portStatus.getValue() == Config.ADMIN_DOWN) { + nodeConnectorName = ""+nodeConnectorName+""; + } + portList.put(Short.parseShort(nodeConnectorNumberToStr), nodeConnectorName); } - Map sortedPortList = new TreeMap( - portList); + + Map sortedPortList = new TreeMap(portList); + for (Entry e : sortedPortList.entrySet()) { - sb1.append(e.getValue() + "(" + e.getKey() + ")"); + sb1.append(e.getValue()); sb1.append("
"); } } @@ -142,6 +153,7 @@ public class Devices implements IDaylightWeb { columnNames.add("Tier"); columnNames.add("Mac Address"); columnNames.add("Ports"); + columnNames.add("Port Status"); result.setColumnNames(columnNames); return result; diff --git a/opendaylight/web/devices/src/main/java/org/opendaylight/controller/devices/web/StatusJsonBean.java b/opendaylight/web/devices/src/main/java/org/opendaylight/controller/devices/web/StatusJsonBean.java index cbfc1214a7..a3546030b4 100644 --- a/opendaylight/web/devices/src/main/java/org/opendaylight/controller/devices/web/StatusJsonBean.java +++ b/opendaylight/web/devices/src/main/java/org/opendaylight/controller/devices/web/StatusJsonBean.java @@ -8,18 +8,22 @@ package org.opendaylight.controller.devices.web; public class StatusJsonBean { - private boolean status; - private String message; - public boolean isStatus() { - return status; - } - public void setStatus(boolean status) { - this.status = status; - } - public String getMessage() { - return message; - } - public void setMessage(String message) { - this.message = message; - } + private boolean status; + private String message; + + public boolean isStatus() { + return status; + } + + public void setStatus(boolean status) { + this.status = status; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } } diff --git a/opendaylight/web/devices/src/main/resources/js/page.js b/opendaylight/web/devices/src/main/resources/js/page.js index 7a2b579326..96b16bf92c 100644 --- a/opendaylight/web/devices/src/main/resources/js/page.js +++ b/opendaylight/web/devices/src/main/resources/js/page.js @@ -18,7 +18,7 @@ one.f.dashlet = { }, staticRouteConfig : { id : 'staticRouteConfig', - name : 'Static route Configuration' + name : 'Static Route Configuration' }, subnetGatewayConfig : { id : 'subnetGatewayConfig', @@ -77,6 +77,7 @@ one.f.switchmanager.nodesLearnt = { form: { nodeId: "one_f_switchmanager_nodesLearnt_id_modal_form_nodeid", nodeName : "one_f_switchmanager_nodesLearnt_id_modal_form_nodename", + portStatus : "one_f_switchmanager_nodesLearnt_id_modal_form_portstatus", tier: "one_f_switchmanager_nodesLearnt_id_modal_form_tier", operationMode: "one_f_switchmanager_nodesLearnt_id_modal_form_opmode" } @@ -93,7 +94,6 @@ one.f.switchmanager.nodesLearnt = { $dashlet.append($table); }); }, - ajax : { main : function(url, callback) { $.getJSON(url, function(data) { @@ -105,7 +105,7 @@ one.f.switchmanager.nodesLearnt = { initialize: { updateNode: function(evt) { var nodeId = decodeURIComponent(evt.target.id); - var h3 = "Update node information"; + var h3 = "Update Node Information"; var footer = one.f.switchmanager.nodesLearnt.modal.footer.updateNode(); var $modal = one.lib.modal.spawn(one.f.switchmanager.nodesLearnt.id.modal.modal, h3, "", footer); @@ -255,6 +255,7 @@ one.f.switchmanager.nodesLearnt = { entry.push(value["tierName"]); entry.push(value["mac"]); entry.push(value["ports"]); + entry.push(value["portStatus"]); tr.entry = entry; result.push(tr); }); @@ -634,7 +635,8 @@ one.f.switchmanager.staticRouteConfig = { var body = one.f.switchmanager.staticRouteConfig.data.staticRouteConfig(content); // first column contains checkbox. no need for header content.columnNames.splice(0,0," "); - var $table = one.f.switchmanager.createTable(content.columnNames, body); + var tableHeaders = ['', 'Name', 'Static Route', 'Next Hop Address']; + var $table = one.f.switchmanager.createTable(tableHeaders, body); $dashlet.append($table); }); }, @@ -1007,4 +1009,4 @@ $('.dash .nav a', '#main').click(function() { // activate first tab on each dashlet $('.dash .nav').each(function(index, value) { $($(value).find('li')[0]).find('a').click(); -}); \ No newline at end of file +}); diff --git a/opendaylight/web/flows/pom.xml b/opendaylight/web/flows/pom.xml index 4eaf227fe9..5333a7e643 100644 --- a/opendaylight/web/flows/pom.xml +++ b/opendaylight/web/flows/pom.xml @@ -106,7 +106,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/web/root/pom.xml b/opendaylight/web/root/pom.xml index 7f5c45319e..d30a6ac4c1 100644 --- a/opendaylight/web/root/pom.xml +++ b/opendaylight/web/root/pom.xml @@ -95,7 +95,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/web/root/src/main/java/org/opendaylight/controller/web/IDaylightWeb.java b/opendaylight/web/root/src/main/java/org/opendaylight/controller/web/IDaylightWeb.java index 84bbd94bae..55e3ee5110 100644 --- a/opendaylight/web/root/src/main/java/org/opendaylight/controller/web/IDaylightWeb.java +++ b/opendaylight/web/root/src/main/java/org/opendaylight/controller/web/IDaylightWeb.java @@ -1,4 +1,3 @@ - /* * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * @@ -11,16 +10,36 @@ package org.opendaylight.controller.web; import org.opendaylight.controller.sal.authorization.UserLevel; -/** - * - * - */ public interface IDaylightWeb { + /** + * Returns the name of the bundle. In the GUI, this name will be displayed + * on the tab. + * + * @return Name assigned to the bundle. + */ public String getWebName(); + /** + * Returns the Id assigned to the web bundle. + * + * @return Id assigned to the web bundle. + */ public String getWebId(); + /** + * Returns the position where the bundle tab will be placed in the GUI. + * + * @return Position number for the bundle tab. + */ public short getWebOrder(); - + + /** + * This method checks if the user is authorized to access the bundle. + * + * @param userLevel + * user role level in the controller space. + * + * @return true, if user is authorized to access the bundle, else false. + */ public boolean isAuthorized(UserLevel userLevel); } diff --git a/opendaylight/web/topology/pom.xml b/opendaylight/web/topology/pom.xml index 38999257f1..0dd10512eb 100644 --- a/opendaylight/web/topology/pom.xml +++ b/opendaylight/web/topology/pom.xml @@ -104,7 +104,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/web/topology/src/main/java/org/opendaylight/controller/topology/web/Topology.java b/opendaylight/web/topology/src/main/java/org/opendaylight/controller/topology/web/Topology.java index 285e33f53b..af25abded0 100644 --- a/opendaylight/web/topology/src/main/java/org/opendaylight/controller/topology/web/Topology.java +++ b/opendaylight/web/topology/src/main/java/org/opendaylight/controller/topology/web/Topology.java @@ -28,6 +28,7 @@ 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.Property; +import org.opendaylight.controller.sal.core.Node.NodeIDType; import org.opendaylight.controller.sal.packet.address.EthernetAddress; import org.opendaylight.controller.sal.utils.ServiceHelper; import org.opendaylight.controller.switchmanager.ISwitchManager; @@ -131,12 +132,21 @@ public class Topology { for (Map.Entry> e : nodeEdges.entrySet()) { Node n = e.getKey(); + + // skip production node + if (nodeIgnore(n)) { + continue; + } + String description = switchManager.getNodeDescription(n); NodeBean node = createNodeBean(description, n); List> adjacencies = new LinkedList>(); Set links = e.getValue(); for (Edge link : links) { + if (edgeIgnore(link)) { + continue; + } for (Property p : properties.get(link)) { if (p instanceof Bandwidth) { bandwidth = (Bandwidth) p; @@ -166,6 +176,45 @@ public class Topology { } } + /** + * Check if this node shouldn't appear in the visual topology + * + * @param node + * @return + */ + private boolean nodeIgnore(Node node) { + String nodeType = node.getType(); + + // add other node types to ignore later + if (nodeType.equals(NodeIDType.PRODUCTION)) { + return true; + } + + return false; + } + + /** + * Check if this edge shouldn't appear in the visual topology + * + * @param edge + * @return + */ + private boolean edgeIgnore(Edge edge) { + NodeConnector headNodeConnector = edge.getHeadNodeConnector(); + Node headNode = headNodeConnector.getNode(); + if (nodeIgnore(headNode)) { + return true; + } + + NodeConnector tailNodeConnector = edge.getTailNodeConnector(); + Node tailNode = tailNodeConnector.getNode(); + if (nodeIgnore(tailNode)) { + return true; + } + + return false; + } + protected NodeBean createNodeBean(String description, Node node) { String name = (description == null || description.trim().isEmpty() || @@ -179,6 +228,11 @@ public class Topology { if (nodes == null) return; for (Switch sw : nodes) { Node n = sw.getNode(); + + // skip production node + if (nodeIgnore(n)) { + continue; + } String description = switchManager.getNodeDescription(n); diff --git a/opendaylight/web/troubleshoot/pom.xml b/opendaylight/web/troubleshoot/pom.xml index 24191692a1..52958e116e 100644 --- a/opendaylight/web/troubleshoot/pom.xml +++ b/opendaylight/web/troubleshoot/pom.xml @@ -103,7 +103,7 @@ org.opendaylight.controller sal - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller