Hooking up SessionManager to Conductor for ListenerMap 81/2281/1
authorYugandhar <ysarraju@in.ibm.com>
Thu, 31 Oct 2013 09:01:55 +0000 (14:31 +0530)
committerYugandhar <ysarraju@in.ibm.com>
Thu, 31 Oct 2013 09:01:55 +0000 (14:31 +0530)
Change-Id: Ie644ff4a0c937da1635aeab60686129b57ec952e
Signed-off-by: Yugandhar <ysarraju@in.ibm.com>
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/ConnectionConductorImpl.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/MDController.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/session/OFSessionUtil.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/session/SessionManager.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/session/SessionManagerOFImpl.java
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/ConnectionConductorImplTest.java

index cd50acc4fdef9b4b03b625aa8b80b3f6adb1f1f7..509a94c9f4430f7e1883032ade81282af451b688 100644 (file)
@@ -281,6 +281,7 @@ public class ConnectionConductorImpl implements OpenflowProtocolListener,
 
                 OFSessionUtil.registerSession(this,
                         featureOutput, version);
+                this.setListenerMapping(OFSessionUtil.getListenersMap());
                 LOG.info("handshake SETTLED: datapathId={}, auxiliaryId={}", featureOutput.getDatapathId(), featureOutput.getAuxiliaryId());
             }
         } catch (Exception e) {
@@ -478,7 +479,7 @@ public class ConnectionConductorImpl implements OpenflowProtocolListener,
     public SessionContext getSessionContext() {
         return sessionContext;
     }
-
+    
     /**
      * @param listenerMapping the listenerMapping to set
      */
index 6150413038c8911c00be5df926384edd5f984655..1ba75ed1c32a1c537e5a4d6356f1ae0fd7e3b44e 100644 (file)
@@ -49,6 +49,8 @@ public class MDController implements IMDController {
     public void init() {
         LOG.debug("Initializing!");
         this.messageListeners = new ConcurrentHashMap<Class<? extends DataObject>, Collection<IMDMessageListener>>();
+        // Push the updated Listeners to Session Manager which will be then picked up by ConnectionConductor eventually
+        OFSessionUtil.getSessionManager().setListenerMapping(messageListeners);
     }
 
     /**
@@ -129,8 +131,6 @@ public class MDController implements IMDController {
                messageListeners.put(messageType, existingValues);
         }
         existingValues.add(listener);
-        // Push the updated Listeners to Session Manager which will be then picked up by ConnectionConductor eventually
-        OFSessionUtil.getSessionManager().setListenerMapping(messageListeners);
         LOG.debug("{} is now listened by {}", messageType, listener);
     }
 
@@ -143,12 +143,9 @@ public class MDController implements IMDController {
                     if (values.size() == 0) {
                         messageListeners.remove(messageType);
                     }
-                    //Push the updated Listeners to Session Manager which will be then picked up by ConnectionConductor eventually
-                    OFSessionUtil.getSessionManager().setListenerMapping(messageListeners);
                     LOG.debug("{} is now removed", listener);
          }
     }
 
 
-
 }
index ee5af9c2223031cd433f6835915733fba63dc472..a4c20a47ecccac64f41828c2c25763a31518732b 100644 (file)
@@ -9,10 +9,14 @@
 package org.opendaylight.openflowplugin.openflow.md.core.session;
 
 import java.math.BigInteger;
+import java.util.Collection;
+import java.util.Map;
 
 import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor;
+import org.opendaylight.openflowplugin.openflow.md.core.IMDMessageListener;
 import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;
+import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -132,5 +136,12 @@ public abstract class OFSessionUtil {
     public static SessionManager getSessionManager() {
         return SessionManagerOFImpl.getInstance();
     }
+    
+    /**
+    * @return session manager listener Map
+    */
+    public static Map<Class<? extends DataObject>, Collection<IMDMessageListener>> getListenersMap() {
+        return getSessionManager().getListenerMapping();
+    }
 
 }
index 43901c85f2c11aaf0099ec39a28baca993204bd8..83b4ebe2668fbd370c08b1f4d06ac339d3dbb33c 100644 (file)
@@ -61,6 +61,8 @@ public interface SessionManager {
     public void invalidateOnDisconnect(ConnectionConductor connectionConductor);
 
     public void setListenerMapping(Map<Class<? extends DataObject>, Collection<IMDMessageListener>> listenerMapping);
+    
+    public Map<Class<? extends DataObject>, Collection<IMDMessageListener>> getListenerMapping();
 
     public ListenerRegistration<SessionListener> registerSessionListener(SessionListener listener);
 }
index 351b1b00316e970d147de19581fe608475edaace..71172f4763f72b15018063aef1587e9881fdf8e7 100644 (file)
@@ -158,4 +158,9 @@ public class SessionManagerOFImpl implements SessionManager {
         }
     };
 
+    @Override
+    public Map<Class<? extends DataObject>, Collection<IMDMessageListener>> getListenerMapping() {
+        return this.listenerMapping;
+    }
+
 }
index 852b5035645a9aa3e1d0b1a9d1991b3f714992c8..27165e245153422a95f8160790e66065362504b0 100644 (file)
@@ -15,6 +15,8 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Stack;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 
@@ -64,6 +66,7 @@ public class ConnectionConductorImplTest {
 
     protected ConnectionAdapterStackImpl adapter;
     private ConnectionConductorImpl connectionConductor;
+    private MDController controller;
     private Stack<SwitchTestEvent> eventPlan;
 
     private Thread libSimulation;
@@ -84,6 +87,8 @@ public class ConnectionConductorImplTest {
         adapter = new ConnectionAdapterStackImpl();
         connectionConductor = new ConnectionConductorImpl(adapter);
         connectionConductor.init();
+        controller = new MDController();
+        controller.init();
         eventPlan = new Stack<>();
         adapter.setEventPlan(eventPlan);
         adapter.setProceedTimeout(5000L);
@@ -114,6 +119,7 @@ public class ConnectionConductorImplTest {
         }
         Assert.assertTrue("plan is not finished", eventPlan.isEmpty());
         eventPlan = null;
+        controller = null;
     }
 
     /**
@@ -283,15 +289,31 @@ public class ConnectionConductorImplTest {
      * Test method for
      * {@link org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductorImpl#onFlowRemovedMessage(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowRemovedMessage)}
      * .
+     * @throws InterruptedException 
      */
     @Test
-    public void testOnFlowRemovedMessage() {
+    public void testOnFlowRemovedMessage() throws InterruptedException {
         IMDMessageListener objFms = new FlowRemovedMessageService() ;
-        Map<Class<? extends DataObject>, Collection<IMDMessageListener>> listenerMapping = new HashMap<Class<? extends DataObject>, Collection<IMDMessageListener>>();
-        Collection<IMDMessageListener> existingValues = new ArrayList<IMDMessageListener>();
-        existingValues.add(objFms);
-        listenerMapping.put(FlowRemovedMessage.class, existingValues);
-        connectionConductor.setListenerMapping(listenerMapping);
+        controller.addMessageListener(FlowRemovedMessage.class, objFms);
+        
+        // Complete HandShake
+        eventPlan.add(0, EventFactory.createDefaultNotificationEvent(42L,
+        EventFactory.DEFAULT_VERSION, new HelloMessageBuilder()));
+        eventPlan.add(0,
+        EventFactory.createDefaultWaitForRpcEvent(43, "helloReply"));
+        eventPlan.add(0,EventFactory.createDefaultWaitForRpcEvent(44, "getFeatures"));
+        GetFeaturesOutputBuilder getFeaturesOutputBuilder = new GetFeaturesOutputBuilder();
+        getFeaturesOutputBuilder.setDatapathId(new BigInteger("102030405060"));
+        getFeaturesOutputBuilder.setAuxiliaryId((short) 0);
+        getFeaturesOutputBuilder.setBuffers(4L);
+        getFeaturesOutputBuilder.setReserved(0L);
+        getFeaturesOutputBuilder.setTables((short) 2);
+        getFeaturesOutputBuilder.setCapabilities(84L);
+        eventPlan.add(0, EventFactory.createDefaultRpcResponseEvent(44,
+          EventFactory.DEFAULT_VERSION, getFeaturesOutputBuilder));
+        execute(true);
+        
+        // Now send Flow Removed messages
         FlowRemovedMessageBuilder builder1 = new FlowRemovedMessageBuilder();
         builder1.setXid(1L);
         connectionConductor.onFlowRemovedMessage(builder1.build());
@@ -327,15 +349,31 @@ public class ConnectionConductorImplTest {
      * Test method for
      * {@link org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductorImpl#onPacketInMessage(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessage)}
      * .
+     * @throws InterruptedException 
      */
     @Test
-    public void testOnPacketInMessage() {
+    public void testOnPacketInMessage() throws InterruptedException {
         IMDMessageListener objPms = new PacketInMessageService() ;
-        Map<Class<? extends DataObject>, Collection<IMDMessageListener>> listenerMapping = new HashMap<Class<? extends DataObject>, Collection<IMDMessageListener>>();
-        Collection<IMDMessageListener> existingValues = new ArrayList<IMDMessageListener>();
-        existingValues.add(objPms);
-        listenerMapping.put(PacketInMessage.class, existingValues);
-        connectionConductor.setListenerMapping(listenerMapping);
+        controller.addMessageListener(PacketInMessage.class, objPms);
+        
+        // Complete HandShake
+        eventPlan.add(0, EventFactory.createDefaultNotificationEvent(42L,
+        EventFactory.DEFAULT_VERSION, new HelloMessageBuilder()));
+        eventPlan.add(0,
+        EventFactory.createDefaultWaitForRpcEvent(43, "helloReply"));
+        eventPlan.add(0,EventFactory.createDefaultWaitForRpcEvent(44, "getFeatures"));
+        GetFeaturesOutputBuilder getFeaturesOutputBuilder = new GetFeaturesOutputBuilder();
+        getFeaturesOutputBuilder.setDatapathId(new BigInteger("102030405060"));
+        getFeaturesOutputBuilder.setAuxiliaryId((short) 0);
+        getFeaturesOutputBuilder.setBuffers(4L);
+        getFeaturesOutputBuilder.setReserved(0L);
+        getFeaturesOutputBuilder.setTables((short) 2);
+        getFeaturesOutputBuilder.setCapabilities(84L);
+        eventPlan.add(0, EventFactory.createDefaultRpcResponseEvent(44,
+          EventFactory.DEFAULT_VERSION, getFeaturesOutputBuilder));
+        execute(true);
+        
+        // Now send PacketIn
         PacketInMessageBuilder builder1 = new PacketInMessageBuilder();
         builder1.setBufferId((long)1);
         connectionConductor.onPacketInMessage(builder1.build());
@@ -349,20 +387,32 @@ public class ConnectionConductorImplTest {
      * Test method for
      * {@link org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductorImpl#onPortStatusMessage(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessage)}
      * .
+     * @throws InterruptedException 
      */
     @Test
-    public void testOnPortStatusMessage() {
-        GetFeaturesOutputBuilder builder = new GetFeaturesOutputBuilder();
-        builder.setDatapathId(new BigInteger("102030405060"));
-        builder.setAuxiliaryId((short) 0);
-        OFSessionUtil.registerSession(connectionConductor,
-                builder.build(), (short)0x04);
+    public void testOnPortStatusMessage() throws InterruptedException {
+        
         IMDMessageListener objPSms = new PortStatusMessageService() ;
-        Map<Class<? extends DataObject>, Collection<IMDMessageListener>> listenerMapping = new HashMap<Class<? extends DataObject>, Collection<IMDMessageListener>>();
-        Collection<IMDMessageListener> existingValues = new ArrayList<IMDMessageListener>();
-        existingValues.add(objPSms);
-        listenerMapping.put(PortStatusMessage.class, existingValues);
-        connectionConductor.setListenerMapping(listenerMapping);
+        controller.addMessageListener(PortStatusMessage.class, objPSms);
+        
+        // Complete HandShake
+        eventPlan.add(0, EventFactory.createDefaultNotificationEvent(42L,
+        EventFactory.DEFAULT_VERSION, new HelloMessageBuilder()));
+        eventPlan.add(0,
+        EventFactory.createDefaultWaitForRpcEvent(43, "helloReply"));
+        eventPlan.add(0,EventFactory.createDefaultWaitForRpcEvent(44, "getFeatures"));
+        GetFeaturesOutputBuilder getFeaturesOutputBuilder = new GetFeaturesOutputBuilder();
+        getFeaturesOutputBuilder.setDatapathId(new BigInteger("102030405060"));
+        getFeaturesOutputBuilder.setAuxiliaryId((short) 0);
+        getFeaturesOutputBuilder.setBuffers(4L);
+        getFeaturesOutputBuilder.setReserved(0L);
+        getFeaturesOutputBuilder.setTables((short) 2);
+        getFeaturesOutputBuilder.setCapabilities(84L);
+        eventPlan.add(0, EventFactory.createDefaultRpcResponseEvent(44,
+          EventFactory.DEFAULT_VERSION, getFeaturesOutputBuilder));
+        execute(true);
+        
+        // Send Port Status messages
         PortStatusMessageBuilder builder1 = new PortStatusMessageBuilder();
         PortFeatures features = new PortFeatures(true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false);
         builder1.setPortNo(90L).setReason(PortReason.OFPPRADD).setCurrentFeatures(features);